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