wangzhengquan
2021-01-13 940bb9e9238488025bf41eb2b2d3df077274004f
src/shm/hashtable.cpp
@@ -189,11 +189,7 @@
void *hashtable_get(hashtable_t *hashtable, int key) {
  
   if (SemUtil::dec_timeout(hashtable->mutex, &TIMEOUT) != 0) {
    SemUtil::inc(hashtable->mutex);
    SemUtil::dec(hashtable->mutex);
   }
   SemUtil::dec(hashtable->mutex);
   hashtable->readcnt++;
   if (hashtable->readcnt == 1) {
    //获取读写锁
@@ -221,30 +217,21 @@
}
void hashtable_put(hashtable_t *hashtable, int key, void *value) {
  struct timespec timeout = {2, 0};
  if (SemUtil::dec_timeout(hashtable->mutex, &timeout) != 0) {
    SemUtil::inc(hashtable->mutex);
    SemUtil::dec(hashtable->mutex);
  }
  SemUtil::dec(hashtable->mutex);
  // 设置读优先级高
  while (hashtable->readcnt > 0)
  {
    SemUtil::set(hashtable->cond, 0);
    SemUtil::inc(hashtable->mutex);
    //等待写通知
    if (SemUtil::dec_timeout(hashtable->cond, &timeout) != 0) {
      hashtable->readcnt = 0;
      SemUtil::inc(hashtable->cond);
      SemUtil::dec(hashtable->cond);
    }
    SemUtil::dec(hashtable->cond);
    SemUtil::dec(hashtable->mutex);
  }
  SemUtil::inc(hashtable->mutex);
  //获取读写锁
  SemUtil::dec(hashtable->wlock);
 // err_msg(0, "hashtable_put dec %d\n", --hashtable->tmp);
@@ -321,11 +308,7 @@
int hashtable_alloc_key(hashtable_t *hashtable) {
  int key = START_KEY;
  if (SemUtil::dec_timeout(hashtable->wlock, &TIMEOUT) != 0) {
    SemUtil::inc(hashtable->wlock);
    SemUtil::dec(hashtable->wlock);
  }
  SemUtil::dec(hashtable->wlock);
  while(_hashtable_get(hashtable, key) != NULL) {
    key++;