فهرست منبع

Use spinlocks in library handle references.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2099 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 17 سال پیش
والد
کامیت
cd154d63e6
9فایلهای تغییر یافته به همراه82 افزوده شده و 79 حذف شده
  1. 31 25
      include/corosync/coroipcc.h
  2. 1 6
      lib/cfg.c
  3. 1 7
      lib/confdb.c
  4. 44 11
      lib/coroipcc.c
  5. 1 6
      lib/cpg.c
  6. 1 6
      lib/evs.c
  7. 1 6
      lib/pload.c
  8. 1 6
      lib/quorum.c
  9. 1 6
      lib/votequorum.c

+ 31 - 25
include/corosync/coroipcc.h

@@ -36,37 +36,14 @@
 #ifndef COROIPC_H_DEFINED
 #define COROIPC_H_DEFINED
 
+#include <config.h>
+
 #include <pthread.h>
 #include <sys/poll.h>
 #include <sys/socket.h>
 #include <corosync/corotypes.h>
 #include <corosync/ipc_gen.h>
 
-/* Debug macro
- */
-#ifdef DEBUG
-	#define DPRINT(s) printf s
-#else
-	#define DPRINT(s)
-#endif
-		
-#ifdef SO_NOSIGPIPE
-#ifndef MSG_NOSIGNAL
-#define MSG_NOSIGNAL 0
-#endif
-void socket_nosigpipe(int s);
-#else
-#define socket_nosigpipe(s)
-#endif
-
-struct saHandleDatabase {
-	unsigned int handleCount;
-	struct saHandle *handles;
-	pthread_mutex_t mutex;
-	void (*handleInstanceDestructor) (void *);
-};
-
-
 extern cs_error_t
 coroipcc_service_connect (
 	const char *socket_name,
@@ -110,6 +87,35 @@ coroipcc_msg_send_reply_receive_in_buf (
 	unsigned int iov_len,
 	void **res_msg);
 
+/*
+ * This needs to be removed
+ */
+struct saHandleDatabase {
+	unsigned int handleCount;
+	struct saHandle *handles;
+#if defined(HAVE_PTHREAD_SPIN_LOCK)
+	pthread_spinlock_t lock;
+#else
+	pthread_mutex_t lock;
+#endif
+	void (*handleInstanceDestructor) (void *);
+};
+
+extern void saHandleDatabaseLock_init (struct saHandleDatabase *hdb);
+
+#define DECLARE_SAHDB_DATABASE(database_name,destructor)		\
+static struct saHandleDatabase (database_name) = {			\
+	.handleInstanceDestructor	= destructor,			\
+	.handleCount			= 0,				\
+	.handles			= NULL,				\
+};									\
+static void database_name##_init(void)__attribute__((constructor));	\
+static void database_name##_init(void)					\
+{									\
+        saHandleDatabaseLock_init (&(database_name));			\
+}
+
+
 extern cs_error_t
 saHandleCreate (
 	struct saHandleDatabase *handleDatabase,

+ 1 - 6
lib/cfg.c

@@ -74,12 +74,7 @@ static void cfg_handle_instance_destructor (void *);
 /*
  * All instances in one database
  */
-static struct saHandleDatabase cfg_hdb = {
-	.handleCount			= 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= cfg_handle_instance_destructor
-};
+DECLARE_SAHDB_DATABASE (cfg_hdb,cfg_handle_instance_destructor);
 
 /*
  * Implementation

+ 1 - 7
lib/confdb.c

@@ -82,13 +82,7 @@ struct confdb_inst {
 
 static void confdb_instance_destructor (void *instance);
 
-static struct saHandleDatabase confdb_handle_t_db = {
-	.handleCount		        = 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= confdb_instance_destructor
-};
-
+DECLARE_SAHDB_DATABASE(confdb_handle_t_db,confdb_instance_destructor);
 
 static cs_error_t do_find_destroy(struct confdb_inst *confdb_inst, hdb_handle_t find_handle);
 

+ 44 - 11
lib/coroipcc.c

@@ -763,6 +763,39 @@ coroipcc_msg_send_reply_receive_in_buf (
 	return (CS_OK);
 }
 
+#if defined(HAVE_PTHREAD_SPIN_LOCK)
+static void hdb_lock (struct saHandleDatabase *hdb)
+{
+	pthread_spin_lock (&hdb->lock);
+}
+
+static void hdb_unlock (struct saHandleDatabase *hdb)
+{
+	pthread_spin_unlock (&hdb->lock);
+}
+
+void saHandleDatabaseLock_init (struct saHandleDatabase *hdb)
+{
+	pthread_spin_init (&hdb->lock, 0);
+}
+#else
+static void hdb_lock (struct saHandleDatabase *hdb)
+{
+	pthread_mutex_lock (&hdb->lock);
+}
+
+static void hdb_unlock (struct saHandleDatabase *hdb)
+{
+	pthread_mutex_unlock (&hdb->lock);
+}
+
+void saHandleDatabaseLock_init (struct saHandleDatabase *hdb)
+{
+	pthread_mutex_init (&hdb->lock, NULL);
+}
+#endif
+
+
 cs_error_t
 saHandleCreate (
 	struct saHandleDatabase *handleDatabase,
@@ -776,7 +809,7 @@ saHandleCreate (
 	void *instance;
 	int i;
 
-	pthread_mutex_lock (&handleDatabase->mutex);
+	hdb_lock (handleDatabase);
 
 	for (handle = 0; handle < handleDatabase->handleCount; handle++) {
 		if (handleDatabase->handles[handle].state == SA_HANDLE_STATE_EMPTY) {
@@ -790,7 +823,7 @@ saHandleCreate (
 		newHandles = (struct saHandle *)realloc (handleDatabase->handles,
 			sizeof (struct saHandle) * handleDatabase->handleCount);
 		if (newHandles == NULL) {
-			pthread_mutex_unlock (&handleDatabase->mutex);
+			hdb_unlock (handleDatabase);
 			return (CS_ERR_NO_MEMORY);
 		}
 		handleDatabase->handles = newHandles;
@@ -799,7 +832,7 @@ saHandleCreate (
 	instance = malloc (instanceSize);
 	if (instance == 0) {
 		free (newHandles);
-		pthread_mutex_unlock (&handleDatabase->mutex);
+		hdb_unlock (handleDatabase);
 		return (CS_ERR_NO_MEMORY);
 	}
 
@@ -828,7 +861,7 @@ saHandleCreate (
 
 	*handleOut = (uint64_t)((uint64_t)check << 32 | handle);
 
-	pthread_mutex_unlock (&handleDatabase->mutex);
+	hdb_unlock (handleDatabase);
 
 	return (CS_OK);
 }
@@ -843,17 +876,17 @@ saHandleDestroy (
 	uint32_t check = inHandle >> 32;
 	uint32_t handle = inHandle & 0xffffffff;
 
-	pthread_mutex_lock (&handleDatabase->mutex);
+	hdb_lock (handleDatabase);
 
 	if (check != handleDatabase->handles[handle].check) {
-		pthread_mutex_unlock (&handleDatabase->mutex);
+		hdb_unlock (handleDatabase);
 		error = CS_ERR_BAD_HANDLE;
 		return (error);
 	}
 
 	handleDatabase->handles[handle].state = SA_HANDLE_STATE_PENDINGREMOVAL;
 
-	pthread_mutex_unlock (&handleDatabase->mutex);
+	hdb_unlock (handleDatabase);
 
 	saHandleInstancePut (handleDatabase, inHandle);
 
@@ -871,7 +904,7 @@ saHandleInstanceGet (
 	uint32_t handle = inHandle & 0xffffffff;
 
 	cs_error_t error = CS_OK;
-	pthread_mutex_lock (&handleDatabase->mutex);
+	hdb_lock (handleDatabase);
 
 	if (handle >= (uint64_t)handleDatabase->handleCount) {
 		error = CS_ERR_BAD_HANDLE;
@@ -892,7 +925,7 @@ saHandleInstanceGet (
 	handleDatabase->handles[handle].refCount += 1;
 
 error_exit:
-	pthread_mutex_unlock (&handleDatabase->mutex);
+	hdb_unlock (handleDatabase);
 
 	return (error);
 }
@@ -908,7 +941,7 @@ saHandleInstancePut (
 	uint32_t check = inHandle >> 32;
 	uint32_t handle = inHandle & 0xffffffff;
 
-	pthread_mutex_lock (&handleDatabase->mutex);
+	hdb_lock (handleDatabase);
 
 	if (check != handleDatabase->handles[handle].check) {
 		error = CS_ERR_BAD_HANDLE;
@@ -926,7 +959,7 @@ saHandleInstancePut (
 	}
 
 error_exit:
-	pthread_mutex_unlock (&handleDatabase->mutex);
+	hdb_unlock (handleDatabase);
 
 	return (error);
 }

+ 1 - 6
lib/cpg.c

@@ -64,12 +64,7 @@ struct cpg_inst {
 
 static void cpg_instance_destructor (void *instance);
 
-static struct saHandleDatabase cpg_handle_t_db = {
-	.handleCount		        = 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= cpg_instance_destructor
-};
+DECLARE_SAHDB_DATABASE(cpg_handle_t_db,cpg_instance_destructor);
 
 /*
  * Clean up function for a cpg instance (cpg_nitialize) handle

+ 1 - 6
lib/evs.c

@@ -67,12 +67,7 @@ struct evs_inst {
 
 static void evs_instance_destructor (void *instance);
 
-static struct saHandleDatabase evs_handle_t_db = {
-	.handleCount				= 0,
-	.handles					= 0,
-	.mutex						= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= evs_instance_destructor
-};
+DECLARE_SAHDB_DATABASE (evs_handle_t_db, evs_instance_destructor);
 
 /*
  * Clean up function for an evt instance (saEvtInitialize) handle

+ 1 - 6
lib/pload.c

@@ -58,12 +58,7 @@ struct pload_inst {
 	unsigned int finalize;
 };
 
-static struct saHandleDatabase pload_handle_t_db = {
-	.handleCount			= 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= pload_instance_destructor
-};
+DECLARE_SAHDB_DATABASE(pload_handle_t_db,pload_instance_destructor);
 
 /*
  * Clean up function for an evt instance (saEvtInitialize) handle

+ 1 - 6
lib/quorum.c

@@ -63,12 +63,7 @@ struct quorum_inst {
 
 static void quorum_instance_destructor (void *instance);
 
-static struct saHandleDatabase quorum_handle_t_db = {
-	.handleCount		        = 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= quorum_instance_destructor
-};
+DECLARE_SAHDB_DATABASE(quorum_handle_t_db,quorum_instance_destructor);
 
 /*
  * Clean up function for a quorum instance (quorum_initialize) handle

+ 1 - 6
lib/votequorum.c

@@ -63,12 +63,7 @@ struct votequorum_inst {
 
 static void votequorum_instance_destructor (void *instance);
 
-static struct saHandleDatabase votequorum_handle_t_db = {
-	.handleCount		        = 0,
-	.handles			= 0,
-	.mutex				= PTHREAD_MUTEX_INITIALIZER,
-	.handleInstanceDestructor	= votequorum_instance_destructor
-};
+DECLARE_SAHDB_DATABASE(votequorum_handle_t_db,votequorum_instance_destructor);
 
 /*
  * Clean up function for a quorum instance (votequorum_initialize) handle