1 package org.eclipse.jetty.io;
2
3
4
5
6
7
8
9
10
11
12
13
14
15 import java.util.Queue;
16 import java.util.concurrent.ConcurrentLinkedQueue;
17 import java.util.concurrent.atomic.AtomicInteger;
18
19 public class PooledBuffers extends AbstractBuffers
20 {
21 private final Queue<Buffer> _headers;
22 private final Queue<Buffer> _buffers;
23 private final Queue<Buffer> _others;
24 private final AtomicInteger _size = new AtomicInteger();
25 private final int _maxSize;
26 private final boolean _otherHeaders;
27 private final boolean _otherBuffers;
28
29
30 public PooledBuffers(Buffers.Type headerType, int headerSize, Buffers.Type bufferType, int bufferSize, Buffers.Type otherType,int maxSize)
31 {
32 super(headerType,headerSize,bufferType,bufferSize,otherType);
33 _headers=new ConcurrentLinkedQueue<Buffer>();
34 _buffers=new ConcurrentLinkedQueue<Buffer>();
35 _others=new ConcurrentLinkedQueue<Buffer>();
36 _otherHeaders=headerType==otherType;
37 _otherBuffers=bufferType==otherType;
38 _maxSize=maxSize;
39 }
40
41
42 public Buffer getHeader()
43 {
44 Buffer buffer = _headers.poll();
45 if (buffer==null)
46 buffer=newHeader();
47 else
48 _size.decrementAndGet();
49 return buffer;
50 }
51
52
53 public Buffer getBuffer()
54 {
55 Buffer buffer = _buffers.poll();
56 if (buffer==null)
57 buffer=newBuffer();
58 else
59 _size.decrementAndGet();
60 return buffer;
61 }
62
63
64 public Buffer getBuffer(int size)
65 {
66 if (_otherHeaders && size==getHeaderSize())
67 return getHeader();
68 if (_otherBuffers && size==getBufferSize())
69 return getBuffer();
70
71
72 Buffer buffer = _others.poll();
73
74
75 while (buffer!=null && buffer.capacity()!=size)
76 {
77 _size.decrementAndGet();
78 buffer = _others.poll();
79 }
80
81 if (buffer==null)
82 buffer=newBuffer(size);
83 else
84 _size.decrementAndGet();
85 return buffer;
86 }
87
88
89 public void returnBuffer(Buffer buffer)
90 {
91 buffer.clear();
92 if (buffer.isVolatile() || buffer.isImmutable())
93 return;
94
95 if (_size.incrementAndGet() > _maxSize)
96 _size.decrementAndGet();
97 else
98 {
99 if (isHeader(buffer))
100 _headers.add(buffer);
101 else if (isBuffer(buffer))
102 _buffers.add(buffer);
103 else
104 _others.add(buffer);
105 }
106 }
107
108 public String toString()
109 {
110 return String.format("%s [%d/%d@%d,%d/%d@%d,%d/%d@-]",
111 getClass().getSimpleName(),
112 _headers.size(),_maxSize,_headerSize,
113 _buffers.size(),_maxSize,_bufferSize,
114 _others.size(),_maxSize);
115 }
116 }