1
2
3
4
5
6
7
8
9
10
11
12
13
14 package org.eclipse.jetty.io;
15
16
17
18
19
20
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 }