#ifndef HASH__H
#define HASH__H 1

#include <stddef.h>				  /* For size_t     */
#include "rdwr.h"

#define READ_LOCK(__hash, __nodeval) \
pthread_rdwr_rlock_np( &(__hash->node[__nodeval]->rwlock))
#define READ_UNLOCK(__hash, __nodeval) \
pthread_rdwr_runlock_np( &(__hash->node[__nodeval]->rwlock))
#define WRITE_LOCK(__hash, __nodeval) \
pthread_rdwr_wlock_np( &(__hash->node[__nodeval]->rwlock))
#define WRITE_UNLOCK(__hash, __nodeval) \
pthread_rdwr_wunlock_np( &(__hash->node[__nodeval]->rwlock))

typedef struct 
{
   void        *data;
   unsigned int size;
} 
datum_t;

typedef struct bucket
{
   datum_t *key;
   datum_t *val;
   struct bucket *next;
}
bucket_t;

typedef struct
{
   bucket_t *bucket;
   pthread_rdwr_t rwlock;    
} 
node_t;

typedef struct
{
  size_t size;
  node_t **node;
}
hash_t;

hash_t  *hash_create (size_t size);
void     hash_destroy(hash_t *hash);

datum_t *hash_insert (datum_t *key, datum_t *val, hash_t *hash);
datum_t *hash_delete (datum_t *key, hash_t *hash);

datum_t *hash_lookup (datum_t *key, hash_t *hash);
int hash_foreach (hash_t *hash, int (*func)(datum_t *key, datum_t *val, void *), void *arg);
int hash_walkfrom (hash_t *hash, size_t from, int (*func)(datum_t *key, datum_t *val, void *), void *arg);

datum_t *datum_new  ( void *data, size_t size );
void     datum_free ( datum_t *datum );

size_t hashval ( datum_t *key, hash_t *hash );

#endif /* HASH__H */


syntax highlighted by Code2HTML, v. 0.9.1