From 8c42a659c0cc9178d1f1305acb41dfbf4a8697ef Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 22 十月 2020 16:20:26 +0800
Subject: [PATCH] update
---
src/queue/hashtable.c | 92 ++++++++++++++++++++++++++++++++++++++-------
1 files changed, 77 insertions(+), 15 deletions(-)
diff --git a/src/queue/hashtable.c b/src/queue/hashtable.c
index 1fa6266..ed3fe34 100755
--- a/src/queue/hashtable.c
+++ b/src/queue/hashtable.c
@@ -3,6 +3,7 @@
#include "mm.h"
#include "sem_util.h"
#include <set>
+#include <functional>
typedef struct tailq_entry_t
{
@@ -19,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 )
@@ -29,10 +31,11 @@
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)
+static inline void *_hashtable_get(hashtable_t *hashtable, int key)
{
size_t code = hashcode(key);
tailq_entry_t *item;
@@ -54,7 +57,7 @@
}
-void * _hashtable_put(hashtable_t *hashtable, int key, void *value)
+static inline void * _hashtable_put(hashtable_t *hashtable, int key, void *value)
{
size_t code = hashcode(key);
void *oldvalue;
@@ -180,21 +183,31 @@
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);
+ // ================
void * res = _hashtable_get(hashtable, key);
+
+ // ==================
SemUtil::dec(hashtable->mutex);
hashtable->readcnt--;
if(hashtable->readcnt == 0) {
//閲婃斁璇诲啓閿�
SemUtil::inc(hashtable->wlock);
+// err_msg(0, "hashtable_get inc %d\n", ++hashtable->tmp);
//閫氱煡鍐�
SemUtil::set(hashtable->cond, 1);
}
@@ -203,13 +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);
@@ -217,15 +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);
}
-void hashtable_foreach(hashtable_t *hashtable, hashtable_foreach_cb 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] ;
@@ -240,18 +267,34 @@
}
}
-int hashtable_alloc_key(hashtable_t *hashtable) {
- int key = START_KEY;
- SemUtil::dec(hashtable->wlock);
- while(_hashtable_get(hashtable, key) != NULL) {
- key++;
- }
+void hashtable_foreach(hashtable_t *hashtable, std::function<void(int, void *)> cb) {
+ SemUtil::dec(hashtable->mutex);
+ hashtable->readcnt++;
+ if (hashtable->readcnt == 1) {
+ //鑾峰彇璇诲啓閿�
+ SemUtil::dec(hashtable->wlock);
+ }
+ SemUtil::inc(hashtable->mutex);
- _hashtable_put(hashtable, key, (void *)1);
- SemUtil::inc(hashtable->wlock);
- return key;
+ // ==================
+
+ _hashtable_foreach(hashtable, cb);
+
+ // ==================
+
+ SemUtil::dec(hashtable->mutex);
+ hashtable->readcnt--;
+ if(hashtable->readcnt == 0) {
+ //閲婃斁璇诲啓閿�
+ SemUtil::inc(hashtable->wlock);
+ //閫氱煡鍐�
+ SemUtil::set(hashtable->cond, 1);
+ }
+ SemUtil::inc(hashtable->mutex);
+
}
+
std::set<int> * hashtable_keyset(hashtable_t *hashtable) {
std::set<int> *keyset = new std::set<int>;
@@ -271,3 +314,22 @@
}
+int hashtable_alloc_key(hashtable_t *hashtable) {
+ int key = START_KEY;
+
+ 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