1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.io;
20
21
22
23
24
25
26
27
28 public class ThreadLocalBuffers extends AbstractBuffers
29 {
30
31 private final ThreadLocal<ThreadBuffers> _buffers=new ThreadLocal<ThreadBuffers>()
32 {
33 @Override
34 protected ThreadBuffers initialValue()
35 {
36 return new ThreadBuffers();
37 }
38 };
39
40
41 public ThreadLocalBuffers(Buffers.Type headerType, int headerSize, Buffers.Type bufferType, int bufferSize, Buffers.Type otherType)
42 {
43 super(headerType,headerSize,bufferType,bufferSize,otherType);
44 }
45
46
47 public Buffer getBuffer()
48 {
49 ThreadBuffers buffers = _buffers.get();
50 if (buffers._buffer!=null)
51 {
52 Buffer b=buffers._buffer;
53 buffers._buffer=null;
54 return b;
55 }
56
57 if (buffers._other!=null && isBuffer(buffers._other))
58 {
59 Buffer b=buffers._other;
60 buffers._other=null;
61 return b;
62 }
63
64 return newBuffer();
65 }
66
67
68 public Buffer getHeader()
69 {
70 ThreadBuffers buffers = _buffers.get();
71 if (buffers._header!=null)
72 {
73 Buffer b=buffers._header;
74 buffers._header=null;
75 return b;
76 }
77
78 if (buffers._other!=null && isHeader(buffers._other))
79 {
80 Buffer b=buffers._other;
81 buffers._other=null;
82 return b;
83 }
84
85 return newHeader();
86 }
87
88
89 public Buffer getBuffer(int size)
90 {
91 ThreadBuffers buffers = _buffers.get();
92 if (buffers._other!=null && buffers._other.capacity()==size)
93 {
94 Buffer b=buffers._other;
95 buffers._other=null;
96 return b;
97 }
98
99 return newBuffer(size);
100 }
101
102
103 public void returnBuffer(Buffer buffer)
104 {
105 buffer.clear();
106 if (buffer.isVolatile() || buffer.isImmutable())
107 return;
108
109 ThreadBuffers buffers = _buffers.get();
110
111 if (buffers._header==null && isHeader(buffer))
112 buffers._header=buffer;
113 else if (buffers._buffer==null && isBuffer(buffer))
114 buffers._buffer=buffer;
115 else
116 buffers._other=buffer;
117 }
118
119
120
121 @Override
122 public String toString()
123 {
124 return "{{"+getHeaderSize()+","+getBufferSize()+"}}";
125 }
126
127
128
129 protected static class ThreadBuffers
130 {
131 Buffer _buffer;
132 Buffer _header;
133 Buffer _other;
134 }
135 }