This is Unofficial EPICS BASE Doxygen Site
asTrapWrite.c File Reference
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include "ellLib.h"
#include "freeList.h"
#include "epicsStdio.h"
#include "cantProceed.h"
#include "epicsMutex.h"
#include "asLib.h"
#include "asTrapWrite.h"
+ Include dependency graph for asTrapWrite.c:

Go to the source code of this file.

Classes

struct  listenerPvt
 
struct  listener
 
struct  writeMessage
 
struct  asTrapWritePvt
 

Typedefs

typedef struct listenerPvt listenerPvt
 
typedef struct listener listener
 
typedef struct writeMessage writeMessage
 
typedef struct asTrapWritePvt asTrapWritePvt
 

Functions

asTrapWriteId epicsStdCall asTrapWriteRegisterListener (asTrapWriteListener func)
 Register function to be called on asTrapWriteListener. More...
 
void epicsStdCall asTrapWriteUnregisterListener (asTrapWriteId id)
 Unregister asTrapWriteListener. More...
 
void *epicsStdCall asTrapWriteBeforeWithData (const char *userid, const char *hostid, void *addr, int dbrType, int no_elements, void *data)
 
void epicsStdCall asTrapWriteAfterWrite (void *pvt)
 

Typedef Documentation

typedef struct listener listener
typedef struct listenerPvt listenerPvt
typedef struct writeMessage writeMessage

Function Documentation

void epicsStdCall asTrapWriteAfterWrite ( void *  pvt)

Definition at line 151 of file asTrapWrite.c.

152 {
153  writeMessage *pwriteMessage = (writeMessage *)pvt;
154  listenerPvt *plistenerPvt;
155 
156  if (pwriteMessage == 0 ||
157  pasTrapWritePvt == 0) return;
158 
159  epicsMutexMustLock(pasTrapWritePvt->lock);
160  plistenerPvt = (listenerPvt *)ellFirst(&pwriteMessage->listenerPvtList);
161  while (plistenerPvt) {
162  listenerPvt *pnext = (listenerPvt *)ellNext(&plistenerPvt->node);
163  listener *plistener = plistenerPvt->plistener;
164 
165  pwriteMessage->message.userPvt = plistenerPvt->userPvt;
166  plistener->func(&pwriteMessage->message, 1);
167  ellDelete(&pwriteMessage->listenerPvtList, &plistenerPvt->node);
168  freeListFree(pasTrapWritePvt->freeListListenerPvt, plistenerPvt);
169  plistenerPvt = pnext;
170  }
171  ellDelete(&pasTrapWritePvt->writeMessageList, &pwriteMessage->node);
172  freeListFree(pasTrapWritePvt->freeListWriteMessage, pwriteMessage);
173  epicsMutexUnlock(pasTrapWritePvt->lock);
174 }
void * freeListWriteMessage
Definition: asTrapWrite.c:54
void * userPvt
Definition: asTrapWrite.c:35
ELLNODE node
Definition: asTrapWrite.c:44
epicsMutexId lock
Definition: asTrapWrite.c:56
asTrapWriteListener func
Definition: asTrapWrite.c:40
ELLNODE node
Definition: asTrapWrite.c:33
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
ELLLIST writeMessageList
Definition: asTrapWrite.c:53
void * userPvt
A field for use by the asTrapWriteListener.
Definition: asTrapWrite.h:49
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
LIBCOM_API void epicsStdCall freeListFree(void *pvt, void *pmem)
Definition: freeListLib.c:131
struct listener * plistener
Definition: asTrapWrite.c:34
asTrapWriteMessage message
Definition: asTrapWrite.c:45
ELLLIST listenerPvtList
Definition: asTrapWrite.c:46
void * freeListListenerPvt
Definition: asTrapWrite.c:55
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
void* epicsStdCall asTrapWriteBeforeWithData ( const char *  userid,
const char *  hostid,
void *  addr,
int  dbrType,
int  no_elements,
void *  data 
)

Definition at line 113 of file asTrapWrite.c.

116 {
117  writeMessage *pwriteMessage;
118  listener *plistener;
119 
120  if (pasTrapWritePvt == 0 ||
121  ellCount(&pasTrapWritePvt->listenerList) <= 0) return 0;
122 
123  pwriteMessage = (writeMessage *)freeListCalloc(
124  pasTrapWritePvt->freeListWriteMessage);
125  pwriteMessage->message.userid = userid;
126  pwriteMessage->message.hostid = hostid;
127  pwriteMessage->message.serverSpecific = addr;
128  pwriteMessage->message.dbrType = dbrType;
129  pwriteMessage->message.no_elements = no_elements;
130  pwriteMessage->message.data = data;
131  ellInit(&pwriteMessage->listenerPvtList);
132 
133  epicsMutexMustLock(pasTrapWritePvt->lock);
134  ellAdd(&pasTrapWritePvt->writeMessageList, &pwriteMessage->node);
135  plistener = (listener *)ellFirst(&pasTrapWritePvt->listenerList);
136  while (plistener) {
137  listenerPvt *plistenerPvt = (listenerPvt *)freeListCalloc(
138  pasTrapWritePvt->freeListListenerPvt);
139 
140  plistenerPvt->plistener = plistener;
141  pwriteMessage->message.userPvt = 0;
142  plistener->func(&pwriteMessage->message, 0);
143  plistenerPvt->userPvt = pwriteMessage->message.userPvt;
144  ellAdd(&pwriteMessage->listenerPvtList, &plistenerPvt->node);
145  plistener = (listener *)ellNext(&plistener->node);
146  }
147  epicsMutexUnlock(pasTrapWritePvt->lock);
148  return pwriteMessage;
149 }
LIBCOM_API void *epicsStdCall freeListCalloc(void *pvt)
Definition: freeListLib.c:60
void * freeListWriteMessage
Definition: asTrapWrite.c:54
void * userPvt
Definition: asTrapWrite.c:35
ELLNODE node
Definition: asTrapWrite.c:44
epicsMutexId lock
Definition: asTrapWrite.c:56
int dbrType
Data type from ca/db_access.h, NOT dbFldTypes.h.
Definition: asTrapWrite.h:50
#define ellCount(PLIST)
Report the number of nodes in a list.
Definition: ellLib.h:84
asTrapWriteListener func
Definition: asTrapWrite.c:40
void * serverSpecific
A field for use by the server.
Definition: asTrapWrite.h:41
ELLNODE node
Definition: asTrapWrite.c:33
void * data
Might be NULL if no data is available.
Definition: asTrapWrite.h:52
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
ELLLIST writeMessageList
Definition: asTrapWrite.c:53
void * userPvt
A field for use by the asTrapWriteListener.
Definition: asTrapWrite.h:49
const char * hostid
Hostid of whoever orginated the request.
Definition: asTrapWrite.h:33
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
ELLLIST listenerList
Definition: asTrapWrite.c:52
struct listener * plistener
Definition: asTrapWrite.c:34
asTrapWriteMessage message
Definition: asTrapWrite.c:45
ELLNODE node
Definition: asTrapWrite.c:39
const char * userid
Userid of whoever orginated the request.
Definition: asTrapWrite.h:32
#define ellInit(PLIST)
Initialize a list type.
Definition: ellLib.h:76
ELLLIST listenerPvtList
Definition: asTrapWrite.c:46
void * freeListListenerPvt
Definition: asTrapWrite.c:55
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
int no_elements
Array length.
Definition: asTrapWrite.h:51
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89
asTrapWriteId epicsStdCall asTrapWriteRegisterListener ( asTrapWriteListener  func)

Register function to be called on asTrapWriteListener.

Parameters
funcThe listener function to be called.
Returns
A listener identifier for unregistering this listener.

Definition at line 73 of file asTrapWrite.c.

75 {
76  listener *plistener;
77  if(pasTrapWritePvt==0) asTrapWriteInit();
78  plistener = callocMustSucceed(1,sizeof(listener),"asTrapWriteRegisterListener");
79  plistener->func = func;
80  epicsMutexMustLock(pasTrapWritePvt->lock);
81  ellAdd(&pasTrapWritePvt->listenerList,&plistener->node);
82  epicsMutexUnlock(pasTrapWritePvt->lock);
83  return((asTrapWriteId)plistener);
84 }
epicsMutexId lock
Definition: asTrapWrite.c:56
asTrapWriteListener func
Definition: asTrapWrite.c:40
void * asTrapWriteId
An identifier needed to unregister an listener.
Definition: asTrapWrite.h:58
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
void ellAdd(ELLLIST *pList, ELLNODE *pNode)
Adds a node to the end of a list.
Definition: ellLib.c:24
ELLLIST listenerList
Definition: asTrapWrite.c:52
LIBCOM_API void * callocMustSucceed(size_t count, size_t size, const char *msg)
A calloc() that never returns NULL.
Definition: cantProceed.c:22
ELLNODE node
Definition: asTrapWrite.c:39
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void epicsStdCall asTrapWriteUnregisterListener ( asTrapWriteId  id)

Unregister asTrapWriteListener.

Parameters
idListener identifier from asTrapWriteRegisterListener().

Definition at line 86 of file asTrapWrite.c.

87 {
88  listener *plistener = (listener *)id;
89  writeMessage *pwriteMessage;
90 
91  if(pasTrapWritePvt==0) return;
92  epicsMutexMustLock(pasTrapWritePvt->lock);
93  pwriteMessage = (writeMessage *)ellFirst(&pasTrapWritePvt->writeMessageList);
94  while(pwriteMessage) {
95  listenerPvt *plistenerPvt
96  = (listenerPvt *)ellFirst(&pwriteMessage->listenerPvtList);
97  while(plistenerPvt) {
98  listenerPvt *pnext
99  = (listenerPvt *)ellNext(&plistenerPvt->node);
100  if(plistenerPvt->plistener == plistener) {
101  ellDelete(&pwriteMessage->listenerPvtList,&plistenerPvt->node);
102  freeListFree(pasTrapWritePvt->freeListListenerPvt, plistenerPvt);
103  }
104  plistenerPvt = pnext;
105  }
106  pwriteMessage = (writeMessage *)ellNext(&pwriteMessage->node);
107  }
108  ellDelete(&pasTrapWritePvt->listenerList,&plistener->node);
109  free(plistener);
110  epicsMutexUnlock(pasTrapWritePvt->lock);
111 }
ELLNODE node
Definition: asTrapWrite.c:44
epicsMutexId lock
Definition: asTrapWrite.c:56
ELLNODE node
Definition: asTrapWrite.c:33
void epicsStdCall epicsMutexUnlock(epicsMutexId pmutexNode)
Release the semaphore.
Definition: epicsMutex.cpp:140
ELLLIST writeMessageList
Definition: asTrapWrite.c:53
#define ellNext(PNODE)
Find the next node in list.
Definition: ellLib.h:99
LIBCOM_API void epicsStdCall freeListFree(void *pvt, void *pmem)
Definition: freeListLib.c:131
ELLLIST listenerList
Definition: asTrapWrite.c:52
struct listener * plistener
Definition: asTrapWrite.c:34
ELLNODE node
Definition: asTrapWrite.c:39
ELLLIST listenerPvtList
Definition: asTrapWrite.c:46
void * freeListListenerPvt
Definition: asTrapWrite.c:55
#define epicsMutexMustLock(ID)
Claim a semaphore (see epicsMutexLock()).
Definition: epicsMutex.h:214
void ellDelete(ELLLIST *pList, ELLNODE *pNode)
Deletes a node from a list.
Definition: ellLib.c:75
#define ellFirst(PLIST)
Find the first node in list.
Definition: ellLib.h:89