View Javadoc

1   package org.eclipse.jetty.io;
2   //========================================================================
3   //Copyright 2011-2012 Mort Bay Consulting Pty. Ltd.
4   //------------------------------------------------------------------------
5   //All rights reserved. This program and the accompanying materials
6   //are made available under the terms of the Eclipse Public License v1.0
7   //and Apache License v2.0 which accompanies this distribution.
8   //The Eclipse Public License is available at
9   //http://www.eclipse.org/legal/epl-v10.html
10  //The Apache License v2.0 is available at
11  //http://www.opensource.org/licenses/apache2.0.php
12  //You may elect to redistribute this code under either of these licenses.
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          // Look for an other buffer
72          Buffer buffer = _others.poll();
73  
74          // consume all other buffers until one of the right size is found
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 }