1 // ========================================================================
2 // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
3 // ------------------------------------------------------------------------
4 // All rights reserved. This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v1.0
6 // and Apache License v2.0 which accompanies this distribution.
7 // The Eclipse Public License is available at
8 // http://www.eclipse.org/legal/epl-v10.html
9 // The Apache License v2.0 is available at
10 // http://www.opensource.org/licenses/apache2.0.php
11 // You may elect to redistribute this code under either of these licenses.
12 // ========================================================================
13
14 package org.eclipse.jetty.io;
15
16
17
18 /* ------------------------------------------------------------ */
19 /** Abstract Buffer pool.
20 * simple unbounded pool of buffers for header, request and response sizes.
21 *
22 */
23 public class ThreadLocalBuffers extends AbstractBuffers
24 {
25 /* ------------------------------------------------------------ */
26 private final ThreadLocal<ThreadBuffers> _buffers=new ThreadLocal<ThreadBuffers>()
27 {
28 @Override
29 protected ThreadBuffers initialValue()
30 {
31 return new ThreadBuffers();
32 }
33 };
34
35 /* ------------------------------------------------------------ */
36 public ThreadLocalBuffers(Buffers.Type headerType, int headerSize, Buffers.Type bufferType, int bufferSize, Buffers.Type otherType)
37 {
38 super(headerType,headerSize,bufferType,bufferSize,otherType);
39 }
40
41 /* ------------------------------------------------------------ */
42 public Buffer getBuffer()
43 {
44 ThreadBuffers buffers = _buffers.get();
45 if (buffers._buffer!=null)
46 {
47 Buffer b=buffers._buffer;
48 buffers._buffer=null;
49 return b;
50 }
51
52 if (buffers._other!=null && isBuffer(buffers._other))
53 {
54 Buffer b=buffers._other;
55 buffers._other=null;
56 return b;
57 }
58
59 return newBuffer();
60 }
61
62 /* ------------------------------------------------------------ */
63 public Buffer getHeader()
64 {
65 ThreadBuffers buffers = _buffers.get();
66 if (buffers._header!=null)
67 {
68 Buffer b=buffers._header;
69 buffers._header=null;
70 return b;
71 }
72
73 if (buffers._other!=null && isHeader(buffers._other))
74 {
75 Buffer b=buffers._other;
76 buffers._other=null;
77 return b;
78 }
79
80 return newHeader();
81 }
82
83 /* ------------------------------------------------------------ */
84 public Buffer getBuffer(int size)
85 {
86 ThreadBuffers buffers = _buffers.get();
87 if (buffers._other!=null && buffers._other.capacity()==size)
88 {
89 Buffer b=buffers._other;
90 buffers._other=null;
91 return b;
92 }
93
94 return newBuffer(size);
95 }
96
97 /* ------------------------------------------------------------ */
98 public void returnBuffer(Buffer buffer)
99 {
100 buffer.clear();
101 if (buffer.isVolatile() || buffer.isImmutable())
102 return;
103
104 ThreadBuffers buffers = _buffers.get();
105
106 if (buffers._header==null && isHeader(buffer))
107 buffers._header=buffer;
108 else if (buffers._buffer==null && isBuffer(buffer))
109 buffers._buffer=buffer;
110 else
111 buffers._other=buffer;
112 }
113
114
115 /* ------------------------------------------------------------ */
116 @Override
117 public String toString()
118 {
119 return "{{"+getHeaderSize()+","+getBufferSize()+"}}";
120 }
121
122 /* ------------------------------------------------------------ */
123 /* ------------------------------------------------------------ */
124 protected static class ThreadBuffers
125 {
126 Buffer _buffer;
127 Buffer _header;
128 Buffer _other;
129 }
130 }