Jelajahi Sumber

qdevice: Properly free IPC data on exit

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 9 tahun lalu
induk
melakukan
a920beb618

+ 5 - 6
qdevices/corosync-qdevice.c

@@ -48,14 +48,14 @@ static void
 signal_int_handler(int sig)
 {
 	qdevice_log(LOG_DEBUG, "SIGINT received - closing local unix socket");
-	qdevice_ipc_destroy(global_instance);
+	qdevice_ipc_close(global_instance);
 }
 
 static void
 signal_term_handler(int sig)
 {
 	qdevice_log(LOG_DEBUG, "SIGTERM received - closing server socket");
-	qdevice_ipc_destroy(global_instance);
+	qdevice_ipc_close(global_instance);
 }
 
 static void
@@ -149,10 +149,6 @@ main(int argc, char * const argv[])
 		return (1);
 	}
 
-	global_instance = &instance;
-
-	signal_handlers_register();
-
 	qdevice_log(LOG_DEBUG, "Registering qdevice models");
 	qdevice_model_register_all();
 
@@ -176,6 +172,9 @@ main(int argc, char * const argv[])
 		return (1);
 	}
 
+	global_instance = &instance;
+	signal_handlers_register();
+
 	qdevice_log(LOG_DEBUG, "Running qdevice model");
 	if (qdevice_model_run(&instance) != 0) {
 		return (1);

+ 22 - 1
qdevices/qdevice-ipc.c

@@ -53,10 +53,31 @@ qdevice_ipc_init(struct qdevice_instance *instance)
 	return (0);
 }
 
+int
+qdevice_ipc_close(struct qdevice_instance *instance)
+{
+	int res;
+
+	res = unix_socket_ipc_close(&instance->local_ipc);
+	if (res != 0) {
+		qdevice_log_err(LOG_WARNING, "Can't close local IPC");
+	}
+
+	return (res);
+}
+
 int
 qdevice_ipc_destroy(struct qdevice_instance *instance)
 {
 	int res;
+	struct unix_socket_client *client;
+	const struct unix_socket_client_list *ipc_client_list;
+
+	ipc_client_list = &instance->local_ipc.clients;
+
+	TAILQ_FOREACH(client, ipc_client_list, entries) {
+		free(client->user_data);
+	}
 
 	res = unix_socket_ipc_destroy(&instance->local_ipc);
 	if (res != 0) {
@@ -264,7 +285,7 @@ qdevice_ipc_io_write(struct qdevice_instance *instance, struct unix_socket_clien
 		client->schedule_disconnect = 1;
 
 		if (ipc_user_data->shutdown_requested) {
-			qdevice_ipc_destroy(instance);
+			qdevice_ipc_close(instance);
 		}
 
 		break;

+ 2 - 0
qdevices/qdevice-ipc.h

@@ -48,6 +48,8 @@ struct qdevice_ipc_user_data {
 
 extern int		qdevice_ipc_init(struct qdevice_instance *instance);
 
+extern int		qdevice_ipc_close(struct qdevice_instance *instance);
+
 extern int		qdevice_ipc_destroy(struct qdevice_instance *instance);
 
 extern int		qdevice_ipc_accept(struct qdevice_instance *instance,

+ 16 - 0
qdevices/qdevice-net-instance.c

@@ -37,6 +37,7 @@
 #include "qnet-config.h"
 #include "utils.h"
 #include "qdevice-net-poll-array-user-data.h"
+#include "qdevice-ipc.h"
 
 /*
  * Needed for creating nspr handle from unix fd
@@ -126,6 +127,21 @@ qdevice_net_instance_clean(struct qdevice_net_instance *instance)
 int
 qdevice_net_instance_destroy(struct qdevice_net_instance *instance)
 {
+	struct unix_socket_client *ipc_client;
+	const struct unix_socket_client_list *ipc_client_list;
+	struct qdevice_ipc_user_data *qdevice_ipc_user_data;
+	PRFileDesc *prfd;
+
+	ipc_client_list = &instance->qdevice_instance_ptr->local_ipc.clients;
+
+	TAILQ_FOREACH(ipc_client, ipc_client_list, entries) {
+		qdevice_ipc_user_data = (struct qdevice_ipc_user_data *)ipc_client->user_data;
+		prfd = (PRFileDesc *)qdevice_ipc_user_data->model_data;
+
+		if (PR_DestroySocketPollFd(prfd) != PR_SUCCESS) {
+			qdevice_log_nss(LOG_WARNING, "Unable to destroy client IPC poll socket fd");
+		}
+	}
 
 	dynar_destroy(&instance->receive_buffer);
 

+ 1 - 1
qdevices/qdevice-net-poll.c

@@ -354,7 +354,7 @@ qdevice_net_poll(struct qdevice_net_instance *instance)
 				prfd = (PRFileDesc *)qdevice_ipc_user_data->model_data;
 
 				if (PR_DestroySocketPollFd(prfd) != PR_SUCCESS) {
-					qdevice_log_nss(LOG_WARNING, "Unable to destroy IPC poll socket fd");
+					qdevice_log_nss(LOG_WARNING, "Unable to destroy client IPC poll socket fd");
 				}
 
 				qdevice_ipc_client_disconnect(instance->qdevice_instance_ptr, ipc_client);

+ 14 - 1
qdevices/unix-socket-ipc.c

@@ -68,7 +68,7 @@ unix_socket_ipc_init(struct unix_socket_ipc *ipc, const char *socket_file_name,
 }
 
 int
-unix_socket_ipc_destroy(struct unix_socket_ipc *ipc)
+unix_socket_ipc_close(struct unix_socket_ipc *ipc)
 {
 	int res;
 
@@ -90,6 +90,19 @@ unix_socket_ipc_destroy(struct unix_socket_ipc *ipc)
 	return (res);
 }
 
+int
+unix_socket_ipc_destroy(struct unix_socket_ipc *ipc)
+{
+
+	if (unix_socket_ipc_close(ipc) != 0) {
+		return (-1);
+	}
+
+	unix_socket_client_list_free(&ipc->clients);
+
+	return (0);
+}
+
 /*
  *  0 = No error
  * -1 = Can't accept connection (errno set)

+ 2 - 0
qdevices/unix-socket-ipc.h

@@ -64,6 +64,8 @@ extern int		unix_socket_ipc_accept(struct unix_socket_ipc *ipc,
 void			unix_socket_ipc_client_disconnect(struct unix_socket_ipc *ipc,
     struct unix_socket_client *client);
 
+extern int		unix_socket_ipc_close(struct unix_socket_ipc *ipc);
+
 #ifdef __cplusplus
 }
 #endif