From 32be9184bcab815ed1795889612a2c2c84a17334 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 13 十月 2020 19:24:28 +0800
Subject: [PATCH] Merge branch 'master' into dev
---
src/queue/hashtable.c | 45 +++++++++++++++++++++++++++++++++++----------
1 files changed, 35 insertions(+), 10 deletions(-)
diff --git a/src/queue/hashtable.c b/src/queue/hashtable.c
index eaa3ca6..ed3fe34 100755
--- a/src/queue/hashtable.c
+++ b/src/queue/hashtable.c
@@ -20,6 +20,7 @@
typedef TAILQ_HEAD(tailq_header_t, tailq_entry_t) tailq_header_t;
+
static size_t hashcode(int key);
void hashtable_init(hashtable_t *hashtable )
@@ -30,6 +31,7 @@
hashtable->wlock = SemUtil::get(IPC_PRIVATE, 1);
hashtable->cond = SemUtil::get(IPC_PRIVATE, 1);
hashtable->readcnt = 0;
+
}
@@ -181,11 +183,17 @@
void *hashtable_get(hashtable_t *hashtable, int key) {
- SemUtil::dec(hashtable->mutex);
+ struct timespec timeout = {1, 0};
+ if (SemUtil::dec_timeout(hashtable->mutex, &timeout) != 0) {
+ SemUtil::inc(hashtable->mutex);
+ SemUtil::dec(hashtable->mutex);
+ }
+
hashtable->readcnt++;
if (hashtable->readcnt == 1) {
//鑾峰彇璇诲啓閿�
SemUtil::dec(hashtable->wlock);
+// err_msg(0, "hashtable_get dec %d %d\n", --hashtable->tmp);
}
SemUtil::inc(hashtable->mutex);
// ================
@@ -199,6 +207,7 @@
if(hashtable->readcnt == 0) {
//閲婃斁璇诲啓閿�
SemUtil::inc(hashtable->wlock);
+// err_msg(0, "hashtable_get inc %d\n", ++hashtable->tmp);
//閫氱煡鍐�
SemUtil::set(hashtable->cond, 1);
}
@@ -207,14 +216,22 @@
}
void hashtable_put(hashtable_t *hashtable, int key, void *value) {
- SemUtil::dec(hashtable->mutex);
+ struct timespec timeout = {2, 0};
+ if (SemUtil::dec_timeout(hashtable->mutex, &timeout) != 0) {
+ SemUtil::inc(hashtable->mutex);
+ SemUtil::dec(hashtable->mutex);
+ }
// 璁剧疆璇讳紭鍏堢骇楂�
while (hashtable->readcnt > 0)
{
SemUtil::set(hashtable->cond, 0);
SemUtil::inc(hashtable->mutex);
//绛夊緟鍐欓�氱煡
- SemUtil::dec(hashtable->cond);
+ if (SemUtil::dec_timeout(hashtable->cond, &timeout) != 0) {
+ hashtable->readcnt = 0;
+ SemUtil::inc(hashtable->cond);
+ SemUtil::dec(hashtable->cond);
+ }
SemUtil::dec(hashtable->mutex);
@@ -222,16 +239,20 @@
SemUtil::inc(hashtable->mutex);
//鑾峰彇璇诲啓閿�
+
SemUtil::dec(hashtable->wlock);
+ // err_msg(0, "hashtable_put dec %d\n", --hashtable->tmp);
_hashtable_put(hashtable, key, value);
+
//閲婃斁璇诲啓閿�
SemUtil::inc(hashtable->wlock);
+// err_msg(0, "hashtable_put inc %d\n", ++hashtable->tmp);
}
-static inline void _hashtable_foreach(hashtable_t *hashtable, std::function<void(int, void *)> cb) {
+static inline void _hashtable_foreach(hashtable_t *hashtable, std::function<void(int, void *)> cb) {
tailq_entry_t *item;
for (int i = 0; i < MAPSIZE; i++) {
tailq_header_t *my_tailq_head = hashtable->array[i] ;
@@ -247,7 +268,7 @@
}
-void hashtable_foreach(hashtable_t *hashtable, hashtable_foreach_cb cb) {
+void hashtable_foreach(hashtable_t *hashtable, std::function<void(int, void *)> cb) {
SemUtil::dec(hashtable->mutex);
hashtable->readcnt++;
if (hashtable->readcnt == 1) {
@@ -275,7 +296,6 @@
}
-
std::set<int> * hashtable_keyset(hashtable_t *hashtable) {
std::set<int> *keyset = new std::set<int>;
tailq_entry_t *item;
@@ -296,15 +316,20 @@
int hashtable_alloc_key(hashtable_t *hashtable) {
int key = START_KEY;
- SemUtil::dec(hashtable->wlock);
+
+ struct timespec timeout = {1, 0};
+ if (SemUtil::dec_timeout(hashtable->wlock, &timeout) != 0) {
+ SemUtil::inc(hashtable->wlock);
+ SemUtil::dec(hashtable->wlock);
+ }
while(_hashtable_get(hashtable, key) != NULL) {
key++;
}
-
+ // 鍗犵敤key
_hashtable_put(hashtable, key, (void *)1);
+
SemUtil::inc(hashtable->wlock);
+// err_msg(0, "hashtable_alloc_key inc %d\n", ++hashtable->tmp);
return key;
}
-
-
--
Gitblit v1.8.0