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

Reply via email to