View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.io;
20  
21  
22  
23  /* ------------------------------------------------------------ */
24  /** Abstract Buffer pool.
25   * simple unbounded pool of buffers for header, request and response sizes.
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 }