Make it clear that there are three separate internal locks.

This commit is contained in:
Peter Wemm 2013-07-03 18:35:21 +00:00
parent 7900abff04
commit ff0b75b897
4 changed files with 28 additions and 25 deletions

View File

@ -58,6 +58,8 @@
static struct _citrus_mapper_area *maparea = NULL; static struct _citrus_mapper_area *maparea = NULL;
static pthread_rwlock_t ma_lock = PTHREAD_RWLOCK_INITIALIZER;
#define CS_ALIAS _PATH_CSMAPPER "/charset.alias" #define CS_ALIAS _PATH_CSMAPPER "/charset.alias"
#define CS_PIVOT _PATH_CSMAPPER "/charset.pivot" #define CS_PIVOT _PATH_CSMAPPER "/charset.pivot"
@ -314,7 +316,7 @@ get_none(struct _citrus_mapper_area *__restrict ma,
{ {
int ret; int ret;
WLOCK; WLOCK(&ma_lock);
if (csm_none) { if (csm_none) {
*rcsm = csm_none; *rcsm = csm_none;
ret = 0; ret = 0;
@ -329,7 +331,7 @@ get_none(struct _citrus_mapper_area *__restrict ma,
*rcsm = csm_none; *rcsm = csm_none;
ret = 0; ret = 0;
quit: quit:
UNLOCK; UNLOCK(&ma_lock);
return (ret); return (ret);
} }

View File

@ -68,11 +68,13 @@ static int shared_max_reuse, shared_num_unused;
static _CITRUS_HASH_HEAD(, _citrus_iconv_shared, CI_HASH_SIZE) shared_pool; static _CITRUS_HASH_HEAD(, _citrus_iconv_shared, CI_HASH_SIZE) shared_pool;
static TAILQ_HEAD(, _citrus_iconv_shared) shared_unused; static TAILQ_HEAD(, _citrus_iconv_shared) shared_unused;
static pthread_rwlock_t ci_lock = PTHREAD_RWLOCK_INITIALIZER;
static __inline void static __inline void
init_cache(void) init_cache(void)
{ {
WLOCK; WLOCK(&ci_lock);
if (!isinit) { if (!isinit) {
_CITRUS_HASH_INIT(&shared_pool, CI_HASH_SIZE); _CITRUS_HASH_INIT(&shared_pool, CI_HASH_SIZE);
TAILQ_INIT(&shared_unused); TAILQ_INIT(&shared_unused);
@ -83,7 +85,7 @@ init_cache(void)
shared_max_reuse = CI_INITIAL_MAX_REUSE; shared_max_reuse = CI_INITIAL_MAX_REUSE;
isinit = true; isinit = true;
} }
UNLOCK; UNLOCK(&ci_lock);
} }
static __inline void static __inline void
@ -195,7 +197,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci,
snprintf(convname, sizeof(convname), "%s/%s", src, dst); snprintf(convname, sizeof(convname), "%s/%s", src, dst);
WLOCK; WLOCK(&ci_lock);
/* lookup alread existing entry */ /* lookup alread existing entry */
hashval = hash_func(convname); hashval = hash_func(convname);
@ -222,7 +224,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci,
*rci = ci; *rci = ci;
quit: quit:
UNLOCK; UNLOCK(&ci_lock);
return (ret); return (ret);
} }
@ -231,7 +233,7 @@ static void
release_shared(struct _citrus_iconv_shared * __restrict ci) release_shared(struct _citrus_iconv_shared * __restrict ci)
{ {
WLOCK; WLOCK(&ci_lock);
ci->ci_used_count--; ci->ci_used_count--;
if (ci->ci_used_count == 0) { if (ci->ci_used_count == 0) {
/* put it into unused list */ /* put it into unused list */
@ -247,7 +249,7 @@ release_shared(struct _citrus_iconv_shared * __restrict ci)
} }
} }
UNLOCK; UNLOCK(&ci_lock);
} }
/* /*

View File

@ -27,10 +27,7 @@
#include <pthread.h> #include <pthread.h>
/* XXX Yes, the original code has three separate file-local lock instances */ #define WLOCK(lock) if (__isthreaded) \
static pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER; pthread_rwlock_wrlock(lock);
#define UNLOCK(lock) if (__isthreaded) \
#define WLOCK if (__isthreaded) \ pthread_rwlock_unlock(lock);
pthread_rwlock_wrlock(&lock);
#define UNLOCK if (__isthreaded) \
pthread_rwlock_unlock(&lock);

View File

@ -55,6 +55,8 @@
#define CM_HASH_SIZE 101 #define CM_HASH_SIZE 101
#define REFCOUNT_PERSISTENT -1 #define REFCOUNT_PERSISTENT -1
static pthread_rwlock_t cm_lock = PTHREAD_RWLOCK_INITIALIZER;
struct _citrus_mapper_area { struct _citrus_mapper_area {
_CITRUS_HASH_HEAD(, _citrus_mapper, CM_HASH_SIZE) ma_cache; _CITRUS_HASH_HEAD(, _citrus_mapper, CM_HASH_SIZE) ma_cache;
char *ma_dir; char *ma_dir;
@ -75,7 +77,7 @@ _citrus_mapper_create_area(
char path[PATH_MAX]; char path[PATH_MAX];
int ret; int ret;
WLOCK; WLOCK(&cm_lock);
if (*rma != NULL) { if (*rma != NULL) {
ret = 0; ret = 0;
@ -104,7 +106,7 @@ _citrus_mapper_create_area(
*rma = ma; *rma = ma;
ret = 0; ret = 0;
quit: quit:
UNLOCK; UNLOCK(&cm_lock);
return (ret); return (ret);
} }
@ -316,7 +318,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
variable = NULL; variable = NULL;
WLOCK; WLOCK(&cm_lock);
/* search in the cache */ /* search in the cache */
hashval = hash_func(mapname); hashval = hash_func(mapname);
@ -337,9 +339,9 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
goto quit; goto quit;
/* open mapper */ /* open mapper */
UNLOCK; UNLOCK(&cm_lock);
ret = mapper_open(ma, &cm, module, variable); ret = mapper_open(ma, &cm, module, variable);
WLOCK; WLOCK(&cm_lock);
if (ret) if (ret)
goto quit; goto quit;
cm->cm_key = strdup(mapname); cm->cm_key = strdup(mapname);
@ -356,7 +358,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
*rcm = cm; *rcm = cm;
ret = 0; ret = 0;
quit: quit:
UNLOCK; UNLOCK(&cm_lock);
return (ret); return (ret);
} }
@ -370,7 +372,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm)
{ {
if (cm) { if (cm) {
WLOCK; WLOCK(&cm_lock);
if (cm->cm_refcount == REFCOUNT_PERSISTENT) if (cm->cm_refcount == REFCOUNT_PERSISTENT)
goto quit; goto quit;
if (cm->cm_refcount > 0) { if (cm->cm_refcount > 0) {
@ -381,7 +383,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm)
} }
mapper_close(cm); mapper_close(cm);
quit: quit:
UNLOCK; UNLOCK(&cm_lock);
} }
} }
@ -393,7 +395,7 @@ void
_citrus_mapper_set_persistent(struct _citrus_mapper * __restrict cm) _citrus_mapper_set_persistent(struct _citrus_mapper * __restrict cm)
{ {
WLOCK; WLOCK(&cm_lock);
cm->cm_refcount = REFCOUNT_PERSISTENT; cm->cm_refcount = REFCOUNT_PERSISTENT;
UNLOCK; UNLOCK(&cm_lock);
} }