From 5df79c53745fde5d6c3340a2979b1429cd5892c1 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Sat, 8 Oct 2011 20:30:28 +0200 Subject: Initial import of htcd system 1.0 Signed-off-by: Henrik Rydberg --- src/mt/uniheap.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/mt/uniheap.h (limited to 'src/mt/uniheap.h') diff --git a/src/mt/uniheap.h b/src/mt/uniheap.h new file mode 100644 index 0000000..39c3d34 --- /dev/null +++ b/src/mt/uniheap.h @@ -0,0 +1,65 @@ +/************************************************************************* + * + * HTCd - Copyright (C) 1998-2006 Henrik Rydberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef UNIHEAPH +#define UNIHEAPH + +#include +#include +#include + +// NOTE - must be in extern/static scope, or zeroed before use +// by a call to init. constructors will fail badly. +// A minimum of sizeof(T)==4 is required. +// Furthermore, the upper limit of heap space is 1Gb. + +template class uniheap { +public: + static const int maxchunks=24; + + void init() { + head=0; + chunk=0; + nchunks=0; + memset(&mutex,0,sizeof(mutex_t)); + } + + char* push() { MLOCK(mutex); char* p=news(); head=*(char**)p; return p; } + void pop(void* p) { MLOCK(mutex); *((char**)p)=head; head=(char*)p; } + int chunksize() const { return chunk; } +protected: + char* news() { + if(!head) { + if(!chunk) chunk=N<<4; + if(nchunks>=maxchunks) throw((int)0); + head=chunks[nchunks++]=(char*)malloc(chunk); + if(!head) throw((int)0); + for(int i=0;i