Remove cache implementation, to be discussed and done later
This commit is contained in:

committed by
mdavidsaver

parent
6a163d7fd4
commit
9702b68d72
@ -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<Structure>()
|
||||
.has<Scalar>("value")
|
||||
.has<Scalar>("N")
|
||||
|
@ -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<Structure>()
|
||||
.has<Scalar>("name")
|
||||
.has<Union>("value")
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("base")
|
||||
.has<ScalarArray>("value")
|
||||
|
@ -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<Structure>()
|
||||
.has<&NTField::isEnumerated, Structure>("value")
|
||||
.maybeHas<Scalar>("descriptor")
|
||||
|
@ -39,6 +39,12 @@ Result& NTField::isEnumerated(Result& result)
|
||||
.has<ScalarArray>("choices");
|
||||
}
|
||||
|
||||
bool NTField::isEnumerated(FieldConstPtr const & field)
|
||||
{
|
||||
Result result(field);
|
||||
return isEnumerated(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
Result& NTField::isTimeStamp(Result& result)
|
||||
{
|
||||
return result
|
||||
@ -47,6 +53,12 @@ Result& NTField::isTimeStamp(Result& result)
|
||||
.has<Scalar>("userTag");
|
||||
}
|
||||
|
||||
bool NTField::isTimeStamp(FieldConstPtr const & field)
|
||||
{
|
||||
Result result(field);
|
||||
return isTimeStamp(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
Result& NTField::isAlarm(Result& result)
|
||||
{
|
||||
return result
|
||||
@ -55,6 +67,12 @@ Result& NTField::isAlarm(Result& result)
|
||||
.has<Scalar>("message");
|
||||
}
|
||||
|
||||
bool NTField::isAlarm(FieldConstPtr const & field)
|
||||
{
|
||||
Result result(field);
|
||||
return isAlarm(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
Result& NTField::isDisplay(Result& result)
|
||||
{
|
||||
return result
|
||||
@ -63,6 +81,13 @@ Result& NTField::isDisplay(Result& result)
|
||||
.has<Scalar>("description")
|
||||
.has<Scalar>("format")
|
||||
.has<Scalar>("units");
|
||||
|
||||
}
|
||||
|
||||
bool NTField::isDisplay(FieldConstPtr const & field)
|
||||
{
|
||||
Result result(field);
|
||||
return isDisplay(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
Result& NTField::isAlarmLimit(Result& result)
|
||||
@ -80,6 +105,12 @@ Result& NTField::isAlarmLimit(Result& result)
|
||||
.has<Scalar>("hysteresis");
|
||||
}
|
||||
|
||||
bool NTField::isAlarmLimit(FieldConstPtr const & field)
|
||||
{
|
||||
Result result(field);
|
||||
return isAlarmLimit(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
Result& NTField::isControl(Result& result)
|
||||
{
|
||||
return result
|
||||
@ -88,24 +119,11 @@ Result& NTField::isControl(Result& result)
|
||||
.has<Scalar>("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<Structure>()).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<Structure>()).valid();
|
||||
}
|
||||
|
||||
StructureConstPtr NTField::createEnumerated()
|
||||
{
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("ranges")
|
||||
.has<ScalarArray>("value")
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("value")
|
||||
.maybeHas<ScalarArray>("dim")
|
||||
|
@ -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<Structure>()
|
||||
.has<UnionArray>("value")
|
||||
.has<ScalarArray>("channelName")
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("name")
|
||||
.has<ScalarArray>("value")
|
||||
|
@ -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<Structure>()
|
||||
.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;
|
||||
|
@ -146,20 +146,13 @@ Result& NTNDArrayAttribute::isAttribute(Result& result) {
|
||||
.has<Scalar>("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<Structure>()).valid();
|
||||
Result result(structure);
|
||||
return isAttribute(result.is<Structure>()).valid();
|
||||
}
|
||||
|
||||
bool NTNDArrayAttribute::isCompatible(PVStructurePtr const & pvStructure)
|
||||
|
@ -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<Structure>()
|
||||
.has<Scalar>("value")
|
||||
.maybeHas<Scalar>("descriptor")
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("value")
|
||||
.maybeHas<Scalar>("descriptor")
|
||||
|
@ -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<Structure>()
|
||||
.has<ScalarArray>("value")
|
||||
.has<ScalarArray>("channelName")
|
||||
|
@ -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<Structure>()
|
||||
.has<Structure>("value")
|
||||
.has<ScalarArray>("labels")
|
||||
|
@ -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<Structure>()
|
||||
.has<Union>("value")
|
||||
.maybeHas<Scalar>("descriptor")
|
||||
|
@ -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<Structure>()
|
||||
.has<Scalar>("scheme")
|
||||
.has<Scalar>("path")
|
||||
|
@ -9,8 +9,6 @@
|
||||
#include <string>
|
||||
#include <set>
|
||||
|
||||
#include <epicsThread.h>
|
||||
|
||||
#include <pv/pvIntrospect.h>
|
||||
|
||||
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<void*>(cachedId));
|
||||
|
||||
Result *result = static_cast<Result*>(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<epicsThreadPrivateId *>(arg);
|
||||
*id = epicsThreadPrivateCreate();
|
||||
}
|
||||
};
|
||||
}}
|
||||
|
||||
|
Reference in New Issue
Block a user