Sfoglia il codice sorgente

Forward port of IPC code from whitetank branch to fix known defects.

git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1303 fd59a12c-fef9-0310-b244-a6a79926bd2f
Steven Dake 19 anni fa
parent
commit
22d3403a6f
1 ha cambiato i file con 30 aggiunte e 6 eliminazioni
  1. 30 6
      exec/ipc.c

+ 30 - 6
exec/ipc.c

@@ -177,7 +177,7 @@ static int response_init_send_response (
 	void *message)
 	void *message)
 {
 {
 	SaAisErrorT error = SA_AIS_ERR_ACCESS;
 	SaAisErrorT error = SA_AIS_ERR_ACCESS;
-	size_t cinfo = (size_t)conn_info;
+	uintptr_t cinfo = (uintptr_t)conn_info;
 	mar_req_lib_response_init_t *req_lib_response_init = (mar_req_lib_response_init_t *)message;
 	mar_req_lib_response_init_t *req_lib_response_init = (mar_req_lib_response_init_t *)message;
 	mar_res_lib_response_init_t res_lib_response_init;
 	mar_res_lib_response_init_t res_lib_response_init;
 
 
@@ -207,7 +207,7 @@ static int dispatch_init_send_response (
 	void *message)
 	void *message)
 {
 {
 	SaAisErrorT error = SA_AIS_ERR_ACCESS;
 	SaAisErrorT error = SA_AIS_ERR_ACCESS;
-	size_t cinfo;
+	uintptr_t cinfo;
 	mar_req_lib_dispatch_init_t *req_lib_dispatch_init = (mar_req_lib_dispatch_init_t *)message;
 	mar_req_lib_dispatch_init_t *req_lib_dispatch_init = (mar_req_lib_dispatch_init_t *)message;
 	mar_res_lib_dispatch_init_t res_lib_dispatch_init;
 	mar_res_lib_dispatch_init_t res_lib_dispatch_init;
 	struct conn_info *msg_conn_info;
 	struct conn_info *msg_conn_info;
@@ -219,10 +219,19 @@ static int dispatch_init_send_response (
 		else
 		else
 			error = SA_AIS_OK;
 			error = SA_AIS_OK;
 
 
-		cinfo = (size_t)req_lib_dispatch_init->conn_info;
+		cinfo = (uintptr_t)req_lib_dispatch_init->conn_info;
 		conn_info->conn_info_partner = (struct conn_info *)cinfo;
 		conn_info->conn_info_partner = (struct conn_info *)cinfo;
+
+		/* temporary fix for memory leak
+		 */
+		pthread_mutex_destroy (conn_info->conn_info_partner->shared_mutex);
+		free (conn_info->conn_info_partner->shared_mutex);
+		
 		conn_info->conn_info_partner->shared_mutex = conn_info->shared_mutex;
 		conn_info->conn_info_partner->shared_mutex = conn_info->shared_mutex;
 
 
+		list_add (&conn_info_list_head, &conn_info->list);
+		list_add (&conn_info_list_head, &conn_info->conn_info_partner->list);
+
 		msg_conn_info = (struct conn_info *)cinfo;
 		msg_conn_info = (struct conn_info *)cinfo;
 		msg_conn_info->conn_info_partner = conn_info;
 		msg_conn_info->conn_info_partner = conn_info;
 
 
@@ -317,16 +326,22 @@ static inline unsigned int conn_info_create (int fd) {
 	pthread_mutex_init (&conn_info->flow_control_mutex, NULL);
 	pthread_mutex_init (&conn_info->flow_control_mutex, NULL);
 	pthread_mutex_init (conn_info->shared_mutex, NULL);
 	pthread_mutex_init (conn_info->shared_mutex, NULL);
 
 
+	list_init (&conn_info->list);
 	conn_info->state = CONN_STATE_ACTIVE;
 	conn_info->state = CONN_STATE_ACTIVE;
 	conn_info->fd = fd;
 	conn_info->fd = fd;
 	conn_info->events = POLLIN|POLLNVAL;
 	conn_info->events = POLLIN|POLLNVAL;
 	conn_info->service = SOCKET_SERVICE_INIT;
 	conn_info->service = SOCKET_SERVICE_INIT;
 
 
-	list_init (&conn_info->list);
-	list_add (&conn_info_list_head, &conn_info->list);
-
 	pthread_attr_init (&conn_info->thread_attr);
 	pthread_attr_init (&conn_info->thread_attr);
+/*
+ * IA64 needs more stack space then other arches
+ */
+#if defined(__ia64__)
+	pthread_attr_setstacksize (&conn_info->thread_attr, 400000);
+#else
 	pthread_attr_setstacksize (&conn_info->thread_attr, 200000);
 	pthread_attr_setstacksize (&conn_info->thread_attr, 200000);
+#endif
+
 	pthread_attr_setdetachstate (&conn_info->thread_attr, PTHREAD_CREATE_DETACHED);
 	pthread_attr_setdetachstate (&conn_info->thread_attr, PTHREAD_CREATE_DETACHED);
 	res = pthread_create (&conn_info->thread, &conn_info->thread_attr,
 	res = pthread_create (&conn_info->thread, &conn_info->thread_attr,
 		prioritized_poll_thread, conn_info);
 		prioritized_poll_thread, conn_info);
@@ -351,6 +366,10 @@ static void conn_info_destroy (struct conn_info *conn_info)
 	if (conn_info->conn_info_partner) {
 	if (conn_info->conn_info_partner) {
 		conn_info->conn_info_partner->conn_info_partner = NULL;
 		conn_info->conn_info_partner->conn_info_partner = NULL;
 	}
 	}
+	
+	pthread_attr_destroy (&conn_info->thread_attr);
+	pthread_mutex_destroy (&conn_info->mutex);
+	
 	list_del (&conn_info->list);
 	list_del (&conn_info->list);
 	free (conn_info);
 	free (conn_info);
 }
 }
@@ -449,6 +468,7 @@ static void *prioritized_poll_thread (void *conn)
 	pthread_mutex_t *rel_mutex;
 	pthread_mutex_t *rel_mutex;
 	unsigned int service;
 	unsigned int service;
 	struct conn_info *cinfo_partner;
 	struct conn_info *cinfo_partner;
+	void *private_data;
 
 
 	sched_param.sched_priority = 1;
 	sched_param.sched_priority = 1;
 	res = pthread_setschedparam (conn_info->thread, SCHED_RR, &sched_param);
 	res = pthread_setschedparam (conn_info->thread, SCHED_RR, &sched_param);
@@ -466,6 +486,7 @@ retry_poll:
 		switch (conn_info->state) {
 		switch (conn_info->state) {
 		case CONN_STATE_SECURITY:
 		case CONN_STATE_SECURITY:
 			conn_info_mutex_unlock (conn_info, service);
 			conn_info_mutex_unlock (conn_info, service);
+			pthread_mutex_destroy (conn_info->shared_mutex);
 			free (conn_info->shared_mutex);
 			free (conn_info->shared_mutex);
 			conn_info_destroy (conn);
 			conn_info_destroy (conn);
 			pthread_exit (0);
 			pthread_exit (0);
@@ -482,6 +503,7 @@ retry_poll:
 
 
 		case CONN_STATE_DISCONNECTED:
 		case CONN_STATE_DISCONNECTED:
 			rel_mutex = conn_info->shared_mutex;
 			rel_mutex = conn_info->shared_mutex;
+			private_data = conn_info->private_data;
 			cinfo_partner = conn_info->conn_info_partner;
 			cinfo_partner = conn_info->conn_info_partner;
 			conn_info_destroy (conn);
 			conn_info_destroy (conn);
 			if (service == SOCKET_SERVICE_INIT) {
 			if (service == SOCKET_SERVICE_INIT) {
@@ -490,7 +512,9 @@ retry_poll:
 				pthread_mutex_unlock (rel_mutex);
 				pthread_mutex_unlock (rel_mutex);
 			}
 			}
 			if (cinfo_partner == NULL) {
 			if (cinfo_partner == NULL) {
+				pthread_mutex_destroy (rel_mutex);
 				free (rel_mutex);
 				free (rel_mutex);
+				free (private_data);
 			}
 			}
 			pthread_exit (0);
 			pthread_exit (0);
 			/*
 			/*