From 2a7c2e9d2699d6ff3c02a77c70708361cbe45a63 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 19 Dec 2006 16:20:47 +0000 Subject: [PATCH] Breakpoint initialization and cleanup. --- src/db/dbAccess.c | 4 ++-- src/db/dbBkpt.c | 43 +++++++++++++++++++------------------------ src/db/dbBkpt.h | 7 ++++--- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/db/dbAccess.c b/src/db/dbAccess.c index 4ff208309..f5d6a445c 100644 --- a/src/db/dbAccess.c +++ b/src/db/dbAccess.c @@ -535,7 +535,7 @@ long epicsShareAPI dbProcess(dbCommon *precord) */ /* see if there are any stopped records or breakpoints */ - if (lset_stack_not_empty) { + if (lset_stack_count != 0) { /* * Check to see if the record should be processed * and activate breakpoint accordingly. If this @@ -624,7 +624,7 @@ long epicsShareAPI dbProcess(dbCommon *precord) /* process record */ status = (*prset->process)(precord); /* Print record's fields if PRINT_MASK set in breakpoint field */ - if (lset_stack_not_empty) { + if (lset_stack_count != 0) { dbPrint(precord); } all_done: diff --git a/src/db/dbBkpt.c b/src/db/dbBkpt.c index 905b8618a..902dd9950 100644 --- a/src/db/dbBkpt.c +++ b/src/db/dbBkpt.c @@ -141,7 +141,7 @@ static long FIND_CONT_NODE( * normal record execution, i.e. when there aren't * any breakpoints set. */ -long lset_stack_not_empty = 0; +long lset_stack_count = 0; /* * Stack--in which each entry represents a different @@ -154,7 +154,7 @@ long lset_stack_not_empty = 0; * operating with this stack. */ static ELLLIST lset_stack; -static epicsMutexId bkpt_stack_sem; +static epicsMutexId bkpt_stack_sem = 0; /* * Stores the last lockset continued or stepped from. @@ -250,6 +250,18 @@ static long FIND_CONT_NODE( } +/* + * Initialise the breakpoint stack + */ +void epicsShareAPI dbBkptInit(void) +{ + if (! bkpt_stack_sem) { + bkpt_stack_sem = epicsMutexMustCreate(); + ellInit(&lset_stack); + lset_stack_count = 0; + } +} + /* * Add breakpoint to a lock set * 1. Convert name to address and check breakpoint mask. @@ -290,17 +302,6 @@ long epicsShareAPI dbb(const char *record_name) * Add lock set to the stack of lock sets that * contain breakpoints and/or stopped records. */ - if (! lset_stack_not_empty) { - /* initialize list and semaphore */ - bkpt_stack_sem = epicsMutexCreate(); - if (bkpt_stack_sem == 0) { - printf(" BKPT> epicsMutexCreate failed\n"); - dbScanUnlock(precord); - return(1); - } - ellInit(&lset_stack); - lset_stack_not_empty = 1; - } epicsMutexMustLock(bkpt_stack_sem); @@ -335,7 +336,9 @@ long epicsShareAPI dbb(const char *record_name) pnode->taskid = 0; pnode->step = 0; pnode->l_num = dbLockGetLockId(precord); + ellAdd(&lset_stack, (ELLNODE *)pnode); + ++lset_stack_count; } /* @@ -604,11 +607,11 @@ static void dbBkptCont(dbCommon *precord) /* Reset precord. (Since no records are at a breakpoint) */ pnode->precord = NULL; - } - while (ellCount(&pnode->bp_list) != 0); + } while (ellCount(&pnode->bp_list) != 0); /* remove node from lockset stack */ ellDelete(&lset_stack, (ELLNODE *)pnode); + --lset_stack_count; { /* @@ -634,15 +637,7 @@ static void dbBkptCont(dbCommon *precord) /* free list node */ free(pnode); - /* if last node on stack ... */ - if (ellCount(&lset_stack) == 0) { - /* Unset flag, delete stack semaphore */ - lset_stack_not_empty = 0; - epicsMutexDestroy(bkpt_stack_sem); - } - - if (lset_stack_not_empty) - epicsMutexUnlock(bkpt_stack_sem); + epicsMutexUnlock(bkpt_stack_sem); } /* diff --git a/src/db/dbBkpt.h b/src/db/dbBkpt.h index 5a37e5aa6..ff3c33065 100644 --- a/src/db/dbBkpt.h +++ b/src/db/dbBkpt.h @@ -82,6 +82,7 @@ struct LS_LIST { #define MAX_EP_COUNT 99999 +epicsShareFunc void epicsShareAPI dbBkptInit(void); epicsShareFunc long epicsShareAPI dbb(const char *recordname); epicsShareFunc long epicsShareAPI dbd(const char *recordname); epicsShareFunc long epicsShareAPI dbc(const char *recordname); @@ -90,11 +91,11 @@ epicsShareFunc long epicsShareAPI dbstat(void); epicsShareFunc long epicsShareAPI dbp( const char *record_name, int interest_level); epicsShareFunc long epicsShareAPI dbap(const char *record_name); -epicsShareFunc int epicsShareAPI dbBkpt(dbCommon *precord); -epicsShareFunc void epicsShareAPI dbPrint(dbCommon *precord); +epicsShareFunc int epicsShareAPI dbBkpt(struct dbCommon *precord); +epicsShareFunc void epicsShareAPI dbPrint(struct dbCommon *precord); epicsShareFunc long epicsShareAPI dbprc(char *record_name); -extern long lset_stack_not_empty; +extern long lset_stack_count; #ifdef __cplusplus }