Remove cache implementation, to be discussed and done later

This commit is contained in:
Bruno Martins
2019-06-13 10:47:00 -04:00
committed by mdavidsaver
parent 6a163d7fd4
commit 9702b68d72
18 changed files with 69 additions and 197 deletions

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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()
{

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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;

View File

@ -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)

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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();
}
};
}}