wangzhengquan
2020-07-13 e1e97f1f98baf82efcd5825d7c7a7b4b1b2f2e40
queue/hashtable.c
@@ -1,7 +1,7 @@
#include "usg_common.h"
#include "hashtable.h"
#include "mm.h"
#include "sem_util.h"
typedef struct tailq_entry_t
{
@@ -14,6 +14,9 @@
  TAILQ_ENTRY(tailq_entry_t) joint;
} tailq_entry_t;
static int hashtable_mutex;
#define START_KEY 1000
typedef  TAILQ_HEAD(tailq_header_t, tailq_entry_t) tailq_header_t;
@@ -21,11 +24,16 @@
void hashtable_init(hashtable_t *hashtable )
{
  memset(hashtable, 0, sizeof(hashtable_t));
  hashtable->mutex = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->wlock = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->cond = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->readcnt = 0;
}
void *hashtable_get(hashtable_t *hashtable, int key)
void *_hashtable_get(hashtable_t *hashtable, int key)
{
  size_t code = hashcode(key);
  tailq_entry_t *item;
@@ -47,7 +55,7 @@
}
void* hashtable_put(hashtable_t *hashtable, int key, void *value)
void* _hashtable_put(hashtable_t *hashtable, int key, void *value)
{
  size_t code = hashcode(key);
  void *oldvalue;
@@ -158,3 +166,61 @@
  return key % MAPSIZE;
  /*printf("hashfun = %ld\n", code);*/
}
int hashtable_alloc_key(hashtable_t *hashtable) {
  int key = START_KEY;
  SemUtil::dec(hashtable->wlock);
  while(_hashtable_get(hashtable, key) != NULL) {
    key++;
  }
  //_hashtable_put(hashtable, key, (void *)1);
  SemUtil::inc(hashtable->wlock);
  return key;
}
void *hashtable_get(hashtable_t *hashtable, int key) {
   SemUtil::dec(hashtable->mutex);
   hashtable->readcnt++;
   if (hashtable->readcnt == 1) {
    //获取读写锁
    SemUtil::dec(hashtable->wlock);
   }
   SemUtil::inc(hashtable->mutex);
   void * res = _hashtable_get(hashtable, key);
   SemUtil::dec(hashtable->mutex);
   hashtable->readcnt--;
   if(hashtable->readcnt == 0) {
    //释放读写锁
    SemUtil::inc(hashtable->wlock);
  //通知写
    SemUtil::set(hashtable->cond, 1);
   }
   SemUtil::inc(hashtable->mutex);
   return res;
}
void* hashtable_put(hashtable_t *hashtable, int key, void *value) {
  SemUtil::dec(hashtable->mutex);
  while (hashtable->readcnt > 0)
  {
    SemUtil::set(hashtable->cond, 0);
    SemUtil::inc(hashtable->mutex);
    //等待写通知
    SemUtil::dec(hashtable->cond);
    SemUtil::dec(hashtable->mutex);
  }
  SemUtil::inc(hashtable->mutex);
  //获取读写锁
  SemUtil::dec(hashtable->wlock);
  _hashtable_put(hashtable, key, value);
  //释放读写锁
  SemUtil::inc(hashtable->wlock);
}