StandardField::getStandardField safety

This commit is contained in:
Michael Davidsaver
2019-01-15 20:53:01 -08:00
parent 4c73607799
commit 2814c779bd
2 changed files with 14 additions and 8 deletions

View File

@@ -11,6 +11,7 @@
#include <stdexcept>
#include <epicsMutex.h>
#include <epicsThread.h>
#define epicsExportSharedSymbols
#include <pv/lock.h>
@@ -262,17 +263,21 @@ StructureConstPtr StandardField::enumerated(string const &properties)
return createProperties("epics:nt/NTEnum:1.0",field,properties);
}
static StandardFieldPtr *stdFieldGbl;
static epicsThreadOnceId stdFieldGblOnce = EPICS_THREAD_ONCE_INIT;
void StandardField::once(void*)
{
stdFieldGbl = new StandardFieldPtr;
stdFieldGbl->reset(new StandardField);
}
const StandardFieldPtr &StandardField::getStandardField()
{
static StandardFieldPtr standardFieldCreate;
static Mutex mutex;
Lock xx(mutex);
epicsThreadOnce(&stdFieldGblOnce, &StandardField::once, 0);
if(standardFieldCreate.get()==0)
{
standardFieldCreate = StandardFieldPtr(new StandardField());
}
return standardFieldCreate;
return *stdFieldGbl;
}
}}

View File

@@ -61,6 +61,7 @@ typedef std::tr1::shared_ptr<StandardField> StandardFieldPtr;
* }
*/
class epicsShareClass StandardField {
static void once(void*);
public:
/**
* getStandardField returns the singleton.