}
/* Alloc block */
bf->bitArray = GNUNET_malloc_large (size);
+ if (bf->bitArray == NULL)
+ {
+ if (bf->fh != NULL)
+ GNUNET_DISK_file_close (bf->fh);
+ GNUNET_free_non_null (bf->filename);
+ GNUNET_free (bf);
+ return NULL;
+ }
bf->bitArraySize = size;
bf->addressesPerElement = k;
memset (bf->bitArray, 0, bf->bitArraySize);
bf->filename = NULL;
bf->fh = NULL;
bf->bitArray = GNUNET_malloc_large (size);
+ if (bf->bitArray == NULL)
+ {
+ GNUNET_free (bf);
+ return NULL;
+ }
bf->bitArraySize = size;
bf->addressesPerElement = k;
if (data != NULL)
const char *data, size_t size)
{
unsigned int i;
+ unsigned int n;
+ unsigned long long* fc;
+ const unsigned long long* dc;
if (NULL == bf)
return GNUNET_YES;
if (bf->bitArraySize != size)
return GNUNET_SYSERR;
- /* FIXME: we could do this 4-8x faster by
- going over int/long arrays */
- for (i = 0; i < size; i++)
+ fc = (unsigned long long*) bf->bitArray;
+ dc = (const unsigned long long*) data;
+ n = size / sizeof (unsigned long long);
+
+ for (i = 0; i < n; i++)
+ fc[i] |= dc[i];
+ for (i = n * sizeof(unsigned long long); i < size; i++)
bf->bitArray[i] |= data[i];
return GNUNET_OK;
}