From 97fed77b5f64b9a2004bc11f1bd7cf3b6226a2b8 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 27 Feb 2002 21:09:57 +0000 Subject: [PATCH] installed patch for "events lost" problem when installing many subscriptions just after canceling many subscriptions --- src/db/dbEvent.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/db/dbEvent.c b/src/db/dbEvent.c index bf825f7b9..3674ad57d 100644 --- a/src/db/dbEvent.c +++ b/src/db/dbEvent.c @@ -84,6 +84,7 @@ struct event_que { unsigned short getix; unsigned short quota; /* the number of assigned entries*/ unsigned short nDuplicates; /* N events duplicated on this q */ + unsigned short nCanceled; /* the number of canceled entries */ }; struct event_user { @@ -231,8 +232,14 @@ int epicsShareAPI dbel ( const char *pname, unsigned level ) if ( ! pevent->valque ) { printf (", queueing disabled" ); } - printf (", duplicate count =%u\n", - pevent->ev_que->nDuplicates ); + if ( pevent->ev_que->nDuplicates ) { + printf (", duplicate count =%u\n", + pevent->ev_que->nDuplicates ); + } + if ( pevent->ev_que->nCanceled ) { + printf (", canceled count =%u\n", + pevent->ev_que->nCanceled ); + } } if ( level > 3 ) { @@ -364,7 +371,7 @@ dbEventSubscription epicsShareAPI db_add_event ( /* otherwise add a new one to the list */ ev_que = &evUser->firstque; while (TRUE) { - if (ev_que->quota < EVENTQUESIZE - EVENTENTRIES) { + if (ev_que->quota + ev_que->nCanceled < EVENTQUESIZE - EVENTENTRIES) { break; } if (!ev_que->nextque) { @@ -517,6 +524,8 @@ void epicsShareAPI db_cancel_event (dbEventSubscription es) pevent->ev_que->evque[getix] != EVENTQEMPTY; getix = RNGINC ( getix ) ) { if ( pevent->ev_que->evque[getix] == pevent ) { + assert ( pevent->ev_que->nCanceled < USHRT_MAX ); + pevent->ev_que->nCanceled++; event_remove ( pevent->ev_que, getix, &canceledEvent ); } } @@ -808,6 +817,8 @@ LOCAL int event_read ( struct event_que *ev_que ) if ( event == &canceledEvent ) { ev_que->evque[ev_que->getix] = EVENTQEMPTY; ev_que->getix = RNGINC ( ev_que->getix ); + assert ( ev_que->nCanceled > 0 ); + ev_que->nCanceled--; continue; }