From 9702b68d7271ec6ef847a5a98065a2c1550d647f Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Thu, 13 Jun 2019 10:47:00 -0400 Subject: [PATCH] Remove cache implementation, to be discussed and done later --- src/ntaggregate.cpp | 9 ++---- src/ntattribute.cpp | 10 ++----- src/ntcontinuum.cpp | 10 ++----- src/ntenum.cpp | 10 ++----- src/ntfield.cpp | 54 ++++++++++++++++++++++++------------ src/nthistogram.cpp | 10 ++----- src/ntmatrix.cpp | 10 ++----- src/ntmultiChannel.cpp | 10 ++----- src/ntnameValue.cpp | 10 ++----- src/ntndarray.cpp | 11 ++------ src/ntndarrayAttribute.cpp | 11 ++------ src/ntscalar.cpp | 10 ++----- src/ntscalarArray.cpp | 10 ++----- src/ntscalarMultiChannel.cpp | 10 ++----- src/nttable.cpp | 10 ++----- src/ntunion.cpp | 10 ++----- src/nturi.cpp | 10 ++----- src/validator.h | 51 ---------------------------------- 18 files changed, 69 insertions(+), 197 deletions(-) diff --git a/src/ntaggregate.cpp b/src/ntaggregate.cpp index 1217d85..c4deda6 100644 --- a/src/ntaggregate.cpp +++ b/src/ntaggregate.cpp @@ -193,20 +193,15 @@ bool NTAggregate::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; bool NTAggregate::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .has("N") diff --git a/src/ntattribute.cpp b/src/ntattribute.cpp index e949e04..bc4173b 100644 --- a/src/ntattribute.cpp +++ b/src/ntattribute.cpp @@ -130,20 +130,14 @@ bool NTAttribute::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTAttribute::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("name") .has("value") diff --git a/src/ntcontinuum.cpp b/src/ntcontinuum.cpp index cb41a8a..792217e 100644 --- a/src/ntcontinuum.cpp +++ b/src/ntcontinuum.cpp @@ -122,20 +122,14 @@ bool NTContinuum::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTContinuum::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("base") .has("value") diff --git a/src/ntenum.cpp b/src/ntenum.cpp index fb410f7..6ac4f4e 100644 --- a/src/ntenum.cpp +++ b/src/ntenum.cpp @@ -121,20 +121,14 @@ bool NTEnum::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTEnum::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has<&NTField::isEnumerated, Structure>("value") .maybeHas("descriptor") diff --git a/src/ntfield.cpp b/src/ntfield.cpp index d0b5965..123d4de 100644 --- a/src/ntfield.cpp +++ b/src/ntfield.cpp @@ -39,6 +39,12 @@ Result& NTField::isEnumerated(Result& result) .has("choices"); } +bool NTField::isEnumerated(FieldConstPtr const & field) +{ + Result result(field); + return isEnumerated(result.is()).valid(); +} + Result& NTField::isTimeStamp(Result& result) { return result @@ -47,6 +53,12 @@ Result& NTField::isTimeStamp(Result& result) .has("userTag"); } +bool NTField::isTimeStamp(FieldConstPtr const & field) +{ + Result result(field); + return isTimeStamp(result.is()).valid(); +} + Result& NTField::isAlarm(Result& result) { return result @@ -55,6 +67,12 @@ Result& NTField::isAlarm(Result& result) .has("message"); } +bool NTField::isAlarm(FieldConstPtr const & field) +{ + Result result(field); + return isAlarm(result.is()).valid(); +} + Result& NTField::isDisplay(Result& result) { return result @@ -63,6 +81,13 @@ Result& NTField::isDisplay(Result& result) .has("description") .has("format") .has("units"); + +} + +bool NTField::isDisplay(FieldConstPtr const & field) +{ + Result result(field); + return isDisplay(result.is()).valid(); } Result& NTField::isAlarmLimit(Result& result) @@ -80,6 +105,12 @@ Result& NTField::isAlarmLimit(Result& result) .has("hysteresis"); } +bool NTField::isAlarmLimit(FieldConstPtr const & field) +{ + Result result(field); + return isAlarmLimit(result.is()).valid(); +} + Result& NTField::isControl(Result& result) { return result @@ -88,24 +119,11 @@ Result& NTField::isControl(Result& result) .has("minStep"); } -#define IS_NTFIELD_FUNC(name) \ - static epicsThreadOnceId cached##name##OnceId = EPICS_THREAD_ONCE_INIT; \ - static epicsThreadPrivateId cached##name##Id; \ - bool NTField::is##name(FieldConstPtr const & field) { \ - Result& result = Result::fromCache(&cached##name##OnceId, \ - &cached##name##Id); \ - if (result.wraps(field)) return result.valid(); \ - return is##name(result.reset(field).is()).valid(); \ - } - -IS_NTFIELD_FUNC(Enumerated) -IS_NTFIELD_FUNC(TimeStamp) -IS_NTFIELD_FUNC(Alarm) -IS_NTFIELD_FUNC(Display) -IS_NTFIELD_FUNC(AlarmLimit) -IS_NTFIELD_FUNC(Control) - -#undef IS_NTFIELD_FUNC +bool NTField::isControl(FieldConstPtr const & field) +{ + Result result(field); + return isControl(result.is()).valid(); +} StructureConstPtr NTField::createEnumerated() { diff --git a/src/nthistogram.cpp b/src/nthistogram.cpp index 3bdb273..7c0ecdb 100644 --- a/src/nthistogram.cpp +++ b/src/nthistogram.cpp @@ -135,20 +135,14 @@ bool NTHistogram::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTHistogram::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("ranges") .has("value") diff --git a/src/ntmatrix.cpp b/src/ntmatrix.cpp index 337c006..090c905 100644 --- a/src/ntmatrix.cpp +++ b/src/ntmatrix.cpp @@ -139,20 +139,14 @@ bool NTMatrix::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTMatrix::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .maybeHas("dim") diff --git a/src/ntmultiChannel.cpp b/src/ntmultiChannel.cpp index f8e10f4..c26f641 100644 --- a/src/ntmultiChannel.cpp +++ b/src/ntmultiChannel.cpp @@ -232,20 +232,14 @@ bool NTMultiChannel::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTMultiChannel::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .has("channelName") diff --git a/src/ntnameValue.cpp b/src/ntnameValue.cpp index eac463a..d34d6b9 100644 --- a/src/ntnameValue.cpp +++ b/src/ntnameValue.cpp @@ -134,20 +134,14 @@ bool NTNameValue::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTNameValue::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); - - if (result.wraps(structure)) - return result.valid(); + Result result(structure); - return result.reset(structure) + return result .is() .has("name") .has("value") diff --git a/src/ntndarray.cpp b/src/ntndarray.cpp index 6d265e9..42ed58a 100644 --- a/src/ntndarray.cpp +++ b/src/ntndarray.cpp @@ -252,20 +252,14 @@ namespace { } } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTNDArray::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has<&isValue>("value") .has<&isCodec>("codec") @@ -282,6 +276,7 @@ bool NTNDArray::isCompatible(StructureConstPtr const &structure) .valid(); } + bool NTNDArray::isCompatible(PVStructurePtr const & pvStructure) { if(!pvStructure.get()) return false; diff --git a/src/ntndarrayAttribute.cpp b/src/ntndarrayAttribute.cpp index 685413d..a66ee39 100644 --- a/src/ntndarrayAttribute.cpp +++ b/src/ntndarrayAttribute.cpp @@ -146,20 +146,13 @@ Result& NTNDArrayAttribute::isAttribute(Result& result) { .has("source"); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTNDArrayAttribute::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); - - if (result.wraps(structure)) - return result.valid(); - - return isAttribute(result.reset(structure).is()).valid(); + Result result(structure); + return isAttribute(result.is()).valid(); } bool NTNDArrayAttribute::isCompatible(PVStructurePtr const & pvStructure) diff --git a/src/ntscalar.cpp b/src/ntscalar.cpp index f78e9bd..afa4b32 100644 --- a/src/ntscalar.cpp +++ b/src/ntscalar.cpp @@ -152,20 +152,14 @@ bool NTScalar::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTScalar::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .maybeHas("descriptor") diff --git a/src/ntscalarArray.cpp b/src/ntscalarArray.cpp index 6d408af..3c82e42 100644 --- a/src/ntscalarArray.cpp +++ b/src/ntscalarArray.cpp @@ -161,20 +161,14 @@ bool NTScalarArray::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTScalarArray::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .maybeHas("descriptor") diff --git a/src/ntscalarMultiChannel.cpp b/src/ntscalarMultiChannel.cpp index f2e9794..69d2be7 100644 --- a/src/ntscalarMultiChannel.cpp +++ b/src/ntscalarMultiChannel.cpp @@ -227,20 +227,14 @@ bool NTScalarMultiChannel::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTScalarMultiChannel::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .has("channelName") diff --git a/src/nttable.cpp b/src/nttable.cpp index e65fc31..458dd9d 100644 --- a/src/nttable.cpp +++ b/src/nttable.cpp @@ -148,20 +148,14 @@ bool NTTable::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTTable::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - result.reset(structure) + result .is() .has("value") .has("labels") diff --git a/src/ntunion.cpp b/src/ntunion.cpp index e82d300..91d5529 100644 --- a/src/ntunion.cpp +++ b/src/ntunion.cpp @@ -128,20 +128,14 @@ bool NTUnion::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTUnion::isCompatible(StructureConstPtr const &structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - return result.reset(structure) + return result .is() .has("value") .maybeHas("descriptor") diff --git a/src/nturi.cpp b/src/nturi.cpp index bb04a93..9bf9f8f 100644 --- a/src/nturi.cpp +++ b/src/nturi.cpp @@ -148,20 +148,14 @@ bool NTURI::is_a(PVStructurePtr const & pvStructure) return is_a(pvStructure->getStructure()); } -static epicsThreadOnceId cachedResultOnceId = EPICS_THREAD_ONCE_INIT; -static epicsThreadPrivateId cachedResultId; - bool NTURI::isCompatible(StructureConstPtr const & structure) { if (!structure) return false; - Result& result = Result::fromCache(&cachedResultOnceId, &cachedResultId); + Result result(structure); - if (result.wraps(structure)) - return result.valid(); - - result.reset(structure) + result .is() .has("scheme") .has("path") diff --git a/src/validator.h b/src/validator.h index 44f3c93..b2f2ea3 100644 --- a/src/validator.h +++ b/src/validator.h @@ -9,8 +9,6 @@ #include #include -#include - #include namespace epics { namespace nt { @@ -70,50 +68,6 @@ struct Result { return *this; } - /** - * Clears the contents of this Result. - * - * @return a reference to itself. - */ - Result& reset(const epics::pvData::FieldConstPtr& newField) { - field = newField; - path.clear(); - errors.clear(); - result = Pass; - return *this; - } - - /** - * Retrieves a Result from a thread-local cache. Allocates a new Result - * if it wasn't allocated yet. - * - * @return a reference to the stored Result. - * - */ - static Result& fromCache(epicsThreadOnceId *onceId, epicsThreadPrivateId *cachedId) { - epicsThreadOnce(onceId, &once, static_cast(cachedId)); - - Result *result = static_cast(epicsThreadPrivateGet(*cachedId)); - - if (!result) { - result = new Result; - epicsThreadPrivateSet(*cachedId, result); - } - - return *result; - } - - /** - * Returns whether this Result already wraps a particular Field. - * Note: this is done via pointer equality, which pvData guarantees - * will work if the pointed-to Fields are the same. - * - * @return true if it does wrap the passed-in field, false otherwise. - */ - inline bool wraps(epics::pvData::FieldConstPtr const & other) const { - return field && field == other; - } - /** * Returns whether this Result is valid. * @@ -316,11 +270,6 @@ private: return *this; } - - static void once(void *arg) { - epicsThreadPrivateId *id = static_cast(arg); - *id = epicsThreadPrivateCreate(); - } }; }}