Make it clear that there are three separate internal locks.
This commit is contained in:
parent
7900abff04
commit
ff0b75b897
@ -58,6 +58,8 @@
|
||||
|
||||
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_PIVOT _PATH_CSMAPPER "/charset.pivot"
|
||||
|
||||
@ -314,7 +316,7 @@ get_none(struct _citrus_mapper_area *__restrict ma,
|
||||
{
|
||||
int ret;
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&ma_lock);
|
||||
if (csm_none) {
|
||||
*rcsm = csm_none;
|
||||
ret = 0;
|
||||
@ -329,7 +331,7 @@ get_none(struct _citrus_mapper_area *__restrict ma,
|
||||
*rcsm = csm_none;
|
||||
ret = 0;
|
||||
quit:
|
||||
UNLOCK;
|
||||
UNLOCK(&ma_lock);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
@ -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 TAILQ_HEAD(, _citrus_iconv_shared) shared_unused;
|
||||
|
||||
static pthread_rwlock_t ci_lock = PTHREAD_RWLOCK_INITIALIZER;
|
||||
|
||||
static __inline void
|
||||
init_cache(void)
|
||||
{
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&ci_lock);
|
||||
if (!isinit) {
|
||||
_CITRUS_HASH_INIT(&shared_pool, CI_HASH_SIZE);
|
||||
TAILQ_INIT(&shared_unused);
|
||||
@ -83,7 +85,7 @@ init_cache(void)
|
||||
shared_max_reuse = CI_INITIAL_MAX_REUSE;
|
||||
isinit = true;
|
||||
}
|
||||
UNLOCK;
|
||||
UNLOCK(&ci_lock);
|
||||
}
|
||||
|
||||
static __inline void
|
||||
@ -195,7 +197,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci,
|
||||
|
||||
snprintf(convname, sizeof(convname), "%s/%s", src, dst);
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&ci_lock);
|
||||
|
||||
/* lookup alread existing entry */
|
||||
hashval = hash_func(convname);
|
||||
@ -222,7 +224,7 @@ get_shared(struct _citrus_iconv_shared * __restrict * __restrict rci,
|
||||
*rci = ci;
|
||||
|
||||
quit:
|
||||
UNLOCK;
|
||||
UNLOCK(&ci_lock);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -231,7 +233,7 @@ static void
|
||||
release_shared(struct _citrus_iconv_shared * __restrict ci)
|
||||
{
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&ci_lock);
|
||||
ci->ci_used_count--;
|
||||
if (ci->ci_used_count == 0) {
|
||||
/* put it into unused list */
|
||||
@ -247,7 +249,7 @@ release_shared(struct _citrus_iconv_shared * __restrict ci)
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
UNLOCK(&ci_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -27,10 +27,7 @@
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
/* XXX Yes, the original code has three separate file-local lock instances */
|
||||
static pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
|
||||
|
||||
#define WLOCK if (__isthreaded) \
|
||||
pthread_rwlock_wrlock(&lock);
|
||||
#define UNLOCK if (__isthreaded) \
|
||||
pthread_rwlock_unlock(&lock);
|
||||
#define WLOCK(lock) if (__isthreaded) \
|
||||
pthread_rwlock_wrlock(lock);
|
||||
#define UNLOCK(lock) if (__isthreaded) \
|
||||
pthread_rwlock_unlock(lock);
|
||||
|
@ -55,6 +55,8 @@
|
||||
#define CM_HASH_SIZE 101
|
||||
#define REFCOUNT_PERSISTENT -1
|
||||
|
||||
static pthread_rwlock_t cm_lock = PTHREAD_RWLOCK_INITIALIZER;
|
||||
|
||||
struct _citrus_mapper_area {
|
||||
_CITRUS_HASH_HEAD(, _citrus_mapper, CM_HASH_SIZE) ma_cache;
|
||||
char *ma_dir;
|
||||
@ -75,7 +77,7 @@ _citrus_mapper_create_area(
|
||||
char path[PATH_MAX];
|
||||
int ret;
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&cm_lock);
|
||||
|
||||
if (*rma != NULL) {
|
||||
ret = 0;
|
||||
@ -104,7 +106,7 @@ _citrus_mapper_create_area(
|
||||
*rma = ma;
|
||||
ret = 0;
|
||||
quit:
|
||||
UNLOCK;
|
||||
UNLOCK(&cm_lock);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -316,7 +318,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
|
||||
|
||||
variable = NULL;
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&cm_lock);
|
||||
|
||||
/* search in the cache */
|
||||
hashval = hash_func(mapname);
|
||||
@ -337,9 +339,9 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
|
||||
goto quit;
|
||||
|
||||
/* open mapper */
|
||||
UNLOCK;
|
||||
UNLOCK(&cm_lock);
|
||||
ret = mapper_open(ma, &cm, module, variable);
|
||||
WLOCK;
|
||||
WLOCK(&cm_lock);
|
||||
if (ret)
|
||||
goto quit;
|
||||
cm->cm_key = strdup(mapname);
|
||||
@ -356,7 +358,7 @@ _citrus_mapper_open(struct _citrus_mapper_area *__restrict ma,
|
||||
*rcm = cm;
|
||||
ret = 0;
|
||||
quit:
|
||||
UNLOCK;
|
||||
UNLOCK(&cm_lock);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
@ -370,7 +372,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm)
|
||||
{
|
||||
|
||||
if (cm) {
|
||||
WLOCK;
|
||||
WLOCK(&cm_lock);
|
||||
if (cm->cm_refcount == REFCOUNT_PERSISTENT)
|
||||
goto quit;
|
||||
if (cm->cm_refcount > 0) {
|
||||
@ -381,7 +383,7 @@ _citrus_mapper_close(struct _citrus_mapper *cm)
|
||||
}
|
||||
mapper_close(cm);
|
||||
quit:
|
||||
UNLOCK;
|
||||
UNLOCK(&cm_lock);
|
||||
}
|
||||
}
|
||||
|
||||
@ -393,7 +395,7 @@ void
|
||||
_citrus_mapper_set_persistent(struct _citrus_mapper * __restrict cm)
|
||||
{
|
||||
|
||||
WLOCK;
|
||||
WLOCK(&cm_lock);
|
||||
cm->cm_refcount = REFCOUNT_PERSISTENT;
|
||||
UNLOCK;
|
||||
UNLOCK(&cm_lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user