From 502366fdc327d1318f95e27983660a1b00e06169 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 7 Feb 2014 14:13:12 -0600 Subject: [PATCH] epicsMutex C++ API: New constructor and newEpicsMutex macro The new constructor accepts source file & line number. The macro passes these in. --- src/ca/client/ca_client_context.cpp | 2 +- src/ca/legacy/gdd/gdd.cc | 2 +- src/ca/legacy/gdd/gddNewDel.h | 2 +- src/libCom/cxxTemplates/epicsSingletonBase.cpp | 2 +- src/libCom/cxxTemplates/epicsSingletonMutex.cpp | 2 +- src/libCom/misc/ipAddrToAsciiAsynchronous.cpp | 2 +- src/libCom/osi/epicsMutex.cpp | 8 ++++++++ src/libCom/osi/epicsMutex.h | 3 +++ 8 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/ca/client/ca_client_context.cpp b/src/ca/client/ca_client_context.cpp index a390b6bcb..20a6e84c8 100644 --- a/src/ca/client/ca_client_context.cpp +++ b/src/ca/client/ca_client_context.cpp @@ -57,7 +57,7 @@ extern "C" void cacOnceFunc ( void * ) { caClientCallbackThreadId = epicsThreadPrivateCreate (); assert ( caClientCallbackThreadId ); - ca_client_context::pDefaultServiceInstallMutex = new epicsMutex; + ca_client_context::pDefaultServiceInstallMutex = newEpicsMutex; epicsAtExit ( cacExitHandler,0 ); } diff --git a/src/ca/legacy/gdd/gdd.cc b/src/ca/legacy/gdd/gdd.cc index 2ff4675fe..d3c14bc36 100644 --- a/src/ca/legacy/gdd/gdd.cc +++ b/src/ca/legacy/gdd/gdd.cc @@ -79,7 +79,7 @@ class gddAitStringDestructor: public gddDestructor { extern "C" void gddStaticInit ( void * p ) { epicsMutex * * pMutex = static_cast < epicsMutex * * > ( p ); - *pMutex = new epicsMutex (); + *pMutex = newEpicsMutex; } gdd::gdd(int app, aitEnum prim, int dimen) diff --git a/src/ca/legacy/gdd/gddNewDel.h b/src/ca/legacy/gdd/gddNewDel.h index 390ad1f43..ce10d8cc1 100644 --- a/src/ca/legacy/gdd/gddNewDel.h +++ b/src/ca/legacy/gdd/gddNewDel.h @@ -64,7 +64,7 @@ void gddGlobalCleanupAdd ( void * pBuf ); char** x = (char**)pfld; return *x; } \ void newdel_setNext(char* n) { char* pfld = (char *)&fld; \ char** x=(char**)pfld; *x=n; } \ - static void gddNewDelInit (void) { pNewdel_lock = new epicsMutex; } + static void gddNewDelInit (void) { pNewdel_lock = newEpicsMutex; } // declaration of the static variable for the free list diff --git a/src/libCom/cxxTemplates/epicsSingletonBase.cpp b/src/libCom/cxxTemplates/epicsSingletonBase.cpp index c7e6e2fca..438f093c3 100644 --- a/src/libCom/cxxTemplates/epicsSingletonBase.cpp +++ b/src/libCom/cxxTemplates/epicsSingletonBase.cpp @@ -33,7 +33,7 @@ static void epicsSingletonCleanup (void *) static void epicsSingletonOnce ( void * ) { - pSingletonBaseMutexEPICS = new epicsMutex; + pSingletonBaseMutexEPICS = newEpicsMutex; epicsAtExit ( epicsSingletonCleanup,0 ); } diff --git a/src/libCom/cxxTemplates/epicsSingletonMutex.cpp b/src/libCom/cxxTemplates/epicsSingletonMutex.cpp index c29980785..9643a1dde 100644 --- a/src/libCom/cxxTemplates/epicsSingletonMutex.cpp +++ b/src/libCom/cxxTemplates/epicsSingletonMutex.cpp @@ -35,7 +35,7 @@ extern "C" void SingletonMutexOnce ( void * /* pParm */ ) // This class exists for the purpose of avoiding file scope // object chicken and egg problems. Therefore, pEPICSSigletonMutex // is never destroyed. - pEPICSSigletonMutex = new epicsMutex; + pEPICSSigletonMutex = newEpicsMutex; } void SingletonUntyped :: incrRefCount ( PBuild pBuild ) diff --git a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp index 91359d1f3..3f87fd59a 100644 --- a/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp +++ b/src/libCom/misc/ipAddrToAsciiAsynchronous.cpp @@ -155,7 +155,7 @@ static void ipAddrToAsciiEngineShutdownRequest ( void * ) static void ipAddrToAsciiEngineGlobalMutexConstruct ( void * ) { - ipAddrToAsciiEnginePrivate :: pGlobalMutex = new epicsMutex (); + ipAddrToAsciiEnginePrivate :: pGlobalMutex = newEpicsMutex; epicsAtExit ( ipAddrToAsciiEngineShutdownRequest, 0 ); } diff --git a/src/libCom/osi/epicsMutex.cpp b/src/libCom/osi/epicsMutex.cpp index 8f2241d91..ec3afaab4 100644 --- a/src/libCom/osi/epicsMutex.cpp +++ b/src/libCom/osi/epicsMutex.cpp @@ -226,6 +226,14 @@ epicsMutex :: epicsMutex () : } } +epicsMutex :: epicsMutex ( const char *pFileName, int lineno ) : + id ( epicsMutexOsiCreate (pFileName, lineno) ) +{ + if ( this->id == 0 ) { + throw mutexCreateFailed (); + } +} + epicsMutex ::~epicsMutex () { epicsMutexDestroy ( this->id ); diff --git a/src/libCom/osi/epicsMutex.h b/src/libCom/osi/epicsMutex.h index d016cf3d4..b24e5ecb8 100644 --- a/src/libCom/osi/epicsMutex.h +++ b/src/libCom/osi/epicsMutex.h @@ -23,11 +23,14 @@ typedef enum { #include "compilerDependencies.h" +#define newEpicsMutex new epicsMutex(__FILE__,__LINE__) + class epicsShareClass epicsMutex { public: class mutexCreateFailed; /* exception payload */ class invalidMutex; /* exception payload */ epicsMutex (); + epicsMutex ( const char *pFileName, int lineno ); ~epicsMutex (); void show ( unsigned level ) const; void lock (); /* blocks until success */