fast time fetch

This commit is contained in:
Jeff Hill
1996-07-09 22:48:29 +00:00
parent 9e62be865b
commit a4b092c966
2 changed files with 47 additions and 32 deletions

View File

@@ -7,6 +7,8 @@
const double myPI = 3.14159265358979323846;
osiTime exPV::currentTime;
//
// exPV::exPV()
//
@@ -54,7 +56,15 @@ void exPV::scanPV()
return;
}
pDD = new gddAtomic (gddAppType_value, aitEnumFloat32);
//
// update current time (so we are not required to do
// this every time that we write the PV which impacts
// throughput under sunos4 because gettimeofday() is
// slow)
//
this->currentTime = osiTime::getCurrent();
pDD = new gddScaler (gddAppType_value, aitEnumFloat32);
if (!pDD) {
return;
}
@@ -72,6 +82,8 @@ void exPV::scanPV()
limit = (float) this->info.getLopr();
newValue = max (newValue, limit);
*pDD = newValue;
pDD->setStat (epicsAlarmNone);
pDD->setSevr (epicsSevNone);
status = this->update (*pDD);
if (status) {
errMessage (status, "scan update failed\n");
@@ -111,40 +123,51 @@ caStatus exPV::update(gdd &valueIn)
{
gdd *pNewValue;
caServer *pCAS = this->getCAS();
osiTime cur (osiTime::getCurrent());
//
// gettimeofday() is very slow under sunos4
//
osiTime cur (this->currentTime);
struct timespec t;
gddStatus gdds;
if (!pCAS) {
return S_casApp_noSupport;
}
//
// this does not modify the current value
// (because it may be referenced in the event queue)
//
pNewValue = new gdd (gddAppType_value, aitEnumFloat32);
if (!pNewValue) {
return S_casApp_noMemory;
}
# if DEBUG
printf("%s = %f\n", this->info.getName().string, valueIn);
printf("%s = %f\n",
this->info.getName().string, valueIn);
# endif
gdds = gddApplicationTypeTable::
app_table.smartCopy(pNewValue, &valueIn);
if (gdds) {
pNewValue->unreference();
return S_cas_noConvert;
if (valueIn.isScaler()) {
pNewValue = &valueIn;
pNewValue->reference();
}
else {
//
// this does not modify the current value
// (because it may be referenced in the event queue)
//
pNewValue = new gddScaler (gddAppType_value, aitEnumFloat32);
if (!pNewValue) {
return S_casApp_noMemory;
}
gdds = gddApplicationTypeTable::
app_table.smartCopy(pNewValue, &valueIn);
if (gdds) {
pNewValue->unreference();
return S_cas_noConvert;
}
pNewValue->setStat (epicsAlarmNone);
pNewValue->setSevr (epicsSevNone);
}
cur.get (t.tv_sec, t.tv_nsec);
pNewValue->setTimeStamp(&t);
pNewValue->setStat (epicsAlarmNone);
pNewValue->setSevr (epicsSevNone);
//
// release old value and replace it
// with the new one
@@ -323,7 +346,7 @@ caStatus exPV::getLowLimit(gdd &value)
caStatus exPV::getUnits(gdd &units)
{
static aitString str("@#$%");
units.putRef(str);
units.put(str);
return S_cas_success;
}
@@ -347,7 +370,7 @@ caStatus exPV::getValue(gdd &value)
}
}
else {
status = S_cas_noMemory;
status = S_casApp_undefined;
}
return status;
}

View File

@@ -91,19 +91,12 @@ public:
static const pvInfo *findPV(const char *pName);
static const osiTime &getCurrentTime()
{
return exServer::currentTime;
}
static void updateCurrentTime();
static gddAppFuncTableStatus read(exPV &pv, gdd &value)
{
return exServer::ft.read(pv, value);
}
private:
static const pvInfo pvList[];
static osiTime currentTime;
static gddAppFuncTable<exPV> ft;
};
@@ -190,13 +183,12 @@ public:
return this->info.getScanRate();
}
protected:
//
// private data
//
gdd *pValue;
exScanTimer *pScanTimer;
const pvInfo & info;
aitBool interest;
private:
static osiTime currentTime;
};
//