diff --git a/modules/database/src/ioc/Makefile b/modules/database/src/ioc/Makefile index cf33453557..74e75a4b0c 100644 --- a/modules/database/src/ioc/Makefile +++ b/modules/database/src/ioc/Makefile @@ -16,8 +16,7 @@ USR_CPPFLAGS += -DUSE_TYPED_RSET -DUSE_TYPED_DSET # Shared library ABI version. SHRLIB_VERSION = $(EPICS_DATABASE_MAJOR_VERSION).$(EPICS_DATABASE_MINOR_VERSION).$(EPICS_DATABASE_MAINTENANCE_VERSION) -API_HEADER = dbCoreAPI.h -dbCore_API = dbCore +# dbCoreAPI.h generated earlier during libcom/ LIBRARY_IOC += dbCore dbCore_LIBS += ca Com diff --git a/modules/libcom/src/Makefile b/modules/libcom/src/Makefile index ffc36445eb..54ab3f5ca9 100644 --- a/modules/libcom/src/Makefile +++ b/modules/libcom/src/Makefile @@ -54,6 +54,9 @@ include $(LIBCOM)/yajl/Makefile # Generate library API header file API_HEADER = libComAPI.h Com_API = libCom +# Generate early to allow a sneak peak at dbChannel.h +API_HEADER += dbCoreAPI.h +dbCore_API = dbCore # Library to build: LIBRARY=Com diff --git a/modules/libcom/src/as/Makefile b/modules/libcom/src/as/Makefile index 65f7520187..4d17a623a8 100644 --- a/modules/libcom/src/as/Makefile +++ b/modules/libcom/src/as/Makefile @@ -19,4 +19,8 @@ INC += asTrapWrite.h Com_SRCS += asLib.c Com_SRCS += asTrapWrite.c +# Allow early access to dbChannel.h +asTrapWrite_CPPFLAGS = -I$(LIBCOM)/../../database/src/ioc/db + + CLEANS += asLib.c asLib_lex.c diff --git a/modules/libcom/src/as/asLib.h b/modules/libcom/src/as/asLib.h index 9c47790ebe..415d98d1a9 100644 --- a/modules/libcom/src/as/asLib.h +++ b/modules/libcom/src/as/asLib.h @@ -22,6 +22,8 @@ extern "C" { #endif +struct dbChannel; + /* 0 - Use (unverified) client provided host name string. * 1 - Use actual client IP address. HAG() are resolved to IPs at ACF load time. */ @@ -121,7 +123,7 @@ LIBCOM_API int epicsStdCall asDumpHash(void); LIBCOM_API int epicsStdCall asDumpHashFP(FILE *fp); LIBCOM_API void * epicsStdCall asTrapWriteBeforeWithData( - const char *userid, const char *hostid, void *addr, + const char *userid, const char *hostid, struct dbChannel *addr, int dbrType, int no_elements, void *data); LIBCOM_API void epicsStdCall asTrapWriteAfterWrite(void *pvt); diff --git a/modules/libcom/src/as/asTrapWrite.c b/modules/libcom/src/as/asTrapWrite.c index a3f390847c..ec5f0d1478 100644 --- a/modules/libcom/src/as/asTrapWrite.c +++ b/modules/libcom/src/as/asTrapWrite.c @@ -22,10 +22,10 @@ #include "ellLib.h" #include "freeList.h" -#include "epicsStdio.h" #include "cantProceed.h" #include "epicsMutex.h" #include "ellLib.h" +#include #include "asLib.h" #include "asTrapWrite.h" @@ -112,11 +112,12 @@ void epicsStdCall asTrapWriteUnregisterListener(asTrapWriteId id) } void * epicsStdCall asTrapWriteBeforeWithData( - const char *userid, const char *hostid, void *addr, + const char *userid, const char *hostid, dbChannel *chan, int dbrType, int no_elements, void *data) { writeMessage *pwriteMessage; listener *plistener; + void *pfieldsave; if (pasTrapWritePvt == 0 || ellCount(&pasTrapWritePvt->listenerList) <= 0) return 0; @@ -125,13 +126,14 @@ void * epicsStdCall asTrapWriteBeforeWithData( pasTrapWritePvt->freeListWriteMessage); pwriteMessage->message.userid = userid; pwriteMessage->message.hostid = hostid; - pwriteMessage->message.serverSpecific = addr; + pwriteMessage->message.serverSpecific = chan; pwriteMessage->message.dbrType = dbrType; pwriteMessage->message.no_elements = no_elements; pwriteMessage->message.data = data; ellInit(&pwriteMessage->listenerPvtList); epicsMutexMustLock(pasTrapWritePvt->lock); + pfieldsave = chan->addr.pfield; ellAdd(&pasTrapWritePvt->writeMessageList, &pwriteMessage->node); plistener = (listener *)ellFirst(&pasTrapWritePvt->listenerList); while (plistener) { @@ -141,6 +143,7 @@ void * epicsStdCall asTrapWriteBeforeWithData( plistenerPvt->plistener = plistener; pwriteMessage->message.userPvt = 0; plistener->func(&pwriteMessage->message, 0); + chan->addr.pfield = pfieldsave; plistenerPvt->userPvt = pwriteMessage->message.userPvt; ellAdd(&pwriteMessage->listenerPvtList, &plistenerPvt->node); plistener = (listener *)ellNext(&plistener->node); @@ -153,11 +156,15 @@ void epicsStdCall asTrapWriteAfterWrite(void *pvt) { writeMessage *pwriteMessage = (writeMessage *)pvt; listenerPvt *plistenerPvt; + dbChannel *chan; + void *pfieldsave; if (pwriteMessage == 0 || pasTrapWritePvt == 0) return; epicsMutexMustLock(pasTrapWritePvt->lock); + chan = pwriteMessage->message.serverSpecific; + pfieldsave = chan->addr.pfield; plistenerPvt = (listenerPvt *)ellFirst(&pwriteMessage->listenerPvtList); while (plistenerPvt) { listenerPvt *pnext = (listenerPvt *)ellNext(&plistenerPvt->node); @@ -165,6 +172,7 @@ void epicsStdCall asTrapWriteAfterWrite(void *pvt) pwriteMessage->message.userPvt = plistenerPvt->userPvt; plistener->func(&pwriteMessage->message, 1); + chan->addr.pfield = pfieldsave; ellDelete(&pwriteMessage->listenerPvtList, &plistenerPvt->node); freeListFree(pasTrapWritePvt->freeListListenerPvt, plistenerPvt); plistenerPvt = pnext; diff --git a/modules/libcom/src/as/asTrapWrite.h b/modules/libcom/src/as/asTrapWrite.h index 0d9f4d99b6..d64e24b18f 100644 --- a/modules/libcom/src/as/asTrapWrite.h +++ b/modules/libcom/src/as/asTrapWrite.h @@ -26,6 +26,8 @@ extern "C" { #endif +struct dbChannel; + /** * \brief The message passed to registered listeners. */ @@ -39,7 +41,7 @@ typedef struct asTrapWriteMessage { * the value the server provides to asTrapWriteWithData(), which * for RSRV is the dbChannel pointer for the target field. */ - void *serverSpecific; + struct dbChannel *serverSpecific; /** \brief A field for use by the \ref asTrapWriteListener. * * When the listener is called before the write, this has the