commit 2962a44a31dc5e5b5618bf3aef6ced9feac9f7e7
Author: dan clark <[email protected]>
Date: Tue Feb 22 12:58:03 2011 -0800
Signed-off-by: dan clark <[email protected]>
Reduce the stack allocated by applications using the corosync library.
The size of the PATH_MAX variable tends to be very large. The change
moves the temporary variable allocation off the stack.
diff --git a/lib/coroipcc.c b/lib/coroipcc.c
index bbeb95f..50538b7 100644
--- a/lib/coroipcc.c
+++ b/lib/coroipcc.c
@@ -86,6 +86,15 @@ struct ipc_instance {
pthread_mutex_t mutex;
};
+struct ipc_service_connect {
+ mar_req_setup_t req_setup;
+ mar_res_setup_t res_setup;
+ char control_map_path[PATH_MAX];
+ char request_map_path[PATH_MAX];
+ char response_map_path[PATH_MAX];
+ char dispatch_map_path[PATH_MAX];
+};
+
void ipc_hdb_destructor (void *context);
DECLARE_HDB_DATABASE(ipc_hdb,ipc_hdb_destructor);
@@ -575,12 +584,7 @@ coroipcc_service_connect (
union semun semun;
#endif
int sys_res;
- mar_req_setup_t req_setup;
- mar_res_setup_t res_setup;
- char control_map_path[PATH_MAX];
- char request_map_path[PATH_MAX];
- char response_map_path[PATH_MAX];
- char dispatch_map_path[PATH_MAX];
+ struct ipc_service_connect *setup;
res = hdb_error_to_cs (hdb_handle_create (&ipc_hdb,
sizeof (struct ipc_instance), handle));
@@ -593,7 +597,13 @@ coroipcc_service_connect (
return (res);
}
- res_setup.error = CS_ERR_LIBRARY;
+ setup = malloc(sizeof (*setup));
+ if (setup == NULL) {
+ res = CS_ERR_NO_MEMORY;
+ goto error_connect;
+ }
+
+ setup->res_setup.error = CS_ERR_LIBRARY;
#if defined(COROSYNC_SOLARIS)
request_fd = socket (PF_UNIX, SOCK_STREAM, 0);
@@ -601,7 +611,8 @@ coroipcc_service_connect (
request_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
#endif
if (request_fd == -1) {
- return (CS_ERR_LIBRARY);
+ res = CS_ERR_LIBRARY;
+ goto error_connect;
}
#ifdef SO_NOSIGPIPE
socket_nosigpipe (request_fd);
@@ -626,7 +637,7 @@ coroipcc_service_connect (
}
sys_res = memory_map (
- control_map_path,
+ setup->control_map_path,
"control_buffer-XXXXXX",
(void *)&ipc_instance->control_buffer,
8192);
@@ -636,7 +647,7 @@ coroipcc_service_connect (
}
sys_res = memory_map (
- request_map_path,
+ setup->request_map_path,
"request_buffer-XXXXXX",
(void *)&ipc_instance->request_buffer,
request_size);
@@ -646,7 +657,7 @@ coroipcc_service_connect (
}
sys_res = memory_map (
- response_map_path,
+ setup->response_map_path,
"response_buffer-XXXXXX",
(void *)&ipc_instance->response_buffer,
response_size);
@@ -656,7 +667,7 @@ coroipcc_service_connect (
}
sys_res = circular_memory_map (
- dispatch_map_path,
+ setup->dispatch_map_path,
"dispatch_buffer-XXXXXX",
(void *)&ipc_instance->dispatch_buffer,
dispatch_size);
@@ -711,33 +722,33 @@ coroipcc_service_connect (
/*
* Initialize IPC setup message
*/
- req_setup.service = service;
- strcpy (req_setup.control_file, control_map_path);
- strcpy (req_setup.request_file, request_map_path);
- strcpy (req_setup.response_file, response_map_path);
- strcpy (req_setup.dispatch_file, dispatch_map_path);
- req_setup.control_size = 8192;
- req_setup.request_size = request_size;
- req_setup.response_size = response_size;
- req_setup.dispatch_size = dispatch_size;
+ setup->req_setup.service = service;
+ strcpy (setup->req_setup.control_file, setup->control_map_path);
+ strcpy (setup->req_setup.request_file, setup->request_map_path);
+ strcpy (setup->req_setup.response_file, setup->response_map_path);
+ strcpy (setup->req_setup.dispatch_file, setup->dispatch_map_path);
+ setup->req_setup.control_size = 8192;
+ setup->req_setup.request_size = request_size;
+ setup->req_setup.response_size = response_size;
+ setup->req_setup.dispatch_size = dispatch_size;
#if _POSIX_THREAD_PROCESS_SHARED < 1
- req_setup.semkey = semkey;
+ setup->req_setup.semkey = semkey;
#endif
- res = socket_send (request_fd, &req_setup, sizeof (mar_req_setup_t));
+ res = socket_send (request_fd, &setup->req_setup, sizeof
(mar_req_setup_t));
if (res != CS_OK) {
goto error_exit;
}
- res = socket_recv (request_fd, &res_setup, sizeof (mar_res_setup_t));
+ res = socket_recv (request_fd, &setup->res_setup, sizeof
(mar_res_setup_t));
if (res != CS_OK) {
goto error_exit;
}
ipc_instance->fd = request_fd;
- if (res_setup.error == CS_ERR_TRY_AGAIN) {
- res = res_setup.error;
+ if (setup->res_setup.error == CS_ERR_TRY_AGAIN) {
+ res = setup->res_setup.error;
goto error_exit;
}
@@ -750,7 +761,10 @@ coroipcc_service_connect (
hdb_handle_put (&ipc_hdb, *handle);
- return (res_setup.error);
+ res = setup->res_setup.error;
+ free(setup);
+
+ return (res);
error_exit:
#if _POSIX_THREAD_PROCESS_SHARED < 1
@@ -769,6 +783,7 @@ error_connect:
hdb_handle_destroy (&ipc_hdb, *handle);
hdb_handle_put (&ipc_hdb, *handle);
+ free(setup);
return (res);
}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais