diff options
-rw-r--r-- | src/vmod_dict.c | 92 |
1 files changed, 12 insertions, 80 deletions
diff --git a/src/vmod_dict.c b/src/vmod_dict.c index 5875abd..04ee52c 100644 --- a/src/vmod_dict.c +++ b/src/vmod_dict.c | |||
@@ -76,71 +76,3 @@ static size_t max_hash_size = 8192; | |||
76 | static ssize_t max_coll = -1; /* Max. number of collisions allowed */ | 76 | static ssize_t max_coll = -1; /* Max. number of collisions allowed */ |
77 | 77 | static pthread_rwlock_t rwlock; | |
78 | typedef struct { | ||
79 | size_t readers; | ||
80 | size_t writer; | ||
81 | pthread_mutex_t mutex; | ||
82 | pthread_cond_t lock_free; | ||
83 | } locker_t; | ||
84 | |||
85 | static locker_t rwlock; | ||
86 | |||
87 | static void | ||
88 | locker_init(locker_t *rdwr) | ||
89 | { | ||
90 | rdwr->readers = 0; | ||
91 | rdwr->writer = 0; | ||
92 | pthread_mutex_init(&rdwr->mutex, NULL); | ||
93 | pthread_cond_init(&rdwr->lock_free, NULL); | ||
94 | } | ||
95 | |||
96 | static void | ||
97 | locker_rlock(locker_t *rdwr) | ||
98 | { | ||
99 | pthread_mutex_lock(&rdwr->mutex); | ||
100 | while (rdwr->writer) | ||
101 | pthread_cond_wait(&rdwr->lock_free, &rdwr->mutex); | ||
102 | rdwr->readers++; | ||
103 | pthread_mutex_unlock(&rdwr->mutex); | ||
104 | } | ||
105 | |||
106 | static void | ||
107 | locker_wlock(locker_t *rdwr) | ||
108 | { | ||
109 | pthread_mutex_lock(&rdwr->mutex); | ||
110 | while (rdwr->writer || rdwr->readers) | ||
111 | pthread_cond_wait(&rdwr->lock_free, &rdwr->mutex); | ||
112 | rdwr->writer++; | ||
113 | pthread_mutex_unlock(&rdwr->mutex); | ||
114 | } | ||
115 | |||
116 | static int | ||
117 | locker_runlock(locker_t *rdwr) | ||
118 | { | ||
119 | pthread_mutex_lock(&rdwr->mutex); | ||
120 | if (rdwr->readers == 0) { | ||
121 | pthread_mutex_unlock(&rdwr->mutex); | ||
122 | return -1; | ||
123 | } else { | ||
124 | rdwr->readers--; | ||
125 | if (rdwr->readers == 0) | ||
126 | pthread_cond_signal(&rdwr->lock_free); | ||
127 | pthread_mutex_unlock(&rdwr->mutex); | ||
128 | return 0; | ||
129 | } | ||
130 | } | ||
131 | |||
132 | static int | ||
133 | locker_wunlock(locker_t *rdwr) | ||
134 | { | ||
135 | pthread_mutex_lock(&rdwr->mutex); | ||
136 | if (rdwr->writer == 0) { | ||
137 | pthread_mutex_unlock(&rdwr->mutex); | ||
138 | return -1; | ||
139 | } else { | ||
140 | rdwr->writer = 0; | ||
141 | pthread_cond_signal(&rdwr->lock_free); | ||
142 | pthread_mutex_unlock(&rdwr->mutex); | ||
143 | return 0; | ||
144 | } | ||
145 | } | ||
146 | 78 | ||
@@ -442,3 +374,3 @@ dict_event(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) | |||
442 | case VCL_EVENT_LOAD: | 374 | case VCL_EVENT_LOAD: |
443 | locker_init(&rwlock); | 375 | pthread_rwlock_init(&rwlock, NULL); |
444 | break; | 376 | break; |
@@ -446,3 +378,3 @@ dict_event(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) | |||
446 | case VCL_EVENT_DISCARD: | 378 | case VCL_EVENT_DISCARD: |
447 | locker_wlock(&rwlock); | 379 | pthread_rwlock_wrlock(&rwlock); |
448 | while (ent_head) | 380 | while (ent_head) |
@@ -452,3 +384,3 @@ dict_event(VRT_CTX, struct vmod_priv *priv, enum vcl_event_e e) | |||
452 | hash_size = 0; | 384 | hash_size = 0; |
453 | locker_wunlock(&rwlock); | 385 | pthread_rwlock_unlock(&rwlock); |
454 | break; | 386 | break; |
@@ -466,3 +398,3 @@ vmod_ci(VRT_CTX, VCL_BOOL ci) | |||
466 | int *cp; | 398 | int *cp; |
467 | locker_wlock(&rwlock); | 399 | pthread_rwlock_wrlock(&rwlock); |
468 | cp = ci ? ci_coll : cs_coll; | 400 | cp = ci ? ci_coll : cs_coll; |
@@ -473,3 +405,3 @@ vmod_ci(VRT_CTX, VCL_BOOL ci) | |||
473 | } | 405 | } |
474 | locker_wunlock(&rwlock); | 406 | pthread_rwlock_unlock(&rwlock); |
475 | } | 407 | } |
@@ -485,6 +417,6 @@ vmod_load(VRT_CTX, VCL_STRING file) | |||
485 | { | 417 | { |
486 | locker_wlock(&rwlock); | 418 | pthread_rwlock_wrlock(&rwlock); |
487 | load_entries(file); | 419 | load_entries(file); |
488 | fill_table(); | 420 | fill_table(); |
489 | locker_wunlock(&rwlock); | 421 | pthread_rwlock_unlock(&rwlock); |
490 | } | 422 | } |
@@ -496,3 +428,3 @@ vmod_clear(VRT_CTX) | |||
496 | 428 | ||
497 | locker_wlock(&rwlock); | 429 | pthread_rwlock_wrlock(&rwlock); |
498 | for (i = 0; i < hash_size; i++) | 430 | for (i = 0; i < hash_size; i++) |
@@ -501,3 +433,3 @@ vmod_clear(VRT_CTX) | |||
501 | entry_remove(ent_head); | 433 | entry_remove(ent_head); |
502 | locker_wunlock(&rwlock); | 434 | pthread_rwlock_unlock(&rwlock); |
503 | } | 435 | } |
@@ -532,3 +464,3 @@ vmod_lookup(VRT_CTX, VCL_STRING key) | |||
532 | if (key) { | 464 | if (key) { |
533 | locker_rlock(&rwlock); | 465 | pthread_rwlock_rdlock(&rwlock); |
534 | char const *p = lookup_unlocked(key); | 466 | char const *p = lookup_unlocked(key); |
@@ -538,3 +470,3 @@ vmod_lookup(VRT_CTX, VCL_STRING key) | |||
538 | } | 470 | } |
539 | locker_runlock(&rwlock); | 471 | pthread_rwlock_unlock(&rwlock); |
540 | } | 472 | } |