diff --git a/configure/CONFIG_BASE b/configure/CONFIG_BASE
index 0b857c22f..8f9fadcdf 100644
--- a/configure/CONFIG_BASE
+++ b/configure/CONFIG_BASE
@@ -43,6 +43,7 @@ PODTOHTML = $(PERL) $(TOOLS)/podToHtml.pl
CONVERTRELEASE = $(PERL) $(call FIND_TOOL,convertRelease.pl)
FULLPATHNAME = $(PERL) $(TOOLS)/fullPathName.pl
TAPTOJUNIT = $(PERL) $(TOOLS)/tap-to-junit-xml.pl
+PROVE = $(PERL) $(TOOLS)/epicsProve.pl
GENVERSIONHEADER = $(PERL) $(TOOLS)/genVersionHeader.pl $(QUIET_FLAG) $(QUESTION_FLAG)
MAKERPATH = $(PYTHON) $(TOOLS)/makeRPath.py
diff --git a/configure/CONFIG_SITE_ENV b/configure/CONFIG_SITE_ENV
index 5bf4960f7..bacbc14a5 100644
--- a/configure/CONFIG_SITE_ENV
+++ b/configure/CONFIG_SITE_ENV
@@ -24,40 +24,40 @@
# Site-specific environment settings
-# Time service:
-# EPICS_TIMEZONE
-# Local timezone info for vxWorks and RTEMS. The format is
-# ::::
-# where is only used by strftime() for %Z conversions,
-# and and are mmddhh - that is month,day,hour
-# e.g. for ANL in 2018: EPICS_TIMEZONE=CUS::360:031102:110402
-# The future dates below assume the rules don't get changed;
-# see http://www.timeanddate.com/time/dst/2018.html to check.
-#
-# DST for 2019 US: Mar 10 - Nov 03
-# EU: Mar 31 - Oct 27
-EPICS_TIMEZONE = CUS::360:031002:110302
-#EPICS_TIMEZONE = MET::-60:033102:102703
-#
-# DST for 2020 US: Mar 08 - Nov 01
-# EU: Mar 29 - Oct 25
-#EPICS_TIMEZONE = CUS::360:030802:110102
-#EPICS_TIMEZONE = MET::-60:032902:102503
-#
-# DST for 2021 US: Mar 14 - Nov 07
-# EU: Mar 28 - Oct 31
-#EPICS_TIMEZONE = CUS::360:031402:110702
-#EPICS_TIMEZONE = MET::-60:032802:103103
-#
-# DST for 2022 US: Mar 13 - Nov 06
-# EU: Mar 27 - Oct 30
-#EPICS_TIMEZONE = CUS::360:031302:110602
-#EPICS_TIMEZONE = MET::-60:032702:103003
-#
-# DST for 2023 US: Mar 13 - Nov 06
-# EU: Mar 27 - Oct 30
-#EPICS_TIMEZONE = CUS::360:031202:110502
-#EPICS_TIMEZONE = MET::-60:032602:102903
+## Time service:
+# EPICS_TZ
+# Local timezone rules for vxWorks and RTEMS. The value follows the Posix
+# TZ environment variable's Mm.n.d/h format (see the IBM link below for
+# details). If TZ hasn't already been set when the osdTime timeRegister()
+# C++ static constructor runs, this parameter will be copied into the TZ
+# environment variable. Once the OS clock has been synchronized to NTP the
+# routine tz2timezone() will be run to convert TZ into the TIMEZONE
+# variable format that VxWorks needs.
+# https://developer.ibm.com/articles/au-aix-posix/
+
+# Japan Standard Time, no DST:
+#EPICS_TZ = "JST-9"
+
+# Central European (Summer) Time:
+#EPICS_TZ = "CET-1CEST,M3.5.0/2,M10.5.0/3"
+
+# Greenwich Mean/British Summer Time:
+#EPICS_TZ = "GMT0BST,M3.5.0/1,M10.5.0/2"
+
+# US Eastern Standard/Daylight Time:
+#EPICS_TZ = "EST5EDT,M3.2.0/2,M11.1.0/2"
+
+# US Central Standard/Daylight Time:
+EPICS_TZ = "CST6CDT,M3.2.0/2,M11.1.0/2"
+
+# US Mountain Standard/Daylight Time:
+#EPICS_TZ = "MST7MDT,M3.2.0/2,M11.1.0/2"
+
+# US Pacific Standard/Daylight Time:
+#EPICS_TZ = "PST8PDT,M3.2.0/2,M11.1.0/2"
+
+# US Hawaiian Standard Time, no DST:
+#EPICS_TZ = "HST10"
# EPICS_TS_NTP_INET
# NTP time server ip address for VxWorks and RTEMS.
diff --git a/configure/RULES_BUILD b/configure/RULES_BUILD
index 743ba503e..0735f5598 100644
--- a/configure/RULES_BUILD
+++ b/configure/RULES_BUILD
@@ -370,7 +370,7 @@ testspec: $(TESTSCRIPTS)
test-results: tapfiles
ifneq ($(TAPFILES),)
ifdef RUNTESTS_ENABLED
- $(PERL) -e 'use App::Prove;my $$app = App::Prove->new;$$app->process_args(@ARGV);exit( $$app->run ? 0 : 1 );' -- --failures --ext .tap --exec "$(CAT)" --color $(TAPFILES)
+ $(PROVE) --failures --ext .tap --exec "$(CAT)" --color $(TAPFILES)
endif
CURRENT_TAPFILES := $(wildcard $(TAPFILES))
diff --git a/configure/os/CONFIG_SITE.Common.linux-arm b/configure/os/CONFIG_SITE.Common.linux-arm
index 556ac6f09..8f5fb8c82 100644
--- a/configure/os/CONFIG_SITE.Common.linux-arm
+++ b/configure/os/CONFIG_SITE.Common.linux-arm
@@ -1,39 +1,35 @@
# CONFIG_SITE.Common.linux-arm
#
-# Site Specific definitions for all linux-arm targets
-#-------------------------------------------------------
+# Site-specific settings for the linux-arm target
-# NOTE for SHARED_LIBRARIES: In most cases if this is set to YES the
+# NOTE: In most cases if SHARED_LIBRARIES is set to YES the
# shared libraries will be found automatically. However if the .so
# files are installed at a different path to their compile-time path
# then in order to be found at runtime do one of these:
# a) LD_LIBRARY_PATH must include the full absolute pathname to
# $(INSTALL_LOCATION)/lib/$(EPICS_HOST_ARCH) when invoking base
# executables.
-# b) Add the runtime path to SHRLIB_DEPLIB_DIRS and PROD_DEPLIB_DIRS, which
+# b) Add the runtime path to SHRLIB_DEPLIB_DIRS and PROD_DEPLIB_DIRS, which
# will add the named directory to the list contained in the executables.
# c) Add the runtime path to /etc/ld.so.conf and run ldconfig
# to inform the system of the shared library location.
-# Depending on your version of Linux you'll want one of the following
-# lines to enable command-line editing and history in iocsh. If you're
-# not sure which, start with the top one and work downwards until the
-# build doesn't fail to link the readline library. If none of them work,
-# comment them all out to build without readline support.
-# No other libraries needed (recent Fedora, Ubuntu etc.):
-#COMMANDLINE_LIBRARY = READLINE
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(firstword $(READLINE_DIR) $(GNU_DIR))/include/readline/readline.h), \
+ READLINE, EPICS))
-# Needs -lncurses (RHEL 5 etc.):
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
+
+# Needs -lncurses:
#COMMANDLINE_LIBRARY = READLINE_NCURSES
-# Needs -lcurses (older versions)
+# Needs -lcurses:
#COMMANDLINE_LIBRARY = READLINE_CURSES
-
-# It makes sense to include debugging symbols even in optimized builds
-# in case you want to attach gdb to the process or examine a core-dump.
-# This does cost disk space, but not memory as debug symbols are not
-# loaded into RAM when the binary is loaded.
-OPT_CFLAGS_YES += -g
-OPT_CXXFLAGS_YES += -g
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
diff --git a/configure/os/CONFIG_SITE.Common.linux-cris b/configure/os/CONFIG_SITE.Common.linux-cris
index b17cb0ee5..699f346ff 100644
--- a/configure/os/CONFIG_SITE.Common.linux-cris
+++ b/configure/os/CONFIG_SITE.Common.linux-cris
@@ -1,9 +1,8 @@
# CONFIG_SITE.Common.linux-cris
#
-# Site Specific definitions for linux-cris target
-# Only the local epics system manager should modify this file
+# Site-specific settings for the linux-cris target
-# NOTE for SHARED_LIBRARIES: In most cases if this is set to YES the
+# NOTE: In most cases if SHARED_LIBRARIES is set to YES the
# shared libraries will be found automatically. However if the .so
# files are installed at a different path to their compile-time path
# then in order to be found at runtime do one of these:
@@ -15,21 +14,21 @@
# c) Add the runtime path to /etc/ld.so.conf and run ldconfig
# to inform the system of the shared library location.
-# Depending on your version of Linux you may want one of the following
-# lines to enable command-line editing and history in iocsh. If you're
-# not sure which, start with the top one and work downwards until the
-# build doesn't fail to link the readline library. If none of them work,
-# comment them all out to build without readline support.
-# No other libraries needed (recent Fedora, Ubuntu etc.):
-#COMMANDLINE_LIBRARY = READLINE
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(GNU_DIR)/include/readline/readline.h), READLINE, EPICS))
-# Needs -lncurses (RHEL 5 etc.):
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
+
+# Needs -lncurses:
#COMMANDLINE_LIBRARY = READLINE_NCURSES
-# Needs -lcurses (older versions)
+# Needs -lcurses:
#COMMANDLINE_LIBRARY = READLINE_CURSES
-
-OP_SYS_CFLAGS += -g
-
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
diff --git a/configure/os/CONFIG_SITE.Common.linux-microblaze b/configure/os/CONFIG_SITE.Common.linux-microblaze
index 43c543c2b..b66b4cced 100644
--- a/configure/os/CONFIG_SITE.Common.linux-microblaze
+++ b/configure/os/CONFIG_SITE.Common.linux-microblaze
@@ -1,7 +1,6 @@
# CONFIG_SITE.Common.linux-microblaze
#
-# Site specific definitions for linux-microblaze target builds.
-#-------------------------------------------------------
+# Site-specific settings for the linux-microblaze target
# The gnu tools for cross compiling for MicroBlaze (little endian)
# on Linux can be downloaded from the Xilinx git server:
@@ -12,3 +11,21 @@
GNU_DIR = /usr/local/vw/microblaze-2.0/microblazeel-unknown-linux-gnu
+
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(GNU_DIR)/include/readline/readline.h), READLINE, EPICS))
+
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
+
+# Needs -lncurses:
+#COMMANDLINE_LIBRARY = READLINE_NCURSES
+
+# Needs -lcurses:
+#COMMANDLINE_LIBRARY = READLINE_CURSES
+
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
diff --git a/configure/os/CONFIG_SITE.Common.linux-x86 b/configure/os/CONFIG_SITE.Common.linux-x86
index e4e7dd0fd..d243dae48 100644
--- a/configure/os/CONFIG_SITE.Common.linux-x86
+++ b/configure/os/CONFIG_SITE.Common.linux-x86
@@ -1,9 +1,8 @@
# CONFIG_SITE.Common.linux-x86
#
-# Site Specific definitions for linux-x86 target
-# Only the local epics system manager should modify this file
+# Site-specific settings for the linux-x86 target
-# NOTE for SHARED_LIBRARIES: In most cases if this is set to YES the
+# NOTE: In most cases if SHARED_LIBRARIES is set to YES the
# shared libraries will be found automatically. However if the .so
# files are installed at a different path to their compile-time path
# then in order to be found at runtime do one of these:
@@ -15,14 +14,15 @@
# c) Add the runtime path to /etc/ld.so.conf and run ldconfig
# to inform the system of the shared library location.
-# Depending on your version of Linux you'll want one of the following
-# lines to enable command-line editing and history in iocsh. If you're
-# not sure which, start with the top one and work downwards until the
-# build doesn't fail to link the readline library. If none of them work,
-# comment them all out to build without readline support.
-# No other libraries needed (recent Fedora, Ubuntu etc.):
-COMMANDLINE_LIBRARY = READLINE
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(GNU_DIR)/include/readline/readline.h), READLINE, EPICS))
+
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
# Needs -lncurses (RHEL 5 etc.):
#COMMANDLINE_LIBRARY = READLINE_NCURSES
@@ -30,6 +30,9 @@ COMMANDLINE_LIBRARY = READLINE
# Needs -lcurses (older versions)
#COMMANDLINE_LIBRARY = READLINE_CURSES
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
+
# Permit access to 64-bit file-systems
OP_SYS_CFLAGS += -D_FILE_OFFSET_BITS=64
@@ -43,14 +46,6 @@ OP_SYS_CFLAGS += -D_FILE_OFFSET_BITS=64
#CCC = clang++
-# It makes sense to include debugging symbols even in optimized builds
-# in case you want to attach gdb to the process or examine a core-dump.
-# This does cost disk space, but not memory as debug symbols are not
-# loaded into RAM when the binary is loaded.
-OPT_CFLAGS_YES += -g
-OPT_CXXFLAGS_YES += -g
-
-
# Tune GNU compiler output for a specific 32-bit cpu-type
# (e.g. generic, native, i386, i686, pentium2/3/4, prescott, k6, athlon etc.)
GNU_TUNE_CFLAGS = -mtune=generic
diff --git a/configure/os/CONFIG_SITE.Common.linux-x86_64 b/configure/os/CONFIG_SITE.Common.linux-x86_64
index 6f7a2dc7b..834da1e5a 100644
--- a/configure/os/CONFIG_SITE.Common.linux-x86_64
+++ b/configure/os/CONFIG_SITE.Common.linux-x86_64
@@ -1,9 +1,8 @@
# CONFIG_SITE.Common.linux-x86_64
#
-# Site Specific definitions for linux-x86_64 target
-# Only the local epics system manager should modify this file
+# Site-specific settings for the linux-x86_64 target
-# NOTE for SHARED_LIBRARIES: In most cases if this is set to YES the
+# NOTE: In most cases if SHARED_LIBRARIES is set to YES the
# shared libraries will be found automatically. However if the .so
# files are installed at a different path to their compile-time path
# then in order to be found at runtime do one of these:
@@ -15,14 +14,15 @@
# c) Add the runtime path to /etc/ld.so.conf and run ldconfig
# to inform the system of the shared library location.
-# Depending on your version of Linux you'll want one of the following
-# lines to enable command-line editing and history in iocsh. If you're
-# not sure which, start with the top one and work downwards until the
-# build doesn't fail to link the readline library. If none of them work,
-# comment them all out to build without readline support.
-# No other libraries needed (recent Fedora, Ubuntu etc.):
-COMMANDLINE_LIBRARY = READLINE
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(GNU_DIR)/include/readline/readline.h), READLINE, EPICS))
+
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
# Needs -lncurses (RHEL 5 etc.):
#COMMANDLINE_LIBRARY = READLINE_NCURSES
@@ -30,6 +30,9 @@ COMMANDLINE_LIBRARY = READLINE
# Needs -lcurses (older versions)
#COMMANDLINE_LIBRARY = READLINE_CURSES
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
+
# Uncomment the followings lines to build with CLANG instead of GCC.
#
@@ -39,14 +42,6 @@ COMMANDLINE_LIBRARY = READLINE
#CCC = clang++
-# It makes sense to include debugging symbols even in optimized builds
-# in case you want to attach gdb to the process or examine a core-dump.
-# This does cost disk space, but not memory as debug symbols are not
-# loaded into RAM when the binary is loaded.
-OPT_CFLAGS_YES += -g
-OPT_CXXFLAGS_YES += -g
-
-
# Tune GNU compiler output for a specific 64-bit cpu-type
# (e.g. generic, native, core2, nocona, k8, opteron, athlon64, barcelona etc.)
GNU_TUNE_CFLAGS = -mtune=generic
diff --git a/configure/os/CONFIG_SITE.Common.linux-xscale_be b/configure/os/CONFIG_SITE.Common.linux-xscale_be
index 015229647..5fb5a4642 100644
--- a/configure/os/CONFIG_SITE.Common.linux-xscale_be
+++ b/configure/os/CONFIG_SITE.Common.linux-xscale_be
@@ -1,4 +1,23 @@
# CONFIG_SITE.Common.linux-xscale_be
#
-# Site specific definitions for all linux-xscale_be target builds.
-#-------------------------------------------------------
+# Site-specific settings for the linux-xscale_be target
+
+
+# Use GNU Readline if the header file is installed
+COMMANDLINE_LIBRARY = $(strip $(if $(wildcard \
+ $(firstword $(READLINE_DIR) $(GNU_DIR))/include/readline/readline.h), \
+ READLINE, EPICS))
+
+# If libreadline needs additional libraries to be linked with it, try
+# uncommenting each of the lines below in turn, starting with the top
+# one and working downwards, until the build succeeds. Do a 'make rebuild'
+# from the top of the Base tree after changing this setting.
+
+# Needs -lncurses:
+#COMMANDLINE_LIBRARY = READLINE_NCURSES
+
+# Needs -lcurses:
+#COMMANDLINE_LIBRARY = READLINE_CURSES
+
+# Readline is broken or you don't want use it:
+#COMMANDLINE_LIBRARY = EPICS
diff --git a/configure/os/CONFIG_SITE.Common.linuxCommon b/configure/os/CONFIG_SITE.Common.linuxCommon
new file mode 100644
index 000000000..7f5d4aa11
--- /dev/null
+++ b/configure/os/CONFIG_SITE.Common.linuxCommon
@@ -0,0 +1,11 @@
+# CONFIG_SITE.Common.linuxCommon
+#
+# Site-specific settings for all linux targets
+
+
+# It makes sense to include debugging symbols even in optimized builds
+# in case you want to attach gdb to the process or examine a core-dump.
+# This does cost disk space, but not memory as debug symbols are not
+# loaded into RAM when the binary is loaded.
+OPT_CFLAGS_YES += -g
+OPT_CXXFLAGS_YES += -g
diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html
deleted file mode 100644
index b444cadcd..000000000
--- a/documentation/RELEASE_NOTES.html
+++ /dev/null
@@ -1,1861 +0,0 @@
-
-
-
-
- EPICS 7.0 Release Notes
-
-
-
-
-
These release notes describe changes that have been made since the previous
-release of this series of EPICS Base. Note that changes which were merged up
-from commits to new releases in an older Base series are not described at the
-top of this file but have entries that appear lower down, under the series to
-which they were originally committed. Thus it is important to read more than
-just the first section to understand everything that has changed in each
-release.
-
-
The external PVA submodules each have their own separate set of release notes
-which should also be read to understand what has changed since an earlier
-release.
-
-
EPICS Release 7.0.3.1
-
-
-
-
Timers and delays use monotonic clock
-
-
Many internal timers and delay calculations use a monotonic clock
-epicsTimeGetMonotonic() instead of the realtime epicsTimeGetCurrent().
-This is intended to make IOCs less susceptible to jumps in system
-time.
-
-
Iocsh "on error ..."
-
-
A new statement is added to enable IOC shell commands
-to signal error conditions, and for scripts to respond.
-This first is through the new function
iocshSetError(int)
-A script may be prefixed with eg. "on error break"
-to stop at the failed command.
Channel Access Security: Check Hostname Against DNS
-
-
Host names given in a HAG entry of an IOC's Access Security
-Configuration File (ACF) have to date been compared against the hostname
-provided by the CA client at connection time, which may or may not be the actual
-name of that client. This allows rogue clients to pretend to be a different
-host, and the IOC would believe them.
-
-
An option is now available to cause an IOC to ask its operating system to
-look up the IP address of any hostnames listed in its ACF (which will normally
-be done using the DNS or the /etc/hosts file). The IOC will then
-compare the resulting IP address against the client's actual IP address when
-checking access permissions at connection time. This name resolution is performed
-at ACF file load time, which has a few consequences:
-
-
-
-
If the DNS is slow when the names are resolved this will delay the process
-of loading the ACF file.
-
-
If a host name cannot be resolved the IOC will proceed, but this host name
-will never be matched.
-
-
Any changes in the hostname to IP address mapping will not be picked up by
-the IOC unless and until the ACF file gets reloaded.
-
-
-
-
Optionally, IP addresses may be added instead of, or in addition to, host names
-in the ACF file.
-
-
This feature can be enabled before iocInit with
-
-
-var("asCheckClientIP",1)
-
-
-
or with the VxWorks target shell use
-
-
-asCheckClientIP = 1
-
-
-
-
New and modified epicsThread APIs
-
-
epicsThreadCreateOpt()
-
-
A new routine epicsThreadCreateOpt() is an alternative to
-epicsThreadCreate() which takes some arguments via a structure
-(struct epicsThreadOpts) to allow for future extensions.
The final opts parameter may be NULL to use the
-default values of thread priority (low) and stack size (medium). Callers wishing
-to provide alternative settings for these thread options or to create a joinable
-thread (see below) should create and pass in an epicsThreadOpts
-structure as shown below. Always initialize one of these structures using the
-EPICS_THREAD_OPTS_INIT macro to ensure that any additional fields
-that get added in the future are set to their default values.
C or C++ Code that also needs to build on earlier versions of Base can use
-#ifdef EPICS_THREAD_OPTS_INIT to determine whether the
-epicsThreadCreateOpt() API is available on this Base version.
-
-
Thread stack sizes
-
-
The stackSize member of the epicsThreadOpts
-structure and the equivalent parameters to the epicsThreadCreate()
-and epicsThreadMustCreate() routines can now be passed either one
-of the epicsThreadStackSizeClass enum values or a value returned
-from the epicsThreadGetStackSize() routine.
-
-
epicsThreadMustJoin()
-
-
If the new joinable flag of an epicsThreadOpts
-structure is non-zero (the default value is zero), the new API routine
-epicsThreadMustJoin()must be called with the thread's
-epicsThreadId when/after the thread exits, to free up thread
-resources. This function will block until the thread's main function has
-returned, allowing the parent to wait for its child thread. The child's
-epicsThreadId will no longer be valid and should not be used after
-the epicsThreadMustJoin() routine returns.
-
-
A thread that was originally created with its joinable flag set may itself
-call epicsThreadMustJoin(), passing in its own epicsThreadId. This
-marks the thread as no longer being joinable, so it will then free the thread
-resources itself when its main function returns. The epicsThreadId
-of a thread that is not joinable gets invalidated as soon as its main function
-returns.
-
-
-
Non-VME RTEMS targets now define pdevLibVME
-
-
Previously IOC executables that made calls to devLib routines would fail to
-link when built for some non-VME based RTEMS targets, which would have to be
-explicitly filtered out by sites that build Base for those targets.
-This fix makes
-that no longer necessary, all RTEMS targets should now link although the IOC
-won't be able to be used with the VME I/O on those systems (that we don't have
-VMEbus I/O support for in libCom).
-
-
EPICS Release 7.0.3
-
-
epicsTimeGetCurrent() optimization
-
-
Add a fast path to epicsTimeGetCurrent() and related calls
-in the common case where only the default OS current time provider is
-registered. This path does not take the global mutex guarding
-the time providers list, potentially reducing lock contention.
-
-
dbEvent tweak Queue size
-
-
The size of the queue used by dbEvent to push monitor updates
-has been slightly increased based on DBR_TIME_DOUBLE to better fill
-an ethernet frame. This may result in slightly fewer, but larger
-frames being sent.
-
-
mbbo/mbbiDirect number of bits as precision
-
-
Report NOBT as "precision" through the dbAccess API.
-This is not accessible through CA, but is planned to be used through
-QSRV.
-
-
EPICS Release 7.0.2.2
-
-
Build System changes
-
-
-
-
The GNUmake build targets cvsclean and depclean are now
-available from any directory; previously they were only available from
-application top directories.
-
-
The approach that EPICS Base uses for building submodules inside the parent
-module looks useful for support modules too. The rules for building submodules
-have been modified and extracted into a new RULES_MODULES file, so a
-support module will be able to use them too without having to copy them into its
-own modules/Makefile. There are some specific requirements that support
-modules and their submodules must follow, which are described as comments in the
-new base/configure/RULES_MODULES file itself.
-
-
-
-
EPICS_BASE_VERSION Update Policy change
-
-
In the past, a build of EPICS using sources checked out from the repository
-branch between official releases would have shown the version number of the
-previous release, followed by a -DEV suffix, for example
-7.0.2.1-DEV.
-
-
The policy that controls when the number gets updated has been changed, and
-now immediately after a release has been tagged the version number will be
-updated to the next patch release version, plus the -DEV suffix as
-before. Thus following 7.0.2.2 the version number will show as
-7.0.2.3-DEV. This does not require the next official release to be
-numbered 7.0.2.3 though, it could become 7.0.3 or even
-7.1.0 if the changes incorporated into it are more substantial than bug
-fixes.
-
-
Drop CLOCK_MONOTONIC_RAW from posix/osdMonotonic.c
-
-
Turns out this is ~10x slower to query than CLOCK_MONOTONIC.
-
-
-
EPICS Release 7.0.2.1
-
-
Linking shared libraries on macOS
-
-
The linker flag -flat_namespace has been restored for creating
-shared libraries, although not for loadable libraries (bundles). This was
-required for building using the latest versions of Apple XCode.
-
-
Fix DB_LINK loop breaking
-
-
A regression was introduced in 7.0.2 which caused record chains with loops to
-be incorrectly broken. Processing should be skipped when a DB_LINK with Process
-Passive (PP) closes a loop to a synchronous record.
-
-
Instead in 7.0.2 the targeted record would be processed if processing began
-with a remote action (or some other caller of dbPutField()). This would
-result in the loop running a second time. The loop would be broken on the second
-iteration.
Support for some obsolete dbStaticLib Database Configuration Tool (DCT) APIs
-was removed some time ago, but vestiges of them still remained. The following
-routines and macros and have now finally been removed:
-
-
-
int dbGetFieldType(DBENTRY *pdbentry)
-
int dbGetLinkType(DBENTRY *pdbentry)
-
DCT_STRING
-
DCT_INTEGER
-
DCT_REAL
-
DCT_MENU
-
DCT_MENUFORM
-
DCT_INLINK
-
DCT_OUTLINK
-
DCT_FWDLINK
-
DCT_NOACCESS
-
DCT_LINK_CONSTANT
-
DCT_LINK_FORM
-
DCT_LINK_PV
-
-
-
Fix for dbhcr before iocInit
-
-
The dbhcr command used to work before iocInit as well as
-afterwards. It displays all records that have hardware addresses (VME_IO,
-CAMAC_IO, GPIB_IO, INST_IO etc.) but stopped working if run before iocInit due
-to the rewrite of the link address parser code in dbStaticLib. This release
-fixes that issue, although in some cases the output may be slightly different
-than it used to be.
The four separate Git branches core/master, libcom/master,
-ca/master and database/master have been recombined into one
-branch called 7.0. Keeping these as 4 separate branches in the same
-repository made it impossible to create merge requests that contained changes in
-more than one of these modules. The layout of the source files has not changed
-at all however, so the source code for libcom, ca and the database are still
-found separately under the module subdirectory.
-
-
-
EPICS Release 7.0.1.1
-
-
Changed SIML failure behavior
-
-
A failure when fetching the simulation mode through SIML will not
-put the record into INVALID alarm state anymore. Instead, as long as the
-record's current alarm severity (SEVR)is NO_ALARM, its alarm status
-(STAT) will be set to LINK_ALARM without increasing the severity. This
-allows clients to get some notification of a failing or bad SIML link
-without otherwise affecting record processing.
-
-
-
dbVerify() has been restored to dbStaticLib
-
-
This routine was removed in Base-3.16.1 but has been reimplemented in this
-release by special request. Note that the error message strings that it returns
-when verification fails have changed, but are still designed for display to the
-user.
-
-
-
Simulation mode improvements
-
-
Records that support simulation mode have two new fields, SSCN
-(Simulation Scan Mode) and SDLY (Simulation Delay). SSCN is a
-menu field that provides an alternate value for the SCAN field to be
-used while the record is in simulation mode. This is especially useful for I/O
-scanned records, for which simulation mode was not working at all. Setting
-SDLY to a positive value makes the record process asynchronously in
-simulation mode, with the second stage processing happening after the specified
-time (in seconds).
-
-
-
Extend the dbServer API with init/run/pause/stop methods
-
-
This change permits IOCs to be built that omit the CA server (RSRV) by
-removing its registrar entry which is now provided in the new rsrv.dbd
-file. Other server layers can be built into the IOC (alongside RSRV or in place
-of it) by registering them in a similar manner. The dbServer API is documented
-with Doxygen comments in the header file.
-
-
Specific IOC server layers can be disabled at runtime by adding their name to
-the environment variable EPICS_IOC_IGNORE_SERVERS (separated by spaces if more
-than one should be ignored).
-
-
-
Grand source-code reorganization
-
-
EPICS 7.0.1 contains the IOC Database, RSRV server and the Channel Access
-client code from EPICS Base 3.16.1 along with all the original record types and
-soft device support, but GDD and the Portable Channel Access Server have been
-unbundled and are now available separately. In their place we have brought in
-the more recently written EPICS V4 C++ libraries (collectively referred to as
-the PVA modules). The directory tree for EPICS is somewhat larger as a result,
-and the original structure of the Base directories has been split into 4
-separate Git repositories. External modules should build against this new
-structure with little or no changes needed, except that some allowance may be
-needed for the merging of the V4 modules.
-
-
There should be rather more description and documantation of these changes
-than is currently available, but as developers we generally much prefer to write
-code than documentation. Send questions to the tech-talk mailing list and we'll
-be happy to try and answer them!
Status reporting for the callback and scanOnce task queues
-
-
Two new iocsh commands and some associated underlying APIs have been added to
-show the state of the queues that feed the three callback tasks and the scanOnce
-task, including a high-water mark which can optionally be reset. The new iocsh
-commands are callbackQueueShow and scanOnceQueueShow; both
-take an optional integer argument which must be non-zero to reset the
-high-water mark.
-
-
Support for event codes greater than or equal to NUM_TIME_EVENTS
-
-
Event numbers greater than or equal to NUM_TIME_EVENTS are now allowed if
-supported by the registered event time provider, which must provide its own
-advancing timestamp validation for such events.
-
-
Time events numbered 0 through (NUM_TIME_EVENTS-1) are still validated by
-code in epicsGeneralTime.c that checks for advancing timestamps and enforces
-that restriction.
-
-
Type-safe Device and Driver Support Tables
-
-
Type-safe versions of the device and driver support structures dset
-and drvet have been added to the devSup.h and drvSup.h headers
-respectively. The original structure definitions have not been changed so
-existing support modules will still build normally, but older modules can be
-modified and new code written to be compatible with both.
-
-
The old structure definitions will be replaced by the new ones if the macros
-USE_TYPED_DSET and/or USE_TYPED_DRVET are defined when the
-appropriate header is included. The best place to define these is in the
-Makefile, as with the USE_TYPED_RSET macro that was introduced in
-Base-3.16.1 and described below. See the comments in devSup.h for a brief usage
-example, or look at
-this commit to the ipac module to see a module conversion.
-
-
A helper function DBLINK* dbGetDevLink(dbCommon *prec) has also been
-added to devSup.h which fetches a pointer to the INP or OUT field of the
-record.
-
-
RTEMS build configuration update, running tests under QEMU
-
-
This release includes the ability to run the EPICS unit tests built for a
-special version of the RTEMS-pc386 target architecture on systems that have an
-appropriate QEMU emulator installed (qemu-system-i386). It is also now
-possible to create sub-architectures of RTEMS targets, whereas previously the
-EPICS target architecture name had to be RTEMS-$(RTEMS_BSP).
-
-
The new target RTEMS-pc386-qemu builds binaries that can be run in
-the qemu-system-i386 PC System emulator. This target is a derivative of
-the original RTEMS-pc386 target but with additional software to build
-an in-memory file-system, and some minor modifications to allow the unit tests
-to work properly under QEMU. When this target is enabled, building any of the
-make targets that cause the built-in self-tests to be run (such as
-make runtests) will also run the tests for RTEMS using QEMU.
-
-
To allow the new 3-component RTEMS target name, the EPICS build system for
-RTEMS was modified to allow a configure/os/CONFIG.Common.<arch>
-file to set the RTEMS_BSP variable to inform the build what RTEMS BSP
-to use. Previously this was inferred from the value of the T_A make
-variable, but that prevents having multiple EPICS targets that build against the
-same BSP. All the included RTEMS target configuration files have been updated;
-build configuration files for out-of-tree RTEMS targets will continue to work as
-the original rules are used to set RTEMS_BSP if it hasn't been set when
-needed.
-
-
Link type enhancements
-
-
This release adds three new link types: "state", "debug" and "trace". The
-"state" link type gets and puts boolean values from/to the dbState library that
-was added in the 3.15.1 release. The "debug" link type sets the
-jlink::debug flag in its child link, while the "trace" link type
-also causes the arguments and return values for all calls to the child link's
-jlif and lset routines to be printed on stdout. The debug flag can no longer be
-set using an info tag. The addition of the "trace" link type has allowed over
-200 lines of conditional diagnostic printf() calls to be removed from the other
-link types.
-
-
The "calc" link type can now be used for output links as well as input links.
-This allows modification of the output value and even combining it with values
-from other input links. See the separate JSON Link types document for
-details.
-
-
A new start_child() method was added to the end of the jlif
-interface table.
-
-
The lset methods have now been properly documented in the
-dbLink.h header file using Doxygen annotations, although we do not run Doxygen
-on the source tree yet to generate API documentation.
-
-
Link types that utilize child links must now indicate whether the child will
-be used for input, output or forward linking by the return value from its
-parse_start_map() method. The jlif_key_result enum now
-contains 3 values jlif_key_child_inlink,
-jlif_key_child_outlink and jlif_key_child_fwdlink
-instead of the single jlif_key_child_link that was previously used
-for this.
-
-
GNUmake targets for debugging
-
-
Some additional build rules have been added to help debug configuration
-problems with the build system. Run make show-makefiles to get a sorted
-list of all the files that the build system includes when building in the
-current directory.
-
-
A new pattern rule for PRINT.% can be used to show the value of any
-GNUmake variable for the current build directory (make sure you are in the right
-directory though, many variables are only set when inside the
-O.arch build directory). For example make PRINT.T_A
-will display the build target architecture name from inside a
-O.arch directory but the variable will be empty from an
-application top or src directory. make PRINT.EPICS_BASE will show the
-path to Base from any EPICS application directory though.
-
-
Propagate PUTF across Asynchronous record processing
-
-
The IOC contains a mechanism involving the PUTF and RPRO fields of each
-record to ensure that if a record is busy when it receives a put to one of its
-fields, the record will be processed again to ensure that the new field value
-has been correctly acted on. Until now that mechanism only worked if the put was
-to the asynchronous record itself, so puts that were chained from some other
-record via a DB link did not cause reprocessing.
-
-
In this release the mechanism has been extended to propagate the PUTF state
-across DB links until all downstream records have been reprocessed. Some
-additional information about the record state can be shown by setting the TPRO
-field of an upstream record, and even more trace data is displayed if the
-debugging variable dbAccessDebugPUTF is set in addition to TPRO.
-
-
Finding info fields
-
-
A new iocsh command dbli lists the info fields defined in the
-database, and can take a glob pattern to limit output to specific info names.
-The newly added dbStaticLib function dbNextMatchingInfo() iterates
-through the info fields defined in the current record, and is used to implement
-the new command.
-
-
Output from dbpr command enhanced
-
-
The "DataBase Print Record" command dbpr now generates slightly
-better output, with more field types having their own display methods. This
-release also includes additional protection against buffer overflows while
-printing long links in dbpr, and corrects the output of long strings
-from the dbgf command.
-
-
Record types mbbiDirect and mbboDirect upgraded to 32 bit
-
-
The VAL fields and related fields of these records are now DBF_LONG.
-(Not DBF_ULONG in order to prevent Channel Access from promoting them
-to DBF_DOUBLE.) Additional bit fields B10...B1F have
-been added.
-
-
Device support that accesses VAL or the bit fields directly (most
-don't) and aims for compatibility with old and new versions of these records
-should use at least 32 bit integer types to avoid bit loss. The number of bit
-fields can be calculated using 8 * sizeof(prec->val)
-which is correct in both versions.
-
-
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
-
-
The IOC now supports the 64-bit integer field types DBF_INT64 and
-DBF_UINT64, and there are new record types int64in and
-int64out derived from the longin and longout types
-respectively that use the DBF_INT64 data type for their VAL and related
-fields. The usual range of Soft Channel device support are included for these
-new record types.
-
-
All internal IOC APIs such as dbAccess can handle the new field types and
-their associated request values DBR_INT64 and DBR_UINT64,
-which are implemented using the epicsInt64 and epicsUInt64
-typedef's from the epicsTypes.h header.
-
-
The waveform record type has been updated to support these new field types.
-All waveform device support layers must be updated to recognize the new
-type enumeration values, which had to be inserted before the
-FLOAT value in the enum dbfType and in menuFtype. C
-or C++ code can detect at compile-time whether this version of base provides
-64-bit support by checking for the presence of the DBR_INT64 macro as
-follows (Note that DBF_INT64 is an enum tag and not a
-preprocessor macro):
-
-
-#ifdef DBR_INT64
- /* Code where Base has INT64 support */
-#else
- /* Code for older versions */
-#endif
-
-
-
If the code uses the old db_access.h types (probably because it's calling
-Channel Access APIs) then it will have to test against the EPICS version number
-instead, like this:
Channel Access does not (and probably never will) directly support 64-bit
-integer types, so the new field types are presented to the CA server as
-DBF_DOUBLE values. This means that field values larger than 2^52
-(0x10_0000_0000_0000 = 4503599627370496) cannot be transported over Channel
-Access without their least significant bits being truncated. The EPICS V4
-pvAccess network protocol can transport 64-bit data types however, and
-a future release of the pvaSrv module will connect this ability to the fields of
-the IOC.
-
-
Additional 64-bit support will be provided in later release. For instance the
-JSON parser for the new Link Support feature only handles integers up to
-32 bits wide, so constant array initializer values cannot hold larger
-values in this release.
-
-
-
Add EPICS_CA_MCAST_TTL
-
-
A new environment parameter EPICS_CA_MCAST_TTL is used to set the Time To
-Live (TTL) value of any IP multi-cast CA search or beacon packets sent.
-
-
-
EPICS_CA_MAX_ARRAY_BYTES is optional
-
-
A new environment parameter EPICS_CA_AUTO_ARRAY_BYTES is now used by libca
-and RSRV (CA clients and the IOC CA server). The default is equivalent to
-setting EPICS_CA_AUTO_ARRAY_BYTES=YES which removes the need to set
-EPICS_CA_MAX_ARRAY_BYTES and always attempts to allocate sufficiently large
-network buffers to transfer large arrays properly over the network. In this case
-the value of the EPICS_CA_MAX_ARRAY_BYTES parameter is ignored.
-
-
Explicitly setting EPICS_CA_AUTO_ARRAY_BYTES=NO will continue to honor the
-buffer setting in EPICS_CA_AUTO_ARRAY_BYTES as in previous releases.
-
-
The default setting for EPICS_CA_AUTO_ARRAY_BYTES can be changed by
-adding the line
-
-
-EPICS_CA_AUTO_ARRAY_BYTES=NO
-
-
-
to the configure/CONFIG_SITE_ENV file before building Base. Sites that wish
-to override this only for specific IOC architectures can create new files for
-each architecture named configure/os/CONFIG_SITE_ENV.<target-arch> with
-the above setting in before building Base. The configuration can also be
-explicitly changed by setting the environment variable in the IOC's startup
-script, anywhere above the iocInit line.
-
-
The PCAS server (used by the PV Gateway and other CA servers) now always
-behaves as if EPICS_CA_AUTO_ARRAY_BYTES is set to YES (it ignores the
-configuration parameter and environment variable).
-
-
-
Channel Access "modernization"
-
-
Drop support for CA clients advertising protocol versions less than 4.
-
-
This effects clients from Base older than 3.12.0-beta1.
-Newer clients will continue to be able to connect to older servers.
-Older clients will be ignored by newer servers.
-
-
This allows removal of UDP echo and similar protocol features which
-are not compatible with secure protocol design practice.
-
-
-
Lookup-tables using the subArrray record
-
-
The subArray record can now be used as a lookup-table from a constant array
-specified in its INP field. For example:
The INDX field selects which power of 2 to set the VAL field to. In previous
-releases the INP field would have to have been pointed to a separate waveform
-record that was initialized with the array values somehow at initialization
-time.
-
-
Synchronized Timestamps with TSEL=-2
-
-
Most Soft Channel input device support routines have supported fetching the
-timestamp through the INP link along with the input data. However before now
-there was no guarantee that the timestamp provided by a CA link came from the
-same update as the data, since the two were read from the CA input buffer at
-separate times without maintaining a lock on that buffer in between. This
-shortcoming could be fixed as a result of the new link support code, which
-allows code using a link to pass a subroutine to the link type which will be run
-with the link locked. The subroutine may make multiple requests for metadata
-from the link, but must not block.
-
-
-
Extensible Link Types
-
-
-
-
A major new feature introduced with this release of EPICS Base is an
-Extensible Link Type mechanism, also known as Link Support or JSON Link Types.
-This addition permits new kinds of link I/O to be added to an IOC in a similar
-manner to the other extension points already supported (e.g. record, device and
-driver support).
-
-
A new link type must implement two related APIs, one for parsing the JSON
-string which provides the link address and the other which implements the link
-operations that get called at run-time to perform I/O. The link type is built
-into the IOC by providing a new link entry in a DBD file.
-
-
-
New Link Types Added
-
-
This release contains two new JSON link types, const and
-calc:
-
-
-
-
The const link type is almost equivalent to the old CONSTANT link
-type with the updates described below to accept arrays and strings, except that
-there is no need to wrap a scalar string constant inside array brackets since a
-constant string will never be confused with a PV name.
-
-
The calc link type allows CALC expressions to be used to combine
-values from other JSON links to produce its value. Until additional JSON link
-types are created though, the calc link type has little practical
-utility as it can currently only fetch inputs from other calc links or
-from const links.
-
-
-
-
- field(INP, {calc:{expr:"A+B+1",
- args:[5, # A
- {const:6}] # B
- }})
-
The API to allow device support to use JSON addresses is currently
-incomplete; developers are advised not to try creating device support that
-specifies a JSON_LINK address type.
-
-
-
Support Routine Modifications for Extensible Link Types
-
-
For link fields in external record types and soft device support to be able
-to use the new link types properly, various changes are required to utilize the
-new Link Support API as defined in the dbLink.h header file and outlined below.
-The existing built-in Database and Channel Access link types have been altered
-to implement the link APIs, so will work properly after these conversions:
-
-
-
-
Make all calls to recGblInitConstantLink() unconditional on the
-link type, i.e. change this code:
-
-
-
-Note that recGblInitConstantLink() still returns TRUE if the field was
-successfully initialized from the link (implying the link is constant).
-This change will work properly with all Base releases currently in use.
-
-
Code that needs to identify a constant link should be modified to use the
-new routine dbLinkIsConstant() instead, which returns TRUE for constant
-or undefined links, FALSE for links whose dbGetLink() routine may
-return different values on different calls. For example this:
-
-
- if (prec->dol.type != CONSTANT)
-
-
-should become this:
-
-
- if (!dbLinkIsConstant(&prec->dol))
-
-
-When the converted software is also required to build against older versions of
-Base, this macro definition may be useful:
-
-
Any code that calls dbCa routines directly, or that explicitly checks if a
-link has been resolved as a CA link using code such as
-
-
- if (prec->inp.type == CA_LINK)
-
-
-will still compile and run, but will only work properly with the old CA link
-type. To operate with the new extensible link types such code must be modified
-to use the new generic routines defined in dbLink.h and should never attempt to
-examine or modify data inside the link. After conversion the above line would
-probably become:
-
-
- if (dbLinkIsVolatile(&prec->inp))
-
-
-A volatile link is one like a Channel Access link which may disconnect and
-reconnect without notice at runtime. Database links and constant links are not
-volatile; unless their link address is changed they will always remain in the
-same state they started in. For compatibility when building against older
-versions of Base, this macro definition may be useful:
-
-
The current connection state of a volatile link can be found using the
-routine dbIsLinkConnected() which will only return TRUE for a volatile
-link that is currently connected. Code using the older dbCa API returning this
-information used to look like this:
-
-
- stat = dbCaIsLinkConnected(plink);
-
-
-which should become:
-
- stat = dbIsLinkConnected(plink);
-
-
-Similar changes should be made for calls to the other dbCa routines.
-
-
-
A full example can be found by looking at the changes to the calcout record
-type, which has been modified in this release to use the new dbLink generic
-API.
-
-
-
-
-
-
-
Constant Link Values
-
-
Previously a constant link (i.e. a link that did not point to another PV,
-either locally or over Channel Access) was only able to provide a single numeric
-value to a record initialization; any string given in a link field that was not
-recognized as a number was treated as a PV name. In this release, constant links
-can be expressed using JSON array syntax and may provide array initialization of
-values containing integers, doubles or strings. An array containing a single
-string value can also be used to initialize scalar strings, so the stringin,
-stringout, lsi (long string input), lso (long string output), printf, waveform,
-subArray and aai (analog array input) record types and/or their soft device
-supports have been modified to support this.
-
-
Some examples of constant array and string initialized records are:
Reminder: Link initialization with constant values normally only occurs at
-record initialization time. The calcout and printf record types are the only
-exceptions in the Base record types to this rule, so it is generally not useful
-to change a const link value after iocInit.
-
-
-
Database Parsing of "Relaxed JSON" Values
-
-
A database file can now provide a "relaxed JSON" value for a database field
-value or an info tag. Only a few field types can currently accept such values,
-but the capability is now available for use in other places in the future. When
-writing to a JSON-capable field at run-time however, only strictly compliant
-JSON may be used (the dbStaticLib parser rewrites relaxed JSON values into
-strict JSON before passing them to the datase for interpretation, where the
-strict rules must be followed).
-
-
"Relaxed JSON" was developed to maximize compatibility with the previous
-database parser rules and reduce the number of double-quotes that would be
-needed for strict JSON syntax. The parser does accept strict JSON too though,
-which should be used when machine-generating database files. The differences
-are:
-
-
-
-
Strings containing only the characters a-z A-Z 0-9 _ - + .
-do not have to be enclosed in double-quote characters.
-
-
The above rule applies to map keys as well as to regular string values.
-
-
The JSON keywords null, true and false (all
-lower-case) will be recognized as keywords, so they must be quoted to use any of
-these single words as a string.
-
-
Comments may be used, introduced as usual by the #
-character and extending to the end of the line.
-
-
-
-
A JSON field or info value is only enclosed in quotes when the value being
-provided is a single string, and even here the quotes can be omitted in some
-cases as described above. The following shows both correct and incorrect
-excerpts from a database file:
Note that the record, field and info-tag names do not accept JSON
-values, so they follows the older bareword rules for quoting where the colon
-: and several additional characters are legal in a bareword
-string. Only the value (after the comma) is parsed as JSON. The autosave module
-has not been modified to accept JSON syntax, the above is only an example of
-how JSON might be used.
-
-
Echoless comments in iocsh
-
-
The way comments are parsed by the iocsh interpreter has changed. The
-interpreter can be selectively disabled from echoing comments coming from
-a script by starting those lines with '#-' rather than just '#'.
-
-
-
Typed record support methods
-
-
The table of record support functions (rset methods for short) no longer
-has entries of type RECSUPFUN (which says: any number and type of
-arguments). Instead, rset methods are now typed by default. The
-RECSUPFUN typedef has been deprecated and casts to it as well as
-using the untyped struct rset will create compilation warnings.
-
-
Existing code (e.g. external record supports) will generate such
-warnings when compiled against this version of Base, but it will work
-without changes.
-
-
For a conversion period, the new typed rset definitions are activated
-by defining USE_TYPED_RSET, preferably by setting
-USR_CPPFLAGS += -DUSE_TYPED_RSET inside a Makefile.
-After activating the new typed rset in this way and making the following
-changes, the result should still compile and work properly against older
-versions of Base.
-
-
The first parameter of init_record and process has been
-changed to struct dbCommon *. Record types that use
-void* here should be changed to use struct dbCommon*, and
-cast the argument to their own xxxRecord *.
-
-
When compiled against this release, compiler warnings about incompatible
-types for the method pointers should be taken seriously. When compiled
-against older versions of base, such warnings are unavoidable.
-
-
Record types written in C++ need to take more drastic measures because of
-the stricter type checking in C++. To remain compatible with older versions
-of base you will need to use something like:
and then replace (RECSUPFUN) with RECSUPFUN_CAST
-when initializing the rset.
-Further changes might also be needed, e.g. to adapt const-ness of
-method parameters.
-
-
-
-
Changes made between 3.15.3 and 3.16.0.1
-
-
Build support for CapFast and dbst removed
-
-
The build rules associated with the CapFast-related tools sch2edif
-and e2db and the database optimization tool dbst have
-been removed, along with the DB_OPT build configuration variable.
-
-
compressRecord buffering order
-
-
The compressRecord has a new field BALG which can select between
-FIFO (append) and LIFO (prepend) ordering for insertion of new elements. FIFO
-ordering is the default, matching the behviour of previous versions.
-
-
Valgrind Instrumentation
-
-
Valgrind is a software debugging suite provided by many Linux distributions.
-The header valgrind/valgrind.h is now included in, and installed by, Base.
-When included by a C or C++ source file this header defines some macros which
-expand to provide hints to the Valgrind runtime.
-These have no effect on normal operation of the software, but when run using the
-valgrind tool they can help to find memory leaks and buffer overflows.
-Suitable hints have been added to several free-lists within libCom, including
-freeListLib, allowing valgrind to provide more accurate information about the
-source of potential leaks.
-
-
valgrind.h automatically disables itself when the build target is not
-supported by the valgrind tool.
-It can also explicitly be disabled by defining the macro NVALGRIND.
-See src/libCom/Makefile for a commented-out example.
-
-
As a matter of policy valgrind.h will never be included by any header file
-installed by Base, so its use will remain purely an implementation
-detail hidden from application software.
-Support modules which choose to use valgrind.h are advised to do
-likewise.
-
-
Database Multi-locking
-
-
The IOC record locking code has been re-written with an expanded API; global
-locks are no longer required by the IOC database implementation.
-
-
The new API functions center around dbScanLockMany(), which behaves like
-dbScanLock() applied to an arbitrary group of records. dbLockerAlloc() is used
-to prepare a list or record pointers, then dbScanLockMany() is called. When it
-returns, all of the records listed may be accessed (in any order) until
-dbScanUnlockMany() is called.
-
-
The Application Developer's Guide has been updated to describe the API and
-implementation is more detail.
-
-
Previously a global mutex 'lockSetModifyLock' was locked and unlocked during
-dbScanLock(), acting as a sequencing point for otherwise unrelated calls. The
-new dbLock.c implementation does not include any global mutex in dbScanLock() or
-dbScanLockMany(). Locking/unlocking of unrelated lock sets is now completely
-concurrent.
-
-
Generate Version Header
-
-
A Perl script and Makefile rules have been added to allow modules to generate
-a C header file with a macro defined with an automatically updated identifier.
-This is a VCS revision ID (Darcs, Git, Mercurial, Subversion, and Bazaar are
-supported) or the date/time of the build if no VCS system is in use.
-
-
The makeBaseApp example template has been updated with a new device support
-which makes this identifier visible via a lsi (long string input) record.
-
-
epicsTime API return status
-
-
The epicsTime routines that used to return epicsTimeERROR now return a
-specific S_time_ status value, allowing the caller to discover the reason for
-any failure. The identifier epicsTimeERROR is no longer defined, so any
-references to it in source code will no longer compile. The identifier
-epicsTimeOK still exists and has the value 0 as before, so most code that uses
-these APIs can be changed in a way that is backwards-compatible with the
-previous return status.
-
-
Time providers that have to return a status value and still need to be built
-with earlier versions of Base can define the necessary status symbols like
-this:
-
-
-#include "epicsTime.h"
-
-#ifndef M_time
-/* S_time_... status values were not provided before Base 3.16 */
-#define S_time_unsynchronized epicsTimeERROR
-#define S_time_...whatever... epicsTimeERROR
-#endif
-
-
-
Refactoring of epicsReadline
-
-
The epicsReadline code has been reorganized to allow the commandline history
-editor to be disabled at runtime. The EPICS_COMMANDLINE_LIBRARY build setting
-still selects the preferred editor, but the new IOCSH_HISTEDIT_DISABLE
-environment variable can be set at runtime to disable history editing and make
-the IOC or other program use the basic editor instead. This is useful when
-starting and controlling an IOC from another program through its stdin and
-stdout streams since history editors often insert invisible escape codes into
-the stdout stream, making it hard to parse.
-
-
Callback subsystem API
-
-
Added a new macro callbackGetPriority(prio, callback) to the
-callback.h header and removed the need for dbScan.c to reach into the internals
-of its CALLBACK objects.
-
-
Changes from the 3.15 branch since 3.15.6
-
-
-
-
Add option to avoid CALLBACK conflict
-
-
If a macro EPICS_NO_CALLBACK is defined, then callback.h will no longer (re)define CALLBACK.
-The name 'CALLBACK' is used by the WIN32 API, and redefinition in callback.h cause errors
-if some windows headers are later included.
-
-
-
Code which defines EPICS_NO_CALLBACK, but still wishes to use callbacks, should use
-the alternate name 'epicsCallback' introduced in 3.15.6, 3.16.2, and 7.0.2.
-It is also possible, though not encouraged, to use 'struct callbackPvt'
-which has been present since the callback API was introduced.
-
-
Cleaning up with Multiple CA contexts in a Process
-
-
Bruno Martins reported a problem with the CA client library at shutdown in a
-process that uses multiple CA client contexts. The first context that triggers
-the CA client exit handler prevents any others from being able to clean up
-because it resets the ID of an internal epicsThreadPrivate variable which is
-shared by all clients. This action has been removed from the client library,
-which makes cleanup of clients like this possible.
-
-
Perl CA bindings fixed for macOS Mojave
-
-
Apple removed some Perl header files from macOS Mojave that were available
-in their SDK, requiring a change to the include paths used when compiling the
-CA bindings. The new version should build on new and older macOS versions, and
-these changes may also help other targets that have an incomplete installation
-of Perl (the build will continue after printing a warning that the Perl CA
-bindings could not be built).
-
-
Routine epicsTempName() removed from libCom
-
-
This routine was a simple wrapper around the C89 function tmpnam()
-which is now seen as unsafe and causes warning messages to be generated by
-most modern compilers. The two internal uses of this function have been
-modified to call epicsTempFile() instead. We were unable to find any
-published code that used this function, so it was removed immediately instead
-of being deprecated.
-
-
DBD Parsing of Record Types
-
-
The Perl DBD file parser has been made slightly more liberal; the order in
-which DBD files must be parsed is now more flexible, so that a record type
-definition can now be parsed after a device support that referred to that
-record type. A warning message will be displayed when the device support is
-seen, but the subsequent loading of the record type will be accepted without
-triggering an error. See
-Launchpad bug
-#1801145.
-
-
menuScan and several record types documented with POD
-
-
The EPICS Wiki pages describing a number of standard record types has been
-converted into the Perl POD documentation format and added to the DBD files,
-so at build-time an HTML version of these documents is generated and installed
-into the htmls directory. Thanks to Tony Pietryla.
-
-
CA client tools learned -V option
-
-
This displays the version numbers of EPICS Base and the CA protocol.
-
-
-
Changes made between 3.15.5 and 3.15.6
-
-
Unsetting environment variables
-
-
The new command epicsEnvUnset varname can be used to
-unset an environment variable.
-
-
Warning indicators in msi (and macLib) output
-
-
The libCom macro expansion library has been modified so that when the
-SUPPRESS_WARNINGS flag is set it will no longer include any ,undefined
-or ,recursive indicators in its output when undefined or recursive
-macros are encountered. These indicators were harmless when the output was fed
-into an IOC along with a definition for the macro, but when the msi
-tool was used to generate other kinds of files they caused problems. If the
-msi -V flag is used the markers will still be present in the output
-whenever the appropriate condition is seen.
-
-
Improvements to msi
-
-
In addition to fixing its response to discovering parsing errors in its
-substitution input file (reported as Launchpad
-bug #1503661)
-so it now deletes the incomplete output file, the msi program has been cleaned
-up a little bit internally.
-
-
All array records now post monitors on their array-length fields
-
-
The waveform record has been posting monitors on its NORD field since Base
-3.15.0.1; we finally got around to doing the equivalent in all the other
-built-in record types, which even required modifying device support in some
-cases. This fixes
-Launchpad bug #1730727.
-
-
HOWTO: Converting Wiki Record Reference to POD
-
-
Some documentation has been added to the dbdToHtml.pl script
-explaining how Perl POD (Plain Old Documentation) markup can be added to
-.dbd files to generate HTML documentation for the record types. To see
-these instructions, run perl bin/<host>/dbdToHtml.pl -H
-or perldoc bin/<host>/dbdToHtml.pl.
-
-
Fix problem with numeric soft events
-
-
Changing from numeric to named soft events introduced an incompatibility
-when a numeric event 1-255 is converted from a DOUBLE, e.g. from a calc record.
-The post_event() API is not marked deprecated any more.
-
-
Also scanpel has been modified to accept a glob pattern for
-event name filtering and to show events with no connected records as well.
-
-
Add osiSockOptMcastLoop_t and osiSockTest
-
-
Added a new OS-independent typedef for multicast socket options, and a test
-file to check their correct operation.
-
-
Support for CONFIG_SITE.local in Base
-
-
This feature is mostly meant for use by developers; configuration
-settings that would normally appear in Base/configure/CONFIG_SITE can now
-be put in a locally created base/configure/CONFIG_SITE.local file instead
-of having go modify or replace the original. A new .gitignore pattern
-tells git to ignore all configure/*.local files.
-
-
-
Changes from the 3.14 branch between 3.15.5 and 3.15.6
-
-
Fix broken EPICS_IOC_LOG_FILE_LIMIT=0 setting
-
-
The Application Developers' Guide says this is allowed and disables the
-limit on the log-file, but it hasn't actually worked for some time (if ever).
-Note that the iocLogServer will be removed from newer Base release sometime
-soon as its functionality can be implemented by other dedicated log servers
-such as logstash or syslog-ng.
The files in the startup directory have not been maintained in recent years
-and have grown crufty (technical term). This release includes the following
-updates to these files:
-
-
-
-
The Perl EpicsHostArch.pl script has been rewritten, and support
-for a few previously missing host architectures has been added to it.
-
-
The EpicsHostArch.pl script has also been moved into the standard
-src/tools directory, from where it will be installed into
-lib/perl. In this new location it is no longer executable, so it must
-be run by the perl executable.
-
-
The build system has been adjusted to look for EpicsHostArch.pl in
-both places if the EPICS_HOST_ARCH environment variable has not been
-set at build-time.
-
-
Sites that used the original Perl script to set EPICS_HOST_ARCH as
-part of their standard environment will need to adjust their scripts when they
-upgrade to this release.
-
-
The EpicsHostArch shell script has been replaced with a wrapper
-routine that calls the Perl EpicsHostArch.pl script. Sites that rely on
-this script to set EPICS_HOST_ARCH should consider switching to the
-Perl script instead.
-
-
The Site.cshrc and Site.profile files have been renamed to
-unix.csh and unix.sh, respectively.
-
-
The existing win32.bat file has been cleaned up and a new
-windows.bat file added for 64-bit targets. The contents of these files
-should be seen as examples, don't uncomment or install parts for software that
-you don't explicitly know that you need.
-
-
-
-
Recent Apple XCode Build Issues
-
-
The latest version of XCode will not compile calls to system() or
-clock_settime() for iOS targets. There were several places in Base
-where these were being compiled, although there were probably never called. The
-code has now been modified to permit iOS builds to complete again.
-
-
Prevent illegal alarm severities
-
-
A check has been added to recGblResetAlarms() that prevents records
-from getting an alarm severity higher than INVALID_ALARM. It is still possible
-for a field like HSV to get set to a value that is not a legal alarm severity,
-but the core IOC code should never copy such a value into a record's SEVR or
-ACKS fields. With this fix the record's alarm severity will be limited to
-INVALID_ALARM.
- lp: #1770292, get_alarm_double() inconsistent across record types
-
- lp: #1771298, Conversion of NaN to integer relies on undefined
- behavior
-
-
-
Updated VxWorks Timezone settings
-
-
Removed the settings for 2017; fixed the hour of the change for MET.
-
-
Fixed camonitor server side relative timestamps bug
-
-
Initialize the first time-stamp from the first monitor, not the client-side
-current time in this configuration.
-
-
Build changes for MSVC
-
-
Windows builds using Visual Studio 2015 and later now use the -FS
-compiler option to allow parallel builds to work properly.
-
-
We now give the -FC option to tell the compiler to print absolute
-paths for source files in diagnostic messages.
-
-
Extend maximum Posix epicsEventWaitWithTimeout() delay
-
-
The Posix implementation of epicsEventWaitWithTimeout() was limiting the
-timeout delay to at most 60 minutes (3600.0 seconds). This has been changed to
-10 years; significantly longer maximum delays cause problems on systems where
-time_t is still a signed 32-bit integer so cannot represent absolute
-time-stamps after 2038-01-19. Our assumption is that such 32-bit systems will
-have been retired before the year 2028, but some additional tests have been
-added to the epicsTimeTest program to detect and fail if this assumption is
-violated.
-
-
New test-related make targets
-
-
This release adds several new make targets intended for use by developers
-and Continuous Integration systems which simplify the task of running the
-built-in self-test programs and viewing the results. Since these targets are
-intended for limited use they can have requirements for the build host which
-go beyond the standard minimum set needed to build and run Base.
-
-
-
-
test-results — Summarize test results
-
-
The new make target test-results will run the self-tests if
-necessary to generate a TAP file for each test, then summarizes the TAP output
-files in each test directory in turn, displaying the details of any failures.
-This step uses the program prove which comes with Perl, but also needs
-cat to be provided in the default search path so will not work on most
-Windows systems.
-
-
junitfiles — Convert test results to JUnit XML Format
-
-
The new make target junitfiles will run the self-tests if necessary
-and then convert the TAP output files into the more commonly-supported JUnit
-XML format. The program that performs this conversion needs the Perl module
-XML::Generator to have been installed.
-
-
clean-tests — Delete test result files
-
-
The new make target clean-tests removes any test result files from
-previous test runs. It cleans both TAP and JUnit XML files.
-
-
-
-
Fix DNS related crash on exit
-
-
The attempt to fix DNS related delays for short lived CLI programs (eg. caget)
-in lp:1527636 introduced a bug which cased these short lived clients to crash on exit.
-This bug should now be fixed.
-
-
Server bind issue on Windows
-
-
When a National Instruments network variables CA server is already running on
-a Windows system and an IOC or PCAS server is started, the IOC's attempt to
-bind a TCP socket to the CA server port number fails, but Windows returns a
-different error status value than the IOC is expecting in that circumstance
-(because the National Instruments code requests exclusive use of that port,
-unlike the EPICS code) so the IOC fails to start properly. The relevent EPICS
-bind() checks have now been updated so the IOC will request that a dynamic port
-number be allocated for this TCP socket instead when this happens.
-
-
Checking Periodic Scan Rates
-
-
Code has been added to the IOC startup to better protect it against bad
-periodic scan rates, including against locales where . is not
-accepted as a decimal separator character. If the scan period in a menuScan
-choice string cannot be parsed, the associated periodic scan thread will no
-longer be started by the IOC and a warning message will be displayed at iocInit
-time. The scanppl command will also flag the faulty menuScan value.
-
-
-
Changes made between 3.15.4 and 3.15.5
-
-
dbStatic Library Speedup and Cleanup
-
-
Loading of database files has been optimized to avoid overproportionally
-long loading times for large databases. As a part of this, the alphabetical
-ordering of records instances (within a record type) has been dropped. In the
-unexpected case that applications were relying on the alphabetic order, setting
-dbRecordsAbcSorted = 1 before loading the databases will retain the
-old behavior.
-
-
The routine dbRenameRecord() has been removed, as it was intended
-to be used by database configuration tools linked against a host side version
-of the dbStatic library that is not being built anymore.
-
-
Launchpad Bug-fixes
-
-
In addition to the more detailed change descriptions below, the following
-Launchpad bugs have also been fixed in this release:
-
-
-
- #1440186 Crash due to a too small buffer being provided in
- dbContextReadNotifyCache
- #1606848 WSAIoctl SIO_GET_INTERFACE_LIST failed in Windows
-
-
-
Whole-Program Optimization for MS Visual Studio Targets
-
-
When using the Microsoft compilers a new build system variable is provided
-that controls whether whole program optimization is used or not. For static
-builds using Visual Studio 2010 this optimization must be disabled. This is
-controlled in the files configure/os/CONFIG_SITE.Common.windows-x64-static and
-configure/os/CONFIG_SITE.Common.win32-x86-static by setting the variable
-OPT_WHOLE_PROGRAM = NO to override the default value
-YES that would otherwise be used.
-
-
Note that enabling this optimization slows down the build process. It is not
-possible to selectively disable this optimization, when building a particular
-module say; Microsoft's linker will restart itself automatically with the
--LTCG flag set and display a warning if it is asked to link any object
-files that were compiled with the -GL flag.
-
-
Add dynamic (variable length) array support to PCAS
-
-
Dynamic array sizing support was added to the IOC server (RSRV) in the
-Base-3.14.12 release, but has not until now been supported in the Portable
-Channel Access Server (PCAS). Channel Access server applications using the
-PCAS may not need to be modified at all; if they already push monitors with
-different gdd array lengths, those variable sizes will be forwarded to any CA
-clients who have requested variable length updates. The example CAS server
-application has been modified to demonstrate this feature.
-
-
In implementing the above, the gdd method gdd::put(const gdd *) now
-copies the full-sized array from the source gdd if the destination gdd is of
-type array, has no allocated memory and a boundary size of 0.
-
-
Additional epicsTime conversion
-
-
The EPICS timestamp library (epicsTime) inside libCom's OSI layer has
-been extended by routines that convert from struct tm to the EPICS
-internal epicsTime type, assuming UTC - i.e. without going through
-the timezone mechanism. This solves issues with converting from the structured
-type to the EPICS timestamp at driver level from multiple threads at a high
-repetition rate, where the timezone mechanism was blocking on file access.
-
-
MinGW Cross-builds from Linux
-
-
The build configuration files that allow cross-building of the 32-bit
-win32-x86-mingw cross-target have been adjusted to default to building shared
-libraries (DLLs) as this is now supported by recent MinGW compilers. The 64-bit
-windows-x64-mingw cross-target was already being built that way by default. The
-configuration options to tell the minGW cross-compiler to link programs with
-static versions of the compiler support libraries have now been moved into the
-CONFIG_SITE.linux-x86.target files.
-
-
General Time updates
-
-
The iocInit code now performs a sanity check of the current time
-returned by the generalTime subsystem and will print a warning if the wall-clock
-time returned has not been initialized yet. This is just a warning message; when
-a time provider does synchonize the IOC will subsequently pick up and use the
-correct time. This check code also primes the registered event system provider
-if there is one so the epicsTimeGetEventInt() routine will work on IOCs
-that ask for event time within an interrupt service routine.
-
-
The osiClockTime provider's synchronization thread (which is only used on
-some embedded targets) will now poll the other time providers at 1Hz until the
-first time it manages to get a successful timestamp, after which it will poll
-for updates every 60 seconds as before.
-
-
The routine generalTimeGetExceptPriority() was designed for use by
-backup (lower priority) time providers like the osiClockTime provider which do
-not have their own absolute time reference and rely on other providers for an
-absolute time source. This routine no longer implements the ratchet mechanism
-that prevented the time it returned from going backwards. If the backup clock's
-tick-timer runs fast the synchronization of the backup time provider would never
-allow it to be corrected backwards when the ratchet was in place. The regular
-epicsTimeGetCurrent() API still uses the ratchet mechanism, so this
-change will not cause the IOC to see time going backwards.
-
-
Microsoft Visual Studio builds
-
-
The build configuration files for builds using the Microsoft compilers have
-been updated, although there should be no noticable difference at most sites.
-One extra compiler warning is now being suppressed for C++ code, C4344:
-behavior change: use of explicit template arguments results in ... which is
-gratuitous and was appearing frequently in builds of the EPICS V4 modules.
-
-
Cross-builds of the windows-x64 target from a win32-x86 host have been
-removed as they don't actually work within the context of a single make
-run. Significant changes to the build configuration files would be necessary for
-these kinds of cross-builds to work properly, which could be done if someone
-needs them (email Andrew Johnson before working on this, and see
-
-this stack-overflow answer for a starting point).
-
-
Bazaar keywords such as 'Revision-Id' removed
-
-
In preparation for moving to git in place of the Bazaar revision control
-system we have removed all the keywords from the Base source code.
-
-
Linux systemd service file for CA Repeater
-
-
Building this version of Base on a Linux system creates a systemd service
-file suitable for starting the Channel Access Repeater under systemd. The file
-will be installed into the target bin directory, from where it can be copied
-into the appropriate systemd location and modified as necessary. Installation
-instructions are included as comments in the file.
-
-
-
Changes made between 3.15.3 and 3.15.4
-
-
New string input device support "getenv"
-
-
A new "getenv" device support for both the stringin and lsi (long string
-input) record types can be used to read the value of an environment variable
-from the IOC at runtime. See base/db/softIocExit.db for sample usage.
-
-
Build rules and DELAY_INSTALL_LIBS
-
-
A new order-only prerequisite build rule has been added to ensure that
-library files (and DLL stubs on Windows) get installed before linking any
-executables, which resolves parallel build problems on high-powered CPUs. There
-are some (rare) cases though where a Makefile has to build an executable and run
-it to be able to compile code for a library built by the same Makefile. With
-this new build rule GNUmake will complain about a circular dependency and the
-build will probably fail in those cases. To avoid this problem the failing
-Makefile should set DELAY_INSTALL_LIBS = YES before including the
-$(TOP)/configure/RULES file, disabling the new build rule.
-
-
IOC environment variables and build parameters
-
-
The IOC now sets a number of environment variables at startup that provide
-the version of EPICS Base it was built against (EPICS_VERSION_...) and its build
-architecture (ARCH). In some cases this allows a single iocBoot/ioc directory to
-be used to run the same IOC on several different architectures without any
-changes.
-
-
There are also 3 new environment parameters (EPICS_BUILD_...) available that
-C/C++ code can use to find out the target architecture, OS class and compiler
-class it was built with. These may be useful when writing interfaces to other
-languages.
-
-
New implementation of promptgroup/gui_group field property
-
-
The mechanism behind the "promptgroup()" field property inside a record type
-definition has been changed. Instead of using a fixed set of choices,
-the static database access library now collects the used gui group names
-while parsing DBD information. Group names should start with a two-digit number
-plus space-dash-space to allow proper sorting of groups.
-
-
The include file guigroup.h that defined the fixed set of choices
-has been deprecated. Instead, use the conversion functions between index number
-and group string that have been added to dbStaticLib.
-
-
When a DBD file containing record-type descriptions is expanded, any
-old-style GUI_xxx group names will be replaced by a new-style
-string for use by the IOC. This permits an older record type to be used with
-the 3.15.4 release, although eventually record types should be converted by
-hand with better group names used.
-
-
CA server configuration changes
-
-
RSRV now honors EPICS_CAS_INTF_ADDR_LIST and binds only to the provided list
-of network interfaces. Name searches (UDP and TCP) on other network interfaces
-are ignored. For example on a computer with interfaces 10.5.1.1/24, 10.5.2.1/24,
-and 10.5.3.1/24, setting "EPICS_CAS_INTF_ADDR_LIST='10.5.1.1 10.5.2.1'" will
-accept traffic on the .1.1 and .2.1, but ignore from .3.1
-
-
RSRV now honors EPICS_CAS_IGNORE_ADDR_LIST and ignores UDP messages received
-from addresses in this list.
-
-
Previously, CA servers (RSRV and PCAS) would build the beacon address list
-using EPICS_CA_ADDR_LIST if EPICS_CAS_BEACON_ADDR_LIST was no set. This is no
-longer done. Sites depending on this should set both envronment variables to the
-same value.
-
-
IPv4 multicast for name search and beacons
-
-
libca, RSRV, and PCAS may now use IPv4 multicasting for UDP traffic (name
-search and beacons). This is disabled by default. To enable multicast address(s)
-must be listed in EPICS_CA_ADDR_LIST for clients and EPICS_CAS_INTF_ADDR_LIST
-for servers (IOCs should set both). For example:
-"EPICS_CAS_INTF_ADDR_LIST='224.0.2.9' EPICS_CA_ADDR_LIST=224.0.2.9".
-
-
Please note that no IPv4 multicast address is officially assigned for Channel
-Access by IANA. The example 224.0.2.9 is taken from the AD-HOC Block I range.
-
-
Moved mlockall() into its own epicsThread routine
-
-
Since EPICS Base 3.15.0.2 on Posix OSs the initialization of the epicsThread
-subsystem has called mlockall() when the OS supports it and thread
-priority scheduling is enabled. Doing so has caused problems in third-party
-applications that call the CA client library, so the functionality has been
-moved to a separate routine epicsThreadRealtimeLock() which will be
-called by the IOC at iocInit (unless disabled by setting the global variable
-dbThreadRealtimeLock to zero).
-
-
Added dbQuietMacroWarnings control
-
-
When loading database files, macros get expanded even on comment lines. If a
-comment contains an undefined macro, the load still continues but an error
-message gets printed. For this release the error message has been changed to a
-warning, but even this warning can be made less verbose by setting this new
-variable to a non-zero value before loading the file, like this:
Changes from the 3.14 branch between 3.15.3 and 3.15.4
-
-
NTP Time Provider adjusts to OS tick rate changes
-
-
Dirk Zimoch provided code that allows the NTP Time provider (used on VxWorks
-and RTEMS only) to adapt to changes in the OS clock tick rate after the provider
-has been initialized. Note that changing the tick rate after iocInit() is not
-advisable, and that other software might still misbehave if initialized before
-an OS tick rate change. This change was back-ported from the 3.15 branch.
-
-
Making IOC ca_get operations atomic
-
-
When a CA client gets data from an IOC record using a compound data type such
-as DBR_TIME_DOUBLE the value field is fetched from the database in a
-separate call than the other metadata, without keeping the record locked. This
-allows some other thread such as a periodic scan thread a chance to interrupt
-the get operation and process the record in between. CA monitors have always
-been atomic as long as the value data isn't a string or an array, but this race
-condition in the CA get path has now been fixed so the record will stay locked
-between the two fetch operations.
The 'make runtests' and 'make tapfiles' build targets normally only run the
-self-tests for the main EPICS_HOST_ARCH architecture. If the host is
-able to execute self-test programs for other target architectures that are being
-built by the host, such as when building a -debug version of the host
-architecture for example, the names of those other architectures can be added to
-the new CROSS_COMPILER_RUNTEST_ARCHS variable in either the
-configure/CONFIG_SITE file or in an appropriate
-configure/os/CONFIG_SITE.<host>.Common file to have the test
-programs for those targets be run as well.
-
-
Additional RELEASE file checks
-
-
An additional check has been added at build-time for the contents of the
-configure/RELEASE file(s), which will mostly only affect users of the Debian
-EPICS packages published by NSLS-2. Support modules may share an install path,
-but all such modules must be listed adjacent to each other in any RELEASE files
-that point to them. For example the following will fail the new checks:
-This application's RELEASE file(s) define
- EPICS_BASE = /usr/lib/epics
-after but not adjacent to
- AUTOSAVE = /usr/lib/epics
-Module definitions that share paths must be grouped together.
-Either remove a definition, or move it to a line immediately
-above or below the other(s).
-Any non-module definitions belong in configure/CONFIG_SITE.
-
-
-
-
In many cases such as the one above the order of the AUTOSAVE and
-ASYN lines can be swapped to let the checks pass, but if the
-AUTOSAVE module depended on ASYN and hence had to appear
-before it in the list this error indicates that AUTOSAVE should also be
-built in its own private area; a shared copy would likely be incompatible with
-the version of ASYN built in the home directory.
-
-
String field buffer overflows
-
-
Two buffer overflow bugs that can crash the IOC have been fixed, caused by
-initializing a string field with a value larger than the field size
-(Launchpad bug
-#1563191).
-
-
Fixed stack corruption bug in epicsThread C++ API
-
-
The C++ interface to the epicsThread API could corrupt the stack on thread
-exit in some rare circumstances, usually at program exit. This bug has been
-fixed (Launchpad bug
-#1558206).
-
-
RTEMS NTP Support Issue
-
-
On RTEMS the NTP Time Provider could in some circumstances get out of sync
-with the server because the osdNTPGet() code wasn't clearing its input socket
-before sending out a new request. This
-(Launchpad bug 1549908)
-has now been fixed.
-
-
CALC engine bitwise operator fixes
-
-
The bitwise operators in the CALC engine have been modified to work properly
-with values that have bit 31 (0x80000000) set. This modification involved
-back-porting some earlier changes from the 3.15 branch, and fixes
-Launchpad bug
-#1514520.
-
-
Fix ipAddrToAsciiAsync(): Don't try to join the daemon thread
-
-
On process exit, don't try to stop the worker thread that makes DNS lookups
-asynchronous. Previously this would wait for any lookups still in progress,
-delaying the exit unnecessarily. This was most obvious with catools (eg.
-cainfo).
-lp:1527636
-
-
Fix epicsTime_localtime() on Windows
-
-
Simpler versions of the epicsTime_gmtime() and epicsTime_localtime()
-routines have been included in the Windows implementations, and a new test
-program added. The original versions do not report DST status properly. Fixes
-Launchpad bug 1528284.
-
-
-
-
diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md
new file mode 100644
index 000000000..efabcbca3
--- /dev/null
+++ b/documentation/RELEASE_NOTES.md
@@ -0,0 +1,1759 @@
+# EPICS 7.0 Release Notes
+
+These release notes describe changes that have been made since the previous
+release of this series of EPICS Base. **Note that changes which were merged up
+from commits to new releases in an older Base series are not described at the
+top of this file but have entries that appear lower down, under the series to
+which they were originally committed.** Thus it is important to read more than
+just the first section to understand everything that has changed in each
+release.
+
+The external PVA submodules each have their own separate set of release notes
+which should also be read to understand what has changed since an earlier
+release.
+
+# EPICS Release 7.0.3.1
+
+### Timers and delays use monotonic clock
+
+Many internal timers and delay calculations use a monotonic clock
+epicsTimeGetMonotonic() instead of the realtime epicsTimeGetCurrent(). This is
+intended to make IOCs less susceptible to jumps in system time.
+
+### Iocsh "on error ..."
+
+A new statement is added to enable IOC shell commands to signal error
+conditions, and for scripts to respond. This first is through the new function
+
+ iocshSetError(int)
+
+A script may be prefixed with eg. "on error break" to stop at the failed
+command.
+
+ on error continue | break | wait [value] | halt
+
+A suggested form for IOC shell commands is:
+
+ static void doSomethingCallFunc(const iocshArgBuf *args)
+ {
+ iocshSetError(doSomething(...)); /* return 0 == success */
+ }
+
+### Channel Access Security: Check Hostname Against DNS
+
+Host names given in a `HAG` entry of an IOC's Access Security Configuration
+File (ACF) have to date been compared against the hostname provided by the CA
+client at connection time, which may or may not be the actual name of that
+client. This allows rogue clients to pretend to be a different host, and the
+IOC would believe them.
+
+An option is now available to cause an IOC to ask its operating system to look
+up the IP address of any hostnames listed in its ACF (which will normally be
+done using the DNS or the `/etc/hosts` file). The IOC will then compare the
+resulting IP address against the client's actual IP address when checking
+access permissions at connection time. This name resolution is performed at
+ACF file load time, which has a few consequences:
+
+ 1. If the DNS is slow when the names are resolved this will delay the process
+of loading the ACF file.
+
+ 2. If a host name cannot be resolved the IOC will proceed, but this host name
+will never be matched.
+
+ 3. Any changes in the hostname to IP address mapping will not be picked up by
+the IOC unless and until the ACF file gets reloaded.
+
+Optionally, IP addresses may be added instead of, or in addition to, host
+names in the ACF file.
+
+This feature can be enabled before `iocInit` with
+
+ var("asCheckClientIP",1)
+
+or with the VxWorks target shell use
+
+ asCheckClientIP = 1
+
+### New and modified epicsThread APIs
+
+#### `epicsThreadCreateOpt()`
+
+A new routine `epicsThreadCreateOpt()` is an alternative to
+`epicsThreadCreate()` which takes some arguments via a structure (`struct
+epicsThreadOpts`) to allow for future extensions.
+
+ typedef struct epicsThreadOpts {
+ unsigned int priority;
+ unsigned int stackSize;
+ unsigned int joinable;
+ } epicsThreadOpts;
+ #define EPICS_THREAD_OPTS_INIT { \
+ epicsThreadPriorityLow, epicsThreadStackMedium, 0}
+ epicsThreadId epicsThreadCreateOpt(const char * name,
+ EPICSTHREADFUNC funptr, void * parm, const epicsThreadOpts *opts);
+
+The final `opts` parameter may be `NULL` to use the default values of thread
+priority (low) and stack size (medium). Callers wishing to provide alternative
+settings for these thread options or to create a joinable thread (see below)
+should create and pass in an `epicsThreadOpts` structure as shown below.
+Always initialize one of these structures using the `EPICS_THREAD_OPTS_INIT`
+macro to ensure that any additional fields that get added in the future are
+set to their default values.
+
+ void startitup(void) {
+ epicsThreadOpts opts = EPICS_THREAD_OPTS_INIT;
+ epicsThreadId tid;
+
+ opts.priority = epicsThreadPriorityMedium;
+ tid = epicsThreadCreateOpt("my thread", &threadMain, NULL, &opts);
+ }
+
+C or C++ Code that also needs to build on earlier versions of Base can use
+`#ifdef EPICS_THREAD_OPTS_INIT` to determine whether the
+`epicsThreadCreateOpt()` API is available on this Base version.
+
+#### Thread stack sizes
+
+The `stackSize` member of the `epicsThreadOpts` structure and the equivalent
+parameters to the `epicsThreadCreate()` and `epicsThreadMustCreate()` routines
+can now be passed either one of the `epicsThreadStackSizeClass` enum values or
+a value returned from the `epicsThreadGetStackSize()` routine.
+
+#### `epicsThreadMustJoin()`
+
+If the new `joinable` flag of an `epicsThreadOpts` structure is non-zero (the
+default value is zero), the new API routine `epicsThreadMustJoin()` *must* be
+called with the thread's `epicsThreadId` when/after the thread exits, to free
+up thread resources. This function will block until the thread's main function
+has returned, allowing the parent to wait for its child thread. The child's
+`epicsThreadId` will no longer be valid and should not be used after the
+`epicsThreadMustJoin()` routine returns.
+
+A thread that was originally created with its joinable flag set may itself
+call `epicsThreadMustJoin()`, passing in its own epicsThreadId. This marks the
+thread as no longer being joinable, so it will then free the thread resources
+itself when its main function returns. The `epicsThreadId` of a thread that is
+not joinable gets invalidated as soon as its main function returns.
+
+### Non-VME RTEMS targets now define pdevLibVME
+
+Previously IOC executables that made calls to devLib routines would fail to
+link when built for some non-VME based RTEMS targets, which would have to be
+explicitly filtered out by sites that build Base for those targets. [This
+fix](https://bugs.launchpad.net/epics-base/+bug/1841692) makes that no longer
+necessary, all RTEMS targets should now link although the IOC won't be able to
+be used with the VME I/O on those systems (that we don't have VMEbus I/O
+support for in libCom).
+
+# EPICS Release 7.0.3
+
+### epicsTimeGetCurrent() optimization
+
+Add a fast path to epicsTimeGetCurrent() and related calls in the common case
+where only the default OS current time provider is registered. This path does
+not take the global mutex guarding the time providers list, potentially
+reducing lock contention.
+
+### dbEvent tweak Queue size
+
+The size of the queue used by dbEvent to push monitor updates has been
+slightly increased based on `DBR_TIME_DOUBLE` to better fill an ethernet frame.
+This may result in slightly fewer, but larger frames being sent.
+
+### mbbo/mbbiDirect number of bits as precision
+
+Report NOBT as "precision" through the dbAccess API. This is not accessible
+through CA, but is planned to be used through QSRV.
+
+# EPICS Release 7.0.2.2
+
+### Build System changes
+
+ * The GNUmake build targets `cvsclean` and `depclean` are now available from
+any directory; previously they were only available from application top
+directories.
+
+ * The approach that EPICS Base uses for building submodules inside the parent
+module looks useful for support modules too. The rules for building submodules
+have been modified and extracted into a new `RULES_MODULES` file, so a support
+module will be able to use them too without having to copy them into its own
+`modules/Makefile`. There are some specific requirements that support modules
+and their submodules must follow, which are described as comments in the new
+`base/configure/RULES_MODULES` file itself.
+
+### `EPICS_BASE_VERSION` Update Policy change
+
+In the past, a build of EPICS using sources checked out from the repository
+branch between official releases would have shown the version number of the
+previous release, followed by a -DEV suffix, for example 7.0.2.1-DEV.
+
+The policy that controls when the number gets updated has been changed, and
+now immediately after a release has been tagged the version number will be
+updated to the next patch release version, plus the -DEV suffix as before.
+Thus following 7.0.2.2 the version number will show as 7.0.2.3-DEV. This does
+not require the next official release to be numbered 7.0.2.3 though, it could
+become 7.0.3 or even 7.1.0 if the changes incorporated into it are more
+substantial than bug fixes.
+
+### Drop `CLOCK_MONOTONIC_RAW` from posix/osdMonotonic.c
+
+Turns out this is ~10x slower to query than `CLOCK_MONOTONIC`.
+
+# EPICS Release 7.0.2.1
+
+### Linking shared libraries on macOS
+
+The linker flag `-flat_namespace` has been restored for creating shared
+libraries, although not for loadable libraries (bundles). This was required
+for building using the latest versions of Apple XCode.
+
+### Fix `DB_LINK` loop breaking
+
+A regression was introduced in 7.0.2 which caused record chains with loops to
+be incorrectly broken. Processing should be skipped when a `DB_LINK` with
+Process Passive (PP) closes a loop to a synchronous record.
+
+Instead in 7.0.2 the targeted record would be processed if processing began
+with a remote action (or some other caller of `dbPutField()`). This would
+result in the loop running a second time. The loop would be broken on the
+second iteration.
+
+[See lp: #1809570](https://bugs.launchpad.net/epics-base/+bug/1809570)
+
+### Old dbStaticLib APIs removed
+
+Support for some obsolete dbStaticLib Database Configuration Tool (DCT) APIs
+was removed some time ago, but vestiges of them still remained. The following
+routines and macros and have now finally been removed:
+
+ * `int dbGetFieldType(DBENTRY *pdbentry)`
+ * `int dbGetLinkType(DBENTRY *pdbentry)`
+ * `DCT_STRING`
+ * `DCT_INTEGER`
+ * `DCT_REAL`
+ * `DCT_MENU`
+ * `DCT_MENUFORM`
+ * `DCT_INLINK`
+ * `DCT_OUTLINK`
+ * `DCT_FWDLINK`
+ * `DCT_NOACCESS`
+ * `DCT_LINK_CONSTANT`
+ * `DCT_LINK_FORM`
+ * `DCT_LINK_PV`
+
+### Fix for `dbhcr` before `iocInit`
+
+The `dbhcr` command used to work before `iocInit` as well as afterwards. It
+displays all records that have hardware addresses (`VME_IO`, `CAMAC_IO`,
+`GPIB_IO`, `INST_IO` etc.) but stopped working if run before iocInit due to the
+rewrite of the link address parser code in dbStaticLib. This release fixes that
+issue, although in some cases the output may be slightly different than it used
+to be.
+
+# EPICS Release 7.0.2
+
+### Launchpad Bugs
+
+The list of tracked bugs fixed in this release can be found on the [Launchpad
+Milestone page for EPICS Base 7.0.2](https://launchpad.net/epics-
+base/+milestone/7.0.2).
+
+### Git Branches Recombined
+
+The four separate Git branches `core/master`, `libcom/master`, `ca/master` and
+`database/master` have been recombined into one branch called `7.0`. Keeping
+these as 4 separate branches in the same repository made it impossible to
+create merge requests that contained changes in more than one of these
+modules. The layout of the source files has not changed at all however, so the
+source code for libcom, ca and the database are still found separately under
+the module subdirectory.
+
+# EPICS Release 7.0.1.1
+
+### Changed SIML failure behavior
+
+A failure when fetching the simulation mode through `SIML` will not put the
+record into INVALID alarm state anymore. Instead, as long as the record's
+current alarm severity (`SEVR`)is `NO_ALARM`, its alarm status (`STAT`) will be
+set to `LINK_ALARM` without increasing the severity. This allows clients to get
+some notification of a failing or bad `SIML` link without otherwise affecting
+record processing.
+
+### dbVerify() has been restored to dbStaticLib
+
+This routine was removed in Base-3.16.1 but has been reimplemented in this
+release by special request. Note that the error message strings that it
+returns when verification fails have changed, but are still designed for
+display to the user.
+
+### Simulation mode improvements
+
+Records that support simulation mode have two new fields, `SSCN` (Simulation
+Scan Mode) and `SDLY` (Simulation Delay). `SSCN` is a menu field that provides
+an alternate value for the `SCAN` field to be used while the record is in
+simulation mode. This is especially useful for I/O scanned records, for which
+simulation mode was not working at all. Setting `SDLY` to a positive value
+makes the record process asynchronously in simulation mode, with the second
+stage processing happening after the specified time (in seconds).
+
+### Extend the dbServer API with init/run/pause/stop methods
+
+This change permits IOCs to be built that omit the CA server (RSRV) by
+removing its registrar entry which is now provided in the new `rsrv.dbd` file.
+Other server layers can be built into the IOC (alongside RSRV or in place of
+it) by registering them in a similar manner. The dbServer API is documented
+with Doxygen comments in the header file.
+
+Specific IOC server layers can be disabled at runtime by adding their name to
+the environment variable `EPICS_IOC_IGNORE_SERVERS` (separated by spaces if more
+than one should be ignored).
+
+### Grand source-code reorganization
+
+EPICS 7.0.1 contains the IOC Database, RSRV server and the Channel Access
+client code from EPICS Base 3.16.1 along with all the original record types
+and soft device support, but GDD and the Portable Channel Access Server have
+been unbundled and are now available separately. In their place we have
+brought in the more recently written EPICS V4 C++ libraries (collectively
+referred to as the PVA modules). The directory tree for EPICS is somewhat
+larger as a result, and the original structure of the Base directories has
+been split into 4 separate Git repositories. External modules should build
+against this new structure with little or no changes needed, except that some
+allowance may be needed for the merging of the V4 modules.
+
+There should be rather more description and documantation of these changes
+than is currently available, but as developers we generally much prefer to
+write code than documentation. Send questions to the tech-talk mailing list
+and we'll be happy to try and answer them!
+
+## Changes between 3.16.1 and 3.16.2
+
+The list of tracked bugs fixed in this release can be found on the [Launchpad
+Milestone page for EPICS Base 3.16.2](https://launchpad.net/epics-
+base/+milestone/3.16.2).
+
+### Status reporting for the callback and scanOnce task queues
+
+Two new iocsh commands and some associated underlying APIs have been added to
+show the state of the queues that feed the three callback tasks and the
+scanOnce task, including a high-water mark which can optionally be reset. The
+new iocsh commands are `callbackQueueShow` and `scanOnceQueueShow`; both take
+an optional integer argument which must be non-zero to reset the high-water
+mark.
+
+### Support for event codes greater than or equal to `NUM_TIME_EVENTS`
+
+Event numbers greater than or equal to `NUM_TIME_EVENTS` are now allowed if
+supported by the registered event time provider, which must provide its own
+advancing timestamp validation for such events.
+
+Time events numbered 0 through `(NUM_TIME_EVENTS-1)` are still validated by code
+in epicsGeneralTime.c that checks for advancing timestamps and enforces that
+restriction.
+
+### Type-safe Device and Driver Support Tables
+
+Type-safe versions of the device and driver support structures `dset` and
+`drvet` have been added to the devSup.h and drvSup.h headers respectively. The
+original structure definitions have not been changed so existing support
+modules will still build normally, but older modules can be modified and new
+code written to be compatible with both.
+
+The old structure definitions will be replaced by the new ones if the macros
+`USE_TYPED_DSET` and/or `USE_TYPED_DRVET` are defined when the appropriate
+header is included. The best place to define these is in the Makefile, as with
+the `USE_TYPED_RSET` macro that was introduced in Base-3.16.1 and described
+below. See the comments in devSup.h for a brief usage example, or look at
+[this commit]
+(https://github.com/epics-modules/ipac/commit/a7e0ff4089b9aa39108bc8569e95ba7fcf07cee9)
+to the ipac module to see a module conversion.
+
+A helper function `DBLINK* dbGetDevLink(dbCommon *prec)` has also been added
+to devSup.h which fetches a pointer to the INP or OUT field of the record.
+
+### RTEMS build configuration update, running tests under QEMU
+
+This release includes the ability to run the EPICS unit tests built for a
+special version of the RTEMS-pc386 target architecture on systems that have an
+appropriate QEMU emulator installed (`qemu-system-i386`). It is also now
+possible to create sub-architectures of RTEMS targets, whereas previously the
+EPICS target architecture name had to be `RTEMS-$(RTEMS_BSP)`.
+
+The new target `RTEMS-pc386-qemu` builds binaries that can be run in the
+`qemu-system-i386` PC System emulator. This target is a derivative of the
+original `RTEMS-pc386` target but with additional software to build an in-
+memory file-system, and some minor modifications to allow the unit tests to
+work properly under QEMU. When this target is enabled, building any of the
+make targets that cause the built-in self-tests to be run (such as `make
+runtests`) will also run the tests for RTEMS using QEMU.
+
+To allow the new 3-component RTEMS target name, the EPICS build system for
+RTEMS was modified to allow a `configure/os/CONFIG.Common.` file to set
+the `RTEMS_BSP` variable to inform the build what RTEMS BSP to use. Previously
+this was inferred from the value of the `T_A` make variable, but that prevents
+having multiple EPICS targets that build against the same BSP. All the
+included RTEMS target configuration files have been updated; build
+configuration files for out-of-tree RTEMS targets will continue to work as the
+original rules are used to set `RTEMS_BSP` if it hasn't been set when needed.
+
+### Link type enhancements
+
+This release adds three new link types: "state", "debug" and "trace". The
+"state" link type gets and puts boolean values from/to the dbState library
+that was added in the 3.15.1 release. The "debug" link type sets the
+`jlink::debug` flag in its child link, while the "trace" link type also causes
+the arguments and return values for all calls to the child link's jlif and
+lset routines to be printed on stdout. The debug flag can no longer be set
+using an info tag. The addition of the "trace" link type has allowed over 200
+lines of conditional diagnostic printf() calls to be removed from the other
+link types.
+
+The "calc" link type can now be used for output links as well as input links.
+This allows modification of the output value and even combining it with values
+from other input links. See the separate JSON Link types document for details.
+
+A new `start_child()` method was added to the end of the jlif interface table.
+
+The `lset` methods have now been properly documented in the dbLink.h header
+file using Doxygen annotations, although we do not run Doxygen on the source
+tree yet to generate API documentation.
+
+Link types that utilize child links must now indicate whether the child will
+be used for input, output or forward linking by the return value from its
+`parse_start_map()` method. The `jlif_key_result` enum now contains 3 values
+`jlif_key_child_inlink`, `jlif_key_child_outlink` and `jlif_key_child_fwdlink`
+instead of the single `jlif_key_child_link` that was previously used for this.
+
+### GNUmake targets for debugging
+
+Some additional build rules have been added to help debug configuration
+problems with the build system. Run `make show-makefiles` to get a sorted list
+of all the files that the build system includes when building in the current
+directory.
+
+A new pattern rule for `PRINT.%` can be used to show the value of any GNUmake
+variable for the current build directory (make sure you are in the right
+directory though, many variables are only set when inside the `O.` build
+directory). For example `make PRINT.T_A` will display the build target
+architecture name from inside a `O.` directory but the variable will be
+empty from an application top or src directory. `make PRINT.EPICS_BASE` will
+show the path to Base from any EPICS application directory though.
+
+### Propagate PUTF across Asynchronous record processing
+
+The IOC contains a mechanism involving the PUTF and RPRO fields of each record
+to ensure that if a record is busy when it receives a put to one of its
+fields, the record will be processed again to ensure that the new field value
+has been correctly acted on. Until now that mechanism only worked if the put
+was to the asynchronous record itself, so puts that were chained from some
+other record via a DB link did not cause reprocessing.
+
+In this release the mechanism has been extended to propagate the PUTF state
+across DB links until all downstream records have been reprocessed. Some
+additional information about the record state can be shown by setting the TPRO
+field of an upstream record, and even more trace data is displayed if the
+debugging variable `dbAccessDebugPUTF` is set in addition to TPRO.
+
+### Finding info fields
+
+A new iocsh command `dbli` lists the info fields defined in the database, and
+can take a glob pattern to limit output to specific info names. The newly
+added dbStaticLib function `dbNextMatchingInfo()` iterates through the info
+fields defined in the current record, and is used to implement the new
+command.
+
+### Output from `dbpr` command enhanced
+
+The "DataBase Print Record" command `dbpr` now generates slightly better
+output, with more field types having their own display methods. This release
+also includes additional protection against buffer overflows while printing
+long links in `dbpr`, and corrects the output of long strings from the `dbgf`
+command.
+
+### Record types mbbiDirect and mbboDirect upgraded to 32 bit
+
+The VAL fields and related fields of these records are now `DBF_LONG`. (Not
+`DBF_ULONG` in order to prevent Channel Access from promoting them to
+`DBF_DOUBLE`.) Additional bit fields `B10`...`B1F` have been added.
+
+Device support that accesses `VAL` or the bit fields directly (most don't) and
+aims for compatibility with old and new versions of these records should use
+at least 32 bit integer types to avoid bit loss. The number of bit fields can
+be calculated using `8 * sizeof(prec->val)` which is correct in both versions.
+
+### 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](https://bugs.launchpad.net/bugs/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](https://bugs.launchpad.net/epics-
+base/+bug/1706703).
+
+## Changes made between 3.16.0.1 and 3.16.1
+
+### IOC Database Support for 64-bit integers
+
+The IOC now supports the 64-bit integer field types `DBF_INT64` and
+`DBF_UINT64`, and there are new record types `int64in` and `int64out` derived
+from the `longin` and `longout` types respectively that use the `DBF_INT64`
+data type for their VAL and related fields. The usual range of Soft Channel
+device support are included for these new record types.
+
+All internal IOC APIs such as dbAccess can handle the new field types and
+their associated request values `DBR_INT64` and `DBR_UINT64`, which are
+implemented using the `epicsInt64` and `epicsUInt64` typedef's from the
+`epicsTypes.h` header.
+
+The waveform record type has been updated to support these new field types.
+**All waveform device support layers must be updated to recognize the new type
+enumeration values**, which had to be inserted before the `FLOAT` value in the
+enum `dbfType` and in `menuFtype`. C or C++ code can detect at compile-time
+whether this version of base provides 64-bit support by checking for the
+presence of the `DBR_INT64` macro as follows (Note that `DBF_INT64` is an
+enum tag and not a preprocessor macro):
+
+ #ifdef DBR_INT64
+ /* Code where Base has INT64 support */
+ #else
+ /* Code for older versions */
+ #endif
+
+If the code uses the old `db_access.h` types (probably because it's calling
+Channel Access APIs) then it will have to test against the EPICS version
+number instead, like this:
+
+ #include
+
+ #ifndef VERSION_INT
+ # define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P))
+ #endif
+ #ifndef EPICS_VERSION_INT
+ # define EPICS_VERSION_INT VERSION_INT(EPICS_VERSION, EPICS_REVISION,
+EPICS_MODIFICATION, EPICS_PATCH_LEVEL)
+ #endif
+
+ #if EPICS_VERSION_INT >= VERSION_INT(3,16,1,0)
+ /* Code where Base has INT64 support */
+ #else
+ /* Code for older versions */
+ #endif
+
+Channel Access does not (and probably never will) directly support 64-bit
+integer types, so the new field types are presented to the CA server as
+`DBF_DOUBLE` values. This means that field values larger than 2^52
+(0x10_0000_0000_0000 = 4503599627370496) cannot be transported over Channel
+Access without their least significant bits being truncated. The EPICS V4
+pvAccess network protocol _can_ transport 64-bit data types however, and a
+future release of the pvaSrv module will connect this ability to the fields of
+the IOC.
+
+Additional 64-bit support will be provided in later release. For instance the
+JSON parser for the new Link Support feature only handles integers up to 32
+bits wide, so constant array initializer values cannot hold larger values in
+this release.
+
+### Add `EPICS_CA_MCAST_TTL`
+
+A new environment parameter `EPICS_CA_MCAST_TTL` is used to set the Time To Live
+(TTL) value of any IP multi-cast CA search or beacon packets sent.
+
+### `EPICS_CA_MAX_ARRAY_BYTES` is optional
+
+A new environment parameter `EPICS_CA_AUTO_ARRAY_BYTES` is now used by libca and
+RSRV (CA clients and the IOC CA server). The default is equivalent to setting
+`EPICS_CA_AUTO_ARRAY_BYTES=YES` which removes the need to set
+`EPICS_CA_MAX_ARRAY_BYTES` and always attempts to allocate sufficiently large
+network buffers to transfer large arrays properly over the network. In this case
+the value of the `EPICS_CA_MAX_ARRAY_BYTES` parameter is ignored.
+
+Explicitly setting `EPICS_CA_AUTO_ARRAY_BYTES=NO` will continue to honor the
+buffer setting in `EPICS_CA_AUTO_ARRAY_BYTES` as in previous releases.
+
+The default setting for `EPICS_CA_AUTO_ARRAY_BYTES` can be changed by adding the
+line
+
+ EPICS_CA_AUTO_ARRAY_BYTES=NO
+
+to the `configure/CONFIG_SITE_ENV` file before building Base. Sites that wish to
+override this only for specific IOC architectures can create new files for each
+architecture named `configure/os/CONFIG_SITE_ENV.` with the above
+setting in before building Base. The configuration can also be explicitly
+changed by setting the environment variable in the IOC's startup script,
+anywhere above the `iocInit` line.
+
+The PCAS server (used by the PV Gateway and other CA servers) now always behaves
+as if `EPICS_CA_AUTO_ARRAY_BYTES` is set to `YES` (it ignores the configuration
+parameter and environment variable).
+
+### Channel Access "modernization"
+
+Drop support for CA clients advertising protocol versions less than 4.
+
+This effects clients from Base older than 3.12.0-beta1. Newer clients will
+continue to be able to connect to older servers. Older clients will be ignored
+by newer servers.
+
+This allows removal of UDP echo and similar protocol features which are not
+compatible with secure protocol design practice.
+
+### Lookup-tables using the subArrray record
+
+The subArray record can now be used as a lookup-table from a constant array
+specified in its INP field. For example:
+
+ record(subArray, "powers-of-2") {
+ field(FTVL, "LONG")
+ field(MALM, 12)
+ field(INP, [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048])
+ field(INDX, 0)
+ field(NELM, 1)
+ }
+
+The INDX field selects which power of 2 to set the VAL field to. In previous
+releases the INP field would have to have been pointed to a separate waveform
+record that was initialized with the array values somehow at initialization
+time.
+
+### Synchronized Timestamps with TSEL=-2
+
+Most Soft Channel input device support routines have supported fetching the
+timestamp through the INP link along with the input data. However before now
+there was no guarantee that the timestamp provided by a CA link came from the
+same update as the data, since the two were read from the CA input buffer at
+separate times without maintaining a lock on that buffer in between. This
+shortcoming could be fixed as a result of the new link support code, which
+allows code using a link to pass a subroutine to the link type which will be
+run with the link locked. The subroutine may make multiple requests for
+metadata from the link, but must not block.
+
+### Extensible Link Types
+
+A major new feature introduced with this release of EPICS Base is an
+Extensible Link Type mechanism, also known as Link Support or JSON Link Types.
+This addition permits new kinds of link I/O to be added to an IOC in a similar
+manner to the other extension points already supported (e.g. record, device
+and driver support).
+
+A new link type must implement two related APIs, one for parsing the JSON
+string which provides the link address and the other which implements the link
+operations that get called at run-time to perform I/O. The link type is built
+into the IOC by providing a new `link` entry in a DBD file.
+
+#### New Link Types Added
+
+This release contains two new JSON link types, `const` and `calc`:
+
+ * The `const` link type is almost equivalent to the old CONSTANT link type
+with the updates described below to accept arrays and strings, except that
+there is no need to wrap a scalar string constant inside array brackets since
+a constant string will never be confused with a PV name.
+
+ * The `calc` link type allows CALC expressions to be used to combine
+values from other JSON links to produce its value. Until additional JSON link
+types are created though, the `calc` link type has little practical utility as
+it can currently only fetch inputs from other `calc` links or from `const`
+links.
+
+ field(INP, {calc:{expr:"A+B+1",
+ args:[5, # A
+ {const:6}] # B
+ }})
+
+The new link types are documented in a [separate](links.html)
+[document](../html/links.html) .
+
+#### Device Support Addressing using `JSON_LINK`
+
+The API to allow device support to use JSON addresses is currently
+incomplete; developers are advised not to try creating device support that
+specifies a `JSON_LINK` address type.
+
+#### Support Routine Modifications for Extensible Link Types
+
+For link fields in external record types and soft device support to be able
+to use the new link types properly, various changes are required to utilize
+the new Link Support API as defined in the dbLink.h header file and outlined
+below. The existing built-in Database and Channel Access link types have been
+altered to implement the link APIs, so will work properly after these
+conversions:
+
+ * Make all calls to `recGblInitConstantLink()` unconditional on the link
+type, i.e. change this code:
+
+ if (prec->siml.type == CONSTANT) {
+ recGblInitConstantLink(&prec->siml, DBF_USHORT, &prec->simm);
+ }
+
+into this:
+
+ recGblInitConstantLink(&prec->siml, DBF_USHORT, &prec->simm);
+
+Note that `recGblInitConstantLink()` still returns TRUE if the field was
+successfully initialized from the link (implying the link is constant).
+This change will work properly with all Base releases currently in use.
+
+ * Code that needs to identify a constant link should be modified to use
+the new routine `dbLinkIsConstant()` instead, which returns TRUE for constant
+or undefined links, FALSE for links whose `dbGetLink()` routine may return
+different values on different calls. For example this:
+
+ if (prec->dol.type != CONSTANT)
+
+should become this:
+
+ if (!dbLinkIsConstant(&prec->dol))
+
+When the converted software is also required to build against older versions
+of Base, this macro definition may be useful:
+
+ #define dbLinkIsConstant(lnk) ((lnk)->type == CONSTANT)
+
+ * Any code that calls dbCa routines directly, or that explicitly checks if
+a link has been resolved as a CA link using code such as
+
+ if (prec->inp.type == CA_LINK)
+
+will still compile and run, but will only work properly with the old CA link
+type. To operate with the new extensible link types such code must be modified
+to use the new generic routines defined in dbLink.h and should never attempt
+to examine or modify data inside the link. After conversion the above line
+would probably become:
+
+ if (dbLinkIsVolatile(&prec->inp))
+
+A volatile link is one like a Channel Access link which may disconnect and
+reconnect without notice at runtime. Database links and constant links are not
+volatile; unless their link address is changed they will always remain in the
+same state they started in. For compatibility when building against older
+versions of Base, this macro definition may be useful:
+
+ #define dbLinkIsVolatile(lnk) ((lnk)->type == CA_LINK)
+
+ * The current connection state of a volatile link can be found using the
+routine `dbIsLinkConnected()` which will only return TRUE for a volatile link
+that is currently connected. Code using the older dbCa API returning this
+information used to look like this:
+
+ stat = dbCaIsLinkConnected(plink);
+
+which should become:
+
+ stat = dbIsLinkConnected(plink);
+
+Similar changes should be made for calls to the other dbCa routines.
+
+ * A full example can be found by looking at the changes to the calcout
+record type, which has been modified in this release to use the new dbLink
+generic API.
+
+### Constant Link Values
+
+Previously a constant link (i.e. a link that did not point to another PV,
+either locally or over Channel Access) was only able to provide a single
+numeric value to a record initialization; any string given in a link field
+that was not recognized as a number was treated as a PV name. In this release,
+constant links can be expressed using JSON array syntax and may provide array
+initialization of values containing integers, doubles or strings. An array
+containing a single string value can also be used to initialize scalar
+strings, so the stringin, stringout, lsi (long string input), lso (long string
+output), printf, waveform, subArray and aai (analog array input) record types
+and/or their soft device supports have been modified to support this.
+
+Some examples of constant array and string initialized records are:
+
+ record(stringin, "const:string") {
+ field(INP, ["Not-a-PV-name"])
+ }
+ record(waveform, "const:longs") {
+ field(FTVL, LONG)
+ field(NELM, 10)
+ field(INP, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+ }
+ record(aai, "const:doubles") {
+ field(FTVL, DOUBLE)
+ field(NELM, 10)
+ field(INP, [0, 1, 1.6e-19, 2.718, 3.141593])
+ }
+ record(aSub, "select") {
+ field(FTA, STRING)
+ field(NOA, 4)
+ field(INPA, ["Zero", "One", "Two", "Three"])
+ field(FTB, SHORT)
+ field(NOB, 1)
+ field(FTVA, STRING)
+ field(NOVA, 1)
+ field(SNAM, "select_asub")
+ }
+
+Reminder: Link initialization with constant values normally only occurs at
+record initialization time. The calcout and printf record types are the only
+exceptions in the Base record types to this rule, so it is generally not
+useful to change a const link value after iocInit.
+
+### Database Parsing of "Relaxed JSON" Values
+
+A database file can now provide a "relaxed JSON" value for a database field
+value or an info tag. Only a few field types can currently accept such values,
+but the capability is now available for use in other places in the future.
+When writing to a JSON-capable field at run-time however, only strictly
+compliant JSON may be used (the dbStaticLib parser rewrites relaxed JSON
+values into strict JSON before passing them to the datase for interpretation,
+where the strict rules must be followed).
+
+"Relaxed JSON" was developed to maximize compatibility with the previous
+database parser rules and reduce the number of double-quotes that would be
+needed for strict JSON syntax. The parser does accept strict JSON too though,
+which should be used when machine-generating database files. The differences
+are:
+
+ * Strings containing only the characters `a-z A-Z 0-9 _ - + .` do not have to
+be enclosed in double-quote characters.
+
+ * The above rule applies to map keys as well as to regular string values.
+
+ * The JSON keywords `null`, `true` and `false` (all lower-case) will be
+recognized as keywords, so they must be quoted to use any of these single words
+as a string.
+
+ * Comments may be used, introduced as usual by the `#` character and extending
+to the end of the line.
+
+A JSON field or info value is only enclosed in quotes when the value being
+provided is a single string, and even here the quotes can be omitted in some
+cases as described above. The following shows both correct and incorrect
+excerpts from a database file:
+
+ record(ai, math:pi) {
+ field(INP, {const: 3.14159265358979}) # Correct
+ field(SIOL, "{const: 3.142857}") # Wrong
+
+ info(autosave, { # White-space and comments are allowed
+ fields:[DESC, SIMM],
+ pass0:[VAL]
+ }) # Correct
+ }
+
+Note that the record, field and info-tag names do *not* accept JSON values, so
+they follows the older bareword rules for quoting where the colon `:` and
+several additional characters are legal in a bareword string. Only the value
+(after the comma) is parsed as JSON. The autosave module has not been modified
+to accept JSON syntax, the above is only an example of how JSON might be used.
+
+### Echoless comments in iocsh
+
+The way comments are parsed by the iocsh interpreter has changed. The
+interpreter can be selectively disabled from echoing comments coming from a
+script by starting those lines with `#-` rather than just `#`.
+
+### Typed record support methods
+
+The table of record support functions (rset methods for short) no longer has
+entries of type `RECSUPFUN` (which says: any number and type of arguments).
+Instead, rset methods are now typed by default. The `RECSUPFUN` typedef has
+been deprecated and casts to it as well as using the untyped `struct rset`
+will create compilation warnings.
+
+Existing code (e.g. external record supports) will generate such warnings when
+compiled against this version of Base, but it will work without changes.
+
+For a conversion period, the new typed rset definitions are activated by
+defining `USE_TYPED_RSET`, preferably by setting `USR_CPPFLAGS +=
+-DUSE_TYPED_RSET` inside a Makefile. After activating the new typed rset in
+this way and making the following changes, the result should still compile and
+work properly against older versions of Base.
+
+The first parameter of `init_record` and `process` has been changed to `struct
+dbCommon *`. Record types that use `void*` here should be changed to use
+`struct dbCommon*`, and cast the argument to their own `xxxRecord *`.
+
+When compiled against this release, compiler warnings about incompatible types
+for the method pointers should be taken seriously. When compiled against older
+versions of base, such warnings are unavoidable.
+
+Record types written in C++ need to take more drastic measures because of the
+stricter type checking in C++. To remain compatible with older versions of
+base you will need to use something like:
+
+ #include "epicsVersion.h"
+ #ifdef VERSION_INT
+ # if EPICS_VERSION_INT < VERSION_INT(3,16,0,2)
+ # define RECSUPFUN_CAST (RECSUPFUN)
+ # else
+ # define RECSUPFUN_CAST
+ # endif
+ #else
+ # define RECSUPFUN_CAST (RECSUPFUN)
+ #endif
+
+and then replace `(RECSUPFUN)` with `RECSUPFUN_CAST` when initializing the
+rset. Further changes might also be needed, e.g. to adapt `const`-ness of
+method parameters.
+
+
+## Changes made between 3.15.3 and 3.16.0.1
+
+### Build support for CapFast and dbst removed
+
+The build rules associated with the CapFast-related tools `sch2edif` and
+`e2db` and the database optimization tool `dbst` have been removed, along with
+the `DB_OPT` build configuration variable.
+
+### compressRecord buffering order
+
+The compressRecord has a new field `BALG` which can select between FIFO
+(append) and LIFO (prepend) ordering for insertion of new elements. FIFO
+ordering is the default, matching the behviour of previous versions.
+
+### Valgrind Instrumentation
+
+Valgrind is a software debugging suite provided by many Linux distributions.
+The header valgrind/valgrind.h is now included in, and installed by, Base.
+When included by a C or C++ source file this header defines some macros which
+expand to provide hints to the Valgrind runtime. These have no effect on
+normal operation of the software, but when run using the valgrind tool they
+can help to find memory leaks and buffer overflows. Suitable hints have been
+added to several free-lists within libCom, including freeListLib, allowing
+valgrind to provide more accurate information about the source of potential
+leaks.
+
+valgrind.h automatically disables itself when the build target is not
+supported by the valgrind tool. It can also explicitly be disabled by defining
+the macro `NVALGRIND`. See `src/libCom/Makefile` for a commented-out example.
+
+As a matter of policy valgrind.h will never be included by any header file
+installed by Base, so its use will remain purely an implementation detail
+hidden from application software. Support modules which choose to use
+valgrind.h are advised to do likewise.
+
+### Database Multi-locking
+
+The IOC record locking code has been re-written with an expanded API; global
+locks are no longer required by the IOC database implementation.
+
+The new API functions center around dbScanLockMany(), which behaves like
+dbScanLock() applied to an arbitrary group of records. dbLockerAlloc() is used
+to prepare a list or record pointers, then dbScanLockMany() is called. When it
+returns, all of the records listed may be accessed (in any order) until
+dbScanUnlockMany() is called.
+
+The Application Developer's Guide has been updated to describe the API and
+implementation is more detail.
+
+Previously a global mutex `lockSetModifyLock` was locked and unlocked during
+dbScanLock(), acting as a sequencing point for otherwise unrelated calls. The
+new dbLock.c implementation does not include any global mutex in dbScanLock()
+or dbScanLockMany(). Locking and unlocking of unrelated lock sets is now
+completely concurrent.
+
+### Generate Version Header
+
+A Perl script and Makefile rules have been added to allow modules to generate
+a C header file with a macro defined with an automatically updated identifier.
+This is a VCS revision ID (Darcs, Git, Mercurial, Subversion, and Bazaar are
+supported) or the date/time of the build if no VCS system is in use.
+
+The makeBaseApp example template has been updated with a new device support
+which makes this identifier visible via a lsi (long string input) record.
+
+### epicsTime API return status
+
+The epicsTime routines that used to return epicsTimeERROR now return a
+specific `S_time_` status value, allowing the caller to discover the reason for
+any failure. The identifier `epicsTimeERROR` is no longer defined, so any
+references to it in source code will no longer compile. The identifier
+epicsTimeOK still exists and has the value 0 as before, so most code that uses
+these APIs can be changed in a way that is backwards-compatible with the
+previous return status.
+
+Time providers that have to return a status value and still need to be built
+with earlier versions of Base can define the necessary status symbols like
+this:
+
+ #include "epicsTime.h"
+
+ #ifndef M_time
+ /* S_time_... status values were not provided before Base 3.16 */
+ #define S_time_unsynchronized epicsTimeERROR
+ #define S_time_...whatever... epicsTimeERROR
+ #endif
+
+### Refactoring of epicsReadline
+
+The epicsReadline code has been reorganized to allow the commandline history
+editor to be disabled at runtime. The `EPICS_COMMANDLINE_LIBRARY` build setting
+still selects the preferred editor, but the new `IOCSH_HISTEDIT_DISABLE`
+environment variable can be set at runtime to disable history editing and make
+the IOC or other program use the basic editor instead. This is useful when
+starting and controlling an IOC from another program through its stdin and
+stdout streams since history editors often insert invisible escape codes into
+the stdout stream, making it hard to parse.
+
+### Callback subsystem API
+
+Added a new macro `callbackGetPriority(prio, callback)` to the callback.h
+header and removed the need for dbScan.c to reach into the internals of its
+CALLBACK objects.
+
+## Changes from the 3.15 branch since 3.15.6
+
+### GNU Readline detection on Linux
+
+Most Linux architectures should now configure themselves automatically to use
+the GNU Readline library if its main header file can be found in the expected
+place, and not try to use Readline if the header file isn't present. For older
+Linux architectures where libncurses or libcurses must also be linked with, the
+manual configuration of the `COMMANDLINE_LIBRARY` variable in the appropriate
+`configure/os/CONFIG_SITE.Common.` file will still be necessary.
+
+### Replace `EPICS_TIMEZONE` with `EPICS_TZ`
+
+The `EPICS_TIMEZONE` environment parameter provided time-zone information for
+the IOC's locale in the old ANSI format expected by VxWorks for its `TIMEZONE`
+environment variable, and can also used by RTEMS to set its `TZ` environment
+variable. However the `TIMEZONE` value has to be updated every year since it
+contains the exact dates of the daylight-savings time changes. The Posix TZ
+format that RTEMS uses contains rules that for calculating those dates, thus its
+value would only need updating if the rules (or the locale) are changed.
+
+This release contains changes that replace the `EPICS_TIMEZONE` environment
+parameter with one called `EPICS_TZ` and a routine for VxWorks that calculates
+the `TIMEZONE` environment variable from the current `TZ` value. This routine
+will be run once at start-up, when the EPICS clock has synchronized to its NTP
+server. The calculations it contains were worked out and donated to EPICS by
+Larry Hoff in 2009; it is unforunate that it has taken 10 years for them to be
+integrated into Base.
+
+The default value for the `EPICS_TZ` environment parameter is set in the Base
+`configure/CONFIG_SITE_ENV` file, which contains example settings for most EPICS
+sites that use VxWorks, and a link to a page describing the Posix TZ format for
+any locations that I missed.
+
+If a VxWorks IOC runs continuously without being rebooted from December 31st to
+the start of daylight savings time the following year, its `TIMEZONE` value will
+be wrong as it was calculated for the previous year. This only affects times
+that are converted to a string on the IOC however and is easily fixed; just run
+the command `tz2timezone()` on the VxWorks shell and the calculation will be
+redone for the current year. IOCs that get rebooted at least once before the
+start of summer time will not need this to be done.
+
+### Added new decimation channel filter
+
+A new server-side filter has been added to the IOC for reducing the number
+and frequency of monitor updates from a channel by a client-specified factor.
+The filter's behaviour is quite simplistic, it passes the first monitor event it
+sees to the client and then drops the next N-1 events before passing another
+event. For example to sample a 60Hz channel at 1Hz, a 10Hz channel every 6
+seconds, or a 1Hz channel once every minute:
+
+```
+ Hal$ camonitor 'test:channel.{"dec":{"n":60}}'
+ ...
+```
+
+More information is included in the filters documentation, which can be found
+[here](filters.html) or [here](../html/filters.html) depending on where you're
+reading this document from.
+
+### Imported Record Reference Documentation from Wiki
+
+The remaining record types that had 3.14 reference documentation in the EPICS
+Wiki have had that documentation converted and imported into their DBD files.
+The preferred form for future updates to the record type descriptions is now an
+emailed patch file, a Pull Request through GitHub, or a Merge Request through
+Launchpad. Note that in some cases the behavior of a record type in a 7.0.x
+release may differ from that of the same record type in a 3.15 release, although
+this would be unusual, so it may be important to indicate the branch that your
+changes apply to.
+
+**NOTE:** *These documentation changes may have modified the order of the fields
+in some record definitions, in which case this release will not be compatible
+with record or device support binaries that were compiled against an earlier
+release.*
+
+### `make test-results` for Windows
+
+The make target `test-results` should now work properly on Windows. Some Perl
+installations used versions of `prove.bat` that would only display the results of
+up to 3 tests or didn't return an error status in the event of tests failing. The
+build system now calls its own perl script to summarize the results instead of
+passing a list of TAP filenames to `prove`.
+
+### Add option to avoid CALLBACK conflict
+
+If a macro `EPICS_NO_CALLBACK` is defined, then callback.h will no longer
+(re)define CALLBACK. The name `CALLBACK` is used by the WIN32 API, and
+redefinition in callback.h cause errors if some windows headers are later
+included.
+
+Code which defines `EPICS_NO_CALLBACK`, but still wishes to use callbacks,
+should use the alternate name `epicsCallback` introduced in 3.15.6, 3.16.2, and
+7.0.2. It is also possible, though not encouraged, to use `struct callbackPvt`
+which has been present since the callback API was introduced.
+
+### Cleaning up with Multiple CA contexts in a Process
+
+Bruno Martins reported a problem with the CA client library at shutdown in a
+process that uses multiple CA client contexts. The first context that triggers
+the CA client exit handler prevents any others from being able to clean up
+because it resets the ID of an internal epicsThreadPrivate variable which is
+shared by all clients. This action has been removed from the client library,
+which makes cleanup of clients like this possible.
+
+### Perl CA bindings fixed for macOS Mojave
+
+Apple removed some Perl header files from macOS Mojave that were available
+in their SDK, requiring a change to the include paths used when compiling the
+CA bindings. The new version should build on new and older macOS versions, and
+these changes may also help other targets that have an incomplete installation
+of Perl (the build will continue after printing a warning that the Perl CA
+bindings could not be built).
+
+### Routine `epicsTempName()` removed from libCom
+
+This routine was a simple wrapper around the C89 function `tmpnam()`
+which is now seen as unsafe and causes warning messages to be generated by
+most modern compilers. The two internal uses of this function have been
+modified to call `epicsTempFile()` instead. We were unable to find any
+published code that used this function, so it was removed immediately instead
+of being deprecated.
+
+### DBD Parsing of Record Types
+
+The Perl DBD file parser has been made slightly more liberal; the order in
+which DBD files must be parsed is now more flexible, so that a record type
+definition can now be parsed after a device support that referred to that
+record type. A warning message will be displayed when the device support is
+seen, but the subsequent loading of the record type will be accepted without
+triggering an error. See
+[Launchpad bug 1801145](https://bugs.launchpad.net/epics-base/+bug/1801145).
+
+### menuScan and several record types documented with POD
+
+The EPICS Wiki pages describing a number of standard record types has been
+converted into the Perl POD documentation format and added to the DBD files,
+so at build-time an HTML version of these documents is generated and installed
+into the htmls directory. Thanks to Tony Pietryla.
+
+### CA client tools learned `-V` option
+
+This displays the version numbers of EPICS Base and the CA protocol.
+
+## Changes made between 3.15.5 and 3.15.6
+
+### Unsetting environment variables
+
+The new command `epicsEnvUnset varname` can be used to
+unset an environment variable.
+
+### Warning indicators in msi (and macLib) output
+
+The libCom macro expansion library has been modified so that when the
+`SUPPRESS_WARNINGS` flag is set it will no longer include any `,undefined`
+or `,recursive` indicators in its output when undefined or recursive
+macros are encountered. These indicators were harmless when the output was fed
+into an IOC along with a definition for the macro, but when the `msi`
+tool was used to generate other kinds of files they caused problems. If the
+`msi -V` flag is used the markers will still be present in the output
+whenever the appropriate condition is seen.
+
+### Improvements to msi
+
+In addition to fixing its response to discovering parsing errors in its
+substitution input file (reported as Launchpad
+[bug 1503661](https://bugs.launchpad.net/epics-base/+bug/1503661))
+so it now deletes the incomplete output file, the msi program has been cleaned
+up a little bit internally.
+
+### All array records now post monitors on their array-length fields
+
+The waveform record has been posting monitors on its NORD field since Base
+3.15.0.1; we finally got around to doing the equivalent in all the other
+built-in record types, which even required modifying device support in some
+cases. This fixes
+[Launchpad bug 1730727](https://bugs.launchpad.net/epics-base/+bug/1730727).
+
+### HOWTO: Converting Wiki Record Reference to POD
+
+Some documentation has been added to the `dbdToHtml.pl` script
+explaining how Perl POD (Plain Old Documentation) markup can be added to
+`.dbd` files to generate HTML documentation for the record types. To see
+these instructions, run `perl bin//dbdToHtml.pl -H`
+or `perldoc bin//dbdToHtml.pl`.
+
+### Fix problem with numeric soft events
+
+Changing from numeric to named soft events introduced an incompatibility
+when a numeric event 1-255 is converted from a DOUBLE, e.g. from a calc record.
+The `post_event()` API is not marked deprecated any more.
+
+Also `scanpel` has been modified to accept a glob pattern for
+event name filtering and to show events with no connected records as well.
+
+### Add `osiSockOptMcastLoop_t` and osiSockTest
+
+Added a new OS-independent typedef for multicast socket options, and a test
+file to check their correct operation.
+
+### Support for `CONFIG_SITE.local` in Base
+
+This feature is mostly meant for use by developers; configuration
+settings that would normally appear in `base/configure/CONFIG_SITE` can now
+be put in a locally created `base/configure/CONFIG_SITE.local` file instead
+of having go modify or replace the original. A new `.gitignore` pattern
+tells git to ignore all `configure/*.local` files.
+
+### Fix broken `EPICS_IOC_LOG_FILE_LIMIT=0` setting
+
+The Application Developers' Guide says this is allowed and disables the
+limit on the log-file, but it hasn't actually worked for some time (if ever).
+Note that the iocLogServer will be removed from newer Base release sometime
+soon as its functionality can be implemented by other dedicated log servers
+such as logstash or syslog-ng.
+
+Fixes [lp:1786858](https://bugs.launchpad.net/bugs/1786858)
+and part of [lp:1786966](https://bugs.launchpad.net/bugs/1786966).
+
+### Cleanup of startup directory
+
+The files in the startup directory have not been maintained in recent years
+and have grown crufty (technical term). This release includes the following
+updates to these files:
+
+ - The Perl `EpicsHostArch.pl` script has been rewritten, and support
+ for a few previously missing host architectures has been added to it.
+ - The `EpicsHostArch.pl` script has also been moved into the standard
+ `src/tools` directory, from where it will be installed into
+ `lib/perl`. In this new location it is no longer executable, so it must
+ be run by the `perl` executable.
+ - The build system has been adjusted to look for `EpicsHostArch.pl` in
+ both places if the `EPICS_HOST_ARCH` environment variable has not been
+ set at build-time.
+ - Sites that used the original Perl script to set `EPICS_HOST_ARCH` as part of
+ their standard environment will need to adjust their scripts when they
+ upgrade to this release.
+ - The `EpicsHostArch` shell script has been replaced with a wrapper
+ routine that calls the Perl `EpicsHostArch.pl` script. Sites that rely on
+ this script to set `EPICS_HOST_ARCH` should consider switching to the
+ Perl script instead.
+ - The `Site.cshrc` and `Site.profile` files have been renamed to
+ `unix.csh` and `unix.sh`, respectively.
+ - The existing `win32.bat` file has been cleaned up and a new
+ `windows.bat` file added for 64-bit targets. The contents of these files
+ should be seen as examples, don't uncomment or install parts for software
+ that you don't explicitly know that you need.
+
+### Recent Apple XCode Build Issues
+
+The latest version of XCode will not compile calls to `system()` or
+`clock_settime()` for iOS targets. There were several places in Base
+where these were being compiled, although there were probably never called. The
+code has now been modified to permit iOS builds to complete again.
+
+### Prevent illegal alarm severities
+
+A check has been added to `recGblResetAlarms()` that prevents records
+from getting an alarm severity higher than `INVALID_ALARM`. It is still possible
+for a field like HSV to get set to a value that is not a legal alarm severity,
+but the core IOC code should never copy such a value into a record's SEVR or
+ACKS fields. With this fix the record's alarm severity will be limited to
+`INVALID_ALARM`.
+
+### Fixes for Launchpad bugs
+
+The following launchpad bugs have fixes included:
+
+ - [lp: 1786320](https://bugs.launchpad.net/epics-base/+bug/1786320), dbCa
+ subscribes twice to ENUM
+ - [lp: 541221](https://bugs.launchpad.net/epics-base/+bug/541221),
+ `assert (pca->pgetNative)` failed in ../dbCa.c
+ - [lp: 1747091](https://bugs.launchpad.net/epics-base/+bug/1747091),
+ epicsTimeGetEvent() / generalTime bug
+ - [lp: 1743076](https://bugs.launchpad.net/epics-base/+bug/1743076), Segfault
+ in `ca_attach_context()` during exits
+ - [lp: 1751380](https://bugs.launchpad.net/epics-base/+bug/1751380), Deadlock
+ in `ca_clear_subscription()`
+ - [lp: 1597809](https://bugs.launchpad.net/epics-base/+bug/1597809), Setting
+ NAME field in DB file may break IOC
+ - [lp: 1770292](https://bugs.launchpad.net/epics-base/+bug/1770292),
+ `get_alarm_double()` inconsistent across record types
+ - [lp: 1771298](https://bugs.launchpad.net/epics-base/+bug/1771298),
+ Conversion of NaN to integer relies on undefined behavior
+
+### Updated VxWorks Timezone settings
+
+Removed the settings for 2017; fixed the hour of the change for MET.
+
+### Fixed camonitor server side relative timestamps bug
+
+Initialize the first time-stamp from the first monitor, not the client-side
+current time in this configuration.
+
+### Build changes for MSVC
+
+Windows builds using Visual Studio 2015 and later now use the `-FS`
+compiler option to allow parallel builds to work properly.
+
+We now give the `-FC` option to tell the compiler to print absolute
+paths for source files in diagnostic messages.
+
+### Extend maximum Posix epicsEventWaitWithTimeout() delay
+
+The Posix implementation of epicsEventWaitWithTimeout() was limiting the
+timeout delay to at most 60 minutes (3600.0 seconds). This has been changed to
+10 years; significantly longer maximum delays cause problems on systems where
+`time_t` is still a signed 32-bit integer so cannot represent absolute
+time-stamps after 2038-01-19. Our assumption is that such 32-bit systems will
+have been retired before the year 2028, but some additional tests have been
+added to the epicsTimeTest program to detect and fail if this assumption is
+violated.
+
+### New test-related make targets
+
+This release adds several new make targets intended for use by developers
+and Continuous Integration systems which simplify the task of running the
+built-in self-test programs and viewing the results. Since these targets are
+intended for limited use they can have requirements for the build host which
+go beyond the standard minimum set needed to build and run Base.
+
+#### `test-results` - Summarize test results
+
+The new make target `test-results` will run the self-tests if
+necessary to generate a TAP file for each test, then summarizes the TAP output
+files in each test directory in turn, displaying the details of any failures.
+This step uses the program `prove` which comes with Perl, but also needs
+`cat` to be provided in the default search path so will not work on most
+Windows systems.
+
+#### `junitfiles` - Convert test results to JUnit XML Format
+
+The new make target `junitfiles` will run the self-tests if necessary
+and then convert the TAP output files into the more commonly-supported JUnit
+XML format. The program that performs this conversion needs the Perl module
+`XML::Generator` to have been installed.
+
+#### `clean-tests` - Delete test result files
+
+The new make target `clean-tests` removes any test result files from
+previous test runs. It cleans both TAP and JUnit XML files.
+
+### Fix DNS related crash on exit
+
+The attempt to fix DNS related delays for short lived CLI programs (eg. caget)
+in lp:1527636 introduced a bug which cased these short lived clients to crash on
+exit. This bug should now be fixed.
+
+### Server bind issue on Windows
+
+When a National Instruments network variables CA server is already running on
+a Windows system and an IOC or PCAS server is started, the IOC's attempt to
+bind a TCP socket to the CA server port number fails, but Windows returns a
+different error status value than the IOC is expecting in that circumstance
+(because the National Instruments code requests exclusive use of that port,
+unlike the EPICS code) so the IOC fails to start properly. The relevent EPICS
+bind() checks have now been updated so the IOC will request that a dynamic port
+number be allocated for this TCP socket instead when this happens.
+
+### Checking Periodic Scan Rates
+
+Code has been added to the IOC startup to better protect it against bad
+periodic scan rates, including against locales where `.` is not
+accepted as a decimal separator character. If the scan period in a menuScan
+choice string cannot be parsed, the associated periodic scan thread will no
+longer be started by the IOC and a warning message will be displayed at iocInit
+time. The `scanppl` command will also flag the faulty menuScan value.
+
+## Changes made between 3.15.4 and 3.15.5
+
+### dbStatic Library Speedup and Cleanup
+
+Loading of database files has been optimized to avoid over-proportionally
+long loading times for large databases. As a part of this, the alphabetical
+ordering of records instances (within a record type) has been dropped. In the
+unexpected case that applications were relying on the alphabetic order, setting
+`dbRecordsAbcSorted = 1` before loading the databases will retain the
+old behavior.
+
+The routine `dbRenameRecord()` has been removed, as it was intended
+to be used by database configuration tools linked against a host side version
+of the dbStatic library that is not being built anymore.
+
+### Launchpad Bug-fixes
+
+In addition to the more detailed change descriptions below, the following
+Launchpad bugs have also been fixed in this release:
+
+ - [lp:1440186](https://bugs.launchpad.net/epics-base/+bug/1440186) Crash due
+ to a too small buffer being provided in dbContextReadNotifyCache
+ - [lp:1479316](https://bugs.launchpad.net/epics-base/+bug/1479316) Some data
+ races found using Helgrind
+ - [lp:1495833](https://bugs.launchpad.net/epics-base/+bug/1495833) biRecord
+ prompt groups are nonsensical
+ - [lp:1606848](https://bugs.launchpad.net/epics-base/+bug/1606848) WSAIoctl
+ `SIO_GET_INTERFACE_LIST` failed in Windows
+
+### Whole-Program Optimization for MS Visual Studio Targets
+
+When using the Microsoft compilers a new build system variable is provided that
+controls whether whole program optimization is used or not. For static builds
+using Visual Studio 2010 this optimization must be disabled. This is controlled
+in the files `configure/os/CONFIG_SITE.Common.windows-x64-static` and
+`configure/os/CONFIG_SITE.Common.win32-x86-static` by setting the variable
+`OPT_WHOLE_PROGRAM=NO` to override the default value `YES` that would otherwise
+be used.
+
+Note that enabling this optimization slows down the build process. It is not
+possible to selectively disable this optimization, when building a particular
+module say; Microsoft's linker will restart itself automatically with the
+`-LTCG` flag set and display a warning if it is asked to link any object
+files that were compiled with the `-GL` flag.
+
+### Add dynamic (variable length) array support to PCAS
+
+Dynamic array sizing support was added to the IOC server (RSRV) in the
+Base-3.14.12 release, but has not until now been supported in the Portable
+Channel Access Server (PCAS). Channel Access server applications using the
+PCAS may not need to be modified at all; if they already push monitors with
+different gdd array lengths, those variable sizes will be forwarded to any CA
+clients who have requested variable length updates. The example CAS server
+application has been modified to demonstrate this feature.
+
+In implementing the above, the gdd method `gdd::put(const gdd *)` now
+copies the full-sized array from the source gdd if the destination gdd is of
+type array, has no allocated memory and a boundary size of 0.
+
+### Additional epicsTime conversion
+
+The EPICS timestamp library (epicsTime) inside libCom's OSI layer has
+been extended by routines that convert from `struct tm` to the EPICS
+internal `epicsTime` type, assuming UTC - i.e. without going through
+the timezone mechanism. This solves issues with converting from the structured
+type to the EPICS timestamp at driver level from multiple threads at a high
+repetition rate, where the timezone mechanism was blocking on file access.
+
+### MinGW Cross-builds from Linux
+
+The build configuration files that allow cross-building of the 32-bit
+win32-x86-mingw cross-target have been adjusted to default to building shared
+libraries (DLLs) as this is now supported by recent MinGW compilers. The 64-bit
+windows-x64-mingw cross-target was already being built that way by default. The
+configuration options to tell the minGW cross-compiler to link programs with
+static versions of the compiler support libraries have now been moved into the
+`CONFIG_SITE.linux-x86.` files.
+
+### General Time updates
+
+The `iocInit` code now performs a sanity check of the current time
+returned by the generalTime subsystem and will print a warning if the wall-clock
+time returned has not been initialized yet. This is just a warning message; when
+a time provider does synchonize the IOC will subsequently pick up and use the
+correct time. This check code also primes the registered event system provider
+if there is one so the `epicsTimeGetEventInt()` routine will work on IOCs
+that ask for event time within an interrupt service routine.
+
+The osiClockTime provider's synchronization thread (which is only used on
+some embedded targets) will now poll the other time providers at 1Hz until the
+first time it manages to get a successful timestamp, after which it will poll
+for updates every 60 seconds as before.
+
+The routine `generalTimeGetExceptPriority()` was designed for use by
+backup (lower priority) time providers like the osiClockTime provider which do
+not have their own absolute time reference and rely on other providers for an
+absolute time source. This routine no longer implements the ratchet mechanism
+that prevented the time it returned from going backwards. If the backup clock's
+tick-timer runs fast the synchronization of the backup time provider would never
+allow it to be corrected backwards when the ratchet was in place. The regular
+`epicsTimeGetCurrent()` API still uses the ratchet mechanism, so this
+change will not cause the IOC to see time going backwards.
+
+### Microsoft Visual Studio builds
+
+The build configuration files for builds using the Microsoft compilers have been
+updated, although there should be no noticable difference at most sites. One
+extra compiler warning is now being suppressed for C++ code, `C4344: behavior
+change: use of explicit template arguments results in ...` which is gratuitous
+and was appearing frequently in builds of the EPICS V4 modules.
+
+Cross-builds of the windows-x64 target from a win32-x86 host have been
+removed as they don't actually work within the context of a single `make`
+run. Significant changes to the build configuration files would be necessary for
+these kinds of cross-builds to work properly, which could be done if someone
+needs them (email Andrew Johnson before working on this, and see
+[this stack-overflow answer](http://stackoverflow.com/questions/5807647/how-do-you-compile-32-bit-and-64-bit-applications-at-the-same-time-in-visual-stu) for a starting point).
+
+### Bazaar keywords such as 'Revision-Id' removed
+
+In preparation for moving to git in place of the Bazaar revision control
+system we have removed all the keywords from the Base source code.
+
+### Linux systemd service file for CA Repeater
+
+Building this version of Base on a Linux system creates a systemd service
+file suitable for starting the Channel Access Repeater under systemd. The file
+will be installed into the target bin directory, from where it can be copied
+into the appropriate systemd location and modified as necessary. Installation
+instructions are included as comments in the file.
+
+## Changes made between 3.15.3 and 3.15.4
+
+### New string input device support "getenv"
+
+A new "getenv" device support for both the stringin and lsi (long string
+input) record types can be used to read the value of an environment variable
+from the IOC at runtime. See base/db/softIocExit.db for sample usage.
+
+### Build rules and `DELAY_INSTALL_LIBS`
+
+A new order-only prerequisite build rule has been added to ensure that
+library files (and DLL stubs on Windows) get installed before linking any
+executables, which resolves parallel build problems on high-powered CPUs. There
+are some (rare) cases though where a Makefile has to build an executable and run
+it to be able to compile code for a library built by the same Makefile. With
+this new build rule GNUmake will complain about a circular dependency and the
+build will probably fail in those cases. To avoid this problem the failing
+Makefile should set `DELAY_INSTALL_LIBS = YES` before including the
+`$(TOP)/configure/RULES` file, disabling the new build rule.
+
+### IOC environment variables and build parameters
+
+The IOC now sets a number of environment variables at startup that provide the
+version of EPICS Base it was built against (`EPICS_VERSION_...`) and its build
+architecture (ARCH). In some cases this allows a single iocBoot/ioc directory to
+be used to run the same IOC on several different architectures without any
+changes.
+
+There are also 3 new environment parameters (`EPICS_BUILD_...`) available that
+C/C++ code can use to find out the target architecture, OS class and compiler
+class it was built with. These may be useful when writing interfaces to other
+languages.
+
+### New implementation of `promptgroup`/`gui_group` field property
+
+The mechanism behind the `promptgroup()` field property inside a record type
+definition has been changed. Instead of using a fixed set of choices,
+the static database access library now collects the used gui group names
+while parsing DBD information. Group names should start with a two-digit number
+plus space-dash-space to allow proper sorting of groups.
+
+The include file `guigroup.h` that defined the fixed set of choices
+has been deprecated. Instead, use the conversion functions between index number
+and group string that have been added to dbStaticLib.
+
+When a DBD file containing record-type descriptions is expanded, any
+old-style `GUI_xxx` group names will be replaced by a new-style
+string for use by the IOC. This permits an older record type to be used with
+the 3.15.4 release, although eventually record types should be converted by
+hand with better group names used.
+
+### CA server configuration changes
+
+RSRV now honors `EPICS_CAS_INTF_ADDR_LIST` and binds only to the provided list
+of network interfaces. Name searches (UDP and TCP) on other network interfaces
+are ignored. For example on a computer with interfaces 10.5.1.1/24, 10.5.2.1/24,
+and 10.5.3.1/24, setting `EPICS_CAS_INTF_ADDR_LIST='10.5.1.1 10.5.2.1'` will
+accept traffic on the .1.1 and .2.1, but ignore from .3.1
+
+RSRV now honors `EPICS_CAS_IGNORE_ADDR_LIST` and ignores UDP messages received
+from addresses in this list.
+
+Previously, CA servers (RSRV and PCAS) would build the beacon address list using
+`EPICS_CA_ADDR_LIST` if `EPICS_CAS_BEACON_ADDR_LIST` was no set. This is no
+longer done. Sites depending on this should set both environment variables to
+the same value.
+
+### IPv4 multicast for name search and beacons
+
+libca, RSRV, and PCAS may now use IPv4 multicasting for UDP traffic (name search
+and beacons). This is disabled by default. To enable multicast address(s) must
+be listed in `EPICS_CA_ADDR_LIST` for clients and `EPICS_CAS_INTF_ADDR_LIST` for
+servers (IOCs should set both). For example:
+
+ EPICS_CAS_INTF_ADDR_LIST='224.0.2.9' EPICS_CA_ADDR_LIST=224.0.2.9
+
+Please note that no IPv4 multicast address is officially assigned for Channel
+Access by IANA. The example 224.0.2.9 is taken from the AD-HOC Block I range.
+
+### Moved `mlockall()` into its own epicsThread routine
+
+Since EPICS Base 3.15.0.2 on Posix OSs the initialization of the epicsThread
+subsystem has called `mlockall()` when the OS supports it and thread
+priority scheduling is enabled. Doing so has caused problems in third-party
+applications that call the CA client library, so the functionality has been
+moved to a separate routine `epicsThreadRealtimeLock()` which will be
+called by the IOC at iocInit (unless disabled by setting the global variable
+`dbThreadRealtimeLock` to zero).
+
+### Added dbQuietMacroWarnings control
+
+When loading database files, macros get expanded even on comment lines. If a
+comment contains an undefined macro, the load still continues but an error
+message gets printed. For this release the error message has been changed to a
+warning, but even this warning can be made less verbose by setting this new
+variable to a non-zero value before loading the file, like this:
+
+```
+ var dbQuietMacroWarnings 1 iocsh
+ dbQuietMacroWarnings=1 VxWorks
+```
+
+This was [Launchpad bug
+541119](https://bugs.launchpad.net/bugs/541119).
+
+## Changes from the 3.14 branch between 3.15.3 and 3.15.4
+
+### NTP Time Provider adjusts to OS tick rate changes
+
+Dirk Zimoch provided code that allows the NTP Time provider (used on VxWorks
+and RTEMS only) to adapt to changes in the OS clock tick rate after the provider
+has been initialized. Note that changing the tick rate after iocInit() is not
+advisable, and that other software might still misbehave if initialized before
+an OS tick rate change. This change was back-ported from the 3.15 branch.
+
+### Making IOC `ca_get` operations atomic
+
+When a CA client gets data from an IOC record using a compound data type such
+as `DBR_TIME_DOUBLE` the value field is fetched from the database in a
+separate call than the other metadata, without keeping the record locked. This
+allows some other thread such as a periodic scan thread a chance to interrupt
+the get operation and process the record in between. CA monitors have always
+been atomic as long as the value data isn't a string or an array, but this race
+condition in the CA get path has now been fixed so the record will stay locked
+between the two fetch operations.
+
+This fixes
+[Launchpad bug 1581212](https://bugs.launchpad.net/epics-base/+bug/1581212),
+thanks to Till Strauman and Dehong Zhang.
+
+### New `CONFIG_SITE` variable for running self-tests
+
+The 'make runtests' and 'make tapfiles' build targets normally only run the
+self-tests for the main `EPICS_HOST_ARCH` architecture. If the host is
+able to execute self-test programs for other target architectures that are being
+built by the host, such as when building a `-debug` version of the host
+architecture for example, the names of those other architectures can be added to
+the new `CROSS_COMPILER_RUNTEST_ARCHS` variable in either the
+`configure/CONFIG_SITE` file or in an appropriate
+`configure/os/CONFIG_SITE..Common` file to have the test
+programs for those targets be run as well.
+
+### Additional RELEASE file checks
+
+An additional check has been added at build-time for the contents of the
+`configure/RELEASE` file(s), which will mostly only affect users of the Debian
+EPICS packages published by NSLS-2. Support modules may share an install path,
+but all such modules must be listed adjacent to each other in any `RELEASE`
+files that point to them. For example the following will fail the new checks:
+
+```
+ AUTOSAVE = /usr/lib/epics
+ ASYN = /home/mdavidsaver/asyn
+ EPICS_BASE = /usr/lib/epics
+```
+
+giving the compile-time error
+
+```
+ This application's RELEASE file(s) define
+ EPICS_BASE = /usr/lib/epics
+ after but not adjacent to
+ AUTOSAVE = /usr/lib/epics
+ Module definitions that share paths must be grouped together.
+ Either remove a definition, or move it to a line immediately
+ above or below the other(s).
+ Any non-module definitions belong in configure/CONFIG_SITE.
+```
+
+In many cases such as the one above the order of the `AUTOSAVE` and
+`ASYN` lines can be swapped to let the checks pass, but if the
+`AUTOSAVE` module depended on `ASYN` and hence had to appear
+before it in the list this error indicates that `AUTOSAVE` should also be
+built in its own private area; a shared copy would likely be incompatible with
+the version of `ASYN` built in the home directory.
+
+### String field buffer overflows
+
+Two buffer overflow bugs that can crash the IOC have been fixed, caused by
+initializing a string field with a value larger than the field size
+([Launchpad bug 1563191](https://bugs.launchpad.net/bugs/1563191)).
+
+### Fixed stack corruption bug in epicsThread C++ API
+
+The C++ interface to the epicsThread API could corrupt the stack on thread
+exit in some rare circumstances, usually at program exit. This bug has been
+fixed ([Launchpad bug 1558206](https://bugs.launchpad.net/bugs/1558206)).
+
+### RTEMS NTP Support Issue
+
+On RTEMS the NTP Time Provider could in some circumstances get out of sync
+with the server because the `osdNTPGet()` code wasn't clearing its input socket
+before sending out a new request. This
+([Launchpad bug 1549908](https://bugs.launchpad.net/bugs/1549908))
+has now been fixed.
+
+### CALC engine bitwise operator fixes
+
+The bitwise operators in the CALC engine have been modified to work properly
+with values that have bit 31 (0x80000000) set. This modification involved
+back-porting some earlier changes from the 3.15 branch, and fixes
+[Launchpad bug 1514520](https://code.launchpad.net/bugs/1514520).
+
+### Fix `ipAddrToAsciiAsync()`: Don't try to join the daemon thread
+
+On process exit, don't try to stop the worker thread that makes DNS lookups
+asynchronous. Previously this would wait for any lookups still in progress,
+delaying the exit unnecessarily. This was most obvious with catools (eg.
+cainfo).
+[lp:1527636](https://bugs.launchpad.net/bugs/1527636)
+
+### Fix `epicsTime_localtime()` on Windows
+
+Simpler versions of the `epicsTime_gmtime()` and `epicsTime_localtime()`
+routines have been included in the Windows implementations, and a new test
+program added. The original versions do not report DST status properly. Fixes
+[Launchpad bug 1528284](https://bugs.launchpad.net/bugs/1528284).
+
diff --git a/modules/ca/src/client/caRepeater.cpp b/modules/ca/src/client/caRepeater.cpp
index 9879af2b4..03cb8957d 100644
--- a/modules/ca/src/client/caRepeater.cpp
+++ b/modules/ca/src/client/caRepeater.cpp
@@ -32,10 +32,12 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include "epicsAssert.h"
+#include "osiUnistd.h"
#include "udpiiu.h"
int main()
{
+ chdir ( "/" );
ca_repeater ();
return ( 0 );
}
diff --git a/modules/database/src/ioc/db/dbEvent.c b/modules/database/src/ioc/db/dbEvent.c
index 5e0f4db7c..0d96e12e5 100644
--- a/modules/database/src/ioc/db/dbEvent.c
+++ b/modules/database/src/ioc/db/dbEvent.c
@@ -1154,3 +1154,8 @@ void db_delete_field_log (db_field_log *pfl)
freeListFree(dbevFieldLogFreeList, pfl);
}
}
+
+int db_available_logs(void)
+{
+ return (int) freeListItemsAvail(dbevFieldLogFreeList);
+}
diff --git a/modules/database/src/ioc/db/dbEvent.h b/modules/database/src/ioc/db/dbEvent.h
index 8ee109373..374e84996 100644
--- a/modules/database/src/ioc/db/dbEvent.h
+++ b/modules/database/src/ioc/db/dbEvent.h
@@ -82,6 +82,7 @@ epicsShareFunc void db_event_disable (dbEventSubscription es);
epicsShareFunc struct db_field_log* db_create_event_log (struct evSubscrip *pevent);
epicsShareFunc struct db_field_log* db_create_read_log (struct dbChannel *chan);
epicsShareFunc void db_delete_field_log (struct db_field_log *pfl);
+epicsShareFunc int db_available_logs(void);
#define DB_EVENT_OK 0
#define DB_EVENT_ERROR (-1)
@@ -91,4 +92,3 @@ epicsShareFunc void db_delete_field_log (struct db_field_log *pfl);
#endif
#endif /*INCLdbEventh*/
-
diff --git a/modules/database/src/ioc/db/menuIvoa.dbd b/modules/database/src/ioc/db/menuIvoa.dbd.pod
similarity index 63%
rename from modules/database/src/ioc/db/menuIvoa.dbd
rename to modules/database/src/ioc/db/menuIvoa.dbd.pod
index b1b3ce51f..8ea2c7a7d 100644
--- a/modules/database/src/ioc/db/menuIvoa.dbd
+++ b/modules/database/src/ioc/db/menuIvoa.dbd.pod
@@ -3,10 +3,19 @@
# National Laboratory.
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
-# EPICS BASE Versions 3.13.7
-# and higher are distributed subject to a Software License Agreement found
-# in file LICENSE that is included with this distribution.
+# EPICS BASE is distributed subject to a Software License Agreement found
+# in file LICENSE that is included with this distribution.
#*************************************************************************
+
+=head1 Menu menuIvoa
+
+This menu specifies the possibile actions to take when the INVALID alarm is
+triggered. See individual record types for more information.
+
+=menu menuIvoa
+
+=cut
+
menu(menuIvoa) {
choice(menuIvoaContinue_normally,"Continue normally")
choice(menuIvoaDon_t_drive_outputs,"Don't drive outputs")
diff --git a/modules/database/src/ioc/db/menuOmsl.dbd b/modules/database/src/ioc/db/menuOmsl.dbd
deleted file mode 100644
index 3022437dc..000000000
--- a/modules/database/src/ioc/db/menuOmsl.dbd
+++ /dev/null
@@ -1,13 +0,0 @@
-#*************************************************************************
-# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
-# National Laboratory.
-# Copyright (c) 2002 The Regents of the University of California, as
-# Operator of Los Alamos National Laboratory.
-# EPICS BASE Versions 3.13.7
-# and higher are distributed subject to a Software License Agreement found
-# in file LICENSE that is included with this distribution.
-#*************************************************************************
-menu(menuOmsl) {
- choice(menuOmslsupervisory,"supervisory")
- choice(menuOmslclosed_loop,"closed_loop")
-}
diff --git a/modules/database/src/std/rec/stateRecord.dbd b/modules/database/src/ioc/db/menuOmsl.dbd.pod
similarity index 50%
rename from modules/database/src/std/rec/stateRecord.dbd
rename to modules/database/src/ioc/db/menuOmsl.dbd.pod
index 6e43ddbba..833f44354 100644
--- a/modules/database/src/std/rec/stateRecord.dbd
+++ b/modules/database/src/ioc/db/menuOmsl.dbd.pod
@@ -6,19 +6,20 @@
# EPICS BASE is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
#*************************************************************************
-recordtype(state) {
- include "dbCommon.dbd"
- field(VAL,DBF_STRING) {
- prompt("Value")
- promptgroup("40 - Input")
- asl(ASL0)
- pp(TRUE)
- size(20)
- }
- field(OVAL,DBF_STRING) {
- prompt("Prev Value")
- special(SPC_NOMOD)
- interest(3)
- size(20)
- }
+
+=head1 Menu menuOmsl
+
+This menu is used for the C field of many output record types. It controls
+whether the record will fetch an input value from its C input link when
+processed, which is useful when it is part of a closed loop control algorithm.
+The C state means the input link will not be used, C
+enables the input link.
+
+=menu menuOmsl
+
+=cut
+
+menu(menuOmsl) {
+ choice(menuOmslsupervisory,"supervisory")
+ choice(menuOmslclosed_loop,"closed_loop")
}
diff --git a/modules/database/src/ioc/db/menuYesNo.dbd b/modules/database/src/ioc/db/menuYesNo.dbd
deleted file mode 100644
index 2d09dd65a..000000000
--- a/modules/database/src/ioc/db/menuYesNo.dbd
+++ /dev/null
@@ -1,13 +0,0 @@
-#*************************************************************************
-# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
-# National Laboratory.
-# Copyright (c) 2002 The Regents of the University of California, as
-# Operator of Los Alamos National Laboratory.
-# EPICS BASE Versions 3.13.7
-# and higher are distributed subject to a Software License Agreement found
-# in file LICENSE that is included with this distribution.
-#*************************************************************************
-menu(menuYesNo) {
- choice(menuYesNoNO,"NO")
- choice(menuYesNoYES,"YES")
-}
diff --git a/modules/database/src/ioc/db/menuYesNo.dbd.pod b/modules/database/src/ioc/db/menuYesNo.dbd.pod
new file mode 100644
index 000000000..d4237e7b8
--- /dev/null
+++ b/modules/database/src/ioc/db/menuYesNo.dbd.pod
@@ -0,0 +1,29 @@
+#*************************************************************************
+# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
+# National Laboratory.
+# Copyright (c) 2002 The Regents of the University of California, as
+# Operator of Los Alamos National Laboratory.
+# EPICS BASE is distributed subject to a Software License Agreement found
+# in file LICENSE that is included with this distribution.
+#*************************************************************************
+
+=head1 Menu menuYesNo
+
+This menu is used by many record types to specify simple C or C
+options for record-specific purposes.
+
+Note that no other values for a field that uses menuYesNo are possible, e.g.
+C or C would not be accepted as choices for the field.
+Also, the choices C, C, and C are not valid choices since they
+don't match the case of C or C.
+The integer values C<0> and C<1> may often be used instead however, they are
+used as an index into the choices so C<0> becomes C and C<1> becomes .
+
+=menu menuYesNo
+
+=cut
+
+menu(menuYesNo) {
+ choice(menuYesNoNO,"NO")
+ choice(menuYesNoYES,"YES")
+}
diff --git a/modules/database/src/std/filters/Makefile b/modules/database/src/std/filters/Makefile
index 6b4dc7917..ee6a0ae68 100644
--- a/modules/database/src/std/filters/Makefile
+++ b/modules/database/src/std/filters/Makefile
@@ -15,6 +15,7 @@ dbRecStd_SRCS += ts.c
dbRecStd_SRCS += dbnd.c
dbRecStd_SRCS += arr.c
dbRecStd_SRCS += sync.c
+dbRecStd_SRCS += decimate.c
HTMLS += filters.html
diff --git a/modules/database/src/std/filters/decimate.c b/modules/database/src/std/filters/decimate.c
new file mode 100644
index 000000000..502422f55
--- /dev/null
+++ b/modules/database/src/std/filters/decimate.c
@@ -0,0 +1,117 @@
+/*************************************************************************\
+* Copyright (c) 2019 UChicago Argonne LLC, as Operator of Argonne
+* National Laboratory.
+* Copyright (c) 2010 Brookhaven National Laboratory.
+* Copyright (c) 2010 Helmholtz-Zentrum Berlin
+* fuer Materialien und Energie GmbH.
+* EPICS BASE is distributed subject to a Software License Agreement found
+* in file LICENSE that is included with this distribution.
+\*************************************************************************/
+
+/*
+ * Authors: Ralph Lange ,
+ * Andrew Johnson
+ */
+
+#include
+
+#include "freeList.h"
+#include "db_field_log.h"
+#include "chfPlugin.h"
+#include "epicsExport.h"
+
+typedef struct myStruct {
+ epicsInt32 n, i;
+} myStruct;
+
+static void *myStructFreeList;
+
+static const
+chfPluginArgDef opts[] = {
+ chfInt32(myStruct, n, "n", 1, 0),
+ chfPluginArgEnd
+};
+
+static void * allocPvt(void)
+{
+ myStruct *my = (myStruct*) freeListCalloc(myStructFreeList);
+ return (void *) my;
+}
+
+static void freePvt(void *pvt)
+{
+ freeListFree(myStructFreeList, pvt);
+}
+
+static int parse_ok(void *pvt)
+{
+ myStruct *my = (myStruct*) pvt;
+
+ if (my->n < 1)
+ return -1;
+
+ return 0;
+}
+
+static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
+ db_field_log *passfl = NULL;
+ myStruct *my = (myStruct*) pvt;
+ epicsInt32 i = my->i;
+
+ if (pfl->ctx == dbfl_context_read)
+ return pfl;
+
+ if (i++ == 0)
+ passfl = pfl;
+ else
+ db_delete_field_log(pfl);
+
+ if (i >= my->n)
+ i = 0;
+
+ my->i = i;
+ return passfl;
+}
+
+static void channelRegisterPre(dbChannel *chan, void *pvt,
+ chPostEventFunc **cb_out, void **arg_out, db_field_log *probe)
+{
+ *cb_out = filter;
+ *arg_out = pvt;
+}
+
+static void channel_report(dbChannel *chan, void *pvt, int level, const unsigned short indent)
+{
+ myStruct *my = (myStruct*) pvt;
+ printf("%*sDecimate (dec): n=%d, i=%d\n", indent, "",
+ my->n, my->i);
+}
+
+static chfPluginIf pif = {
+ allocPvt,
+ freePvt,
+
+ NULL, /* parse_error, */
+ parse_ok,
+
+ NULL, /* channel_open, */
+ channelRegisterPre,
+ NULL, /* channelRegisterPost, */
+ channel_report,
+ NULL /* channel_close */
+};
+
+static void decInitialize(void)
+{
+ static int firstTime = 1;
+
+ if (!firstTime) return;
+ firstTime = 0;
+
+ if (!myStructFreeList)
+ freeListInitPvt(&myStructFreeList, sizeof(myStruct), 64);
+
+ chfPluginRegister("dec", &pif, opts);
+}
+
+epicsExportRegistrar(decInitialize);
diff --git a/modules/database/src/std/filters/filters.dbd.pod b/modules/database/src/std/filters/filters.dbd.pod
index d7ab785f5..27e356f83 100644
--- a/modules/database/src/std/filters/filters.dbd.pod
+++ b/modules/database/src/std/filters/filters.dbd.pod
@@ -14,6 +14,8 @@ The following filters are available in this release:
=item * L
+=item * L
+
=back
=head2 Using Filters
@@ -245,3 +247,41 @@ periods only when "blue" is true by using
...
=cut
+
+registrar(decInitialize)
+
+=head3 Decimation Filter C<"dec">
+
+This filter is used to reduce the number or rate of monitor updates from a
+channel by an integer factor C that is provided as a filter argument,
+discarding the other updates. A true decimation following the original meaning
+of the word would be achieved by giving C as 10, to only allow every tenth
+update through.
+
+=head4 Parameters
+
+=over
+
+=item Number C<"n">
+
+The decimation factor, a positive integer. Giving n=1 is equivalent to a no-op
+that allows all updates to be passed to the client.
+
+=back
+
+This filter is intentionally very simplistic. It passes on the first monitor
+event that it sees after the channel connects, then discards the next N-1 events
+before sending the next event. If several clients connect to a channel using the
+same filter settings they may see completely different data streams since each
+client gets its own instance of the filter whose event counter starts when that
+client connects.
+
+=head4 Example
+
+To sample a 60Hz channel at 1Hz, a 10Hz channel every 6 seconds or a 1Hz channel
+once every minute:
+
+ Hal$ camonitor 'test:channel' 'test:channel.{"dec":{"n":60}}'
+ ...
+
+=cut
diff --git a/modules/database/src/std/filters/sync.c b/modules/database/src/std/filters/sync.c
index d137dd7a9..a7f7b6bd1 100644
--- a/modules/database/src/std/filters/sync.c
+++ b/modules/database/src/std/filters/sync.c
@@ -110,7 +110,9 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
passfl = pfl;
pfl = NULL;
}
- break;
+ else
+ db_delete_field_log(pfl);
+ goto save_state;
case syncModeLast:
if (!actstate && my->laststate) {
passfl = my->lastfl;
@@ -122,28 +124,34 @@ static db_field_log* filter(void* pvt, dbChannel *chan, db_field_log *pfl) {
passfl = pfl;
pfl = NULL;
}
- break;
+ else
+ db_delete_field_log(pfl);
+ goto save_state;
case syncModeWhile:
- if (actstate) {
+ if (actstate)
passfl = pfl;
- }
+ else
+ db_delete_field_log(pfl);
goto no_shift;
case syncModeUnless:
- if (!actstate) {
+ if (!actstate)
passfl = pfl;
- }
+ else
+ db_delete_field_log(pfl);
goto no_shift;
}
if (my->lastfl)
db_delete_field_log(my->lastfl);
my->lastfl = pfl;
- my->laststate = actstate;
/* since no copy is made we can't keep a reference to the returned fl */
assert(my->lastfl != passfl);
- no_shift:
+save_state:
+ my->laststate = actstate;
+
+no_shift:
return passfl;
}
diff --git a/modules/database/src/std/rec/aiRecord.dbd.pod b/modules/database/src/std/rec/aiRecord.dbd.pod
index e113aa3d2..3b53b7a24 100644
--- a/modules/database/src/std/rec/aiRecord.dbd.pod
+++ b/modules/database/src/std/rec/aiRecord.dbd.pod
@@ -4,7 +4,7 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
-# in file LICENSE that is included with this distribution.
+# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Analog Input Record (ai)
@@ -214,7 +214,7 @@ monitoring functionality.
=cut
- include "dbCommon.dbd"
+ include "dbCommon.dbd"
field(VAL,DBF_DOUBLE) {
prompt("Current EGU Value")
promptgroup("40 - Input")
@@ -547,7 +547,7 @@ The individual routines are described below.
=head3 Device Support Routines
-=head4 long report(int level)
+ long report(int level)
This optional routine is called by the IOC command C and is passed the
report level that was requested by the user.
@@ -557,7 +557,7 @@ information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
-=head4 long init(int after)
+ long init(int after)
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C calls are made, with
@@ -565,7 +565,7 @@ the integer parameter C set to 0.
The second call happens after all of the C calls have been made,
with C set to 1.
-=head4 long init_record(aiRecord *prec)
+ long init_record(aiRecord *prec)
This optional routine is called by the record initialization code for each ai
record instance that has its DTYP field set to use this device support.
@@ -582,7 +582,7 @@ C, but it is not necessary to check that condition first.
This same calculation takes place in the C routine, so the
implementation can usually just call that routine to perform the task.
-=head4 long get_ioint_info(int cmd, aiRecord *prec, IOSCANPVT *piosl)
+ long get_ioint_info(int cmd, aiRecord *prec, IOSCANPVT *piosl)
This optional routine is called whenever the record's SCAN field is being
changed to or from the value C to find out which I/O Interrupt Scan
@@ -611,7 +611,7 @@ thread.
The C routine is safe to call from an interrupt service routine
on embedded architectures (vxWorks and RTEMS).
-=head4 long read_ai(aiRecord *prec)
+ long read_ai(aiRecord *prec)
This essential routine is called when the record wants a new value from the
addressed device.
@@ -622,7 +622,7 @@ It is responsible for performing (or at least initiating) a read operation, and
... return value ...
-=head4 long special_linconv(aiRecord *prec, int after)
+ long special_linconv(aiRecord *prec, int after)
This optional routine should be provided if the record type's unit conversion
features are used by the device support's C routine returning a
diff --git a/modules/database/src/std/rec/biRecord.dbd.pod b/modules/database/src/std/rec/biRecord.dbd.pod
index 6973b2a63..62bcf3bf2 100644
--- a/modules/database/src/std/rec/biRecord.dbd.pod
+++ b/modules/database/src/std/rec/biRecord.dbd.pod
@@ -162,7 +162,7 @@ these fields.
=cut
- include "dbCommon.dbd"
+ include "dbCommon.dbd"
field(INP,DBF_INLINK) {
prompt("Input Specification")
promptgroup("40 - Input")
@@ -291,7 +291,7 @@ these fields.
=head3 Record Support Routines
-=head2 C
+ long init_record(struct dbCommon *precord, int pass);
This routine initializes SIMM with the value of SIML if SIML type is a
CONSTANT link or creates a channel access link if SIML type is PV_LINK.
@@ -303,19 +303,19 @@ processing is terminated.
If device support includes C, it is called.
-=head2 C
+ long process(struct dbCommon *precord);
-See next section.
+See L below.
-=head2 C
+ long get_enum_str(const struct dbAddr *paddr, char *pbuffer);
Retrieves ASCII string corresponding to VAL.
-=head2 C
+ long get_enum_strs(const struct dbAddr *paddr, struct dbr_enumStrs *p);
Retrieves ASCII strings for ZNAM and ONAM.
-=head2 C
+ long put_enum_str(const struct dbAddr *paddr, const char *pbuffer);
Check if string matches ZNAM or ONAM, and if it does, sets VAL.
@@ -323,7 +323,7 @@ Check if string matches ZNAM or ONAM, and if it does, sets VAL.
Routine process implements the following algorithm:
-=over 1
+=over
=item 1.
Check to see that the appropriate device support module exists. If it
@@ -344,7 +344,7 @@ Convert.
=back
-=over 1
+=over
=item *
status = read_bi
@@ -363,7 +363,7 @@ if status is 2, set status = 0
=back
-=over 1
+=over
=item 5.
Check alarms: This routine checks to see if the new VAL causes the alarm
@@ -375,7 +375,7 @@ Check if monitors should be invoked:
=back
-=over 1
+=over
=item *
Alarm monitors are invoked if the alarm status or severity has changed.
@@ -391,7 +391,7 @@ NSEV and NSTA are reset to 0.
=back
-=over 1
+=over
=item 7.
Scan forward link if necessary, set PACT FALSE, and return.
@@ -413,7 +413,7 @@ support routines are primarily interested in the following fields:
Device support consists of the following routines:
-=head4 long report(int level)
+ long report(int level);
This optional routine is called by the IOC command C and is passed the
report level that was requested by the user.
@@ -423,7 +423,7 @@ information at higher levels, or to select different types of information with
different levels.
Level zero should print no more than a small summary.
-=head4 long init(int after)
+ long init(int after);
This optional routine is called twice at IOC initialization time.
The first call happens before any of the C calls are made, with
@@ -431,19 +431,19 @@ the integer parameter C set to 0.
The second call happens after all of the C calls have been made,
with C set to 1.
-=head2 C
+ long init_record(struct dbCommon *precord);
This routine is optional. If provided, it is called by the record support
C routine.
-=head2 C
+ long get_ioint_info(int cmd, struct dbCommon *precord, IOSCANPVT *ppvt);
This routine is called by the ioEventScan system each time the record is
added or deleted from an I/O event scan list. C has the value (0,1) if
the record is being (added to, deleted from) and I/O event list. It must be
provided for any device type that can use the ioEvent scanner.
-=head2 C
+ long read_bi(struct dbCommon *precord);
This routine must provide a new input value. It returns the following
values:
diff --git a/modules/database/src/std/rec/boRecord.dbd.pod b/modules/database/src/std/rec/boRecord.dbd.pod
index 8df8d7f31..6b6d1800c 100644
--- a/modules/database/src/std/rec/boRecord.dbd.pod
+++ b/modules/database/src/std/rec/boRecord.dbd.pod
@@ -65,9 +65,9 @@ C or C. If C is specified, the value
in the VAL field can be set externally via dbPuts at run-time. If
C is specified, the VAL field's value is obtained from the
address specified in the desired output location (DOL) field which can be a
-database link, a channel access link, or a constant. To achieve continuous
-control, a database link to a control algorithm record should be entered in
-the DOL field.
+database link or a channel access link, but not a constant. To achieve
+continuous control, a database link to a control algorithm record should be
+entered in the DOL field.
L presents more information on database addresses
and links. L explaines the effect of database
diff --git a/modules/database/src/std/rec/compressRecord.dbd.pod b/modules/database/src/std/rec/compressRecord.dbd.pod
index 5eb817f62..3bc3416a7 100644
--- a/modules/database/src/std/rec/compressRecord.dbd.pod
+++ b/modules/database/src/std/rec/compressRecord.dbd.pod
@@ -4,7 +4,7 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
-# in file LICENSE that is included with this distribution.
+# in file LICENSE that is included with this distribution.
#*************************************************************************
=title Compression Record (compress)
@@ -62,46 +62,10 @@ menu(bufferingALG) {
}
recordtype(compress) {
-=head2 Contents
-
-=over
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=back
-
-=back
-
-=begin html
-
-
-
-
-
-=end html
-
=head2 Parameter Fields
+The record-specific fields are described below, grouped by functionality.
+
=head3 Scanning Parameters
The compression record has the standard fields for specifying under what
@@ -259,80 +223,52 @@ SPTR points to an array that is used for array averages.
WPTR is used by the dbGetlinks routines.
-=begin html
-
-
-
-
-
-=end html
-
=head2 Record Support
-=head3 Record Support Routines (compressRecord.c)
+=head3 Record Support Routines
-=head4 init_record
-
- long (*init_record)(struct dbCommon *precord, int pass)
+ long init_record(struct dbCommon *precord, int pass)
Space for all necessary arrays is allocated. The addresses are stored in the
appropriate fields in the record.
-=head4 process
+ long process(struct dbCommon *precord)
- long (*process)(struct dbCommon *precord)
+See L below.
-See L
-
-=head4 special
-
- long (*special)(struct dbAddr *paddr, int after)
+ long special(struct dbAddr *paddr, int after)
This routine is called when RSET, ALG, or N are set. It performs a reset.
-=head4 cvt_dbaddr
-
- long (*cvt_dbaddr)(struct dbAddr *paddr)
+ long cvt_dbaddr(struct dbAddr *paddr)
This is called by dbNameToAddr. It makes the dbAddr structure refer to the
actual buffer holding the result.
-=head4 get_array_info
-
- long (*get_array_info)(struct dbAddr *paddr, long *no_elements, long *offset)
+ long get_array_info(struct dbAddr *paddr, long *no_elements, long *offset)
Obtains values from the circular buffer referenced by VAL.
-=head4 put_array_info
-
- long (*put_array_info)(struct dbAddr *paddr, long nNew);
+ long put_array_info(struct dbAddr *paddr, long nNew);
Writes values into the circular buffer referenced by VAL.
-=head4 get_units
-
- long (*get_units)(struct dbAddr *paddr, char *units);
+ long get_units(struct dbAddr *paddr, char *units);
Retrieves EGU.
-=head4 get_precision
-
- long (*get_precision)(const struct dbAddr *paddr, long *precision);
+ long get_precision(const struct dbAddr *paddr, long *precision);
Retrieves PREC.
-=head4 get_graphic_double
-
- long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p);
+ long get_graphic_double(struct dbAddr *paddr, struct dbr_grDouble *p);
Sets the upper display and lower display limits for a field. If the field is
VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower
limits defined they will be used, else the upper and lower maximum values for
the field type will be used.
-=head4 get_control_double
-
- long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p);
+ long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *p);
Sets the upper control and the lower control limits for a field. If the field is
VAL, the limits are set to HOPR and LOPR, else if the field has upper and lower
@@ -418,7 +354,7 @@ Scan forward link if necessary, set PACT FALSE, and return.
=cut
- include "dbCommon.dbd"
+ include "dbCommon.dbd"
field(VAL,DBF_NOACCESS) {
prompt("Value")
asl(ASL0)
@@ -549,4 +485,3 @@ Scan forward link if necessary, set PACT FALSE, and return.
interest(3)
}
}
-
diff --git a/modules/database/src/std/rec/longinRecord.dbd.pod b/modules/database/src/std/rec/longinRecord.dbd.pod
index 20f236b7d..cf2a3a395 100644
--- a/modules/database/src/std/rec/longinRecord.dbd.pod
+++ b/modules/database/src/std/rec/longinRecord.dbd.pod
@@ -7,7 +7,7 @@
# in file LICENSE that is included with this distribution.
#*************************************************************************
-=head1 Long Input Record (longin)
+=title Long Input Record (longin)
The normal use for the long input record or "longin" record is to retrieve a
long integer value of up to 32 bits. Device support routines are provided to
@@ -15,56 +15,6 @@ support direct interfaces to hardware. In addition, the C<<< Soft Channel >>>
device module is provided to obtain input via database or channel access links
or via dbPutField or dbPutLink requests.
-=head1 Contents
-
-=over
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=back
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
-
-=back
-
-=begin html
-
-
-
-=end html
-
=recordtype longin
=cut
@@ -73,21 +23,7 @@ recordtype(longin) {
=head2 Parameter Fields
-The fields in this record fall into the following categories:
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
+The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
@@ -174,17 +110,11 @@ See L for more information on these fields.
=fields SIOL, SVAL, SIML, SIMM, SIMS
-=begin html
-
-
-
-=end html
-
=head2 Record Support
-=head3 Record Support Routines
+=head3 Record Support Routines
-=head4 init_record
+=head4 init_record
This routine initializes SIMM with the value of SIML if SIML type is CONSTANT
link or creates a channel access link if SIML type is PV_LINK. SVAL is likewise
@@ -374,7 +304,7 @@ sets UDF to FALSE. read_longin returns the status of C.
=cut
- include "dbCommon.dbd"
+ include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Current value")
promptgroup("40 - Input")
diff --git a/modules/database/src/std/rec/longoutRecord.dbd.pod b/modules/database/src/std/rec/longoutRecord.dbd.pod
index a86edb7ac..276f3046f 100644
--- a/modules/database/src/std/rec/longoutRecord.dbd.pod
+++ b/modules/database/src/std/rec/longoutRecord.dbd.pod
@@ -7,69 +7,15 @@
# in file LICENSE that is included with this distribution.
#*************************************************************************
-=head1 B
+=title Long Output Record (longout)
The normal use for the long output or "longout" record type is to store long
-integer values of up to 32 bits and write them to hardware devices. The C<<<
-Soft Channel >>> device support routine can also be used to write values to
+integer values of up to 32 bits and write them to hardware devices. The C<<<
+Soft Channel >>> device support layer can also be used to write values to
other records via database or channel access links. The OUT field determines how
the record is used. The record supports alarm limits and graphics and control
limits.
-=head1 L
-
-=over
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=back
-
-=item * L
-
-=over
-
-=item * L
-
-=item * L
-
-=item * L
-
-=back
-
-=back
-
-=begin html
-
-
-
-=end html
-
=recordtype longout
=cut
@@ -149,7 +95,7 @@ and database links.
=cut
- include "dbCommon.dbd"
+ include "dbCommon.dbd"
field(VAL,DBF_LONG) {
prompt("Desired Output")
promptgroup("50 - Output")
@@ -243,7 +189,7 @@ HYST field contains the alarm deadband around each limit alarm.
See the See L for a complete explanation of alarms and
these fields. For an explanation of the IVOA and IVOV fields, see L