wangzhengquan
2021-01-21 2c65db46500207f8445aa4baa53bfbb6602e0e18
src/shm/hashtable.cpp
@@ -35,6 +35,12 @@
  hashtable->cond = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->readcnt = 0;
  FILE * semfile = fopen("./sem.txt", "w+");
  if(semfile == NULL) {
    err_exit(errno, "fopen");
  }
  fprintf(semfile, "hashtable->mutex=%d\n", hashtable->mutex);
  fclose(semfile);
}
void hashtable_destroy(hashtable_t *hashtable) {
@@ -202,23 +208,27 @@
}
void *hashtable_get(hashtable_t *hashtable, int key) {
  LoggerFactory::getLogger()->debug( "==========hashtable_get before 1");
  int rv;
  rv = SemUtil::dec(hashtable->mutex);
  LoggerFactory::getLogger()->debug( "==========hashtable_get before 2");
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
    LoggerFactory::getLogger()->error(rv, "hashtable_get 1");
  }
  hashtable->readcnt++;
  if (hashtable->readcnt == 1) {
    //获取读写锁
    rv = SemUtil::dec(hashtable->wlock);
    if(rv != 0) {
      LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
      LoggerFactory::getLogger()->error(rv, "hashtable_get 2");
    }
  }
  rv = SemUtil::inc(hashtable->mutex);
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
    LoggerFactory::getLogger()->error(rv, "hashtable_get 3");
  }
  // ================
@@ -228,33 +238,34 @@
  rv = SemUtil::dec(hashtable->mutex);
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
    LoggerFactory::getLogger()->error(rv, "hashtable_get 4");
  }
  hashtable->readcnt--;
  if(hashtable->readcnt == 0) {
    //释放读写锁
    rv = SemUtil::inc(hashtable->wlock);
    if(rv != 0) {
      LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
      LoggerFactory::getLogger()->error(rv, "hashtable_get 5");
    }
    //通知写
    rv = SemUtil::set(hashtable->cond, 1);
    if(rv != 0) {
      LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
      LoggerFactory::getLogger()->error(rv, "hashtable_get 6");
    }
  }
  rv = SemUtil::inc(hashtable->mutex);
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_get\n");
    LoggerFactory::getLogger()->error(rv, "hashtable_get 7");
  }
  LoggerFactory::getLogger()->debug( "==========hashtable_get after");
  return res;
}
void hashtable_put(hashtable_t *hashtable, int key, void *value) {
  int rv;
  LoggerFactory::getLogger()->debug( "==========hashtable_put before");
  rv = SemUtil::dec(hashtable->mutex);
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_put\n");
@@ -300,6 +311,8 @@
  if(rv != 0) {
    LoggerFactory::getLogger()->error(rv, "hashtable_put\n");
  }
  LoggerFactory::getLogger()->debug( "==========hashtable_put after");
}