From 79eebbd8f8d794c8fcf8e5e735c1c891ee035bdf Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Fri, 6 Apr 2001 12:43:44 +0000 Subject: [PATCH] support osi features --- src/libCom/osi/epicsMutex.c | 125 ++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 src/libCom/osi/epicsMutex.c diff --git a/src/libCom/osi/epicsMutex.c b/src/libCom/osi/epicsMutex.c new file mode 100644 index 000000000..b24d0fda1 --- /dev/null +++ b/src/libCom/osi/epicsMutex.c @@ -0,0 +1,125 @@ +/* epicsMutex.c */ +/* Author: Marty Kraimer Date: 03APR01 */ +/***************************************************************** + COPYRIGHT NOTIFICATION +***************************************************************** + +(C) COPYRIGHT 1991 Regents of the University of California, +and the University of Chicago Board of Governors. + +This software was developed under a United States Government license +described on the COPYRIGHT_Combined file included as part +of this distribution. +**********************************************************************/ + +#include +#include +#include +#include + +#define epicsExportSharedSymbols +#include "epicsThread.h" +#include "ellLib.h" +#include "errlog.h" +#include "epicsMutex.h" +#include "epicsThread.h" + +#define STATIC static + +STATIC int firstTime = 1; +STATIC ELLLIST mutexList; +STATIC ELLLIST freeList; + +typedef struct mutexNode { + ELLNODE node; + epicsMutexId id; + const char *pFileName; + int lineno; +}mutexNode; + +STATIC epicsMutexId lock; + +epicsMutexId epicsShareAPI epicsMutexOsiCreate( + const char *pFileName,int lineno) +{ + epicsMutexId id; + mutexNode *pmutexNode; + + if(firstTime) { + firstTime=0; + ellInit(&mutexList); + ellInit(&freeList); + lock = epicsMutexOsdCreate(); + } + epicsMutexMustLock(lock); + id = epicsMutexOsdCreate(); + if(id) { + pmutexNode = (mutexNode *)ellFirst(&freeList); + if(pmutexNode) { + ellDelete(&freeList,&pmutexNode->node); + } else { + pmutexNode = calloc(1,sizeof(mutexNode)); + } + pmutexNode->id = id; + pmutexNode->pFileName = pFileName; + pmutexNode->lineno = lineno; + ellAdd(&mutexList,&pmutexNode->node); + } + epicsMutexUnlock(lock); + return(id); +} + +epicsMutexId epicsShareAPI epicsMutexOsiMustCreate( + const char *pFileName,int lineno) +{ + epicsMutexId id = epicsMutexOsiCreate(pFileName,lineno); + assert(id); + return(id ); +} + +void epicsShareAPI epicsMutexDestroy(epicsMutexId id) +{ + mutexNode *pmutexNode; + + epicsMutexMustLock(lock); + pmutexNode = (mutexNode *)ellLast(&mutexList); + while(pmutexNode) { + if(id==pmutexNode->id) { + ellDelete(&mutexList,&pmutexNode->node); + ellAdd(&freeList,&pmutexNode->node); + epicsMutexOsdDestroy(pmutexNode->id); + epicsMutexUnlock(lock); + return; + } + pmutexNode = (mutexNode *)ellPrevious(&pmutexNode->node); + } + epicsMutexUnlock(lock); + errlogPrintf("epicsMutexDestroy Did not find epicsMutexId\n"); +} + +void epicsShareAPI epicsMutexShowAll(int onlyLocked,unsigned int level) +{ + mutexNode *pmutexNode; + + if(firstTime) return; + printf("ellCount(&mutexList) %d ellCount(&freeList) %d\n", + ellCount(&mutexList),ellCount(&freeList)); + epicsMutexMustLock(lock); + pmutexNode = (mutexNode *)ellFirst(&mutexList); + while(pmutexNode) { + if(onlyLocked) { + epicsMutexLockStatus status; + status = epicsMutexTryLock(pmutexNode->id); + if(status==epicsMutexLockOK) { + epicsMutexUnlock(pmutexNode->id); + pmutexNode = (mutexNode *)ellNext(&pmutexNode->node); + continue; + } + } + printf("epicsMutexId %p source %s line %d\n", + pmutexNode->id,pmutexNode->pFileName,pmutexNode->lineno); + epicsMutexShow(pmutexNode->id,level); + pmutexNode = (mutexNode *)ellNext(&pmutexNode->node); + } + epicsMutexUnlock(lock); +}