X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Flib%2Fhtable.h;h=48dcc2ebaca68d7636dbc3eca086dbff12ac23cd;hb=4715eed45b57fd37557fc0ccd65207c835d47080;hp=2918d58025562939e75d547ab42fa82bdbfcc4fa;hpb=8b53e63f96bdd8c0600079fe71cf367729141a84;p=bacula%2Fbacula diff --git a/bacula/src/lib/htable.h b/bacula/src/lib/htable.h index 2918d58025..48dcc2ebac 100644 --- a/bacula/src/lib/htable.h +++ b/bacula/src/lib/htable.h @@ -1,40 +1,64 @@ /* - * Version $Id$ - */ + Bacula® - The Network Backup Solution -/* - Copyright (C) 2000-2003 Kern Sibbald and John Walker + Copyright (C) 2004-2008 Free Software Foundation Europe e.V. - 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. + 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 distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of + 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., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + 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$ */ /* ======================================================================== - * + * * Hash table class -- htable * */ +/* + * 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(((void *)(var))=(tbl)->first(); \ + 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))=(tbl)->next()) + (*((void **)&(var))=(void *)((tbl)->next()))) +#endif + + struct hlink { void *next; /* next hash item */ @@ -42,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 */ @@ -54,10 +85,18 @@ 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(); } void init(void *item, void *link, int tsize = 31); bool insert(char *key, void *item); void *lookup(char *key); @@ -66,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 };