Sending_allowed use sync_in_process. If sync_in process is set in the
middle of sending_allowed and api->handler_fn_get, results are
unpredictable. Solution is to enlarge lock.

Signed-off-by: Jan Friesse <[email protected]>
---
 exec/coroipcs.c |    7 +++++--
 1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/exec/coroipcs.c b/exec/coroipcs.c
index 36d18a4..f3161a1 100644
--- a/exec/coroipcs.c
+++ b/exec/coroipcs.c
@@ -703,6 +703,8 @@ static void *pthread_ipc_consumer (void *conn)
 
                coroipcs_refcount_inc (conn);
 
+               api->serialize_lock();
+
                send_ok = api->sending_allowed (conn_info->service,
                        header->id,
                        header,
@@ -723,9 +725,7 @@ static void *pthread_ipc_consumer (void *conn)
                } else 
                if (send_ok) {
                        api->stats_increment_value (conn_info->stats_handle, 
"requests");
-                       api->serialize_lock();
                        api->handler_fn_get (conn_info->service, header->id) 
(conn_info, header);
-                       api->serialize_unlock();
                } else {
                        /*
                         * Overload, tell library to retry
@@ -740,6 +740,9 @@ static void *pthread_ipc_consumer (void *conn)
                }
 
                api->sending_allowed_release 
(conn_info->sending_allowed_private_data);
+
+               api->serialize_unlock();
+
                coroipcs_refcount_dec (conn);
        }
        pthread_exit (0);
-- 
1.7.1

_______________________________________________
discuss mailing list
[email protected]
http://lists.corosync.org/mailman/listinfo/discuss

Reply via email to