Author: grothoff Date: 2006-06-24 20:29:57 -0700 (Sat, 24 Jun 2006) New Revision: 3051
Modified: GNUnet/src/include/gnunet_util_containers.h GNUnet/src/util/README GNUnet/src/util/containers/Makefile.am GNUnet/src/util/containers/bloomfilter.c GNUnet/src/util/containers/hashtable.c GNUnet/src/util/containers/vector.c GNUnet/src/util/cron/cron.c Log: sync Modified: GNUnet/src/include/gnunet_util_containers.h =================================================================== --- GNUnet/src/include/gnunet_util_containers.h 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/include/gnunet_util_containers.h 2006-06-25 03:29:57 UTC (rev 3051) @@ -27,6 +27,9 @@ * @author Gerd Knorr <[EMAIL PROTECTED]> * @author Ioana Patrascu * @author Tzvetan Horozov + * @author Nils Durner + * + * TODO: refactor APIs (more consistent naming conventions, etc.) */ #ifndef GNUNET_UTIL_CONTAINERS_H @@ -34,6 +37,7 @@ /* add error and config prototypes */ #include "gnunet_util.h" +#include "gnunet_util_crypto.h" #ifdef __cplusplus extern "C" { @@ -71,7 +75,8 @@ * element (number of bits set per element in the set) * @return the bloomfilter */ -struct Bloomfilter * loadBloomfilter(const char * filename, +struct Bloomfilter * loadBloomfilter(struct GE_Context * ectx, + const char * filename, unsigned int size, unsigned int k); @@ -310,8 +315,11 @@ * @param value the value associated with the key * @return 0 if successful, -1 if an error was encountered */ -int ht_put(struct HashTable *hashTable, const void *key, const unsigned int keylen, - void *value, const unsigned int valuelen); +int ht_put(struct HashTable *hashTable, + const void *key, + const unsigned int keylen, + void *value, + const unsigned int valuelen); /** * @brief retrieves the value of a key in a HashTable @@ -321,15 +329,20 @@ * @param valuelen the length of the value * @return YES if found, NO otherwise */ -int ht_get(const struct HashTable *hashTable, const void *key, const unsigned int - keylen, void **value, unsigned int *valuelen); +int ht_get(const struct HashTable *hashTable, + const void *key, + const unsigned int keylen, + void **value, + unsigned int *valuelen); /** * @brief removes a key/value pair from a HashTable * @param hashTable the HashTable to remove the key/value pair from * @param key the key specifying the key/value pair to be removed */ -void ht_remove(struct HashTable *hashTable, const void *key, const unsigned int keylen); +void ht_remove(struct HashTable *hashTable, + const void *key, + const unsigned int keylen); /** * @brief removes all key/value pairs from a HashTable @@ -365,7 +378,8 @@ * specified, an appropriate number of buckets is * automatically calculated. */ -void ht_rehash(struct HashTable *hashTable, long numOfBuckets); +void ht_rehash(struct HashTable *hashTable, + long numOfBuckets); /** * @brief sets the ideal element-to-bucket ratio of a HashTable @@ -393,8 +407,10 @@ * is considered unacceptably high, a value of 0.0 can * be specified. */ -void ht_setIdealRatio(struct HashTable *hashTable, float idealRatio, - float lowerRehashThreshold, float upperRehashThreshold); +void ht_setIdealRatio(struct HashTable *hashTable, + float idealRatio, + float lowerRehashThreshold, + float upperRehashThreshold); #define HT_PUT(ht, key, val) ht_put(ht, key, sizeof(key), val, sizeof(val)) #define HT_GET(ht, key, val, vallen) ht_get(ht, key, sizeof(key), val, vallen) Modified: GNUnet/src/util/README =================================================================== --- GNUnet/src/util/README 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/README 2006-06-25 03:29:57 UTC (rev 3051) @@ -13,16 +13,16 @@ util: main utility library (depends on all of the above) => these are all statically linked into gnunetutil.so --------- TODO ---------- - util/config_impl: implementation of config API (depends on gnunetutil.so) => linked to gnunetutil_config.so -util/containers: implementation of bloomfilter/vector/hashset (depends on gnunetutil.so) - => linked to gnunetutil_containers.so (also requires libgnunetutil_crypto) + +-------- TODO ---------- util/cron: periodic job execution (depends on gnunetutil.so) => linked to gnunetutil_cron.so util/crypto: implementation of crypto API (depends on gnunetutil.so) => linked to gnunetutil_crypto.so +util/containers: implementation of bloomfilter/vector/hashset (depends on gnunetutil.so) + => linked to gnunetutil_containers.so (also requires libgnunetutil_crypto) util/loggers: specific logging implementations (depends on gnunetutil.so) => linked to gnunetutil_logging.so Modified: GNUnet/src/util/containers/Makefile.am =================================================================== --- GNUnet/src/util/containers/Makefile.am 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/containers/Makefile.am 2006-06-25 03:29:57 UTC (rev 3051) @@ -6,7 +6,7 @@ libgnunetutil_containers_la_LIBADD = \ $(top_builddir)/src/util/libgnunetutil.la \ - $(top_builddir)/src/util/libgnunetutil_crypto.la + $(top_builddir)/src/util/crypto/libgnunetutil_crypto.la libgnunetutil_containers_la_LDFLAGS = \ -version-info 0:0:0 Modified: GNUnet/src/util/containers/bloomfilter.c =================================================================== --- GNUnet/src/util/containers/bloomfilter.c 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/containers/bloomfilter.c 2006-06-25 03:29:57 UTC (rev 3051) @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - (C) 2001, 2002, 2003, 2004 Christian Grothoff (and other contributing authors) + (C) 2001, 2002, 2003, 2004, 2006 Christian Grothoff (and other contributing authors) GNUnet is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -18,7 +18,7 @@ Boston, MA 02111-1307, USA. */ /** - * @file util/bloomfilter.c + * @file util/containers/bloomfilter.c * @brief data structure used to reduce disk accesses. * * The idea basically: Create a signature for each element in the @@ -40,19 +40,42 @@ */ #include "gnunet_util.h" +#include "gnunet_util_containers.h" #include "platform.h" typedef struct Bloomfilter { - /** The bit counter file on disk */ + + /** + * Concurrency control + */ + struct MUTEX * lock; + + + /** + * The actual bloomfilter bit array + */ + char * bitArray; + + /** + * For error handling. + */ + struct GE_Context * ectx; + + /** + * The bit counter file on disk + */ int fd; - /** How many bits we set for each stored element */ + + /** + * How many bits we set for each stored element + */ unsigned int addressesPerElement; - /** The actual bloomfilter bit array */ - char * bitArray; - /** Size of bitArray in bytes */ + + /** + * Size of bitArray in bytes + */ unsigned int bitArraySize; - /** Concurrency control */ - Mutex lock; + } Bloomfilter; @@ -130,12 +153,15 @@ setBit(bitArray, bitIdx); /* Update the counter file on disk */ - GNUNET_ASSERT(fd != -1); + GE_ASSERT(NULL, + fd != -1); fileSlot = bitIdx / 2; targetLoc = bitIdx % 2; if (fileSlot != (unsigned int) lseek(fd, fileSlot, SEEK_SET)) - DIE_STRERROR("lseek"); + GE_DIE_STRERROR(NULL, + GE_ADMIN | GE_USER | GE_FATAL | GE_IMMEDIATE, + "lseek"); value = 0; READ(fd, &value, @@ -153,9 +179,14 @@ } value = ((high<<4) | low); if (fileSlot != (unsigned int) lseek(fd, fileSlot, SEEK_SET)) - DIE_STRERROR("lseek"); + GE_DIE_STRERROR(NULL, + GE_ADMIN | GE_USER | GE_FATAL | GE_IMMEDIATE, + "lseek"); if (1 != WRITE(fd, &value, 1)) - DIE_STRERROR("write"); + GE_DIE_STRERROR(NULL, + GE_ADMIN | GE_USER | GE_FATAL | GE_IMMEDIATE, + "write"); + } /** @@ -175,7 +206,7 @@ unsigned int low; unsigned int targetLoc; - GNUNET_ASSERT(fd != -1); + GE_ASSERT(NULL, fd != -1); /* Each char slot in the counter file holds two 4 bit counters */ fileSlot = bitIdx / 2; targetLoc = bitIdx % 2; @@ -204,7 +235,9 @@ value = ((high<<4) | low); lseek(fd, fileSlot, SEEK_SET); if (1 != WRITE(fd, &value, 1)) - DIE_STRERROR("write"); + GE_DIE_STRERROR(NULL, + GE_ADMIN | GE_USER | GE_FATAL | GE_IMMEDIATE, + "write"); } #define BUFFSIZE 65536 @@ -224,7 +257,7 @@ if (fd == -1) return SYSERR; - buffer = (char*)MALLOC(BUFFSIZE); + buffer = MALLOC(BUFFSIZE); memset(buffer, 0, BUFFSIZE); lseek(fd, 0, SEEK_SET); @@ -237,7 +270,9 @@ bytesleft = 0; } if(res == -1) { - LOG_STRERROR(LOG_WARNING, "write"); + GE_DIE_STRERROR(NULL, + GE_ADMIN | GE_USER | GE_FATAL | GE_IMMEDIATE, + "write"); FREE(buffer); return SYSERR; } @@ -341,9 +376,10 @@ * @param bit the bit to test * @param arg pointer set to NO if bit is not set */ -static void testBitCallback(const Bloomfilter * bf, +static void testBitCallback(Bloomfilter * bf, unsigned int bit, - int * arg) { + void * cls) { + int * arg = cls; if (NO == testBit(bf->bitArray, bit)) *arg = NO; @@ -361,7 +397,8 @@ * element (number of bits set per element in the set) * @return the bloomfilter */ -Bloomfilter * loadBloomfilter(const char * filename, +Bloomfilter * loadBloomfilter(struct GE_Context * ectx, + const char * filename, unsigned int size, unsigned int k) { Bloomfilter * bf; @@ -382,23 +419,27 @@ size = ui; /* make sure it's a power of 2 */ bf = (Bloomfilter *) MALLOC(sizeof(Bloomfilter)); - + bf->ectx = ectx; /* Try to open a bloomfilter file */ #ifndef _MSC_VER - bf->fd = fileopen(filename, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); + bf->fd = disk_file_open(ectx, + filename, + O_RDWR|O_CREAT, + S_IRUSR|S_IWUSR); #else - bf->fd = fileopen(filename, O_WRONLY|O_CREAT, S_IREAD|S_IWRITE); + bf->fd = disk_file_open(ectx, + filename, + O_WRONLY|O_CREAT, + S_IREAD|S_IWRITE); #endif if (-1 == bf->fd) { - LOG_FILE_STRERROR(LOG_FAILURE, "open", filename); FREE(bf); return NULL; } /* Alloc block */ - MUTEX_CREATE_RECURSIVE(&bf->lock); - bf->bitArray - = (char *) xmalloc_unchecked_(size, __FILE__, __LINE__); + bf->lock = MUTEX_CREATE(YES); + bf->bitArray = MALLOC_LARGE(size); bf->bitArraySize = size; bf->addressesPerElement = k; memset(bf->bitArray, @@ -406,7 +447,7 @@ bf->bitArraySize); /* Read from the file what bits we can */ - rbuff = (char*)MALLOC(BUFFSIZE); + rbuff = MALLOC(BUFFSIZE); pos = 0; while (pos < size*8) { int res; @@ -442,8 +483,10 @@ void freeBloomfilter(Bloomfilter * bf) { if (NULL == bf) return; - MUTEX_DESTROY(&bf->lock); - closefile(bf->fd); + MUTEX_DESTROY(bf->lock); + disk_file_close(bf->ectx, + NULL, /* FIXME: keep filename around! */ + bf->fd); FREE(bf->bitArray); FREE(bf); } @@ -457,13 +500,13 @@ if (NULL == bf) return; - MUTEX_LOCK(&bf->lock); + MUTEX_LOCK(bf->lock); memset(bf->bitArray, 0, bf->bitArraySize); makeEmptyFile(bf->fd, bf->bitArraySize * 4); - MUTEX_UNLOCK(&bf->lock); + MUTEX_UNLOCK(bf->lock); } @@ -480,13 +523,13 @@ if (NULL == bf) return YES; - MUTEX_LOCK(&bf->lock); + MUTEX_LOCK(bf->lock); res = YES; iterateBits(bf, - (BitIterator)&testBitCallback, + &testBitCallback, &res, e); - MUTEX_UNLOCK(&bf->lock); + MUTEX_UNLOCK(bf->lock); return res; } @@ -501,12 +544,12 @@ if (NULL == bf) return; - MUTEX_LOCK(&bf->lock); + MUTEX_LOCK(bf->lock); iterateBits(bf, &incrementBitCallback, NULL, e); - MUTEX_UNLOCK(&bf->lock); + MUTEX_UNLOCK(bf->lock); } /** @@ -519,12 +562,12 @@ const HashCode512 * e) { if(NULL == bf) return; - MUTEX_LOCK(&bf->lock); + MUTEX_LOCK(bf->lock); iterateBits(bf, &decrementBitCallback, NULL, e); - MUTEX_UNLOCK(&bf->lock); + MUTEX_UNLOCK(bf->lock); } /** @@ -546,7 +589,7 @@ HashCode512 * e; unsigned int i; - MUTEX_LOCK(&bf->lock); + MUTEX_LOCK(bf->lock); FREE(bf->bitArray); i = 1; while (i < size) @@ -567,7 +610,7 @@ FREE(e); e = iterator(iterator_arg); } - MUTEX_UNLOCK(&bf->lock); + MUTEX_UNLOCK(bf->lock); } /* ******************** end of bloomfilter.c *********** */ Modified: GNUnet/src/util/containers/hashtable.c =================================================================== --- GNUnet/src/util/containers/hashtable.c 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/containers/hashtable.c 2006-06-25 03:29:57 UTC (rev 3051) @@ -29,6 +29,7 @@ */ #include "gnunet_util.h" +#include "gnunet_util_containers.h" #include "platform.h" typedef struct KeyValuePair { Modified: GNUnet/src/util/containers/vector.c =================================================================== --- GNUnet/src/util/containers/vector.c 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/containers/vector.c 2006-06-25 03:29:57 UTC (rev 3051) @@ -18,7 +18,7 @@ */ /** - * @file util/vector.c + * @file util/containers/vector.c * @brief Implementation of a dynamic array * @author Antti Salonen, Christian Grothoff * @version vector.c,v 1.3 2004/05/02 20:22:52 aksalone Exp @@ -41,6 +41,7 @@ #include "platform.h" #include "gnunet_util.h" +#include "gnunet_util_containers.h" typedef struct Vector { unsigned int VECTOR_SEGMENT_SIZE; @@ -624,9 +625,7 @@ VectorSegment *vs; size_t i = 0; - rvalue = xmalloc_unchecked_(v->size * sizeof (void *), - __FILE__, - __LINE__); + rvalue = MALLOC_LARGE(v->size * sizeof (void *)); for (vs = v->segmentsHead; vs; vs = vs->next) { memcpy (rvalue + i, vs->data, Modified: GNUnet/src/util/cron/cron.c =================================================================== --- GNUnet/src/util/cron/cron.c 2006-06-25 03:28:16 UTC (rev 3050) +++ GNUnet/src/util/cron/cron.c 2006-06-25 03:29:57 UTC (rev 3051) @@ -34,6 +34,7 @@ * then run the actual job. */ +#include "gnunet_util.h" #include "gnunet_util_cron.h" #include "platform.h" _______________________________________________ GNUnet-SVN mailing list GNUnet-SVN@gnu.org http://lists.gnu.org/mailman/listinfo/gnunet-svn