View Javadoc

1   // ========================================================================
2   // Copyright (c) 2004-2009 Mort Bay Consulting Pty. Ltd.
3   // ------------------------------------------------------------------------
4   // All rights reserved. This program and the accompanying materials
5   // are made available under the terms of the Eclipse Public License v1.0
6   // and Apache License v2.0 which accompanies this distribution.
7   // The Eclipse Public License is available at 
8   // http://www.eclipse.org/legal/epl-v10.html
9   // The Apache License v2.0 is available at
10  // http://www.opensource.org/licenses/apache2.0.php
11  // You may elect to redistribute this code under either of these licenses. 
12  // ========================================================================
13  
14  package org.eclipse.jetty.io;
15  
16  
17  
18  /* ------------------------------------------------------------ */
19  /** Abstract Buffer pool.
20   * simple unbounded pool of buffers for header, request and response sizes.
21   *
22   */
23  public class ThreadLocalBuffers extends AbstractBuffers 
24  {
25      /* ------------------------------------------------------------ */
26      private final ThreadLocal<ThreadBuffers> _buffers=new ThreadLocal<ThreadBuffers>()
27      {
28          @Override
29          protected ThreadBuffers initialValue()
30          {
31              return new ThreadBuffers();
32          }
33      };
34  
35      /* ------------------------------------------------------------ */
36      public ThreadLocalBuffers(Buffers.Type headerType, int headerSize, Buffers.Type bufferType, int bufferSize, Buffers.Type otherType)
37      {
38          super(headerType,headerSize,bufferType,bufferSize,otherType);
39      }
40  
41      /* ------------------------------------------------------------ */
42      public Buffer getBuffer()
43      {
44          ThreadBuffers buffers = _buffers.get();
45          if (buffers._buffer!=null)
46          {
47              Buffer b=buffers._buffer;
48              buffers._buffer=null;
49              return b;
50          }
51  
52          if (buffers._other!=null && isBuffer(buffers._other))
53          {
54              Buffer b=buffers._other;
55              buffers._other=null;
56              return b;
57          }
58  
59          return newBuffer();
60      }
61  
62      /* ------------------------------------------------------------ */
63      public Buffer getHeader()
64      {
65          ThreadBuffers buffers = _buffers.get();
66          if (buffers._header!=null)
67          {
68              Buffer b=buffers._header;
69              buffers._header=null;
70              return b;
71          }
72  
73          if (buffers._other!=null && isHeader(buffers._other))
74          {
75              Buffer b=buffers._other;
76              buffers._other=null;
77              return b;
78          }
79  
80          return newHeader();
81      }
82  
83      /* ------------------------------------------------------------ */
84      public Buffer getBuffer(int size)
85      {
86          ThreadBuffers buffers = _buffers.get();
87          if (buffers._other!=null && buffers._other.capacity()==size)
88          {
89              Buffer b=buffers._other;
90              buffers._other=null;
91              return b;
92          }
93  
94          return newBuffer(size);
95      }
96  
97      /* ------------------------------------------------------------ */
98      public void returnBuffer(Buffer buffer)
99      {
100         buffer.clear();
101         if (buffer.isVolatile() || buffer.isImmutable())
102             return;
103         
104         ThreadBuffers buffers = _buffers.get();
105         
106         if (buffers._header==null && isHeader(buffer))
107             buffers._header=buffer;
108         else if (buffers._buffer==null && isBuffer(buffer))
109             buffers._buffer=buffer;
110         else
111             buffers._other=buffer;
112     }
113 
114 
115     /* ------------------------------------------------------------ */
116     @Override
117     public String toString()
118     {
119         return "{{"+getHeaderSize()+","+getBufferSize()+"}}";
120     }
121     
122     /* ------------------------------------------------------------ */
123     /* ------------------------------------------------------------ */
124     protected static class ThreadBuffers
125     {
126         Buffer _buffer;
127         Buffer _header;
128         Buffer _other;
129     }
130 }