X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fhtable.h;h=48dcc2ebaca68d7636dbc3eca086dbff12ac23cd;hb=4715eed45b57fd37557fc0ccd65207c835d47080;hp=ddf76058593457816cb335df48fc4f5188386c89;hpb=444d14e5e29b052b8710a318bcae9573692b632c;p=bacula%2Fbacula diff --git a/bacula/src/lib/htable.h b/bacula/src/lib/htable.h index ddf7605859..48dcc2ebac 100644 --- a/bacula/src/lib/htable.h +++ b/bacula/src/lib/htable.h @@ -1,19 +1,35 @@ /* - * Version $Id$ - */ -/* - Copyright (C) 2003-2005 Kern Sibbald + Bacula® - The Network Backup Solution + + Copyright (C) 2004-2008 Free Software Foundation Europe e.V. + + The main author of Bacula is Kern Sibbald, with contributions from + many others, a complete list can be found in the file AUTHORS. + This program is Free Software; you can redistribute it and/or + modify it under the terms of version two of the GNU General Public + License as published by the Free Software Foundation and included + in the file LICENSE. - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License - version 2 as ammended with additional clauses defined in the - file LICENSE in the main source directory. + 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. - 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 - the file LICENSE for additional 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 Street, Fifth Floor, Boston, MA + 02110-1301, USA. + Bacula® is a registered trademark of John Walker. + The licensor of Bacula is the Free Software Foundation Europe + (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich, + Switzerland, email:ftf@fsfeurope.org. +*/ +/* + * + * Written by Kern Sibbald, MMIV + * + * Version $Id$ */ /* ======================================================================== @@ -22,13 +38,27 @@ * */ +/* + * BIG_MALLOC is to provide a large malloc service to htable + */ +#define BIG_MALLOC + /* * Loop var through each member of table */ +#ifdef HAVE_TYPEOF +#define foreach_htable(var, tbl) \ + for((var)=(typeof(var))((tbl)->first()); \ + (var); \ + (var)=(typeof(var))((tbl)->next())) +#else #define foreach_htable(var, tbl) \ for((*((void **)&(var))=(void *)((tbl)->first())); \ (var); \ (*((void **)&(var))=(void *)((tbl)->next()))) +#endif + + struct hlink { void *next; /* next hash item */ @@ -36,6 +66,13 @@ struct hlink { uint32_t hash; /* hash for this key */ }; +struct h_mem { + struct h_mem *next; /* next buffer */ + int rem; /* remaining bytes */ + char *mem; /* memory pointer */ + char first[1]; /* first byte */ +}; + class htable : public SMARTALLOC { hlink **table; /* hash table */ int loffset; /* link offset in item */ @@ -48,8 +85,15 @@ class htable : public SMARTALLOC { uint32_t rshift; /* amount to shift down */ hlink *walkptr; /* table walk pointer */ uint32_t walk_index; /* table walk index */ + uint32_t total_size; /* total bytes malloced */ + uint32_t blocks; /* blocks malloced */ +#ifdef BIG_MALLOC + struct h_mem *mem; /* malloced memory blocks */ + void malloc_buf(int size); /* Get a bit buffer */ +#endif void hash_index(char *key); /* produce hash key,index */ void grow_table(); /* grow the table */ + public: htable(void *item, void *link, int tsize = 31); ~htable() { destroy(); } @@ -61,4 +105,8 @@ public: void destroy(); void stats(); /* print stats about the table */ uint32_t size(); /* return size of table */ + char *hash_malloc(int size); /* malloc bytes for a hash entry */ +#ifdef BIG_MALLOC + void hash_free(); /* free all hash allocated bytes */ +#endif };