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 | 108 +++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 90 insertions(+), 18 deletions(-)
diff --git a/src/queue/hashtable.c b/src/queue/hashtable.c
index 43c59ce..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;
@@ -91,9 +94,12 @@
size_t code = hashcode(key);
tailq_entry_t *item;
void *oldvalue;
+
+ SemUtil::dec(hashtable->wlock);
tailq_header_t *my_tailq_head = hashtable->array[code] ;
if ( my_tailq_head == NULL)
{
+ SemUtil::inc(hashtable->wlock);
return NULL;
}
else
@@ -108,11 +114,12 @@
/* mm_free the item as we don't need it anymore. */
mm_free(item);
-
+ SemUtil::inc(hashtable->wlock);
return oldvalue;
}
}
}
+ SemUtil::inc(hashtable->wlock);
return NULL;
}
@@ -124,6 +131,7 @@
void hashtable_removeall(hashtable_t *hashtable)
{
tailq_entry_t *item;
+ SemUtil::dec(hashtable->wlock);
for (int i = 0; i < MAPSIZE; i++)
{
tailq_header_t *my_tailq_head = hashtable->array[i] ;
@@ -139,6 +147,7 @@
mm_free(my_tailq_head);
hashtable->array[i] = NULL;
}
+ SemUtil::inc(hashtable->wlock);
}
/**
@@ -171,35 +180,34 @@
}
-int hashtable_alloc_key(hashtable_t *hashtable) {
- int key = START_KEY;
- SemUtil::dec(hashtable->wlock);
- while(_hashtable_get(hashtable, key) != NULL) {
- key++;
- }
-
- _hashtable_put(hashtable, key, (void *)1);
- SemUtil::inc(hashtable->wlock);
- return key;
-}
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);
}
@@ -208,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);
@@ -222,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] ;
@@ -244,6 +266,35 @@
}
}
}
+
+
+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_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>;
@@ -261,3 +312,24 @@
}
return keyset;
}
+
+
+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