From 9c1b8ba9521e2aee0b3e78af00b0f56424433bbe Mon Sep 17 00:00:00 2001
From: Andrew Johnson <anj@aps.anl.gov>
Date: Sat, 6 Oct 2012 21:48:01 -0500
Subject: [PATCH] rec: Fix problem with NAN in MLST/ALST fields

If MLST or ALST became NAN the associated monitor would never trigger.
Now a NAN will cause it to always trigger.
---
 documentation/RELEASE_NOTES.html |  6 ++++++
 src/rec/aiRecord.c               |  4 ++--
 src/rec/aoRecord.c               |  4 ++--
 src/rec/calcRecord.c             |  4 ++--
 src/rec/calcoutRecord.c          | 17 +++++++++--------
 src/rec/dfanoutRecord.c          |  4 ++--
 src/rec/selRecord.c              |  4 ++--
 src/rec/subRecord.c              |  4 ++--
 8 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html
index 47babb91bd..7d1e8b8422 100644
--- a/documentation/RELEASE_NOTES.html
+++ b/documentation/RELEASE_NOTES.html
@@ -13,6 +13,12 @@
 
 <!-- Insert new items immediately below here ... -->
 
+<h4>Problem with NAN values in MLST/ALST fields</h4>
+
+<p>The ai, ao, calc, calcout, dfanout, sel and sub record types could stop
+posting monitors if they got NAN values in their MLST or ALST fields. A change
+has been included so this should no longer be the case.</p>
+
 <h4>MacOS build defaults changed</h4>
 
 <p>The default build settings for darwin-x86 targets have been changed to match
diff --git a/src/rec/aiRecord.c b/src/rec/aiRecord.c
index 343d62126e..e6977005fb 100644
--- a/src/rec/aiRecord.c
+++ b/src/rec/aiRecord.c
@@ -385,7 +385,7 @@ static void monitor(aiRecord *prec)
 	/* check for value change */
 	delta = prec->mlst - prec->val;
 	if(delta<0.0) delta = -delta;
-	if (delta > prec->mdel) {
+	if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
 		/* post events for value change */
 		monitor_mask |= DBE_VALUE;
 		/* update last value monitored */
@@ -395,7 +395,7 @@ static void monitor(aiRecord *prec)
 	/* check for archive change */
 	delta = prec->alst - prec->val;
 	if(delta<0.0) delta = -delta;
-	if (delta > prec->adel) {
+	if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
 		/* post events on value field for archive change */
 		monitor_mask |= DBE_LOG;
 		/* update last archive value monitored */
diff --git a/src/rec/aoRecord.c b/src/rec/aoRecord.c
index 5f8436ab24..bce43e3e4f 100644
--- a/src/rec/aoRecord.c
+++ b/src/rec/aoRecord.c
@@ -484,7 +484,7 @@ static void monitor(aoRecord *prec)
         /* check for value change */
         delta = prec->mlst - prec->val;
         if(delta<0.0) delta = -delta;
-        if (delta > prec->mdel) {
+        if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
                 /* post events for value change */
                 monitor_mask |= DBE_VALUE;
                 /* update last value monitored */
@@ -493,7 +493,7 @@ static void monitor(aoRecord *prec)
         /* check for archive change */
         delta = prec->alst - prec->val;
         if(delta<0.0) delta = -delta;
-        if (delta > prec->adel) {
+        if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
                 /* post events on value field for archive change */
                 monitor_mask |= DBE_LOG;
                 /* update last archive value monitored */
diff --git a/src/rec/calcRecord.c b/src/rec/calcRecord.c
index 722ce06982..8accf60d9d 100644
--- a/src/rec/calcRecord.c
+++ b/src/rec/calcRecord.c
@@ -310,7 +310,7 @@ static void monitor(calcRecord *prec)
     /* check for value change */
     delta = prec->mlst - prec->val;
     if (delta < 0.0) delta = -delta;
-    if (delta > prec->mdel) {
+    if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
 	/* post events for value change */
 	monitor_mask |= DBE_VALUE;
 	/* update last value monitored */
@@ -319,7 +319,7 @@ static void monitor(calcRecord *prec)
     /* check for archive change */
     delta = prec->alst - prec->val;
     if (delta < 0.0) delta = -delta;
-    if (delta > prec->adel) {
+    if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
 	/* post events on value field for archive change */
 	monitor_mask |= DBE_LOG;
 	/* update last archive value monitored */
diff --git a/src/rec/calcoutRecord.c b/src/rec/calcoutRecord.c
index 0b7c78323a..89265f3cc3 100644
--- a/src/rec/calcoutRecord.c
+++ b/src/rec/calcoutRecord.c
@@ -209,7 +209,7 @@ static long init_record(calcoutRecord *prec, int pass)
 static long process(calcoutRecord *prec)
 {
     rpvtStruct *prpvt = prec->rpvt;
-    int doOutput = 0;
+    int doOutput;
 
     if (!prec->pact) {
         prec->pact = TRUE;
@@ -231,21 +231,22 @@ static long process(calcoutRecord *prec)
             doOutput = 1;
             break;
         case calcoutOOPT_On_Change:
-            if (fabs(prec->pval - prec->val) > prec->mdel) doOutput = 1;
+            doOutput = ! (fabs(prec->pval - prec->val) <= prec->mdel);
             break;
         case calcoutOOPT_Transition_To_Zero:
-            if ((prec->pval != 0.0) && (prec->val == 0.0)) doOutput = 1;
+            doOutput = ((prec->pval != 0.0) && (prec->val == 0.0));
             break;
         case calcoutOOPT_Transition_To_Non_zero:
-            if ((prec->pval == 0.0) && (prec->val != 0.0)) doOutput = 1;
+            doOutput = ((prec->pval == 0.0) && (prec->val != 0.0));
             break;
         case calcoutOOPT_When_Zero:
-            if (prec->val == 0.0) doOutput = 1;
+            doOutput = (prec->val == 0.0);
             break;
         case calcoutOOPT_When_Non_zero:
-            if (prec->val != 0.0) doOutput = 1;
+            doOutput = (prec->val != 0.0);
             break;
         default:
+	    doOutput = 0;
             break;
         }
         prec->pval = prec->val;
@@ -584,7 +585,7 @@ static void monitor(calcoutRecord *prec)
         /* check for value change */
         delta = prec->mlst - prec->val;
         if (delta<0.0) delta = -delta;
-        if (delta > prec->mdel) {
+        if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
                 /* post events for value change */
                 monitor_mask |= DBE_VALUE;
                 /* update last value monitored */
@@ -593,7 +594,7 @@ static void monitor(calcoutRecord *prec)
         /* check for archive change */
         delta = prec->alst - prec->val;
         if (delta<0.0) delta = -delta;
-        if (delta > prec->adel) {
+        if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
                 /* post events on value field for archive change */
                 monitor_mask |= DBE_LOG;
                 /* update last archive value monitored */
diff --git a/src/rec/dfanoutRecord.c b/src/rec/dfanoutRecord.c
index 672c1cccd4..723d1a59c4 100644
--- a/src/rec/dfanoutRecord.c
+++ b/src/rec/dfanoutRecord.c
@@ -267,7 +267,7 @@ static void monitor(dfanoutRecord *prec)
         /* check for value change */
         delta = prec->mlst - prec->val;
         if(delta<0) delta = -delta;
-        if (delta > prec->mdel) {
+        if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
                 /* post events for value change */
                 monitor_mask |= DBE_VALUE;
                 /* update last value monitored */
@@ -276,7 +276,7 @@ static void monitor(dfanoutRecord *prec)
         /* check for archive change */
         delta = prec->alst - prec->val;
         if(delta<0) delta = -delta;
-        if (delta > prec->adel) {
+        if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
                 /* post events on value field for archive change */
                 monitor_mask |= DBE_LOG;
                 /* update last archive value monitored */
diff --git a/src/rec/selRecord.c b/src/rec/selRecord.c
index 6bc43c227b..6174dab3d0 100644
--- a/src/rec/selRecord.c
+++ b/src/rec/selRecord.c
@@ -300,7 +300,7 @@ static void monitor(selRecord *prec)
     /* check for value change */
     delta = prec->mlst - prec->val;
     if(delta<0.0) delta = -delta;
-    if (delta > prec->mdel) {
+    if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
         /* post events for value change */
         monitor_mask |= DBE_VALUE;
         /* update last value monitored */
@@ -309,7 +309,7 @@ static void monitor(selRecord *prec)
     /* check for archive change */
     delta = prec->alst - prec->val;
     if(delta<0.0) delta = -delta;
-    if (delta > prec->adel) {
+    if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
         /* post events on value field for archive change */
         monitor_mask |= DBE_LOG;
         /* update last archive value monitored */
diff --git a/src/rec/subRecord.c b/src/rec/subRecord.c
index c07de56929..b16a89c3c0 100644
--- a/src/rec/subRecord.c
+++ b/src/rec/subRecord.c
@@ -353,7 +353,7 @@ static void monitor(subRecord *prec)
     /* check for value change */
     delta = prec->val - prec->mlst;
     if (delta < 0.0) delta = -delta;
-    if (delta > prec->mdel) {
+    if (!(delta <= prec->mdel)) { /* Handles MDEL == NAN */
         /* post events for value change */
         monitor_mask |= DBE_VALUE;
         /* update last value monitored */
@@ -362,7 +362,7 @@ static void monitor(subRecord *prec)
     /* check for archive change */
     delta = prec->val - prec->alst;
     if (delta < 0.0) delta = -delta;
-    if (delta > prec->adel) {
+    if (!(delta <= prec->adel)) { /* Handles ADEL == NAN */
         /* post events on value field for archive change */
         monitor_mask |= DBE_LOG;
         /* update last archive value monitored */
-- 
GitLab