wangzhengquan
2021-01-20 a4d18d6ab3216ce1bf8052f0fdc4ea34bc6385e8
src/shm/hashtable.cpp
@@ -34,7 +34,7 @@
  hashtable->wlock = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->cond = SemUtil::get(IPC_PRIVATE, 1);
  hashtable->readcnt = 0;
printf("hashtable->mutex=%d\n", hashtable->mutex);
}
void hashtable_destroy(hashtable_t *hashtable) {
@@ -206,19 +206,19 @@
  int rv;
  rv = SemUtil::dec(hashtable->mutex);
  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,25 +228,25 @@
  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");
  }
  return res;
}