1 //========================================================================
2 //Copyright 2004-2008 Mort Bay Consulting Pty. Ltd.
3 //------------------------------------------------------------------------
4 //Licensed under the Apache License, Version 2.0 (the "License");
5 //you may not use this file except in compliance with the License.
6 //You may obtain a copy of the License at
7 //http://www.apache.org/licenses/LICENSE-2.0
8 //Unless required by applicable law or agreed to in writing, software
9 //distributed under the License is distributed on an "AS IS" BASIS,
10 //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 //See the License for the specific language governing permissions and
12 //limitations under the License.
13 //========================================================================
14
15 /**
16 *
17 */
18 package org.mortbay.jetty.nio;
19
20 import org.mortbay.io.Buffer;
21 import org.mortbay.io.nio.DirectNIOBuffer;
22 import org.mortbay.io.nio.IndirectNIOBuffer;
23 import org.mortbay.io.nio.NIOBuffer;
24 import org.mortbay.jetty.AbstractConnector;
25
26 /* ------------------------------------------------------------ */
27 /**
28 * @author gregw
29 *
30 */
31 public abstract class AbstractNIOConnector extends AbstractConnector implements NIOConnector
32 {
33 private boolean _useDirectBuffers=true;
34
35 /* ------------------------------------------------------------------------------- */
36 public boolean getUseDirectBuffers()
37 {
38 return _useDirectBuffers;
39 }
40
41 /* ------------------------------------------------------------------------------- */
42 /**
43 * @param direct If True (the default), the connector can use NIO direct buffers.
44 * Some JVMs have memory management issues (bugs) with direct buffers.
45 */
46 public void setUseDirectBuffers(boolean direct)
47 {
48 _useDirectBuffers=direct;
49 }
50
51 /* ------------------------------------------------------------------------------- */
52 protected Buffer newBuffer(int size)
53 {
54 // TODO
55 // Header buffers always byte array buffers (efficiency of random access)
56 // There are lots of things to consider here... DIRECT buffers are faster to
57 // send but more expensive to build and access! so we have choices to make...
58 // + headers are constructed bit by bit and parsed bit by bit, so INDiRECT looks
59 // good for them.
60 // + but will a gather write of an INDIRECT header with a DIRECT body be any good?
61 // this needs to be benchmarked.
62 // + Will it be possible to get a DIRECT header buffer just for the gather writes of
63 // content from file mapped buffers?
64 // + Are gather writes worth the effort? Maybe they will work well with two INDIRECT
65 // buffers being copied into a single kernel buffer?
66 //
67 Buffer buf = null;
68 if (size==getHeaderBufferSize())
69 buf= new IndirectNIOBuffer(size);
70 else
71 buf = _useDirectBuffers
72 ?(NIOBuffer)new DirectNIOBuffer(size)
73 :(NIOBuffer)new IndirectNIOBuffer(size);
74 return buf;
75 }
76
77
78 }