From: Zoran V. <vas...@us...> - 2005-10-20 16:41:44
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19692/nsd Modified Files: callbacks.c Log Message: Added options to run registered callbacks in both FIFO and LIFO fashion. All of the start-type callbacks are now executed in FIFO and all stop-type in LIFO. Index: callbacks.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/callbacks.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** callbacks.c 10 Jun 2005 17:58:38 -0000 1.2 --- callbacks.c 20 Oct 2005 16:41:36 -0000 1.3 *************** *** 47,50 **** --- 47,51 ---- typedef struct Callback { struct Callback *nextPtr; + struct Callback *prevPtr; Ns_Callback *proc; void *arg; *************** *** 56,60 **** static Ns_ThreadProc RunThread; ! static void RunCallbacks(Callback *firstPtr); static void RunStart(Callback **firstPtrPtr, Ns_Thread *threadPtr); static void RunWait(Callback **firstPtrPtr, Ns_Thread *threadPtr, Ns_Time *toPtr); --- 57,61 ---- static Ns_ThreadProc RunThread; ! static void RunCallbacks(Callback *firstPtr, int reverse); static void RunStart(Callback **firstPtrPtr, Ns_Thread *threadPtr); static void RunWait(Callback **firstPtrPtr, Ns_Thread *threadPtr, Ns_Time *toPtr); *************** *** 86,90 **** NsRunAtReadyProcs(void) { ! RunCallbacks(firstReady); } --- 87,91 ---- NsRunAtReadyProcs(void) { ! RunCallbacks(firstReady, 0); } *************** *** 262,266 **** NsRunStartupProcs(void) { ! RunCallbacks(firstStartup); } --- 263,267 ---- NsRunStartupProcs(void) { ! RunCallbacks(firstStartup, 1); } *************** *** 285,289 **** NsRunPreStartupProcs(void) { ! RunCallbacks(firstPreStartup); } --- 286,290 ---- NsRunPreStartupProcs(void) { ! RunCallbacks(firstPreStartup, 1); } *************** *** 308,312 **** NsRunSignalProcs(void) { ! RunCallbacks(firstSignal); } --- 309,313 ---- NsRunSignalProcs(void) { ! RunCallbacks(firstSignal, 1); } *************** *** 351,355 **** NsRunAtExitProcs(void) { ! RunCallbacks(firstExit); } --- 352,356 ---- NsRunAtExitProcs(void) { ! RunCallbacks(firstExit, 0); } *************** *** 382,394 **** Ns_MutexLock(&lock); if (first) { ! Ns_MutexSetName(&lock, "ns:callbacks"); ! first = 0; } if (shutdownPending) { ns_free(cbPtr); ! cbPtr = NULL; } else { ! cbPtr->nextPtr = *firstPtrPtr; ! *firstPtrPtr = cbPtr; } Ns_MutexUnlock(&lock); --- 383,401 ---- Ns_MutexLock(&lock); if (first) { ! Ns_MutexSetName(&lock, "ns:callbacks"); ! first = 0; } if (shutdownPending) { ns_free(cbPtr); ! cbPtr = NULL; ! } else if (*firstPtrPtr == NULL) { ! *firstPtrPtr = cbPtr; ! cbPtr->nextPtr = NULL; ! cbPtr->prevPtr = NULL; } else { ! (*firstPtrPtr)->prevPtr = cbPtr; ! cbPtr->nextPtr = *firstPtrPtr; ! cbPtr->prevPtr = NULL; ! *firstPtrPtr = cbPtr; } Ns_MutexUnlock(&lock); *************** *** 402,406 **** * RunCallbacks -- * ! * Run all callbacks in the passed-in linked list * * Results: --- 409,413 ---- * RunCallbacks -- * ! * Run all callbacks in the passed-in linked list. * * Results: *************** *** 414,422 **** static void ! RunCallbacks(Callback *cbPtr) { while (cbPtr != NULL) { (*cbPtr->proc) (cbPtr->arg); ! cbPtr = cbPtr->nextPtr; } } --- 421,439 ---- static void ! RunCallbacks(Callback *cbPtr, int reverse) { + if (reverse) { + while (cbPtr != NULL && cbPtr->nextPtr != NULL) { + cbPtr = cbPtr->nextPtr; + } + } + while (cbPtr != NULL) { (*cbPtr->proc) (cbPtr->arg); ! if (reverse) { ! cbPtr = cbPtr->prevPtr; ! } else { ! cbPtr = cbPtr->nextPtr; ! } } } *************** *** 465,469 **** Ns_MutexUnlock(&lock); ! RunCallbacks(firstPtr); Ns_MutexLock(&lock); --- 482,486 ---- Ns_MutexUnlock(&lock); ! RunCallbacks(firstPtr, 0); Ns_MutexLock(&lock); *************** *** 479,493 **** static void ! AppendList(Tcl_DString *dsPtr, char *list, Callback *firstPtr) { ! Callback *cbPtr; - cbPtr = firstPtr; while (cbPtr != NULL) { ! Tcl_DStringStartSublist(dsPtr); ! Tcl_DStringAppendElement(dsPtr, list); ! Ns_GetProcInfo(dsPtr, (void *) cbPtr->proc, cbPtr->arg); ! Tcl_DStringEndSublist(dsPtr); ! cbPtr = cbPtr->nextPtr; } } --- 496,519 ---- static void ! AppendList(Tcl_DString *dsPtr, char *list, Callback *firstPtr, int reverse) { ! Callback *cbPtr = firstPtr; ! ! if (reverse) { ! while (cbPtr != NULL && cbPtr->nextPtr != NULL) { ! cbPtr = cbPtr->nextPtr; ! } ! } while (cbPtr != NULL) { ! Tcl_DStringStartSublist(dsPtr); ! Tcl_DStringAppendElement(dsPtr, list); ! Ns_GetProcInfo(dsPtr, (void *) cbPtr->proc, cbPtr->arg); ! Tcl_DStringEndSublist(dsPtr); ! if (reverse) { ! cbPtr = cbPtr->prevPtr; ! } else { ! cbPtr = cbPtr->nextPtr; ! } } } *************** *** 498,507 **** { Ns_MutexLock(&lock); ! AppendList(dsPtr, "prestartup", firstPreStartup); ! AppendList(dsPtr, "startup", firstStartup); ! AppendList(dsPtr, "signal", firstSignal); ! AppendList(dsPtr, "servershutdown", firstServerShutdown); ! AppendList(dsPtr, "shutdown", firstShutdown); ! AppendList(dsPtr, "exit", firstExit); Ns_MutexUnlock(&lock); } --- 524,533 ---- { Ns_MutexLock(&lock); ! AppendList(dsPtr, "prestartup", firstPreStartup, 1); ! AppendList(dsPtr, "startup", firstStartup, 1); ! AppendList(dsPtr, "signal", firstSignal, 1); ! AppendList(dsPtr, "servershutdown", firstServerShutdown, 0); ! AppendList(dsPtr, "shutdown", firstShutdown, 0); ! AppendList(dsPtr, "exit", firstExit, 0); Ns_MutexUnlock(&lock); } |