View Javadoc

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          // Look for an other buffer
60          Buffer buffer = _others.poll();
61          
62          // consume all other buffers until one of the right size is found
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  }