This patch fixes a few issues with the event service dispatch code. It
is similar to the patch I posted eariler for the saAmf service.
Fixes include:
* Change checking of dispatchFlags to be same as other services.
* Wrap coroipcc_dispatch_recv with pthread_mutex_lock/unlock. As a
result, remove other unlocks. Note that it appears that existing
code never called lock on dispatch_mutex.
* Change finalize check to only occur when dispatch_avail == -1.
* Remove ignore_dispatch variable, which wasn't used.
Index: lib/evt.c
===================================================================
--- lib/evt.c (revision 1787)
+++ lib/evt.c (working copy)
@@ -597,48 +597,53 @@
struct event_instance *evti;
SaEvtEventHandleT event_handle;
SaEvtCallbacksT callbacks;
- int ignore_dispatch = 0;
int cont = 1; /* always continue do loop except when set to 0 */
struct lib_event_data *evt = 0;
- if (dispatchFlags < SA_DISPATCH_ONE ||
- dispatchFlags > SA_DISPATCH_BLOCKING) {
+ if (dispatchFlags != SA_DISPATCH_ONE &&
+ dispatchFlags != SA_DISPATCH_ALL &&
+ dispatchFlags != SA_DISPATCH_BLOCKING) {
+
return SA_AIS_ERR_INVALID_PARAM;
}
error = saHandleInstanceGet(&evt_instance_handle_db, evtHandle,
(void *)&evti);
if (error != SA_AIS_OK) {
- return error;
+ goto dispatch_exit;
}
/*
- * Timeout instantly for SA_DISPATCH_ALL
+ * Timeout instantly for SA_DISPATCH_ALL, otherwise don't timeout
+ * for SA_DISPATCH_BLOCKING or SA_DISPATCH_ONE
*/
- if (dispatchFlags == SA_DISPATCH_ALL || dispatchFlags ==
SA_DISPATCH_ONE) {
+ if (dispatchFlags == SA_DISPATCH_ALL) {
timeout = 0;
}
do {
+ pthread_mutex_lock (&evti->ei_dispatch_mutex);
+
dispatch_avail = coroipcc_dispatch_recv (evti->ipc_ctx,
(void *)&evti->ei_dispatch_data, sizeof
(evti->ei_dispatch_data), timeout);
- /*
- * Handle has been finalized in another thread
- */
- if (evti->ei_finalize == 1) {
- error = SA_AIS_OK;
- goto dispatch_unlock;
- }
+ pthread_mutex_unlock (&evti->ei_dispatch_mutex);
if (dispatch_avail == 0 && dispatchFlags == SA_DISPATCH_ALL) {
- pthread_mutex_unlock (&evti->ei_dispatch_mutex);
break; /* exit do while cont is 1 loop */
} else
if (dispatch_avail == 0) {
- pthread_mutex_unlock (&evti->ei_dispatch_mutex);
- continue; /* next poll */
+ continue;
}
+ if (dispatch_avail == -1) {
+ if (evti->ei_finalize == 1) {
+ error = SA_AIS_OK;
+ } else {
+ error = SA_AIS_ERR_LIBRARY;
+ }
+ goto dispatch_put;
+ }
+
/*
* Make copy of callbacks, message data, unlock instance,
@@ -732,26 +737,16 @@
default:
printf ("Dispatch: Bad message type 0x%x\n",
evti->ei_dispatch_data.header.id);
error = SA_AIS_ERR_LIBRARY;
- goto dispatch_unlock;
}
- pthread_mutex_unlock(&evti->ei_dispatch_mutex);
-
/*
* Determine if more messages should be processed
*/
switch (dispatchFlags) {
case SA_DISPATCH_ONE:
- if (ignore_dispatch) {
- ignore_dispatch = 0;
- } else {
- cont = 0;
- }
+ cont = 0;
break;
case SA_DISPATCH_ALL:
- if (ignore_dispatch) {
- ignore_dispatch = 0;
- }
break;
case SA_DISPATCH_BLOCKING:
break;
@@ -760,10 +755,9 @@
goto dispatch_put;
-dispatch_unlock:
- pthread_mutex_unlock(&evti->ei_dispatch_mutex);
dispatch_put:
saHandleInstancePut(&evt_instance_handle_db, evtHandle);
+dispatch_exit:
return error;
}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais