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