From 2814c779bd9c3f13e70b95df40c9aa3320272028 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Tue, 15 Jan 2019 20:53:01 -0800 Subject: [PATCH] StandardField::getStandardField safety --- src/factory/StandardField.cpp | 21 +++++++++++++-------- src/pv/standardField.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/factory/StandardField.cpp b/src/factory/StandardField.cpp index 9e1c972..4bfc7f3 100644 --- a/src/factory/StandardField.cpp +++ b/src/factory/StandardField.cpp @@ -11,6 +11,7 @@ #include #include +#include #define epicsExportSharedSymbols #include @@ -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; } }} diff --git a/src/pv/standardField.h b/src/pv/standardField.h index 3dfd095..fe4a8ac 100644 --- a/src/pv/standardField.h +++ b/src/pv/standardField.h @@ -61,6 +61,7 @@ typedef std::tr1::shared_ptr StandardFieldPtr; * } */ class epicsShareClass StandardField { + static void once(void*); public: /** * getStandardField returns the singleton.