From 3529d5181c6ebea4fdef5622f5694706e8d22b59 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Thu, 18 Nov 1999 18:19:15 +0000 Subject: [PATCH] fixed bug where ++ -- operators were not properly guarded on RISC arch --- src/db/dbEvent.c | 83 +++++++++++++++++++++++++++--------------------- src/db/dbEvent.h | 62 ++++++++++++++++++------------------ 2 files changed, 78 insertions(+), 67 deletions(-) diff --git a/src/db/dbEvent.c b/src/db/dbEvent.c index 96bfbfd50..4103dbce8 100644 --- a/src/db/dbEvent.c +++ b/src/db/dbEvent.c @@ -1,5 +1,5 @@ /* dbEvent.c */ -/* share/src/db $Id$ */ +/* $Id$ */ /* routines for scheduling events to lower priority tasks via the RT kernel */ /* * Author: Jeffrey O. Hill @@ -192,10 +192,14 @@ struct event_user *db_init_events(void) evUser = (struct event_user *) freeListCalloc(dbevEventUserFreeList); if(!evUser) - return NULL; + return NULL; evUser->firstque.evUser = evUser; - evUser->firstque.writelock = semMutexCreate(); + evUser->firstque.writelock = semMutexCreate(); + if (!evUser->firstque.writelock) { + freeListFree (dbevEventUserFreeList, evUser); + return NULL; + } evUser->ppendsem = semBinaryCreate(semEmpty); if(!evUser->ppendsem){ semMutexDestroy(evUser->firstque.writelock); @@ -210,7 +214,6 @@ struct event_user *db_init_events(void) return NULL; } evUser->flowCtrlMode = FALSE; - evUser->nDuplicates = 0u; return evUser; } @@ -304,7 +307,12 @@ struct event_block *pevent /* ptr to event blk (not required) */ if(!tmp_que) return ERROR; tmp_que->evUser = evUser; - tmp_que->writelock = semMutexCreate(); + tmp_que->writelock = semMutexCreate(); + if (!tmp_que->writelock) { + freeListFree (dbevEventQueueFreeList, tmp_que); + return ERROR; + } + tmp_que->nDuplicates = 0u; ev_que->nextque = tmp_que; ev_que = tmp_que; break; @@ -642,7 +650,7 @@ LOCAL int db_post_single_event_private(struct event_block *event) pLog = &ev_que->valque[ev_que->putix]; ev_que->evque[ev_que->putix] = event; if (event->npend>0u) { - ev_que->evUser->nDuplicates++; + ev_que->nDuplicates++; } event->npend++; /* @@ -780,35 +788,26 @@ void event_task( struct event_user *evUser) (*evUser->extralabor_sub)(evUser->extralabor_arg); } - /* - * if in flow control mode drain duplicates and then - * suspend processing events until flow control - * mode is over - */ - if (evUser->flowCtrlMode!=TRUE || evUser->nDuplicates>0u) { - - for( ev_que= &evUser->firstque; - ev_que; - ev_que = ev_que->nextque){ - event_read(ev_que); - } - - /* - * The following do not introduce event latency since they - * are not between notification and posting events. - */ - if(evUser->queovr){ - if(evUser->overflow_sub) - (*evUser->overflow_sub)( - evUser->overflow_arg, - evUser->queovr); - else - errlogPrintf("Events lost, discard count was %d\n", - evUser->queovr); - evUser->queovr = 0; - } + for( ev_que= &evUser->firstque; + ev_que; + ev_que = ev_que->nextque){ + event_read(ev_que); } + /* + * The following do not introduce event latency since they + * are not between notification and posting events. + */ + if(evUser->queovr){ + if(evUser->overflow_sub) + (*evUser->overflow_sub)( + evUser->overflow_arg, + evUser->queovr); + else + errlogPrintf("Events lost, discard count was %d\n", + evUser->queovr); + evUser->queovr = 0; + } }while(!evUser->pendexit); evUser->pendlck = FALSE; @@ -852,12 +851,24 @@ LOCAL int event_read (struct event_que *ev_que) void (*user_sub) (void *user_arg, struct dbAddr *paddr, int eventsRemaining, db_field_log *pfl); + + /* * evUser ring buffer must be locked for the multiple * threads writing/reading it */ LOCKEVQUE(ev_que) - + + /* + * if in flow control mode drain duplicates and then + * suspend processing events until flow control + * mode is over + */ + if (ev_que->evUser->flowCtrlMode && ev_que->nDuplicates==0u) { + UNLOCKEVQUE(ev_que); + return OK; + } + /* * Fetch fast register copy */ @@ -895,8 +906,8 @@ LOCAL int event_read (struct event_que *ev_que) } else { assert (event->npend>1u); - assert (ev_que->evUser->nDuplicates>=1u); - ev_que->evUser->nDuplicates--; + assert (ev_que->nDuplicates>=1u); + ev_que->nDuplicates--; } /* diff --git a/src/db/dbEvent.h b/src/db/dbEvent.h index 0f7a811c4..9d546e73a 100644 --- a/src/db/dbEvent.h +++ b/src/db/dbEvent.h @@ -1,4 +1,5 @@ -/* $Id$ +/* + * $Id$ * * Author: Jeff Hill * Date: 030393 @@ -70,43 +71,42 @@ struct event_block{ struct event_que{ /* lock writers to the ring buffer only */ /* readers must never slow up writers */ - semId writelock; - db_field_log valque[EVENTQUESIZE]; - struct event_block *evque[EVENTQUESIZE]; - struct event_que *nextque; /* in case que quota exceeded */ - struct event_user *evUser; /* event user parent struct */ - unsigned short putix; - unsigned short getix; - unsigned short quota; /* the number of assigned entries*/ + semId writelock; + db_field_log valque[EVENTQUESIZE]; + struct event_block *evque[EVENTQUESIZE]; + struct event_que *nextque; /* in case que quota exceeded */ + struct event_user *evUser; /* event user parent struct */ + unsigned short putix; + unsigned short getix; + unsigned short quota; /* the number of assigned entries*/ + unsigned short nDuplicates; /* N events duplicated on this q */ }; typedef void OVRFFUNC (void *overflow_arg, unsigned count); typedef void EXTRALABORFUNC (void *extralabor_arg); -struct event_user{ - struct event_que firstque; /* the first event que */ - - semId ppendsem; /* Wait while empty */ - semId pflush_sem; /* wait for flush */ - - OVRFFUNC *overflow_sub; /* called when overflow detect */ - void *overflow_arg; /* parameter to above */ - - EXTRALABORFUNC *extralabor_sub;/* off load to event task */ - void *extralabor_arg;/* parameter to above */ - - threadId taskid; /* event handler task id */ - unsigned queovr; /* event que overflow count */ - unsigned nDuplicates; /* events duplicated on q */ - char pendlck; /* Only one task can pend */ - unsigned char pendexit; /* exit pend task */ - unsigned char extra_labor; /* if set call extra labor func */ - unsigned char flowCtrlMode; /* replace existing monitor */ - int (*init_func)(); - threadId init_func_arg; +struct event_user { + struct event_que firstque; /* the first event que */ + + semId ppendsem; /* Wait while empty */ + semId pflush_sem; /* wait for flush */ + + OVRFFUNC *overflow_sub; /* called when overflow detect */ + void *overflow_arg; /* parameter to above */ + + EXTRALABORFUNC *extralabor_sub;/* off load to event task */ + void *extralabor_arg;/* parameter to above */ + + threadId taskid; /* event handler task id */ + unsigned queovr; /* event que overflow count */ + char pendlck; /* Only one task can pend */ + unsigned char pendexit; /* exit pend task */ + unsigned char extra_labor; /* if set call extra labor func */ + unsigned char flowCtrlMode; /* replace existing monitor */ + int (*init_func)(); + int init_func_arg; }; - int db_event_list(char *name); struct event_user *db_init_events(void); int db_close_events(struct event_user *evUser);