From 8766ce05aa9edd9c6422c119f31866d2e193056b Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 4 Jan 2018 11:41:38 -0600 Subject: [PATCH 01/13] Fix slow callback test failures. Slow callbacks no longer cause test failures, now they just emit a diagnostic. Jenkins on MacOS frequently failed those tests. We should never test for something that we can't fix. --- src/ioc/db/test/callbackParallelTest.c | 10 +++++++--- src/ioc/db/test/callbackTest.c | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/ioc/db/test/callbackParallelTest.c b/src/ioc/db/test/callbackParallelTest.c index 2ccc44375..f8d0c3981 100644 --- a/src/ioc/db/test/callbackParallelTest.c +++ b/src/ioc/db/test/callbackParallelTest.c @@ -34,6 +34,8 @@ * * Two time intervals are measured. The time to queue and run each of * the immediate callbacks, and the actual delay of the delayed callback. + * + * Slow callbacks no longer fail the test, they just emit a diagnostic. */ #define NCALLBACKS 169 @@ -108,7 +110,7 @@ MAIN(callbackParallelTest) for (j = 0; j < 5; j++) setupError[i][j] = timeError[i][j] = defaultError[j]; - testPlan(4); + testPlan(2); testDiag("Starting %d parallel callback threads", noCpus); @@ -165,7 +167,8 @@ MAIN(callbackParallelTest) } } testOk(faults == 0, "%d faults during callback setup", faults); - testOk(slowups <= 1, "%d slowups during callback setup", slowups); + if (slowups) + testDiag("%d slowups during callback setup", slowups); slowups = 0; for (i = 0; i < NCALLBACKS ; i++) { @@ -182,7 +185,8 @@ MAIN(callbackParallelTest) } updateStats(timeError[i%NUM_CALLBACK_PRIORITIES], error); } - testOk(slowups < 5, "%d slowups during callbacks", slowups); + if (slowups) + testDiag("%d slowups during callback setup", slowups); testDiag("Setup time statistics"); printStats(setupError[0], "LOW"); diff --git a/src/ioc/db/test/callbackTest.c b/src/ioc/db/test/callbackTest.c index 7032a7cd1..3ccc2c2f3 100644 --- a/src/ioc/db/test/callbackTest.c +++ b/src/ioc/db/test/callbackTest.c @@ -34,6 +34,8 @@ * * Two time intervals are measured. The time to queue and run each of * the immediate callbacks, and the actual delay of the delayed callback. + * + * Slow callbacks no longer fail the test, they just emit a diagnostic. */ #define NCALLBACKS 169 @@ -108,7 +110,7 @@ MAIN(callbackTest) for (j = 0; j < 5; j++) setupError[i][j] = timeError[i][j] = defaultError[j]; - testPlan(4); + testPlan(2); callbackInit(); epicsThreadSleep(1.0); @@ -162,7 +164,8 @@ MAIN(callbackTest) } } testOk(faults == 0, "%d faults during callback setup", faults); - testOk(slowups <= 1, "%d slowups during callback setup", slowups); + if (slowups) + testDiag("%d slowups during callback setup", slowups); slowups = 0; for (i = 0; i < NCALLBACKS ; i++) { @@ -179,7 +182,8 @@ MAIN(callbackTest) } updateStats(timeError[i%NUM_CALLBACK_PRIORITIES], error); } - testOk(slowups < 5, "%d slowups during callbacks", slowups); + if (slowups) + testDiag("%d slowups during callback setup", slowups); testDiag("Setup time statistics"); printStats(setupError[0], "LOW"); From d41f2e6806ffc9dda66cfc03d9537fd7781af65c Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 8 Jan 2018 11:56:37 -0600 Subject: [PATCH 02/13] Configure command-line interface for VxWorks Add new LEDLIB and OTHER configuration options. Fix typo in vxWorks/osdReadline.c Use LEDLIB on VxWorks. Fixes LP: #1741578 --- configure/os/CONFIG.Common.vxWorksCommon | 4 ++++ src/libCom/osi/epicsReadline.c | 17 ++++++++++------- src/libCom/osi/os/vxWorks/osdReadline.c | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/configure/os/CONFIG.Common.vxWorksCommon b/configure/os/CONFIG.Common.vxWorksCommon index e7be9fae0..50f626959 100644 --- a/configure/os/CONFIG.Common.vxWorksCommon +++ b/configure/os/CONFIG.Common.vxWorksCommon @@ -170,6 +170,10 @@ COMPILE.ctdt = $(CC) -c $(CPPFLAGS) $(CFLAGS_ctdt) $(INCLUDES) $(SOURCE_FLAG) VXCPPFLAGS = $(filter-out $(OP_SYS_INCLUDE_CPPFLAGS),$(CPPFLAGS)) PREPROCESS.cpp = $(CPP) $(VXCPPFLAGS) $(INCLUDES) $< > $@ +#-------------------------------------------------- +# Use LEDLIB for command-line editing +COMMANDLINE_LIBRARY = LEDLIB + #-------------------------------------------------- # Allow site overrides -include $(CONFIG)/os/CONFIG_SITE.Common.vxWorksCommon diff --git a/src/libCom/osi/epicsReadline.c b/src/libCom/osi/epicsReadline.c index 936cbce99..d61238856 100644 --- a/src/libCom/osi/epicsReadline.c +++ b/src/libCom/osi/epicsReadline.c @@ -15,8 +15,15 @@ #include "envDefs.h" #include "epicsReadline.h" +/* Basic command-line input, no editing or history: */ #define EPICS_COMMANDLINE_LIBRARY_EPICS 0 + +/* OS-specific command-line editing and/or history: */ #define EPICS_COMMANDLINE_LIBRARY_LIBTECLA 1 +#define EPICS_COMMANDLINE_LIBRARY_LEDLIB 1 +#define EPICS_COMMANDLINE_LIBRARY_OTHER 1 + +/* GNU readline, or Apple's libedit wrapper: */ #define EPICS_COMMANDLINE_LIBRARY_READLINE 2 #define EPICS_COMMANDLINE_LIBRARY_READLINE_CURSES 2 #define EPICS_COMMANDLINE_LIBRARY_READLINE_NCURSES 2 @@ -42,14 +49,10 @@ static void osdReadlineBegin(struct readlineContext * c) {} static char * osdReadline(const char *prompt, struct readlineContext * c) { return NULL; } static void osdReadlineEnd(struct readlineContext * c) {} +#elif EPICS_COMMANDLINE_LIBRARY == EPICS_COMMANDLINE_LIBRARY_READLINE +# include "gnuReadline.c" #else - -# if EPICS_COMMANDLINE_LIBRARY == EPICS_COMMANDLINE_LIBRARY_READLINE -# include "gnuReadline.c" -# else -# include "osdReadline.c" -# endif - +# include "osdReadline.c" #endif /* diff --git a/src/libCom/osi/os/vxWorks/osdReadline.c b/src/libCom/osi/os/vxWorks/osdReadline.c index 9195b6b72..dee24fd64 100644 --- a/src/libCom/osi/os/vxWorks/osdReadline.c +++ b/src/libCom/osi/os/vxWorks/osdReadline.c @@ -33,7 +33,7 @@ struct osdContext { static void osdReadlineBegin(struct readlineContext *context) { - struct osdContext osd = malloc(sizeof *osd); + struct osdContext *osd = malloc(sizeof *osd); if (osd != NULL) { osd->ledId = (LED_ID) ERROR; From f527e5939ec390e487a6af2920a924a4edb57e4c Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 8 Jan 2018 11:58:20 -0600 Subject: [PATCH 03/13] Cleanup epicsReadline.c No real code changes, just reformatting and variable renames. --- src/libCom/osi/epicsReadline.c | 51 ++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/libCom/osi/epicsReadline.c b/src/libCom/osi/epicsReadline.c index d61238856..0caa50fc2 100644 --- a/src/libCom/osi/epicsReadline.c +++ b/src/libCom/osi/epicsReadline.c @@ -1,11 +1,11 @@ /*************************************************************************\ * Copyright (c) 2002 The University of Saskatchewan -* Copyright (c) 2014 UChicago Argonne LLC, as Operator of Argonne +* Copyright (c) 2015 UChicago Argonne LLC, as Operator of Argonne * National Laboratory. * EPICS BASE is distributed subject to a Software License Agreement found * in file LICENSE that is included with this distribution. \*************************************************************************/ -/* Author: Eric Norum Date: 12DEC2001 */ +/* Author: Eric Norum */ #include #include @@ -45,9 +45,12 @@ static void osdReadlineEnd(struct readlineContext *); #if EPICS_COMMANDLINE_LIBRARY == EPICS_COMMANDLINE_LIBRARY_EPICS -static void osdReadlineBegin(struct readlineContext * c) {} -static char * osdReadline(const char *prompt, struct readlineContext * c) { return NULL; } -static void osdReadlineEnd(struct readlineContext * c) {} +static void osdReadlineBegin(struct readlineContext *rc) {} +static char * osdReadline(const char *prompt, struct readlineContext *rc) +{ + return NULL; +} +static void osdReadlineEnd(struct readlineContext *rc) {} #elif EPICS_COMMANDLINE_LIBRARY == EPICS_COMMANDLINE_LIBRARY_READLINE # include "gnuReadline.c" @@ -61,15 +64,15 @@ static void osdReadlineEnd(struct readlineContext * c) {} void * epicsShareAPI epicsReadlineBegin(FILE *in) { - struct readlineContext *readlineContext = calloc(1, sizeof(*readlineContext)); + struct readlineContext *rc = calloc(1, sizeof(*rc)); - if (readlineContext) { - readlineContext->in = in; - readlineContext->line = NULL; + if (rc) { + rc->in = in; + rc->line = NULL; if (!envGetConfigParamPtr(&IOCSH_HISTEDIT_DISABLE)) - osdReadlineBegin(readlineContext); + osdReadlineBegin(rc); } - return readlineContext; + return rc; } /* @@ -78,19 +81,19 @@ epicsReadlineBegin(FILE *in) char * epicsShareAPI epicsReadline (const char *prompt, void *context) { - struct readlineContext *readlineContext = context; + struct readlineContext *rc = context; FILE *in; char *line; int c; /* char is unsigned on some archs, EOF is -ve */ int linelen = 0; int linesize = 50; - if (readlineContext->osd) - return osdReadline(prompt, readlineContext); + if (rc->osd) + return osdReadline(prompt, rc); - free(readlineContext->line); - readlineContext->line = NULL; - if ((in = readlineContext->in) == NULL) { + free(rc->line); + rc->line = NULL; + if ((in = rc->in) == NULL) { in = stdin; if (prompt) { fputs(prompt, stdout); @@ -128,7 +131,7 @@ epicsReadline (const char *prompt, void *context) line[linelen++] = c; } line[linelen] = '\0'; - readlineContext->line = line; + rc->line = line; return line; } @@ -139,13 +142,13 @@ void epicsShareAPI epicsReadlineEnd (void *context) { if (context) { - struct readlineContext *readlineContext = context; + struct readlineContext *rc = context; - if (readlineContext->osd) - osdReadlineEnd(readlineContext); - else - free(readlineContext->line); - free(readlineContext); + if (rc->osd) + osdReadlineEnd(rc); + else + free(rc->line); + free(rc); } } From f5cd5553831d96ed86d1cedf4b61a1e698a1200d Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 8 Jan 2018 16:53:11 -0600 Subject: [PATCH 04/13] Describe recent 3.16-only fixes in Release Notes Preparing for Base-3.16.2 at some point. --- documentation/RELEASE_NOTES.html | 61 ++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html index 3a3f0d3be..f5936bcc2 100644 --- a/documentation/RELEASE_NOTES.html +++ b/documentation/RELEASE_NOTES.html @@ -3,11 +3,11 @@ - EPICS Base R3.16.1 Release Notes + EPICS Base R3.16.2 Release Notes -

EPICS Base Release 3.16.1

+

EPICS Base Release 3.16.2

+

Restore use of ledlib for VxWorks command editing

+ +

The epicsReadline refactoring work described below unfortunately disabled the +VxWorks implementation of the osdReadline.c API that uses ledlib for command +editing and history. This functionality has now been restored, see Launchpad +bug #1741578.

+ +

Constant link types

+ +

Constant links can now hold 64-bit integer values, either as scalars or +arrays. Only base 10 is supported by the JSON parser though, the JSON standard +doesn't allow for hexadecimal numbers.

+ +

Upgraded the YAJL JSON Library

+ +

The third-party YAJL library that has been included in libCom for several +years has been upgraded to version 2.1.0 and several bugs fixed. This has an +updated API, requiring any code that uses it to parse its own JSON files to be +modified to match. The changes are mainly that it uses size_t instead +unsigned int for string lengths, but it also uses long long +instead of long for JSON integer values, which was the main motivation +for the upgrade.

+ +

The self-tests that YAJL comes with have been imported and are now run as an +EPICS Unit Test program, and the JSON syntax accepted by the parser was extended +to permit trailing commas in both arrays and maps. The difference between the +old and new YAJL APIs can be detected at compile time by looking for the macro +EPICS_YAJL_VERSION which is defined in the yajl_common.h header file +along with a brief description of the API changes.

+ +

Timestamp support for the calc link type

+ +

A new optional parameter can be given when specifying a calc JSON link. The +time parameter is a string containing a single letter A..L +that selects one of the input links to be used for the timestamp of calculation +if requested. The timestamp will be fetched atomically with the value from the +chosen input link (providing that input link type supports the readLocked() +method).

+ +

Silence errors from puts to constant link types

+ +

A soft channel output record with the OUT link unset uses the CONSTANT link +type. The new link type code was causing some soft channel device supports to +return an error status from the write method of that link type, which would +cause a ca_put() operation to such a record to generate an exception. This has +been silenced by giving the constant link types a dummy putValue method. A new +test program has been added to prevent regressions of this behaviour.

+ +

RSRV expanding large buffer causes crash

+ +

In the 3.16.1 release a crash can occur in the IOC's RSRV server when a large +array is made even larger; the previous array buffer was not being released +correctly. See Launchpad +bug +#1706703.

+ +

Changes made between 3.16.0.1 and 3.16.1

IOC Database Support for 64-bit integers

From 1daab5fb35d15b66c256bd70985fa668e3090648 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 18 Jan 2018 23:16:42 -0600 Subject: [PATCH 05/13] Add soft-channel tests for local dbCa links, both input and output Update test descriptions. Renamed records to match their group number. 103 more tests, but some could fail on a busy system... --- src/std/rec/test/softTest.c | 48 ++++++++---- src/std/rec/test/softTest.db | 147 ++++++++++++++++++++++++++++++----- 2 files changed, 162 insertions(+), 33 deletions(-) diff --git a/src/std/rec/test/softTest.c b/src/std/rec/test/softTest.c index b81e6bfda..b29c955f9 100644 --- a/src/std/rec/test/softTest.c +++ b/src/std/rec/test/softTest.c @@ -11,6 +11,7 @@ #include "dbStaticLib.h" #include "dbTest.h" #include "dbUnitTest.h" +#include "epicsThread.h" #include "errlog.h" #include "registryFunction.h" #include "subRecord.h" @@ -39,10 +40,10 @@ void doProcess(const char *rec) testdbPutFieldOk(proc, DBR_CHAR, 1); } -/* Group 0 are all soft-channel input records with INP being a DB link +/* Group 0 are soft-channel input records with INP being a DB or CA link * to the PV 'source'. Their VAL fields all start out with the default * value for the type, i.e. 0 or an empty string. Triggering record - * processing should read the integer value from the 'source' PV. + * processing reads the value from the 'source' PV. */ static @@ -50,14 +51,22 @@ void testGroup0(void) { const char ** rec; const char * records[] = { - "ai0", "bi0", "di0", "ii0", "li0", "lsi0", "mi0", "si0", NULL + "ai0", "bi0", "di0", "ii0", "li0", "lsi0", "mi0", "si0", + "ai0c", "bi0c", "di0c", "ii0c", "li0c", "lsi0c", "mi0c", "si0c", + NULL }; testDiag("============ Starting %s ============", EPICS_FUNCTION); testdbPutFieldOk("source", DBR_LONG, 1); + /* The above put sends CA monitors to all of the CA links, but + * doesn't trigger record processing (the links are not CP/CPP). + * How could we wait until all of those monitors have arrived, + * instead of just waiting for an arbitrary time period? + */ + epicsThreadSleep(1.0); /* FIXME: Wait here? */ for (rec = records; *rec; rec++) { - if (strcmp(*rec, "lsi0") != 0) + if (strncmp(*rec, "lsi0", 4) != 0) testdbGetFieldEqual(*rec, DBR_LONG, 0); checkDtyp(*rec); doProcess(*rec); @@ -65,6 +74,7 @@ void testGroup0(void) } testdbPutFieldOk("source", DBR_LONG, 0); + epicsThreadSleep(1.0); /* FIXME: Wait here as above */ for (rec = records; *rec; rec++) { doProcess(*rec); testdbGetFieldEqual(*rec, DBR_LONG, 0); @@ -129,6 +139,7 @@ static long destSubr(subRecord *prec) { dest = prec->val; + prec->val = -1; return 0; } @@ -138,20 +149,25 @@ void checkOutput(const char *rec, int value) testDiag("Checking record '%s'", rec); testdbPutFieldOk(rec, DBR_LONG, value); - + /* Even with a local CA link, the dest record gets processed in + * the context of this thread (i.e. immediately). TPRO confirms. + */ testOk(dest == value, "value %d output -> %d", value, dest); } -/* Group 3 are all soft-channel output records with OUT being a DB link - * to the PV 'dest' with PP. Putting a value to the record writes that - * value to 'dest' and processes it. +/* Group 3 are all soft-channel output records with OUT being a DB or + * local CA link to the subRecord 'dest'; DB links have the PP flag, + * for CA links the VAL field is marked PP. Putting a value to the + * output record writes that value to 'dest'. */ static void testGroup3(void) { const char ** rec; const char * records[] = { - "ao0", "bo0", "io0", "lo0", "lso0", "mo0", "so0", NULL, + "ao3", "bo3", "io3", "lo3", "lso3", "mo3", "so3", + "ao3c", "bo3c", "io3c", "lo3c", "lso3c", "mo3c", "so3c", + NULL, }; testDiag("============ Starting %s ============", EPICS_FUNCTION); @@ -160,13 +176,16 @@ void testGroup3(void) checkOutput(*rec, 1); checkDtyp(*rec); } - checkOutput("do0.B0", 1); - checkDtyp("do0"); + checkOutput("do3.B0", 1); + checkDtyp("do3"); + checkOutput("do3c.B0", 1); + checkDtyp("do3c"); for (rec = records; *rec; rec++) { checkOutput(*rec, 0); } - checkOutput("do0.B0", 0); + checkOutput("do3.B0", 0); + checkOutput("do3c.B0", 0); } /* Group 4 are all soft-channel output records with OUT being empty @@ -177,7 +196,7 @@ void testGroup4(void) { const char ** rec; const char * records[] = { - "ao1", "bo1", "do1.B0", "io1", "lo1", "lso1", "mo1", "so1", NULL, + "ao4", "bo4", "do4.B0", "io4", "lo4", "lso4", "mo4", "so4", NULL, }; testDiag("============ Starting %s ============", EPICS_FUNCTION); @@ -189,9 +208,10 @@ void testGroup4(void) void recTestIoc_registerRecordDeviceDriver(struct dbBase *); + MAIN(softTest) { - testPlan(163); + testPlan(266); testdbPrepare(); testdbReadDatabase("recTestIoc.dbd", NULL, NULL); diff --git a/src/std/rec/test/softTest.db b/src/std/rec/test/softTest.db index 8384fe946..06dbf2b7e 100644 --- a/src/std/rec/test/softTest.db +++ b/src/std/rec/test/softTest.db @@ -59,6 +59,60 @@ record(stringin, "si0") { field(INP, "source") } +record(ai, "ai0c") { + field(DTYP, "Soft Channel") + field(INP, "source CA") +} +record(bi, "bi0c") { + field(DTYP, "Soft Channel") + field(INP, "source CA") + field(ZNAM, "Zero") + field(ONAM, "One") +} +record(int64in, "ii0c") { + field(DTYP, "Soft Channel") + field(INP, "source CA") +} +record(longin, "li0c") { + field(DTYP, "Soft Channel") + field(INP, "source CA") +} +record(mbbiDirect, "di0c") { + field(DTYP, "Soft Channel") + field(NOBT, 4) + field(INP, "source CA") +} +record(mbbi, "mi0c") { + field(DTYP, "Soft Channel") + field(NOBT, 4) + field(INP, "source CA") + field(ZRST, "Zero") + field(ONST, "One") + field(TWST, "Two") + field(THST, "Three") + field(FRST, "Four") + field(FVST, "Five") + field(SXST, "Six") + field(SVST, "Seven") + field(EIST, "Eight") + field(NIST, "Nine") + field(TEST, "Ten") + field(ELST, "Eleven") + field(TWST, "Twelve") + field(TTST, "Thirteen") + field(FTST, "Fourteen") + field(FFST, "Fifteen") +} +record(lsi, "lsi0c") { + field(DTYP, "Soft Channel") + field(SIZV, 40) + field(INP, "source CA") +} +record(stringin, "si0c") { + field(DTYP, "Soft Channel") + field(INP, "source CA") +} + # Group 1 are all soft-channel input records with INP being a non-zero # "const" JSON-link, 9 for most records, 1 for the binary. Their VAL @@ -171,38 +225,39 @@ record(mbbi, "mi2") { } -# Group 3 are all soft-channel output records with OUT being a DB link -# to the PV 'dest' with PP. Putting a value to the record writes that -# value to 'dest' and processes it. +# Group 3 are all soft-channel output records with OUT being a DB or +# CA link to the PV 'dest' with PP. Putting a value to the record +# under test writes the value to 'dest' and processes it. record(sub, "dest") { field(SNAM, "destSubr") + field(VAL, -1) } -record(ao, "ao0") { +record(ao, "ao3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") } -record(bo, "bo0") { +record(bo, "bo3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") field(ZNAM, "Zero") field(ONAM, "One") } -record(int64out, "io0") { +record(int64out, "io3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") } -record(longout, "lo0") { +record(longout, "lo3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") } -record(mbboDirect, "do0") { +record(mbboDirect, "do3") { field(DTYP, "Soft Channel") field(NOBT, 4) field(OUT, "dest PP") } -record(mbbo, "mo0") { +record(mbbo, "mo3") { field(DTYP, "Soft Channel") field(NOBT, 4) field(OUT, "dest PP") @@ -223,39 +278,93 @@ record(mbbo, "mo0") { field(FTST, "Fourteen") field(FFST, "Fifteen") } -record(lso, "lso0") { +record(lso, "lso3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") field(SIZV, 40) } -record(stringout, "so0") { +record(stringout, "so3") { field(DTYP, "Soft Channel") field(OUT, "dest PP") } +record(ao, "ao3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") +} +record(bo, "bo3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") + field(ZNAM, "Zero") + field(ONAM, "One") +} +record(int64out, "io3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") +} +record(longout, "lo3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") +} +record(mbboDirect, "do3c") { + field(DTYP, "Soft Channel") + field(NOBT, 4) + field(OUT, "dest CA") +} +record(mbbo, "mo3c") { + field(DTYP, "Soft Channel") + field(NOBT, 4) + field(OUT, "dest CA") + field(ZRST, "Zero") + field(ONST, "One") + field(TWST, "Two") + field(THST, "Three") + field(FRST, "Four") + field(FVST, "Five") + field(SXST, "Six") + field(SVST, "Seven") + field(EIST, "Eight") + field(NIST, "Nine") + field(TEST, "Ten") + field(ELST, "Eleven") + field(TWST, "Twelve") + field(TTST, "Thirteen") + field(FTST, "Fourteen") + field(FFST, "Fifteen") +} +record(lso, "lso3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") + field(SIZV, 40) +} +record(stringout, "so3c") { + field(DTYP, "Soft Channel") + field(OUT, "dest CA") +} + # Group 4 are all soft-channel output records with OUT being empty # (i.e. a CONSTANT link). Putting a value to the record must succeed. -record(ao, "ao1") { +record(ao, "ao4") { field(DTYP, "Soft Channel") } -record(bo, "bo1") { +record(bo, "bo4") { field(DTYP, "Soft Channel") field(ZNAM, "Zero") field(ONAM, "One") } -record(int64out, "io1") { +record(int64out, "io4") { field(DTYP, "Soft Channel") } -record(longout, "lo1") { +record(longout, "lo4") { field(DTYP, "Soft Channel") } -record(mbboDirect, "do1") { +record(mbboDirect, "do4") { field(DTYP, "Soft Channel") field(NOBT, 4) } -record(mbbo, "mo1") { +record(mbbo, "mo4") { field(DTYP, "Soft Channel") field(NOBT, 4) field(ZRST, "Zero") @@ -275,10 +384,10 @@ record(mbbo, "mo1") { field(FTST, "Fourteen") field(FFST, "Fifteen") } -record(lso, "lso1") { +record(lso, "lso4") { field(DTYP, "Soft Channel") field(SIZV, 40) } -record(stringout, "so1") { +record(stringout, "so4") { field(DTYP, "Soft Channel") } From c830a3a4eeed9cddaccd8ecbb0dad6ee1f9683c7 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 18 Jan 2018 23:35:09 -0600 Subject: [PATCH 06/13] Updated links to new EPICS website at Argonne Only done for documents that are still present in EPICS 7. --- README | 2 +- documentation/README.1st | 6 +++--- documentation/README.html | 6 +++--- src/cap5/CA.pm | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README b/README index ce971d630..a4d27876e 100644 --- a/README +++ b/README @@ -20,5 +20,5 @@ Additional information about EPICS including mailing list archives and subscription instructions, documentation and training materials, additional components, links to other websites etc. is available on the EPICS home page at - http://www.aps.anl.gov/epics/ + https://epics.anl.gov/ diff --git a/documentation/README.1st b/documentation/README.1st index b5b85f2d3..462ac460a 100644 --- a/documentation/README.1st +++ b/documentation/README.1st @@ -436,6 +436,6 @@ References - 1. http://www.aps.anl.gov/epics/base/tornado.php - 2. http://www.aps.anl.gov/epics/base/vxWorks6.php - 3. http://www.aps.anl.gov/epics/ + 1. https://epics.anl.gov/base/tornado.php + 2. https://epics.anl.gov/base/vxWorks6.php + 3. https://epics.anl.gov/ diff --git a/documentation/README.html b/documentation/README.html index 620feffcc..a8a572372 100644 --- a/documentation/README.html +++ b/documentation/README.html @@ -96,8 +96,8 @@ needed to build for these target systems. The absolute path to and version number of the vxWorks installation is normally specified in the base/configure/os/CONFIG_SITE.Common.vxWorksCommon file. Consult the EPICS web - pages about vxWorks - 5.x and vxWorks + pages about vxWorks + 5.x and vxWorks 6.x and the vxWorks documentation for information about configuring your vxWorks operating system for use with EPICS.

@@ -126,7 +126,7 @@

Documentation

EPICS documentation is available through the - EPICS website at Argonne. + EPICS website at Argonne.

Release specific documentation can also be found in the base/documentation directory of the distribution.

diff --git a/src/cap5/CA.pm b/src/cap5/CA.pm index ce9e992da..4dac675fa 100644 --- a/src/cap5/CA.pm +++ b/src/cap5/CA.pm @@ -639,7 +639,7 @@ not follow this pattern, but are still printable strings. =item [1] R3.14 Channel Access Reference Manual by Jeffrey O. Hill -L +L =back From 0315e90e6e8a2296e8d299c6e06c25b006383e6e Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 19 Jan 2018 11:06:23 -0600 Subject: [PATCH 07/13] Revert "tools: Use Carp" This reverts commit f207b00b052037cbb59928e7d5cab1afc6a93a2d. None of these warn/die messages request a stack dump since they all end with \n, but carp & croak ignore that. --- src/tools/EPICS/Copy.pm | 14 ++++++-------- src/tools/EPICS/Release.pm | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/tools/EPICS/Copy.pm b/src/tools/EPICS/Copy.pm index d61800e0e..e1ef2a54e 100644 --- a/src/tools/EPICS/Copy.pm +++ b/src/tools/EPICS/Copy.pm @@ -5,8 +5,6 @@ # in file LICENSE that is included with this distribution. #************************************************************************* -use Carp; - # Copy directories and files from a template sub copyTree { @@ -15,7 +13,7 @@ sub copyTree { # $Rtextsubs contains substitutions for file content. opendir my $FILES, $src - or croak "opendir failed while copying $src: $!\n"; + or die "opendir failed while copying $src: $!\n"; my @entries = readdir $FILES; closedir $FILES; @@ -36,9 +34,9 @@ sub copyTree { print "." unless $opt_d; copyFile($srcName, $dstName, $Rtextsubs); } elsif (-l $srcName) { - carp "\nSoft link in template, ignored:\n\t$srcName\n"; + warn "\nSoft link in template, ignored:\n\t$srcName\n"; } else { - carp "\nUnknown file type in template, ignored:\n\t$srcName\n"; + warn "\nUnknown file type in template, ignored:\n\t$srcName\n"; } } } @@ -46,11 +44,11 @@ sub copyTree { sub copyDir { my ($src, $dst, $Rnamesubs, $Rtextsubs) = @_; if (-e $dst && ! -d $dst) { - carp "\nTarget exists but is not a directory, skipping:\n\t$dst\n"; + warn "\nTarget exists but is not a directory, skipping:\n\t$dst\n"; return; } print "Creating directory '$dst'\n" if $opt_d; - mkdir $dst, 0777 or croak "Can't create $dst: $!\n" + mkdir $dst, 0777 or die "Can't create $dst: $!\n" unless -d $dst; copyTree($src, $dst, $Rnamesubs, $Rtextsubs); } @@ -61,7 +59,7 @@ sub copyFile { print "Creating file '$dst'\n" if $opt_d; open(my $SRC, '<', $src) and open(my $DST, '>', $dst) - or croak "$! copying $src to $dst\n"; + or die "$! copying $src to $dst\n"; while (<$SRC>) { # Substitute any @VARS@ in the text s{@(\w+?)@} diff --git a/src/tools/EPICS/Release.pm b/src/tools/EPICS/Release.pm index 98f18514b..9ae6610c3 100644 --- a/src/tools/EPICS/Release.pm +++ b/src/tools/EPICS/Release.pm @@ -5,8 +5,6 @@ # in file LICENSE that is included with this distribution. #************************************************************************* -use Carp; - # # Parse all relevent configure/RELEASE* files and includes # @@ -51,7 +49,7 @@ sub readRelease { "discovered in $file\n"; } - open(my $IN, '<', $file) or croak "Can't open $file: $!\n"; + open(my $IN, '<', $file) or die "Can't open $file: $!\n"; $Ractive->{$file}++; while (<$IN>) { chomp; @@ -79,7 +77,7 @@ sub readRelease { if (-e $path) { &readRelease($path, $Rmacros, $Rapps, $Ractive); } elsif ($op eq "include") { - carp "EPICS/Release.pm: Include file '$path' not found\n"; + warn "EPICS/Release.pm: Include file '$path' not found\n"; } } $Ractive->{$file}--; @@ -109,9 +107,9 @@ sub expandRelease { while (my ($macro, $val) = each %$Rmacros) { while (my ($pre,$var,$post) = $val =~ m/ (.*) \$\( (\w+) \) (.*) /x) { - carp "EPICS/Release.pm: Undefined macro \$($var) used\n" + warn "EPICS/Release.pm: Undefined macro \$($var) used\n" unless exists $Rmacros->{$var}; - croak "EPICS/Release.pm: Circular definition of macro $macro\n" + die "EPICS/Release.pm: Circular definition of macro $macro\n" if $macro eq $var; $val = $pre . $Rmacros->{$var} . $post; $Rmacros->{$macro} = $val; From 729e6fda4da38d2b9a5dfa46b80a0dd202df0fc1 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 19 Jan 2018 13:14:13 -0600 Subject: [PATCH 08/13] tools: Add some context to the 'Undefined macro' warning Mark Rivers saw this warning when he forgot to configure and build a dependent module properly. The additional information given by this change would have helped him track down the problem faster. --- src/tools/EPICS/Release.pm | 9 +++++---- src/tools/convertRelease.pl | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/tools/EPICS/Release.pm b/src/tools/EPICS/Release.pm index 9ae6610c3..6ae0dbd9a 100644 --- a/src/tools/EPICS/Release.pm +++ b/src/tools/EPICS/Release.pm @@ -99,17 +99,18 @@ sub expandMacros { } # -# Expand all (possibly nested) macros in dictionary +# Expand all (possibly nested) macros in a dictionary # sub expandRelease { - my ($Rmacros) = @_; + my ($Rmacros, $warn) = @_; # $Rmacros is a reference to a hash + $warn = '' unless defined $warn; while (my ($macro, $val) = each %$Rmacros) { while (my ($pre,$var,$post) = $val =~ m/ (.*) \$\( (\w+) \) (.*) /x) { - warn "EPICS/Release.pm: Undefined macro \$($var) used\n" + warn "EPICS/Release.pm: Undefined macro \$($var) used $warn\n" unless exists $Rmacros->{$var}; - die "EPICS/Release.pm: Circular definition of macro $macro\n" + die "EPICS/Release.pm: Circular definition of macro $var $warn\n" if $macro eq $var; $val = $pre . $Rmacros->{$var} . $post; $Rmacros->{$macro} = $val; diff --git a/src/tools/convertRelease.pl b/src/tools/convertRelease.pl index e3fc2644a..d1a054e87 100644 --- a/src/tools/convertRelease.pl +++ b/src/tools/convertRelease.pl @@ -220,7 +220,7 @@ sub checkRelease { my @order = (); my $relfile = "$path/configure/RELEASE"; readReleaseFiles($relfile, \%check, \@order, $arch); - expandRelease(\%check); + expandRelease(\%check, "while checking module\n\t$app = $path"); delete $check{TOP}; delete $check{EPICS_HOST_ARCH}; From ddbdcf94628d7cac5bdef0f18f03c0255bcb1341 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sun, 21 Jan 2018 00:44:10 -0600 Subject: [PATCH 09/13] rec/test: Add missing filename to DBDDEPENDS_FILES --- src/std/rec/test/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/src/std/rec/test/Makefile b/src/std/rec/test/Makefile index 8084b38b5..5322c8e92 100644 --- a/src/std/rec/test/Makefile +++ b/src/std/rec/test/Makefile @@ -38,6 +38,7 @@ TESTFILES += $(COMMON_DIR)/analogMonitorTest.dbd ../analogMonitorTest.db TESTS += analogMonitorTest TARGETS += $(COMMON_DIR)/regressTest.dbd +DBDDEPENDS_FILES += regressTest.dbd$(DEP) regressTest_DBD += base.dbd TESTPROD_HOST += regressTest regressTest_SRCS += regressTest.c From 1454f42a2737fd476531a1476653f16ffcf7bb9f Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Thu, 1 Feb 2018 11:19:08 -0600 Subject: [PATCH 10/13] Config fix for parallel builds with MSVC 2015 and later From Mark Rivers and Freddie Akeroyd. --- configure/os/CONFIG.win32-x86.win32-x86 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/configure/os/CONFIG.win32-x86.win32-x86 b/configure/os/CONFIG.win32-x86.win32-x86 index 863841923..f5b21cc2e 100644 --- a/configure/os/CONFIG.win32-x86.win32-x86 +++ b/configure/os/CONFIG.win32-x86.win32-x86 @@ -142,6 +142,17 @@ STATIC_LDLIBS_NO= STATIC_LDFLAGS= RANLIB= +# +# option needed for parallel builds with Visual Studio 2015 onward +# +# -FS Force Synchronous PDB Writes +ifneq ($(VisualStudioVersion),) + OPT_CXXFLAGS_NO += -FS + OPT_CFLAGS_NO += -FS +endif + + +# # add -profile here to run the ms profiler # -LTCG whole program optimization # -incremental:no full linking From 734d16291fec37b5517cf15fd134cce0f5c9a4ef Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 1 Feb 2018 09:42:51 -0800 Subject: [PATCH 11/13] rsrv: buffer for IP too small An IPv4 address and port number has 21 characters max. --- src/rsrv/online_notify.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rsrv/online_notify.c b/src/rsrv/online_notify.c index 883951dce..b7249870f 100644 --- a/src/rsrv/online_notify.c +++ b/src/rsrv/online_notify.c @@ -72,7 +72,7 @@ void rsrv_online_notify_task(void *pParm) char * pStr; int autoBeaconAddr; ELLLIST autoAddrList; - char buf[16]; + char buf[22]; unsigned priorityOfUDP; epicsThreadBooleanStatus tbs; epicsThreadId tid; From 713c2d5080102daa12bea10e27edfb4a373e4d5e Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 2 Feb 2018 17:47:35 -0600 Subject: [PATCH 12/13] Fix for lp: #1747091 generalTimeGetEvent() --- src/libCom/osi/epicsGeneralTime.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libCom/osi/epicsGeneralTime.c b/src/libCom/osi/epicsGeneralTime.c index 98c5566f7..c3dcc7646 100644 --- a/src/libCom/osi/epicsGeneralTime.c +++ b/src/libCom/osi/epicsGeneralTime.c @@ -269,7 +269,7 @@ static int generalTimeGetEventPriority(epicsTimeStamp *pDest, int eventNumber, } } } else { - if (epicsTimeGreaterThanEqual(pDest, + if (epicsTimeGreaterThanEqual(&ts, >Pvt.eventTime[eventNumber])) { *pDest = ts; gtPvt.eventTime[eventNumber] = ts; @@ -279,7 +279,6 @@ static int generalTimeGetEventPriority(epicsTimeStamp *pDest, int eventNumber, key = epicsInterruptLock(); gtPvt.ErrorCounts++; epicsInterruptUnlock(key); - } IFDEBUG(10) { char last[40], buff[40]; @@ -291,6 +290,7 @@ static int generalTimeGetEventPriority(epicsTimeStamp *pDest, int eventNumber, " %s, using %s instead\n", ptp->name, buff, last); } + } } break; } From de442e9584d9214533e5e90af4270e34fd45d947 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 5 Feb 2018 12:02:13 -0600 Subject: [PATCH 13/13] Fix for LP: #1743076 Never zero the CA client context private ID. --- src/ca/access.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/ca/access.cpp b/src/ca/access.cpp index 74f74325a..e701c5b00 100644 --- a/src/ca/access.cpp +++ b/src/ca/access.cpp @@ -127,21 +127,10 @@ const char * ca_message_text [] static epicsThreadOnceId caClientContextIdOnce = EPICS_THREAD_ONCE_INIT; -extern "C" void ca_client_exit_handler (void *) -{ - if ( caClientContextId ) { - epicsThreadPrivateDelete ( caClientContextId ); - caClientContextId = 0; - } -} - // runs once only for each process extern "C" void ca_init_client_context ( void * ) { caClientContextId = epicsThreadPrivateCreate (); - if ( caClientContextId ) { - epicsAtExit ( ca_client_exit_handler,0 ); - } } /*