Sirikata
|
00001 /* Sirikata 00002 * BatchedBuffer.hpp 00003 * 00004 * Copyright (c) 2010, Ewen Cheslack-Postava 00005 * All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions are 00009 * met: 00010 * * Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * * Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in 00014 * the documentation and/or other materials provided with the 00015 * distribution. 00016 * * Neither the name of Sirikata nor the names of its contributors may 00017 * be used to endorse or promote products derived from this software 00018 * without specific prior written permission. 00019 * 00020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 00021 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 00022 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 00023 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 00024 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 00027 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 00028 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 00029 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 00030 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00031 */ 00032 00033 #ifndef _SIRIKATA_BATCHED_BUFFER_HPP_ 00034 #define _SIRIKATA_BATCHED_BUFFER_HPP_ 00035 00036 #include <sirikata/core/util/Platform.hpp> 00037 #include <boost/thread/recursive_mutex.hpp> 00038 00039 namespace Sirikata { 00040 00041 template<typename T> 00042 struct Batch { 00043 static const uint16 max_size = 65535; 00044 uint16 size; 00045 T items[max_size]; 00046 00047 Batch() : size(0) {} 00048 00049 bool full() const { 00050 return (size >= max_size); 00051 } 00052 00053 uint32 avail() const { 00054 return max_size - size; 00055 } 00056 }; 00057 00058 class BatchedBuffer { 00059 public: 00060 struct IOVec { 00061 IOVec() 00062 : base(NULL), 00063 len(0) 00064 {} 00065 00066 IOVec(const void* _b, uint32 _l) 00067 : base(_b), 00068 len(_l) 00069 {} 00070 00071 const void* base; 00072 uint32 len; 00073 }; 00074 00075 BatchedBuffer(); 00076 00077 void write(const IOVec* iov, uint32 iovcnt); 00078 00079 void flush(); 00080 00081 // write the buffer to an ostream 00082 void store(FILE* os); 00083 00084 bool empty(); 00085 private: 00086 // write the specified number of bytes from the pointer to the buffer 00087 void write(const void* buf, uint32 nbytes); 00088 00089 typedef Batch<uint8> ByteBatch; 00090 boost::recursive_mutex mMutex; 00091 ByteBatch* filling; 00092 std::deque<ByteBatch*> batches; 00093 }; 00094 00095 } // namespace Sirikata 00096 00097 #endif //_SIRIKATA_BATCHED_BUFFER_HPP_