Added initHookName() function.

Use epicsThreadOnce() for lazy init.
This commit is contained in:
Andrew Johnson
2008-06-11 14:50:40 +00:00
parent 2dc0020513
commit 556bab5ffe
2 changed files with 73 additions and 45 deletions

View File

@@ -1,19 +1,17 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* Copyright (c) 2008 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/* share/src/db/initHooks.c*/
/* src/db/initHooks.c */
/*
* Authors: Benjamin Franksen (BESY) and Marty Kraimer
* Date: 06-01-91
* Date: 06-01-91
* major Revision: 07JuL97
*/
#include <stdlib.h>
#include <stddef.h>
@@ -21,55 +19,86 @@
#include "dbDefs.h"
#include "ellLib.h"
#include "epicsThread.h"
#define epicsExportSharedSymbols
#include "initHooks.h"
typedef struct initHookLink {
ELLNODE node;
initHookFunction func;
ELLNODE node;
initHookFunction func;
} initHookLink;
static int functionListInited = FALSE;
static ELLLIST functionList;
static void initFunctionList(void)
/*
* Lazy initialization functions
*/
static void initHookOnce(void *arg)
{
ellInit(&functionList);
functionListInited = TRUE;
}
static void initHookInit(void)
{
static epicsThreadOnceId onceFlag = EPICS_THREAD_ONCE_INIT;
epicsThreadOnce(&onceFlag, initHookOnce, NULL);
}
/*
* To be called before iocInit reaches state desired.
*/
int epicsShareAPI initHookRegister(initHookFunction func)
int initHookRegister(initHookFunction func)
{
initHookLink *newHook;
initHookLink *newHook;
if(!functionListInited) initFunctionList();
newHook = (initHookLink *)malloc(sizeof(initHookLink));
if (newHook == NULL)
{
printf("Cannot malloc a new initHookLink\n");
return -1;
}
newHook->func = func;
ellAdd(&functionList,&newHook->node);
return 0;
initHookInit();
newHook = (initHookLink *)malloc(sizeof(initHookLink));
if (newHook == NULL) {
printf("Cannot malloc a new initHookLink\n");
return -1;
}
newHook->func = func;
ellAdd(&functionList, &newHook->node);
return 0;
}
/*
* Called by iocInit at various points during initialization.
* Do not call this function from any other function than iocInit.
*/
void epicsShareAPI initHooks(initHookState state)
void initHooks(initHookState state)
{
initHookLink *hook;
initHookLink *hook;
if(!functionListInited) initFunctionList();
hook = (initHookLink *)ellFirst(&functionList);
while(hook != NULL)
{
hook->func(state);
hook = (initHookLink *)ellNext(&hook->node);
}
initHookInit();
hook = (initHookLink *)ellFirst(&functionList);
while (hook != NULL) {
hook->func(state);
hook = (initHookLink *)ellNext(&hook->node);
}
}
/*
* Call any time you want to print out a state name.
*/
const char *initHookName(initHookState state)
{
const char *stateName[] = {
"initHookAtBeginning",
"initHookAfterCallbackInit",
"initHookAfterCaLinkInit",
"initHookAfterInitDrvSup",
"initHookAfterInitRecSup",
"initHookAfterInitDevSup",
"initHookAfterInitDatabase",
"initHookAfterFinishDevSup",
"initHookAfterScanInit",
"initHookAfterInitialProcess",
"initHookAfterInterruptAccept",
"initHookAtEnd"
};
if (state < initHookAtBeginning || state > initHookAtEnd) {
return "Not an initHookState";
}
return stateName[state];
}

View File

@@ -1,25 +1,24 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* Copyright (c) 2008 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/* share/src/db/initHooks.h*/
/* src/db/initHooks.h */
/*
* Authors: Benjamin Franksen (BESY) and Marty Kraimer
* Date: 06-01-91
* Authors: Benjamin Franksen (BESY) and Marty Kraimer
* Date: 06-01-91
* major Revision: 07JuL97
*/
#ifndef INCinitHooksh
#define INCinitHooksh 1
#ifndef INC_initHooks_H
#define INC_initHooks_H
#include "shareLib.h"
/* This enum must agree with the array of names defined in initHookName() */
typedef enum {
initHookAtBeginning,
initHookAfterCallbackInit,
@@ -40,11 +39,11 @@ extern "C" {
#endif
typedef void (*initHookFunction)(initHookState state);
epicsShareFunc int epicsShareAPI initHookRegister(initHookFunction func);
epicsShareFunc void epicsShareAPI initHooks(initHookState state);
epicsShareFunc int initHookRegister(initHookFunction func);
epicsShareFunc void initHooks(initHookState state);
epicsShareFunc const char *initHookName(initHookState state);
#ifdef __cplusplus
}
#endif
#endif /*INCinitHooksh*/
#endif /* INC_initHooks_H */