svn commit: r252584 - head/lib/libc/iconv

Peter Wemm peter at FreeBSD.org
Wed Jul 3 18:35:22 UTC 2013


Author: peter
Date: Wed Jul  3 18:35:21 2013
New Revision: 252584
URL: http://svnweb.freebsd.org/changeset/base/252584

Log:
  Make it clear that there are three separate internal locks.

Modified:
  head/lib/libc/iconv/citrus_csmapper.c
  head/lib/libc/iconv/citrus_iconv.c
  head/lib/libc/iconv/citrus_lock.h
  head/lib/libc/iconv/citrus_mapper.c

Modified: head/lib/libc/iconv/citrus_csmapper.c
==============================================================================
--- head/lib/libc/iconv/citrus_csmapper.c	Wed Jul  3 18:27:45 2013	(r252583)
+++ head/lib/libc/iconv/citrus_csmapper.c	Wed Jul  3 18:35:21 2013	(r252584)
@@ -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 *__r
 {
 	int ret;
 
-	WLOCK;
+	WLOCK(&ma_lock);
 	if (csm_none) {
 		*rcsm = csm_none;
 		ret = 0;
@@ -329,7 +331,7 @@ get_none(struct _citrus_mapper_area *__r
 	*rcsm = csm_none;
 	ret = 0;
 quit:
-	UNLOCK;
+	UNLOCK(&ma_lock);
 	return (ret);
 }
 

Modified: head/lib/libc/iconv/citrus_iconv.c
==============================================================================
--- head/lib/libc/iconv/citrus_iconv.c	Wed Jul  3 18:27:45 2013	(r252583)
+++ head/lib/libc/iconv/citrus_iconv.c	Wed Jul  3 18:35:21 2013	(r252584)
@@ -68,11 +68,13 @@ static int			 shared_max_reuse, shared_n
 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 *
 
 	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 *
 	*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_shar
 		}
 	}
 
-	UNLOCK;
+	UNLOCK(&ci_lock);
 }
 
 /*

Modified: head/lib/libc/iconv/citrus_lock.h
==============================================================================
--- head/lib/libc/iconv/citrus_lock.h	Wed Jul  3 18:27:45 2013	(r252583)
+++ head/lib/libc/iconv/citrus_lock.h	Wed Jul  3 18:35:21 2013	(r252584)
@@ -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);

Modified: head/lib/libc/iconv/citrus_mapper.c
==============================================================================
--- head/lib/libc/iconv/citrus_mapper.c	Wed Jul  3 18:27:45 2013	(r252583)
+++ head/lib/libc/iconv/citrus_mapper.c	Wed Jul  3 18:35:21 2013	(r252584)
@@ -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_mappe
 
 	variable = NULL;
 
-	WLOCK;
+	WLOCK(&cm_lock);
 
 	/* search in the cache */
 	hashval = hash_func(mapname);
@@ -337,9 +339,9 @@ _citrus_mapper_open(struct _citrus_mappe
 		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_mappe
 	*rcm = cm;
 	ret = 0;
 quit:
-	UNLOCK;
+	UNLOCK(&cm_lock);
 
 	return (ret);
 }
@@ -370,7 +372,7 @@ _citrus_mapper_close(struct _citrus_mapp
 {
 
 	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_mapp
 		}
 		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);
 }


More information about the svn-src-head mailing list