Browse Source

Fix up mutexes to avoid deadlocks

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1017 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 20 years ago
parent
commit
2439b397fb
3 changed files with 10 additions and 8 deletions
  1. 4 4
      exec/aispoll.c
  2. 4 2
      exec/ipc.c
  3. 2 2
      exec/totempg.c

+ 4 - 4
exec/aispoll.c

@@ -378,9 +378,7 @@ int poll_run (
 				&poll_instance->poll_entries[i].ufd,
 				&poll_instance->poll_entries[i].ufd,
 				sizeof (struct pollfd));
 				sizeof (struct pollfd));
 		}
 		}
-		pthread_mutex_lock (poll_instance->serialize);
 		timeout = timerlist_timeout_msec (&poll_instance->timerlist);
 		timeout = timerlist_timeout_msec (&poll_instance->timerlist);
-		pthread_mutex_unlock (poll_instance->serialize);
 
 
 retry_poll:
 retry_poll:
 		res = poll (poll_instance->ufds,
 		res = poll (poll_instance->ufds,
@@ -396,23 +394,25 @@ retry_poll:
 		for (i = 0; i < poll_entry_count; i++) {
 		for (i = 0; i < poll_entry_count; i++) {
 			if (poll_instance->ufds[i].fd != -1 &&
 			if (poll_instance->ufds[i].fd != -1 &&
 				poll_instance->ufds[i].revents) {
 				poll_instance->ufds[i].revents) {
-				pthread_mutex_lock (poll_instance->serialize);
 
 
+				pthread_mutex_lock (poll_instance->serialize);
 				res = poll_instance->poll_entries[i].dispatch_fn (handle,
 				res = poll_instance->poll_entries[i].dispatch_fn (handle,
 					poll_instance->ufds[i].fd, 
 					poll_instance->ufds[i].fd, 
 					poll_instance->ufds[i].revents,
 					poll_instance->ufds[i].revents,
 					poll_instance->poll_entries[i].data);
 					poll_instance->poll_entries[i].data);
 
 
+				pthread_mutex_unlock (poll_instance->serialize);
 				/*
 				/*
 				 * Remove dispatch functions that return -1
 				 * Remove dispatch functions that return -1
 				 */
 				 */
 				if (res == -1) {
 				if (res == -1) {
 					poll_instance->poll_entries[i].ufd.fd = -1; /* empty entry */
 					poll_instance->poll_entries[i].ufd.fd = -1; /* empty entry */
 				}
 				}
-				pthread_mutex_unlock (poll_instance->serialize);
 			}
 			}
 		}
 		}
+		pthread_mutex_lock (poll_instance->serialize);
 		timerlist_expire (&poll_instance->timerlist);
 		timerlist_expire (&poll_instance->timerlist);
+		pthread_mutex_unlock (poll_instance->serialize);
 	} /* for (;;) */
 	} /* for (;;) */
 
 
 	hdb_handle_put (&poll_instance_database, handle);
 	hdb_handle_put (&poll_instance_database, handle);

+ 4 - 2
exec/ipc.c

@@ -392,9 +392,8 @@ retry_poll:
 			if ((ufd.revents & POLLIN) == POLLIN) {
 			if ((ufd.revents & POLLIN) == POLLIN) {
 				libais_deliver (conn_info);
 				libais_deliver (conn_info);
 			}
 			}
-
-			pthread_mutex_unlock (&serialize_input);
 		}
 		}
+		pthread_mutex_unlock (&serialize_input);
 	}
 	}
 
 
 	pthread_mutex_unlock (&serialize_input);
 	pthread_mutex_unlock (&serialize_input);
@@ -425,6 +424,7 @@ static int conn_info_outq_flush (struct conn_info *conn_info) {
 
 
 	pthread_mutex_lock (&conn_info->mutex);
 	pthread_mutex_lock (&conn_info->mutex);
 	if (!libais_connection_active (conn_info)) {
 	if (!libais_connection_active (conn_info)) {
+		pthread_mutex_unlock (&conn_info->mutex);
 		return (-1);
 		return (-1);
 	}
 	}
 	outq = &conn_info->outq;
 	outq = &conn_info->outq;
@@ -455,6 +455,7 @@ retry_sendmsg:
 			return (0);
 			return (0);
 		}
 		}
 		if (res == -1 && errno == EPIPE) {
 		if (res == -1 && errno == EPIPE) {
+			pthread_mutex_unlock (&conn_info->mutex);
 			libais_disconnect_delayed (conn_info);
 			libais_disconnect_delayed (conn_info);
 			return (0);
 			return (0);
 		}
 		}
@@ -943,6 +944,7 @@ retry_sendmsg:
 		}
 		}
 		if (res == -1 && errno == EPIPE) {
 		if (res == -1 && errno == EPIPE) {
 			libais_disconnect_delayed (conn_info);
 			libais_disconnect_delayed (conn_info);
+			pthread_mutex_unlock (&conn_info->mutex);
 			return (0);
 			return (0);
 		}
 		}
 		if (res == -1) {
 		if (res == -1) {

+ 2 - 2
exec/totempg.c

@@ -215,6 +215,8 @@ static pthread_mutex_t totempg_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
 static pthread_mutex_t callback_token_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_mutex_t callback_token_mutex = PTHREAD_MUTEX_INITIALIZER;
 
 
+static pthread_mutex_t mcast_msg_mutex = PTHREAD_MUTEX_INITIALIZER;
+
 #define log_printf(level, format, args...) \
 #define log_printf(level, format, args...) \
     totempg_log_printf (__FILE__, __LINE__, level, format, ##args)
     totempg_log_printf (__FILE__, __LINE__, level, format, ##args)
 
 
@@ -571,8 +573,6 @@ static void totempg_deliver_fn (
 
 
 void *callback_token_received_handle;
 void *callback_token_received_handle;
 
 
-pthread_mutex_t mcast_msg_mutex = PTHREAD_MUTEX_INITIALIZER;
-
 int callback_token_received_fn (enum totem_callback_token_type type,
 int callback_token_received_fn (enum totem_callback_token_type type,
 	void *data)
 	void *data)
 {
 {