1//
2//  ========================================================================
3//  Copyright (c) 1995-2014 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
19package 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 */
28public 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}
136