From 7fc0860442460d3fbf31054f28109c6e103f730c Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Fri, 12 Oct 2001 22:48:30 +0000 Subject: [PATCH] dont allow disabled event to be removed from the queue and changed interface so that new events are initially disabled --- src/db/dbEvent.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/db/dbEvent.c b/src/db/dbEvent.c index f3cff466f..d066642ca 100644 --- a/src/db/dbEvent.c +++ b/src/db/dbEvent.c @@ -65,6 +65,7 @@ struct evSubscrip { unsigned char select; char valque; char callBackInProgress; + char enabled; }; /* @@ -387,12 +388,12 @@ dbEventSubscription epicsShareAPI db_add_event ( pevent->select = select; pevent->pLastLog = NULL; /* not yet in the queue */ pevent->callBackInProgress = FALSE; + pevent->enabled = FALSE; + pevent->ev_que = ev_que; LOCKEVQUE(ev_que); ev_que->quota += EVENTENTRIES; UNLOCKEVQUE(ev_que); - - pevent->ev_que = ev_que; /* * Simple types values queued up for reliable interprocess @@ -407,10 +408,6 @@ dbEventSubscription epicsShareAPI db_add_event ( pevent->valque = FALSE; } - LOCKREC(precord); - ellAdd(&precord->mlis, &pevent->node); - UNLOCKREC(precord); - return pevent; } @@ -425,7 +422,10 @@ void epicsShareAPI db_event_enable (dbEventSubscription es) precord = (struct dbCommon *) pevent->paddr->precord; LOCKREC(precord); - ellAdd (&precord->mlis, &pevent->node); + if ( ! pevent->enabled ) { + ellAdd (&precord->mlis, &pevent->node); + pevent->enabled = TRUE; + } UNLOCKREC(precord); } @@ -440,7 +440,10 @@ void epicsShareAPI db_event_disable (dbEventSubscription es) precord = (struct dbCommon *) pevent->paddr->precord; LOCKREC(precord); - ellDelete(&precord->mlis, &pevent->node); + if ( pevent->enabled ) { + ellDelete(&precord->mlis, &pevent->node); + pevent->enabled = FALSE; + } UNLOCKREC(precord); } @@ -480,9 +483,7 @@ void epicsShareAPI db_cancel_event (dbEventSubscription es) precord = ( struct dbCommon * ) pevent->paddr->precord; - LOCKREC ( precord ); - ellDelete ( ( ELLLIST* ) &precord->mlis, &pevent->node ); - UNLOCKREC ( precord ); + db_event_disable ( es ); /* * flag the event as canceled by NULLing out the callback handler