diff --git a/documentation/RELEASE_NOTES.html b/documentation/RELEASE_NOTES.html
deleted file mode 100644
index 6f2019379..000000000
--- a/documentation/RELEASE_NOTES.html
+++ /dev/null
@@ -1,1846 +0,0 @@
-
-
-
-
- EPICS Base R3.15.6 Release Notes
-
-
-
-EPICS Base Release 3.15.7
-
-This version of EPICS Base has not been released yet.
-
-
-Changes made on 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.
-
-
-
-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
-and part of lp: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:
-
-
-
-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
- -
- #1479316 Some data races found using Helgrind
- -
- #1495833 biRecord prompt groups are nonsensical
- -
- #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:
-
-
-var dbQuietMacroWarnings 1 iocsh
-dbQuietMacroWarnings=1 VxWorks
-
-
-This was Launchpad bug
-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, 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.<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:
-
-
-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).
-
-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.
-
-
-Changes made between 3.15.2 and 3.15.3
-
-Make the NTP Time provider optional on VxWorks
-
-Recent versions of VxWorks (sometime after VxWorks 6) provide facilities for
-automatically synchronizing the OS clock time with an NTP server. The EPICS time
-system used to assume that it had to provide time synchronization on VxWorks,
-but now it tests for the existance of either of the two OS synchronization
-threads before starting the NTP time provider. It is still possible to force the
-NTP provider to be started even if the OS synchronization is running by defining
-the environment variable EPICS_TS_FORCE_NTPTIME in the startup script
-before loading the IOC's .munch file. Forcing may be necessary if the VxWorks
-image is not correctly configured with the IP address of a local NTP server.
-
-Assembling files from numbered snippets
-
-A tool has been added that assembles file snippets specified on the
-command line into a single output file, with sorting and replacing/adding of
-snippets done based on their file names. The build system integration requires
-the output file to be specified setting COMMON_ASSEMBLIES (arch independent)
-or ASSEMBLIES (created by arch), then defining the snippets for each assembly
-setting *_SNIPPETS (explicitly) or *_PATTERN (searched relative to all source
-directories).
-
-
-Clean up after GNU readline()
-
-If EPICS Base is built with readline support, any IOC that calls epicsExit()
-from a thread other than the main thread is likely to leave the user's terminal
-in a weird state, requiring the user to run something like 'stty sane' to clean
-it up. This release patches the readline support code to clean up automatically
-by registering an epicsAtExit() routine.
-
-Removed the last vestiges of RSET::get_value()
-
-The IOC has not called the get_value() routine in the RSET for a very long
-time, but there was still one implementation left in the event record support
-code, and a structure definition for one of the original arguments to that
-routine was defined in recGbl.h. Both of these have now been removed.
-
-
-Changes made between 3.15.1 and 3.15.2
-
-Raised limit on link field length in database files
-
-The length of INP/OUT link fields in database files was limited to 79 chars
-by an internal buffer size in the db file parser. This limitation will go away
-completely in 3.16, and has been statically raised to 255 chars for the 3.15
-series.
-
-aoRecord raw conversion overflows
-
-The ao record type now checks converted raw values and limits them to the
-32-bit integer range before writing them to the RVAL field. Previously value
-overflows relied on Undefined Behaviour which could give different results on
-different platforms. The ROFF fields of the ao and ai record types are now
-DBF_ULONG to allow an ROFF setting of 0x80000000 to work properly.
-
-Changes to <top>/cfg/* files
-
-The order in which cfg/CONFIG* and cfg/RULES* files are included from support
-applications listed in the configure/RELEASE* files has been changed. Previously
-these files were included in the order in which the top areas are listed in the
-RELEASE file, but it makes more sense to load them in reverse order since later
-entries override earlier ones in Makefiles but the release file order is
-supposed to allow earlier entries to take precedence over later ones. The same
-change has been made to the inclusion of the <top>/configure/RULES_BUILD
-files.
-
-Two new file types can also be provided in a module's cfg directory. Files
-named TOP_RULES* will be included by the top-level Makefile of other modules
-that refer to this module; files name DIR_RULES* will be included by all
-Makefiles that merely descend into lower-level directories. The cfg/RULES* files
-are only included when make is building code inside the O.<arch>
-directories.
-
-The new cfg/DIR_RULES* file inclusion was designed to permit new recursive
-make actions to be implemented by appending the name of the new action to the
-ACTIONS variable. There must be a matching rule in one of the cfg/RULES* files
-when doing this. Similar rules may also be defined in the cfg/TOP_RULES* and/or
-cfg/DIR_RULES* files, but these should only state prerequisites and not directly
-provide commands to be executed.
-
-Build rules for RTEMS GESYS modules
-
-RTEMS target builds can now be configured to make GESYS modules by changing
-the USE_GESYS=NO setting in the file
-configure/os/CONFIG_SITE.Common.RTEMS to YES.
-
-Added Make variables for command-line use
-
-The following variables are now used during the build process, reserved for
-setting on the command-line only (Makefiles should continue to use the
-USR_ equivalents):
-
-
-- CMD_INCLUDES
-- CMD_CPPFLAGS
-- CMD_CFLAGS
-- CMD_CXXFLAGS
-- CMD_LDFLAGS
-- CMD_DBFLAGS
-- CMD_DBDFLAGS
-- CMD_REGRDDFLAGS
-- CMD_ARFLAGS
-
-
-For example:
-
-
-make CMD_INCLUDES=/opt/local/include CMD_LDFLAGS=-L/opt/local/lib
-
-
-Enhanced API for asTrapWrite listeners
-
-External software such as the CA Put Logging module that registers a listener
-with the asTrapWrite subsystem was not previously given access to the actual
-data being sent by the CA client. In most cases this was not a problem as the
-listener can look at the field being modified both before and after the
-operation, but if the put processes the record which immediately overwrites the
-new value, the client's value cannot be observed.
-
-This release adds three fields to the asTrapWriteMessage structure that is
-passed to the listener routines. These new fields provide the CA data type, the
-number of array elements, and a pointer to the source data buffer. This change
-is completely backwards compatible with listener code written against the
-original API. The new API can be detected at compile-time as follows:
-
-
-#include "asLib.h"
-
-/* ... */
-
-#ifdef asTrapWriteWithData
- /* Enhanced API */
-#endif
-
-
-Use of PATH_FILTER in Makefiles deprecated
-
-The PATH_FILTER variable was being called to convert forward shashes
-/ in file paths into pairs of backward slashes
-\\ on Windows architectures. This has never been strictly
-necessary, and was added about 10 years ago to get around some short-comings in
-Windows tools at the time. All uses of PATH_FILTER in Base have now been
-removed; the definition is still present, but will result in a warning being
-printed if it is ever used.
-
-Using msi for dependencies
-
-To reduce confusion the msi program has been modified to allow the generation
-of dependency rules by adding support for a -D option, and changing the
-commands in RULES.Db to use this option instead of the mkmf.pl script. The new
-build rules will not work with old versions of the msi program, so the command
-variable name used in the rules has been changed from MSI to MSI3_15. Sites that
-use a modified version of msi must provide support for both the -D and
--o outfile options, and should then point the MSI3_15 variable in
-their applications' CONFIG_SITE files to that updated executable.
-
-
-Changes made between 3.15.0.2 and 3.15.1
-
-epicsStrnEscapedFromRaw() and epicsStrnRawFromEscaped()
-
-These routines have been rewritten; the previous implementations did not
-always behave exactly as specified.
-
-Shared Library Versions
-
-On architectures that can support it, the shared library version number for
-libraries provided with Base has had the third component of the EPICS version
-number added to it, thus libCom.so.3.15.1 instead of libCom.so.3.15. Windows
-can only support two components to its internal product version number, and the
-Darwin bug that external shared libraries were being built using the EPICS
-version number has been fixed.
-
-Hooking into dbLoadRecords
-
-A function pointer hook has been added to the dbLoadRecords() routine, to
-allow external modules such as autosave to be notified when new records have
-been loaded during IOC initialization. The hook is called dbLoadRecordsHook and
-follows the model of the recGblAlarmHook pointer in that modules that wish to
-use it must save the current value of the pointer before installing their own
-function pointer, and must call the original function from their own
-routine.
-
-The hook is activiated from the dbLoadRecords() routine and gets called only
-after a database instance file has been read in without error. Note that the
-dbLoadTemplates() routine directly calls dbLoadRecords() so this hook also
-provides information about instantiated database templates. It is still possible
-to load record instances using dbLoadDatabase() though, and doing this will not
-result in the hook routines being called.
-
-Code to use this hook should look something like this:
-
-
-#include "dbAccessDefs.h"
-
-static DB_LOAD_RECORDS_HOOK_ROUTINE previousHook;
-
-static void myRoutine(const char* file, const char* subs) {
- if (previousHook)
- previousHook(file, subs);
-
- /* Do whatever ... */
-}
-
-void myInit(void) {
- static int done = 0;
-
- if (!done) {
- previousHook = dbLoadRecordsHook;
- dbLoadRecordsHook = myRoutine;
- done = 1;
- }
-}
-
-
-As with many other parts of the static database access library there is no
-mutex to protect the function pointer. Initialization is expected to take place
-in the context of the IOC's main thread, from either a static C++ constructor or
-an EPICS registrar routine.
-
-
-Changes made between 3.15.0.1 and 3.15.0.2
-
-New iocshLoad command
-
-A new command iocshLoad has been added to iocsh which executes a
-named iocsh script and can also set one or more shell macro variables at the
-same time, the values of which will be forgotten immediately after the named
-script finishes executing. The following example shows the syntax:
-
-
-iocshLoad "serial.cmd", "DEV=/dev/ttyS0,PORT=com1,TYPE=RS485"
-iocshLoad "radmon.cmd", "PORT=com1,ADDR=0"
-
-
-Support routines for 64-bit integers
-
-The libCom library now provides support for 64-bit integer types on all
-supported architectures. The epicsTypes.h header file defines epicsInt64 and
-epicsUInt64 type definitions for both C and C++ code. The epicsStdlib.h header
-also declares the following for parsing strings into the relevent sized integer
-variables: Functions epicsParseLLong(), epicsParseULLong() with related macros
-epicsScanLLong() and epicsScanULLong(), and the functions epicsParseInt64()
-and epicsParseUInt64(). Use the first two functions and the macros for long long
-and unsigned long long integer types, and the last two functions for the
-epicsInt64 and epicsUInt64 types. Note that the latter can map to the types long
-and unsigned long on some 64-bit architectures such as linux-x86_64, not to the
-two long long types.
-
-This version does not provide the ability to define 64-bit record fields, the
-use of the 64-bit types in the IOC database will come in a later release of
-EPICS Base.
-
-Full support for loadable support modules
-
-Apparently later versions of Base 3.14 permitted support modules to be loaded
-from a shared library at runtime without the IOC having been linked against that
-shared library; the registerRecordDeviceDriver.pl program would accept a partial
-DBD file containing just the entries needed for the library and generate the
-appropriate registration code. In 3.15 however the registerRecordDeviceDriver.pl
-program was replaced by one using the new DBD file parser, and in this a device
-support entry would only be accepted after first loading the record type that it
-depended on.
-
-The parser has been modified to accept device entries without having seen the
-record type first, although a warning is given when that happens. To remove the
-warning the DBD file can provide a record type declaration instead (no fields
-can be defined, so the braces must be empty), before the device() entry. The
-result will generate the correct registration code for the device entry without
-including anything for any merely declared record types. The generated code can
-be linked into a shared library and loaded by an IOC at runtime using dlload.
-
-
-Parallel callback threads
-
-The general purpose callback facility can run multiple parallel callback
-threads per priority level. This makes better use of SMP architectures (e.g.
-processors with multiple cores), as callback work - which includes second
-stage processing of records with asynchronuous device support and I/O
-scanned processing - can be distributed over the available CPUs.
-
-Note that by using parallel callback threads the order of scan callback
-requests in the queue is not retained. If a device support needs to be
-informed when scanIoRequest processing has finished, it should use the new
-scanIoSetComplete() feature to add a user function that will be called after
-the scanIoRequest record processing has finished.
-
-Parallel callback threads have to be explicitly configured, by default
-the IOC keeps the old behavior of running one callback thread per priority.
-
-Merge MMIO API from devLib2
-
-Added calls to handle 8, 16, and 32 bit Memory Mapped I/O reads and writes.
-The calls added include X_iowriteY() and
-X_ioreadY()
-where X is nat (native), be or le,
-and Y is 16 or 32.
-Also added are ioread8() and iowrite8().
-
-Added optional dbServer API to database
-
-A server layer that sits on top of the IOC database may now register itself
-as such by calling dbRegisterServer() and providing optional routines
-that other components can use. The initial purpose of this API allows the Trace
-Processing implementation in dbProcess() to identify a client that
-causes a record to process when TPRO is set.
-
-To support the client idenfication, the server provides a routine that
-returns that identity string when called by one of its own processing
-threads.
-
-Concatenated database definition files
-
-A series of database definition (dbd) files can now be concatenated during
-the build process into a newly-created dbd file with result being installed into
-$(INSTALL_LOCATION)/dbd without expanding it.
-
-The following lines in an EPICS Makefile will create a file name.dbd in the
-O.Common build directory containing the contents of file1.dbd followed by
-file2.dbd then file3.dbd. The new file will then be installed into
-$(INSTALL_LOCATION)/dbd without expanding any of its include statements.
-
-
-DBDCAT += name.dbd
-name_DBD += file1.dbd file2.dbd file3.dbd
-
-
-The source files file1.dbd, file2.dbd and file3.dbd may be created by the
-current Makefile, be located in the parent directory or any other directory in
-the SRC_DIRS list, be specified by their full pathname, exist in the install dbd
-directory, or be found in any dbd directory linked from the application's
-RELEASE files.
-
-Posix: Drop SCHED_FIFO before exec() in child process
-
-If Base is compiled with USE_POSIX_THREAD_PRIORITY_SCHEDULING = YES
-in configure/CONFIG_SITE or related files, the Posix implementation of the
-libCom osiSpawnDetachedProcess() routine will switch the child process
-to use the normal SCHED_OTHER (non real-time) scheduler before executing the
-named executable program. If it needs to use the real-time scheduler the new
-program can request that for itself.
-
-Posix: Lock all memory when running with FIFO scheduler
-
-On Posix systems, an IOC application's ability to meet timing deadlines is
-often dependent on its ability to lock part or all of the process's virtual
-address space into RAM, preventing that memory from being paged to the swap
-area. This change will attempt to lock the process's virtual address space into
-RAM if the process has the ability to run threads with different priorities. If
-unsuccessful, it prints an message to stderr and continues.
-
-On Linux, one can grant a process the ability to run threads with different
-priorities by using the command ulimit -r unlimited. To use the
-FIFO scheduler for an IOC, use a command like this:
-
-chrt -f 1 softIoc -d test.db
-
-On Linux, one can grant a process the ability to lock itself into memory
-using the command ulimit -l unlimited. These limits can also be
-configured on a per user/per group basis by changing /etc/security/limits.conf
-or its equivalent.
-
-A child process created via fork() normally inherits its parent's resource
-limits, so a child of a real-time soft-IOC will get its parent's real-time
-priority and memlock limits. The memory locks themselves however are not
-inherited by child processes.
-
-Implement EPICS_CAS_INTF_ADDR_LIST in rsrv
-
-The IOC server can now bind to a single IP address (and optional port number)
-read from the standard environment parameter EPICS_CAS_INTF_ADDR_LIST.
-Additional addresses included in that parameter after the first will be ignored
-and a warning message displayed at iocInit time.
-
-alarmString.h deprecated again
-
-The string arrays that provide string versions of the alarm status and
-severity values have been moved into libCom and the header file that used to
-instanciate them is no longer required, although a copy is still provided for
-backwards compatibility reasons. Only the alarm.h header needs to be included
-now to declare the epicsAlarmSeverityStrings and epicsAlarmConditionStrings
-arrays.
-
-General purpose thread pool
-
-
-A general purpose threaded work queue API epicsThreadPool is added.
-Multiple pools can be created with controlable priority and number
-of worker threads. Lazy worker startup is supported.
-
-Database field setting updates
-
-A database (.db) file loaded by an IOC does not have to repeat the record
-type of a record that has already been loaded. It may replace the first
-parameter of the record(type, name) statement with an asterisk
-character inside double-quotes, "*" instead. Thus the following is a
-legal database file:
-
-record(ao, "ao1") {}
-record("*", "ao1") {
- field(VAL, 10)
-}
-
-Note that database configuration tools will not be expected to have to
-understand this syntax, which is provided for scripted and hand-coded database
-and template instantiation only. Setting the IOC's dbRecordsOnceOnly
-flag also makes this syntax illegal, since its purpose is to prevent
-multiply-defined records from being collapsed into a single instance.
-
-Added echo command to iocsh
-
-The single argument string may contain escaped characters, which will be
-translated to their raw form before being printed (enclose the string in quotes
-to avoid double-translation). A newline is always appended to the output, and
-output stream redirection is supported.
-
-Added macro EPICS_UNUSED to compilerDependencies.h
-
-To prevent the compiler from warning about a known-unused variable, mark it
-with the macro EPICS_UNUSED. On gcc and clang this will expand to
-__attribute__((unused)) to prevent the warning.
-
-User specified db substitution file suffix
-
-Per Dirk Zimoch's suggestion, a user specified db substitution file suffix is
-now allowed by setting the variable SUBST_SUFFIX in a configuration directory
-CONFIG_SITE file or in a Makefile before the include $(TOP)/configure/RULES
-line. The default for SUBST_SUFFIX is .substitutions
-
-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.
-
-Added newEpicsMutex macro
-
-Internal C++ uses of new epicsMutex() have been replaced with a new
-macro which calls a new constructor, passing it the file name and line number of
-the mutex creation code. C code that creates mutexes has been using a similar
-macro for a long time, but there was no equivalent constructor for the C++
-wrapper class, so identifying a specific mutex was much harder to do.
-
-Post DBE_PROPERTY events automatically
-
-A new record field attribute "prop(YES)" has been added to identify fields
-holding meta-data. External changes to these fields will cause a CA monitor
-event to be sent to all record subscribers who have asked for DBE_PROPERTY
-updates. Meta-data fields have been marked for all Base record types.
-
-errlogRemoveListener() routine changed
-
-Code that calls errlogRemoveListener(myfunc) must be modified to use
-the new, safer routine errlogRemoveListeners(myfunc, &pvt) instead.
-The replacement routine takes a second argument which must be the same private
-pointer that was passed to errlogAddListener() when adding that
-listener. It also deletes all matching listeners (hence the new plural name) and
-returns how many were actually deleted, whereas the previous routine only
-removed the first listener that matched.
-
-Simplified generation of .dbd files
-
-The Perl script makeIncludeDbd.pl has been removed and the rules
-that created an intermediate xxxInclude.dbd file from the
-Makefile variable xxx_DBD have been modified to generate the target
-xxx.dbd file directly. This should simplify applications that
-might have had to provide dependency rules for the intermediate files in 3.15.
-Applications which provide their own xxxInclude.dbd source file
-will continue to have it expanded as before.
-
-New Undefined Severity field UDFS
-
-A new field has been added to dbCommon which configures the alarm severity
-associated with the record being undefined (when UDF=TRUE). The default value is
-INVALID so old databases will not be affected, but now individual records can be
-configured to have a lower severity or even no alarm when undefined. Be careful
-when changing this on applications where the IVOA field of output records is
-used, IVOA still requires an INVALID severity to trigger value replacement.
-
-New build target tapfiles
-
-This new make target runs the same tests as the runtests
target, but
-instead of summarizing or displaying the output for each test script it creates
-a .tap
file inside the architecture build directory which contains the
-detailed test output. The output file can be parsed by continuous integration
-packages such as Jenkins to show the
-test results.
-
-Array field double-buffering
-
-Array data can now be moved, without copying, into and out of the VAL field
-of the waveform, aai, and aao record types by replacing the pointer in BPTR.
-The basic rules which device support must follow are:
-
-
- - BPTR, and the memory it is currently pointing to, can only be accessed
- while the record is locked.
- - NELM may not be changed; NORD should be updated whenever the number of
- valid data elements changes.
- - When BPTR is replaced it must always point to a block of memory large
- enough to hold the maximum number of elements, as given by the NELM and
- FTVL fields.
-
-
-Spin-locks API added
-
-The new header file epicsSpin.h adds a portable spin-locks API which is
-intended for locking very short sections of code (typically one or two lines of
-C or C++) to provide a critical section that protects against race conditions.
-On Posix platforms this uses the pthread_spinlock_t type if it's available and
-the build is not configured to use Posix thread priorities, but otherwise it
-falls back to a pthread_mutex_t. On the UP VxWorks and RTEMS platforms the
-implementations lock out CPU interrupts and disable task preemption while a
-spin-lock is held. The default implementation (used when no other implementation
-is provided) uses an epicsMutex. Spin-locks may not be taken recursively, and
-the code inside the critical section should be short and deterministic.
-
-Improvements to aToIPAddr()
-
-The libCom routine aToIPAddr() and the vxWorks implementation of the
-associated hostToIPAddr() function have been modified to be able to look up
-hostnames that begin with one or more digits. The epicsSockResolveTest program
-was added to check this functionality.
-
-mbboDirect and mbbiDirect records
-
-These record types have undergone some significant rework, and will behave
-slightly differently than they did in their 3.14 versions. The externally
-visible changes are as follows:
-
-mbbiDirect
-
-
- - If the MASK field is set in a database file, it will not be over-written
- when the record is initialized. This allows non-contiguous masks to be set,
- although only the device support actually uses the MASK field.
- - If process() finds the UDF field to be set, the record will raise a
- UDF/INVALID alarm.
-
-
-mbboDirect
-
-
- - If the MASK field is set in a database file, it will not be over-written
- when the record is initialized. This allows non-contiguous masks to be set,
- although only the device support actually uses the MASK field.
- - After the device support's init_record() routine returns during record
- initialization, if OMSL is
supervisory
and UDF is clear the fields
- B0-BF will be set from the current VAL field.
- - When a put to the OMSL field sets it to
supervisory
, the fields
- B0-BF will be set from the current VAL field. This did not used to happen,
- the individual bit fields were previously never modified by the record.
- Note that this change may require some databases to be modified, if they
- were designed to take advantage of the previous behavior.
-
-
-Redirection of the errlog console stream
-
-A new routine has been added to the errlog facility which allows the console
-error message stream to be redirected from stderr to some other already open
-file stream:
-
-int errlogSetConsole(FILE *stream);
-
-
-The stream argument must be a FILE* pointer as returned by fopen() that is
-open for output. If NULL is passed in, the errlog thread's stderr output stream
-will be used instead. Note that messages to the console can be disabled and
-re-enabled using the eltc routine which is also an iocsh command, but there is
-no iocsh command currently provided for calling errlogSetConsole.
-
-Add cleanup subroutine to aSub record
-
-An aSub routine may set the CADR field with a function pointer which will be
-run before a new routine in the event that a change to the SNAM field changes
-the record's process subroutine.
-
-This can be used to free any resources the routine needs to allocate. It can
-also be used to determine if this is the first time this routine has been called
-by this record instance. The CADR field is set to NULL immediately after the
-routine it points to is called.
-
-Example:
-
-void cleanup(aSubRecord* prec) {
- free(prec->dpvt);
- prec->dpvt = NULL;
-}
-
-long myAsubRoutine(aSubRecord* prec) {
- if (!prec->cadr) {
- /* check types of inputs and outputs */
- if (prec->ftva != menuFtypeDOUBLE)
- return 1; /* oops */
-
- dpvt = malloc(42);
- prec->cadr = &cleanup;
- }
-
- /* normal processing */
-}
-epicsRegisterFunction(myAsubRoutine);
-
-
-Sequence record enhancements
-
-The sequence record type now has 16 link groups numbered 0 through 9 and A
-through F, instead of the previous 10 groups numbered 1 through 9 and A. The
-changes to this record are directly equivalent to those described below for the
-fanout record. The fields OFFS and SHFT have been added and operate on the SELN
-value exactly the same way. The result is backwards compatible with the 3.14
-version of the sequence record as long as none of the new fields are modified
-and the application does not rely on the SOFT/INVALID alarm that was generated
-when the selection number exceeded 10. The record also now posts monitors on the
-SELN field at the end of the sequence if its value changed when read through the
-SELL link.
-
-
Fanout record enhancements
-
-The fanout record type now has 16 output links LNK0-LNK9 and LNKA-LNKF, plus
-two additional fields which make the result backwards compatible with 3.14
-databases, but also allow the link selection to be shifted without having to
-process the SELN value through a calc or calcout record first.
-
-Previously there was no LNK0 field, so when SELM is Mask
bit 0 of SELN
-controls whether the LNK1 link field was activated; bit 1 controls LNK2 and so
-on. When SELM is Specified
and SELN is zero no output link would be
-activated at all; LNK1 gets activated when SELN is 1 and so on. Only 6 links
-were provided, LNK1 through LNK6. The updated record type maintains the original
-behavior when the new fields are not configured, except that the SOFT/INVALID
-alarm is not generated when SELN is 7 through 15.
-
-The update involved adding a LNK0 field, as well as fields LNK7 through LNK9
-and LNKA through LNKF. To add flexibility and maintain backwards compatibility,
-two additional fields have been added:
-
-
-- OFFS
-
-- This field holds a signed offset which is added to SELN to select which link
-to activate when SELM is
Specified
. If the resulting value is outside the
-range 0 .. 15 the record will go into a SOFT/INVALID alarm state. The default
-value of OFFS is zero, so if it is not explicitly set and SELN is 1 the LNK1
-link will be activated.
-
-- SHFT
-
-- When SELM is
Mask
the signed field SHFT is used to shift the SELN
-value by SHFT bits (positive means right-wards, values outside the range -15 ..
-15 will result in a SOFT/INVALID alarm), before using the resulting bit-pattern
-to control which links to activate. The default value is -1, so if SHFT is not
-explicitly set bit 0 of SELN will be used to control whether LNK1 gets
-activated.
-
-
-
-The record also now posts monitors on the SELN field if it changes as a
-result of record processing (i.e. when read through the SELL link).
-
-Deleted Java build rules
-
-Java has its own build systems now, so we've deleted the rules and associated
-variables from Base, although they might get added to the Extensions build rules
-for a while in case anyone still needs them.
-
-Changes made between 3.14.x and 3.15.0.1
-
-Application clean rules
-
-The clean Makefile target has changed between a single-colon rule
-and a double-colon rule more than once in the life of the EPICS build rules, and
-it just changed back to a single-colon rule, but now we recommend that
-applications that wish to provide a Makefile that is backwards compatible with
-the 3.14 build rules use the construct shown below. The 3.15 rules now support
-a variable called CLEANS to which a Makefile can add a list of files to
-be deleted when the user does a make clean like this:
-
-CLEANS += <list of files to be cleaned>
-
-ifndef BASE_3_15
-clean::
- $(RM) $(CLEANS)
-endif
-
-The conditional rule provides compatibility for use with the 3.14 build
-system.
-
-MSI included with Base
-
-An enhanced version of the Macro Substitution and Include program msi
-has been included with Base. Both this new version of msi and the IOC's
-dbLoadTemplates command now support setting global macros in
-substitution files, and dbLoadTemplates can now take a list of global
-macro settings as the second argument on its command line. The substitution file
-syntax is documented in the Application Developers Guide.
-
-Cross-builds targeting win32-x86-mingw
-
-Some Linux distributions now package the MinGW cross-compiler which makes it
-possible to cross-build the win32-x86-mingw target from a linux-x86 host. Build
-configuration files for this combination are now included; adjust the settings
-in configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw and add win32-x86-mingw to
-the CROSS_COMPILER_TARGET_ARCHS variable in configure/CONFIG_SITE or in
-configure/os/CONFIG_SITE.linux-x86.Common.
-
-Architecture win32-x86-cygwin Removed
-
-The ability to compile non-cygwin binaries using the Cygwin build tools is no
-longer supported by current versions of Cygwin, so this architecture has been
-removed. Use the MinWG tools and the win32-x86-mingw architecture instead.
-
-RTEMS and VxWorks Test Harnesses
-
-The original libCom test harness has been renamed libComTestHarness,
-and two additional test harnesses have been created dbTestHarness and
-filterTestHarness which are all built for RTEMS and vxWorks targets.
-The new ones include tests in src/ioc/db/test and src/std/filters/test.
-
-Running the new tests requires additional .db and .dbd files to be loaded at
-runtime, which can be found in the relevant source directory or its O.Common
-subdirectory. If the target can access the Base source tree directly it may be
-simplest to cd to the relevant source directory before running the test. If not,
-the files needed are listed in the generated 'testspec' file found in the
-associated build (O.arch) directory.
-
-For RTEMS users the current directory is determined in a BSP specific way.
-See rtems_init.c and setBootConfigFromNVRAM.c in src/libCom/RTEMS.
-
-New API to hook into thread creation
-
-A hook API has been added allowing user-supplied functions to be called
-whenever a thread starts. The calls are made from the thread's context,
-and can be used to control additional thread properties not handled inside
-EPICS base, e.g. setting the scheduling policy or CPU affinity (on SMP
-systems).
-
-The API also supports a mapping operation, calling a user-supplied function
-for every thread that is currently running.
-
-New scan rate units
-
-Scan rates defined in the menuScan.dbd file may now be specified in seconds,
-minutes, hours or Hertz, and plural time units will also be accepted (seconds
-are used if no unit is mentioned in the choice string). At iocInit each
-scan rate is compared with the OS's clock tick and a warning printed if the
-rate is too fast or likely to be more than 10% different to the requested rate.
-For example the rates given below are all valid, although non-standard (the
-default menuScan choices that come with Base have not been changed):
-
-
-menu(menuScan) {
- choice(menuScanPassive, "Passive")
- choice(menuScanEvent, "Event")
- choice(menuScanI_O_Intr, "I/O Intr")
- choice(menuScan1_hour, "1 hour")
- choice(menuScan0_5_hours, "0.5 hours")
- choice(menuScan15_minutes, "15 minutes")
- choice(menuScan5_minutes, "5 minutes")
- choice(menuScan1_minute, "1 minute")
- choice(menuScan10_seconds, "10 seconds")
- choice(menuScan5_seconds, "5 seconds")
- choice(menuScan2_seconds, "2 seconds")
- choice(menuScan1_second, "1 second")
- choice(menuScan2_Hertz, "2 Hertz")
- choice(menuScan5_Hertz, "5 Hertz")
- choice(menuScan10_Hertz, "10 Hz")
-}
-
-Alarm filtering added to input record types
-
-The record types ai, calc, longin and mbbi have a new alarm filter added to
-them. This provides a low-pass filter that can be used to delay the reporting of
-alarms caused by the input level passing the HIGH, HIHI, LOW or LOLO values. The
-filter is controlled with a new AFTC field that sets the filter's time constant.
-The default value for this field is zero, which keeps the record's original
-alarm behaviour.
-
-The record must be scanned often enough for the filtering action to work
-effectively and the alarm severity can only change when the record is processed,
-but that processing does not have to be regular; the filter uses the time since
-the record last processed in its calculation. Setting AFTC to a positive number
-of seconds will delay the record going into or out of a minor alarm severity or
-from minor to major severity until the input signal has been in that range for
-that number of seconds.
-
-Post events on Waveform record's NORD field
-
-When the record type or device support modify the NORD field of a waveform
-record, the record support code now posts DBE_VALUE and DBE_LOG events for that
-field, signalling the array length change to any client monitoring the NORD
-field.
-
-Attributes of Non-VAL Fields
-
-Non-VAL fields now report meaningful information for precision, units,
-graphic limits, control limits, and alarm limits instead of simply using
-PREC, EGU, HOPR, LOPR, DRVL, DRVH, HIHI, HIGH, LOW, and LOLO. All delay
-fields have a default precision of 2 digits, units "s" and control limits
-of 0 to 100,000 seconds (these precision and limit values can be changed
-for each record type as a whole at runtime by updating a registered global
-variable). Input fields like A-L of the calc record read their metadata
-from the corresponding INPn link if possible.
-epicsStdioRedirect.h merged into epicsStdio.h
-
-The definitions from the header file epicsStdioRedirect.h have been moved
-into epicsStdio.h so all calls to printf(), puts() and putchar() in files that
-include that OSI header will now be subject to stdout redirection. In past
-releases (3.14.7 and later) it was necessary to request the redirection support
-by including the epicsStdioRedirect.h header file. The header file is still
-provided, but now it just includes epicsStdio.h.
-
-Named Soft Events
-
-Soft events can now be given meaningful names instead of just using the
-numbers 1-255. The EVNT field is now a DBF_STRING. The post_event() API
-is now deprecated but still works. It should be replaced by code that in advance
-looks up the EVNTPVT event handle associated with the named event by
-calling eventNameToHandle(char *), and when that event occurs passes
-that handle to the new postEvent(EVNTPVT) routine (which may be called
-from interrupt level). A new iocsh command postEvent name will
-trigger a named event from the command-line or a startup script (on vxWorks the
-expression postEvent(eventNameToHandle("name")) must be used
-instead though).
-
-Parallel Builds
-
-
-As EPICS sites get computers with more CPUs they report additional bugs in our
-parallel build rules. Various issues have been fixed by separating out the build
-rules that generate dependency (.d) files, ensuring that they are constructed at
-the appropriate time in the build.
-
-
-These rule changes can cause additional warning messages to appear when building
-support modules. Where an application provides its own Makefile rules it may now
-have to add rules to construct an associated dependency file. In many cases
-though the change needed is just to replace a dependency for a
-target$(OBJ) with the target$(DEP) so this
-
-
- myLib$(OBJ): myLib_lex.c
-
-
-becomes
-
-
- myLib$(DEP): myLib_lex.c
-
-
-To debug build issues assocated with dependency files, use the command make
---debug=m which tells GNUmake to display information about what it is doing
-during the first pass when it updates its makefiles.
-
-
-Removed tsDefs.h
-
-
-The deprecated tsDefs API was provided for 3.13 compatibility only, and has now
-been removed. Convert any remaining code that used it to call the epicsTime API
-instead.
-
-
-Changes to epicsVersion.h
-
-
-The two macros EPICS_UPDATE_LEVEL and EPICS_CVS_SNAPSHOT have
-been deleted from the epicsVersion.h file; they were deprecated in R3.14 and can
-be replaced with EPICS_PATCH_LEVEL and EPICS_DEV_SNAPSHOT
-respectively.
-
-
-A new pair of macros has been added to make version number comparisons easier.
-Code that will not work with a version of Base before 3.15.0 can now be
-written like this to prevent it from compiling:
-
-
-#if defined(VERSION_INT) && EPICS_VERSION_INT < VERSION_INT(3,15,0,0)
-# error EPICS Base R3.15.0 or later is required
-#endif
-
-
-
-Added support for iocLogPrefix
-
-
-Added a iocLogPrefix command to iocsh. This adds a
-prefix to all messages from this IOC (or other log client) as they get sent to the
-iocLogServer. This lets sites use the "fac=<facility>" syntax for
-displaying the facility, process name etc. in log viewers like the
-cmlogviewer.
-
-
-Reworked the epicsEvent C & C++ APIs
-
-
- - Renamed the enum epicsEventWaitStatus to epicsEventStatus
- - Defined epicsEventWaitStatus as a macro for epicsEventStatus
- - Renamed epicsEventWaitOk to epicsEventOk
- - Renamed epicsEventWaitError to epicsEventError
- - Defined epicsEventWaitOK and epicsEventWaitError as macros
- - Added epicsEventTrigger(id) which triggers an event and returns OK or an
- error status if the underlying OS primitives report an error
- - Added epicsEventMustTrigger(id) which halts on error
- - Defined epicsEventSignal(id) as a macro for epicsEventMustTrigger(id)
- - Added a new C++ method epicsEvent::trigger() which throws an
- epicsEvent::invalidSemaphore in the event of an error
- - epicsEvent::signal() makes an inline call to epicsEvent::trigger()
- - epicsEventWait() and epicsEventWaitWithTimeout() now return an error
- status if the underlying OS primitives report an error
- - All the epicsEventMust...() routines are now implemented in the common
- libCom/osi/epicsEvent.cpp source file, and call cantProceed() instead of
- mis-using assert()
- - Implemented epicsEventShow() on Posix
- - Win32: Removed all epicsShareAPI decorations
-
-
-
-Enabled histogram record type
-
-
-The histogram record was not included in the base.dbd file in any 3.14 release,
-but has now been added along with its associated soft device support. The build
-system now generates the list of all the record.dbd files in base automatically
-in src/std/rec/Makefile.
-
-
-Reorganization of src/
-
-Reorganization of subdirectories of src/ to better represent the relation
-between different parts as described in the following table.
-
-This change also allows the number of libraries built to be reduced to:
-libCap5.so, libca.so, libdbCore.so, libdbStaticHost.so,
-libCom.so, libcas.so, libdbRecStd.so, and libgdd.so
-
-
-
- | Component |
- Dependency |
- Library name |
- Description |
-
-
- | src/tools |
- |
- |
- Build system scripts |
-
-
- | src/libCom |
- src/tools |
- Com |
- Utility routines and OS-independant API |
-
-
- | src/template |
- src/tools |
- |
- User application templates (e.g. makeBaseApp) |
-
-
- | src/ca/client |
- src/libCom |
- ca |
- Channel Access client |
-
-
- | src/ca/legacy/gdd |
- src/ca/client |
- gdd |
- Generic data layer for PCAS |
-
-
- | src/ca/legacy/pcas |
- src/ca/legacy/gdd |
- cas |
- Portable Channel Access Server |
-
-
- | src/ioc |
- src/ca |
- dbCore |
- Core database processing functions |
-
-
- | src/std |
- src/ioc |
- dbRecStd |
- Standard records, soft device support and the softIoc |
-
-
-
-
-In order to better reflect these relations the following
-directories and files were moved as described:
-
-
-
- | Relocations |
-
-
- | Previous | New |
-
-
- | libCom |
-
-
- | src/RTEMS |
- src/libCom/RTEMS |
-
-
- | src/toolsComm/flex |
- src/libCom/flex |
-
-
- | src/toolsComm/antelope |
- src/libCom/yacc |
-
-
- src/dbStatic/alarm.h .../alarmString.h |
- src/libCom/misc/ |
-
-
- | IOC Core Components |
-
-
- | src/bpt |
- src/ioc/bpt |
-
-
- | src/db |
- src/ioc/db |
-
-
- | src/dbStatic |
- src/ioc/dbStatic |
-
-
- | src/dbtools |
- src/ioc/dbtemplate |
-
-
- | src/misc |
- src/ioc/misc |
-
-
- | src/registry |
- src/ioc/registry |
-
-
- | src/rsrv |
- src/ioc/rsrv 1 |
-
-
- | Standard Record Definitions |
-
-
- | src/dev/softDev |
- src/std/dev |
-
-
- | src/rec |
- src/std/rec |
-
-
- | src/softIoc |
- src/std/softIoc |
-
-
- | Channel Access |
-
-
- | src/ca |
- src/ca/client |
-
-
- | src/catools |
- src/ca/client/tools |
-
-
- | src/cap5 |
- src/ca/client/perl |
-
-
- | src/gdd |
- src/ca/legacy/gdd |
-
-
- | src/cas |
- src/ca/legacy/pcas |
-
-
- | src/excas |
- src/ca/legacy/pcas/ex |
-
-
- | User Templates |
-
-
- | src/makeBaseApp |
- src/template/base |
-
-
- | src/makeBaseExt |
- src/template/ext |
-
-
- | Dispersed |
-
-
- | src/util 2 |
- src/ca/client |
-
-
- | src/ca/client/test |
-
-
- | src/libCom/log |
-
-
- | src/as 3 |
- src/libCom/as |
-
-
- | src/ioc/as |
-
-
-
-1
-RSRV is built as part of dbCore due to its tight (bidirectional) coupling
-with the other database code.
-
-2
-The contents for src/util/ moved to three locations. The caRepeater init script
-was moved to src/ca/client/. ca_test is now in src/ca/client/test/.
-The iocLogServer was moved into the same directory (src/libCom/log) as
-the log client code.
-
-3
-The Access Security code has been divided, with the parts not related to the
-database (lexer/parser and trap registration) becoming part of libCom.
-The remaining components are included in the dbCore library
-
-
-Moved src/RTEMS/base directory
-
-
-These files are now found under src/RTEMS.
-
-
-Removed 3.13 compatibility
-
-
-Removed the 3.13 <top>/config directory and build compatibility rules and
-variables, and various conversion documents.
-
-
-
diff --git a/documentation/RELEASE_NOTES.md b/documentation/RELEASE_NOTES.md
new file mode 100644
index 000000000..133c823a0
--- /dev/null
+++ b/documentation/RELEASE_NOTES.md
@@ -0,0 +1,1610 @@
+# EPICS Base Release 3.15.7
+
+This version of EPICS Base has not been released yet.
+
+## Changes made on 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](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).
+
+## Changes made between 3.15.2 and 3.15.3
+
+### Make the NTP Time provider optional on VxWorks
+
+Recent versions of VxWorks (sometime after VxWorks 6) provide facilities for
+automatically synchronizing the OS clock time with an NTP server. The EPICS time
+system used to assume that it had to provide time synchronization on VxWorks,
+but now it tests for the existance of either of the two OS synchronization
+threads before starting the NTP time provider. It is still possible to force the
+NTP provider to be started even if the OS synchronization is running by defining
+the environment variable `EPICS_TS_FORCE_NTPTIME` in the startup script
+before loading the IOC's `.munch` file. Forcing may be necessary if the VxWorks
+image is not correctly configured with the IP address of a local NTP server.
+
+### Assembling files from numbered snippets
+
+A tool has been added that assembles file snippets specified on the
+command line into a single output file, with sorting and replacing/adding of
+snippets done based on their file names. The build system integration requires
+the output file to be specified setting `COMMON_ASSEMBLIES` (arch independent)
+or `ASSEMBLIES` (created by arch), then defining the snippets for each assembly
+setting `*_SNIPPETS` (explicitly) or `*_PATTERN` (searched relative to all source
+directories).
+
+### Clean up after GNU readline()
+
+If EPICS Base is built with readline support, any IOC that calls epicsExit()
+from a thread other than the main thread is likely to leave the user's terminal
+in a weird state, requiring the user to run something like 'stty sane' to clean
+it up. This release patches the readline support code to clean up automatically
+by registering an epicsAtExit() routine.
+
+### Removed the last vestiges of `RSET::get_value()`
+
+The IOC has not called the `get_value()` routine in the RSET for a very long
+time, but there was still one implementation left in the event record support
+code, and a structure definition for one of the original arguments to that
+routine was defined in recGbl.h. Both of these have now been removed.
+
+## Changes made between 3.15.1 and 3.15.2
+
+### Raised limit on link field length in database files
+
+The length of INP/OUT link fields in database files was limited to 79 chars
+by an internal buffer size in the db file parser. This limitation will go away
+completely in 3.16, and has been statically raised to 255 chars for the 3.15
+series.
+
+### aoRecord raw conversion overflows
+
+The ao record type now checks converted raw values and limits them to the
+32-bit integer range before writing them to the RVAL field. Previously value
+overflows relied on Undefined Behaviour which could give different results on
+different platforms. The ROFF fields of the ao and ai record types are now
+`DBF_ULONG` to allow an ROFF setting of 0x80000000 to work properly.
+
+### Changes to `/cfg/*` files
+
+The order in which `cfg/CONFIG*` and `cfg/RULES*` files are included from support
+applications listed in the `configure/RELEASE*` files has been changed. Previously
+these files were included in the order in which the top areas are listed in the
+RELEASE file, but it makes more sense to load them in reverse order since later
+entries override earlier ones in Makefiles but the release file order is
+supposed to allow earlier entries to take precedence over later ones. The same
+change has been made to the inclusion of the `/configure/RULES_BUILD`
+files.
+
+Two new file types can also be provided in a module's `cfg` directory. Files
+named `TOP_RULES*` will be included by the top-level Makefile of other modules
+that refer to this module; files name `DIR_RULES*` will be included by all
+Makefiles that merely descend into lower-level directories. The `cfg/RULES*` files
+are only included when make is building code inside the `O.` directories.
+
+The new `cfg/DIR_RULES*` file inclusion was designed to permit new recursive
+make actions to be implemented by appending the name of the new action to the
+`ACTIONS` variable. There must be a matching rule in one of the `cfg/RULES*` files
+when doing this. Similar rules may also be defined in the `cfg/TOP_RULES*` and/or
+`cfg/DIR_RULES*` files, but these should only state prerequisites and not directly
+provide commands to be executed.
+
+### Build rules for RTEMS GESYS modules
+
+RTEMS target builds can now be configured to make GESYS modules by changing
+the `USE_GESYS=NO` setting in the file
+`configure/os/CONFIG_SITE.Common.RTEMS` to `YES`.
+
+### Added Make variables for command-line use
+
+The following variables are now used during the build process, reserved for
+setting on the command-line only (Makefiles should continue to use the
+`USR_` equivalents):
+
+ - `CMD_INCLUDES`
+ - `CMD_CPPFLAGS`
+ - `CMD_CFLAGS`
+ - `CMD_CXXFLAGS`
+ - `CMD_LDFLAGS`
+ - `CMD_DBFLAGS`
+ - `CMD_DBDFLAGS`
+ - `CMD_REGRDDFLAGS`
+ - `CMD_ARFLAGS`
+
+For example:
+
+```
+ make CMD_INCLUDES=/opt/local/include CMD_LDFLAGS=-L/opt/local/lib
+```
+
+### Enhanced API for asTrapWrite listeners
+
+External software such as the CA Put Logging module that registers a listener
+with the asTrapWrite subsystem was not previously given access to the actual
+data being sent by the CA client. In most cases this was not a problem as the
+listener can look at the field being modified both before and after the
+operation, but if the put processes the record which immediately overwrites the
+new value, the client's value cannot be observed.
+
+This release adds three fields to the asTrapWriteMessage structure that is
+passed to the listener routines. These new fields provide the CA data type, the
+number of array elements, and a pointer to the source data buffer. This change
+is completely backwards compatible with listener code written against the
+original API. The new API can be detected at compile-time as follows:
+
+```
+ #include "asLib.h"
+
+ /* ... */
+
+ #ifdef asTrapWriteWithData
+ /* Enhanced API */
+ #endif
+```
+
+### Use of `PATH_FILTER` in Makefiles deprecated
+
+The `PATH_FILTER` variable was being called to convert forward slashes
+`/` in file paths into pairs of backward slashes
+`\\` on Windows architectures. This has never been strictly
+necessary, and was added about 10 years ago to get around some short-comings in
+Windows tools at the time. All uses of `PATH_FILTER` in Base have now been
+removed; the definition is still present, but will result in a warning being
+printed if it is ever used.
+
+### Using msi for dependencies
+
+To reduce confusion the msi program has been modified to allow the generation
+of dependency rules by adding support for a `-D` option, and changing the
+commands in RULES.Db to use this option instead of the mkmf.pl script. The new
+build rules will not work with old versions of the msi program, so the command
+variable name used in the rules has been changed from `MSI` to `MSI3_15`. Sites that
+use a modified version of msi must provide support for both the `-D` and
+`-o outfile` options, and should then point the `MSI3_15` variable in
+their applications' `CONFIG_SITE` files to that updated executable.
+
+## Changes made between 3.15.0.2 and 3.15.1
+
+### `epicsStrnEscapedFromRaw()` and `epicsStrnRawFromEscaped()`
+
+These routines have been rewritten; the previous implementations did not
+always behave exactly as specified.
+
+### Shared Library Versions
+
+On architectures that can support it, the shared library version number for
+libraries provided with Base has had the third component of the EPICS version
+number added to it, thus libCom.so.3.15.1 instead of libCom.so.3.15. Windows
+can only support two components to its internal product version number, and the
+Darwin bug that external shared libraries were being built using the EPICS
+version number has been fixed.
+
+### Hooking into dbLoadRecords
+
+A function pointer hook has been added to the dbLoadRecords() routine, to
+allow external modules such as autosave to be notified when new records have
+been loaded during IOC initialization. The hook is called `dbLoadRecordsHook` and
+follows the model of the `recGblAlarmHook` pointer in that modules that wish to
+use it must save the current value of the pointer before installing their own
+function pointer, and must call the original function from their own
+routine.
+
+The hook is activiated from the `dbLoadRecords()` routine and gets called only
+after a database instance file has been read in without error. Note that the
+`dbLoadTemplates()` routine directly calls `dbLoadRecords()` so this hook also
+provides information about instantiated database templates. It is still possible
+to load record instances using `dbLoadDatabase()` though, and doing this will not
+result in the hook routines being called.
+
+Code to use this hook should look something like this:
+
+```
+ #include "dbAccessDefs.h"
+
+ static DB_LOAD_RECORDS_HOOK_ROUTINE previousHook;
+
+ static void myRoutine(const char* file, const char* subs) {
+ if (previousHook)
+ previousHook(file, subs);
+
+ /* Do whatever ... */
+ }
+
+ void myInit(void) {
+ static int done = 0;
+
+ if (!done) {
+ previousHook = dbLoadRecordsHook;
+ dbLoadRecordsHook = myRoutine;
+ done = 1;
+ }
+ }
+```
+
+As with many other parts of the static database access library there is no
+mutex to protect the function pointer. Initialization is expected to take place
+in the context of the IOC's main thread, from either a static C++ constructor or
+an EPICS registrar routine.
+
+## Changes made between 3.15.0.1 and 3.15.0.2
+
+### New iocshLoad command
+
+A new command `iocshLoad` has been added to iocsh which executes a
+named iocsh script and can also set one or more shell macro variables at the
+same time, the values of which will be forgotten immediately after the named
+script finishes executing. The following example shows the syntax:
+
+```
+ iocshLoad "serial.cmd", "DEV=/dev/ttyS0,PORT=com1,TYPE=RS485"
+ iocshLoad "radmon.cmd", "PORT=com1,ADDR=0"
+```
+
+### Support routines for 64-bit integers
+
+The libCom library now provides support for 64-bit integer types on all
+supported architectures. The epicsTypes.h header file defines epicsInt64 and
+epicsUInt64 type definitions for both C and C++ code. The epicsStdlib.h header
+also declares the following for parsing strings into the relevent sized integer
+variables: Functions epicsParseLLong(), epicsParseULLong() with related macros
+epicsScanLLong() and epicsScanULLong(), and the functions epicsParseInt64()
+and epicsParseUInt64(). Use the first two functions and the macros for long long
+and unsigned long long integer types, and the last two functions for the
+epicsInt64 and epicsUInt64 types. Note that the latter can map to the types long
+and unsigned long on some 64-bit architectures such as linux-x86\_64, not to the
+two long long types.
+
+This version does not provide the ability to define 64-bit record fields, the
+use of the 64-bit types in the IOC database will come in a later release of
+EPICS Base.
+
+### Full support for loadable support modules
+
+Apparently later versions of Base 3.14 permitted support modules to be loaded
+from a shared library at runtime without the IOC having been linked against that
+shared library; the registerRecordDeviceDriver.pl program would accept a partial
+DBD file containing just the entries needed for the library and generate the
+appropriate registration code. In 3.15 however the registerRecordDeviceDriver.pl
+program was replaced by one using the new DBD file parser, and in this a device
+support entry would only be accepted after first loading the record type that it
+depended on.
+
+The parser has been modified to accept device entries without having seen the
+record type first, although a warning is given when that happens. To remove the
+warning the DBD file can provide a record type declaration instead (no fields
+can be defined, so the braces must be empty), before the device() entry. The
+result will generate the correct registration code for the device entry without
+including anything for any merely declared record types. The generated code can
+be linked into a shared library and loaded by an IOC at runtime using dlload.
+
+### Parallel callback threads
+
+The general purpose callback facility can run multiple parallel callback
+threads per priority level. This makes better use of SMP architectures (e.g.
+processors with multiple cores), as callback work - which includes second
+stage processing of records with asynchronuous device support and I/O
+scanned processing - can be distributed over the available CPUs.
+
+Note that by using parallel callback threads the order of scan callback
+requests in the queue is not retained. If a device support needs to be
+informed when scanIoRequest processing has finished, it should use the new
+scanIoSetComplete() feature to add a user function that will be called after
+the scanIoRequest record processing has finished.
+
+Parallel callback threads have to be explicitly configured, by default
+the IOC keeps the old behavior of running one callback thread per priority.
+
+### Merge MMIO API from devLib2
+
+Added calls to handle 8, 16, and 32 bit Memory Mapped I/O reads and writes.
+The calls added include `X_iowriteY()` and `X_ioreadY()`
+where `X` is `nat` (native), `be` or `le`, and `Y` is `16` or `32`.
+Also added are `ioread8()` and `iowrite8()`.
+
+### Added optional dbServer API to database
+
+A server layer that sits on top of the IOC database may now register itself
+as such by calling `dbRegisterServer()` and providing optional routines
+that other components can use. The initial purpose of this API allows the Trace
+Processing implementation in `dbProcess()` to identify a client that
+causes a record to process when TPRO is set.
+
+To support the client identification, the server provides a routine that
+returns that identity string when called by one of its own processing
+threads.
+
+### Concatenated database definition files
+
+A series of database definition (dbd) files can now be concatenated during
+the build process into a newly-created dbd file with result being installed into
+`$(INSTALL_LOCATION)/dbd` without expanding it.
+
+The following lines in an EPICS Makefile will create a file name.dbd in the
+O.Common build directory containing the contents of file1.dbd followed by
+file2.dbd then file3.dbd. The new file will then be installed into
+`$(INSTALL_LOCATION)/dbd` without expanding any of its include statements.
+
+```
+ DBDCAT += name.dbd
+ name_DBD += file1.dbd file2.dbd file3.dbd
+```
+
+The source files file1.dbd, file2.dbd and file3.dbd may be created by the
+current Makefile, be located in the parent directory or any other directory in
+the `SRC_DIRS` list, be specified by their full pathname, exist in the install dbd
+directory, or be found in any dbd directory linked from the application's
+RELEASE files.
+
+### Posix: Drop `SCHED_FIFO` before exec() in child process
+
+If Base is compiled with `USE_POSIX_THREAD_PRIORITY_SCHEDULING = YES`
+in `configure/CONFIG_SITE` or related files, the Posix implementation of the
+libCom `osiSpawnDetachedProcess()` routine will switch the child process
+to use the normal `SCHED_OTHER` (non real-time) scheduler before executing the
+named executable program. If it needs to use the real-time scheduler the new
+program can request that for itself.
+
+### Posix: Lock all memory when running with FIFO scheduler
+
+On Posix systems, an IOC application's ability to meet timing deadlines is
+often dependent on its ability to lock part or all of the process's virtual
+address space into RAM, preventing that memory from being paged to the swap
+area. This change will attempt to lock the process's virtual address space into
+RAM if the process has the ability to run threads with different priorities. If
+unsuccessful, it prints an message to stderr and continues.
+
+On Linux, one can grant a process the ability to run threads with different
+priorities by using the command `ulimit -r unlimited`. To use the
+FIFO scheduler for an IOC, use a command like this:
+
+```
+ chrt -f 1 softIoc -d test.db
+```
+
+On Linux, one can grant a process the ability to lock itself into memory
+using the command `ulimit -l unlimited`. These limits can also be
+configured on a per user/per group basis by changing `/etc/security/limits.conf`
+or its equivalent.
+
+A child process created via `fork()` normally inherits its parent's resource
+limits, so a child of a real-time soft-IOC will get its parent's real-time
+priority and memlock limits. The memory locks themselves however are not
+inherited by child processes.
+
+### Implement `EPICS_CAS_INTF_ADDR_LIST` in rsrv
+
+The IOC server can now bind to a single IP address (and optional port number)
+read from the standard environment parameter `EPICS_CAS_INTF_ADDR_LIST`.
+Additional addresses included in that parameter after the first will be ignored
+and a warning message displayed at iocInit time.
+
+### alarmString.h deprecated again
+
+The string arrays that provide string versions of the alarm status and
+severity values have been moved into libCom and the header file that used to
+instanciate them is no longer required, although a copy is still provided for
+backwards compatibility reasons. Only the alarm.h header needs to be included
+now to declare the `epicsAlarmSeverityStrings` and `epicsAlarmConditionStrings`
+arrays.
+
+### General purpose thread pool
+
+A general purpose threaded work queue API epicsThreadPool is added.
+Multiple pools can be created with controllable priority and number
+of worker threads. Lazy worker startup is supported.
+
+### Database field setting updates
+
+A database (.db) file loaded by an IOC does not have to repeat the record
+type of a record that has already been loaded. It may replace the first
+parameter of the `record(type, name)` statement with an asterisk
+character inside double-quotes, `"*"` instead. Thus the following is a
+legal database file:
+
+```
+ record(ao, "ao1") {}
+ record("*", "ao1") {
+ field(VAL, 10)
+ }
+```
+
+Note that database configuration tools will not be expected to have to
+understand this syntax, which is provided for scripted and hand-coded database
+and template instantiation only. Setting the IOC's `dbRecordsOnceOnly`
+flag also makes this syntax illegal, since its purpose is to prevent
+multiply-defined records from being collapsed into a single instance.
+
+### Added echo command to iocsh
+
+The single argument string may contain escaped characters, which will be
+translated to their raw form before being printed (enclose the string in quotes
+to avoid double-translation). A newline is always appended to the output, and
+output stream redirection is supported.
+
+### Added macro `EPICS_UNUSED` to compilerDependencies.h
+
+To prevent the compiler from warning about a known-unused variable, mark it
+with the macro `EPICS_UNUSED`. On gcc and clang this will expand to
+`__attribute__((unused))` to prevent the warning.
+
+### User specified db substitution file suffix
+
+Per Dirk Zimoch's suggestion, a user specified db substitution file suffix is
+now allowed by setting the variable `SUBST_SUFFIX` in a configuration directory
+`CONFIG_SITE` file or in a Makefile before the include $(TOP)/configure/RULES
+line. The default for `SUBST_SUFFIX` is `.substitutions`
+
+### 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.
+
+### Added newEpicsMutex macro
+
+Internal C++ uses of `new epicsMutex()` have been replaced with a new
+macro which calls a new constructor, passing it the file name and line number of
+the mutex creation code. C code that creates mutexes has been using a similar
+macro for a long time, but there was no equivalent constructor for the C++
+wrapper class, so identifying a specific mutex was much harder to do.
+
+### Post `DBE_PROPERTY` events automatically
+
+A new record field attribute `prop(YES)` has been added to identify fields
+holding meta-data. External changes to these fields will cause a CA monitor
+event to be sent to all record subscribers who have asked for `DBE_PROPERTY`
+updates. Meta-data fields have been marked for all Base record types.
+
+### errlogRemoveListener() routine changed
+
+Code that calls `errlogRemoveListener(myfunc)` must be modified to use
+the new, safer routine `errlogRemoveListeners(myfunc, &pvt)` instead.
+The replacement routine takes a second argument which must be the same private
+pointer that was passed to `errlogAddListener()` when adding that
+listener. It also deletes all matching listeners (hence the new plural name) and
+returns how many were actually deleted, whereas the previous routine only
+removed the first listener that matched.
+
+### Simplified generation of .dbd files
+
+The Perl script `makeIncludeDbd.pl` has been removed and the rules
+that created an intermediate `xxxInclude.dbd` file from the
+Makefile variable `xxx_DBD` have been modified to generate the target
+`xxx.dbd` file directly. This should simplify applications that
+might have had to provide dependency rules for the intermediate files in 3.15.
+Applications which provide their own `xxxInclude.dbd` source file
+will continue to have it expanded as before.
+
+### New Undefined Severity field UDFS
+
+A new field has been added to dbCommon which configures the alarm severity
+associated with the record being undefined (when UDF=TRUE). The default value is
+INVALID so old databases will not be affected, but now individual records can be
+configured to have a lower severity or even no alarm when undefined. Be careful
+when changing this on applications where the IVOA field of output records is
+used, IVOA still requires an INVALID severity to trigger value replacement.
+
+### New build target “tapfiles”
+
+This new make target runs the same tests as the “runtests” target, but
+instead of summarizing or displaying the output for each test script it creates
+a “.tap” file inside the architecture build directory which contains the
+detailed test output. The output file can be parsed by continuous integration
+packages such as [Jenkins](http://www.jenkins-ci.org/) to show the
+test results.
+
+### Array field double-buffering
+
+Array data can now be moved, without copying, into and out of the VAL field
+of the waveform, aai, and aao record types by replacing the pointer in BPTR.
+The basic rules which device support must follow are:
+
+1. BPTR, and the memory it is currently pointing to, can only be accessed
+ while the record is locked.
+2. NELM may not be changed; NORD should be updated whenever the number of
+ valid data elements changes.
+3. When BPTR is replaced it must always point to a block of memory large
+ enough to hold the maximum number of elements, as given by the NELM and
+ FTVL fields.
+
+### Spin-locks API added
+
+The new header file epicsSpin.h adds a portable spin-locks API which is
+intended for locking very short sections of code (typically one or two lines of
+C or C++) to provide a critical section that protects against race conditions.
+On Posix platforms this uses the `pthread_spinlock_t` type if it's available and
+the build is not configured to use Posix thread priorities, but otherwise it
+falls back to a `pthread_mutex_t`. On the UP VxWorks and RTEMS platforms the
+implementations lock out CPU interrupts and disable task preemption while a
+spin-lock is held. The default implementation (used when no other implementation
+is provided) uses an epicsMutex. Spin-locks may not be taken recursively, and
+the code inside the critical section should be short and deterministic.
+
+### Improvements to aToIPAddr()
+
+The libCom routine aToIPAddr() and the vxWorks implementation of the
+associated hostToIPAddr() function have been modified to be able to look up
+hostnames that begin with one or more digits. The epicsSockResolveTest program
+was added to check this functionality.
+
+### mbboDirect and mbbiDirect records
+
+These record types have undergone some significant rework, and will behave
+slightly differently than they did in their 3.14 versions. The externally
+visible changes are as follows:
+
+##### mbbiDirect
+
+ - If the MASK field is set in a database file, it will not be over-written
+ when the record is initialized. This allows non-contiguous masks to be set,
+ although only the device support actually uses the MASK field.
+ - If process() finds the UDF field to be set, the record will raise a
+ UDF/INVALID alarm.
+
+##### mbboDirect
+
+ - If the MASK field is set in a database file, it will not be over-written
+ when the record is initialized. This allows non-contiguous masks to be set,
+ although only the device support actually uses the MASK field.
+ - After the device support's `init_record()` routine returns during record
+ initialization, if OMSL is “supervisory” and UDF is clear the fields
+ B0-BF will be set from the current VAL field.
+ - When a put to the OMSL field sets it to “supervisory”, the fields
+ B0-BF will be set from the current VAL field. This did not used to happen,
+ the individual bit fields were previously never modified by the record.
+ Note that this change may require some databases to be modified, if they
+ were designed to take advantage of the previous behavior.
+
+### Redirection of the errlog console stream
+
+A new routine has been added to the errlog facility which allows the console
+error message stream to be redirected from stderr to some other already open
+file stream:
+
+```
+ int errlogSetConsole(FILE *stream);
+```
+
+The stream argument must be a `FILE*` pointer as returned by `fopen()` that is
+open for output. If `NULL` is passed in, the errlog thread's stderr output stream
+will be used instead. Note that messages to the console can be disabled and
+re-enabled using the `eltc` routine which is also an iocsh command, but there is
+no iocsh command currently provided for calling `errlogSetConsole()`.
+
+### Add cleanup subroutine to aSub record
+
+An aSub routine may set the CADR field with a function pointer which will be
+run before a new routine in the event that a change to the SNAM field changes
+the record's process subroutine.
+
+This can be used to free any resources the routine needs to allocate. It can
+also be used to determine if this is the first time this routine has been called
+by this record instance. The CADR field is set to NULL immediately after the
+routine it points to is called.
+
+Example:
+
+```
+ void cleanup(aSubRecord* prec) {
+ free(prec->dpvt);
+ prec->dpvt = NULL;
+ }
+
+ long myAsubRoutine(aSubRecord* prec) {
+ if (!prec->cadr) {
+ /* check types of inputs and outputs */
+ if (prec->ftva != menuFtypeDOUBLE)
+ return 1; /* oops */
+
+ dpvt = malloc(42);
+ prec->cadr = &cleanup;
+ }
+
+ /* normal processing */
+ }
+ epicsRegisterFunction(myAsubRoutine);
+```
+
+### Sequence record enhancements
+
+The sequence record type now has 16 link groups numbered 0 through 9 and A
+through F, instead of the previous 10 groups numbered 1 through 9 and A. The
+changes to this record are directly equivalent to those described below for the
+fanout record. The fields OFFS and SHFT have been added and operate on the SELN
+value exactly the same way. The result is backwards compatible with the 3.14
+version of the sequence record as long as none of the new fields are modified
+and the application does not rely on the SOFT/INVALID alarm that was generated
+when the selection number exceeded 10. The record also now posts monitors on the
+SELN field at the end of the sequence if its value changed when read through the
+SELL link.
+
+### Fanout record enhancements
+
+The fanout record type now has 16 output links LNK0-LNK9 and LNKA-LNKF, plus
+two additional fields which make the result backwards compatible with 3.14
+databases, but also allow the link selection to be shifted without having to
+process the SELN value through a calc or calcout record first.
+
+Previously there was no LNK0 field, so when SELM is “Mask” bit 0 of SELN
+controls whether the LNK1 link field was activated; bit 1 controls LNK2 and so
+on. When SELM is “Specified” and SELN is zero no output link would be
+activated at all; LNK1 gets activated when SELN is 1 and so on. Only 6 links
+were provided, LNK1 through LNK6. The updated record type maintains the original
+behavior when the new fields are not configured, except that the SOFT/INVALID
+alarm is not generated when SELN is 7 through 15.
+
+The update involved adding a LNK0 field, as well as fields LNK7 through LNK9
+and LNKA through LNKF. To add flexibility and maintain backwards compatibility,
+two additional fields have been added:
+
+ - **OFFS**
+ This field holds a signed offset which is added to SELN to select which link
+ to activate when SELM is “Specified”. If the resulting value is outside the
+ range 0 .. 15 the record will go into a SOFT/INVALID alarm state. The default
+ value of OFFS is zero, so if it is not explicitly set and SELN is 1 the LNK1
+ link will be activated.
+ - **SHFT**
+ When SELM is “Mask” the signed field SHFT is used to shift the SELN
+ value by SHFT bits (positive means right-wards, values outside the range -15 ..
+ 15 will result in a SOFT/INVALID alarm), before using the resulting bit-pattern
+ to control which links to activate. The default value is -1, so if SHFT is not
+ explicitly set bit 0 of SELN will be used to control whether LNK1 gets
+ activated.
+
+The record also now posts monitors on the SELN field if it changes as a
+result of record processing (i.e. when read through the SELL link).
+
+### Deleted Java build rules
+
+Java has its own build systems now, so we've deleted the rules and associated
+variables from Base, although they might get added to the Extensions build rules
+for a while in case anyone still needs them.
+
+## Changes made between 3.14.x and 3.15.0.1
+
+### Application clean rules
+
+The `clean` Makefile target has changed between a single-colon rule
+and a double-colon rule more than once in the life of the EPICS build rules, and
+it just changed back to a single-colon rule, but now we recommend that
+applications that wish to provide a Makefile that is backwards compatible with
+the 3.14 build rules use the construct shown below. The 3.15 rules now support
+a variable called `CLEANS` to which a Makefile can add a list of files to
+be deleted when the user does a `make clean` like this:
+
+```
+ CLEANS +=
+
+ ifndef BASE_3_15
+ clean::
+ $(RM) $(CLEANS)
+ endif
+```
+
+The conditional rule provides compatibility for use with the 3.14 build
+system.
+
+### MSI included with Base
+
+An enhanced version of the Macro Substitution and Include program “msi”
+has been included with Base. Both this new version of msi and the IOC's
+`dbLoadTemplates` command now support setting global macros in
+substitution files, and `dbLoadTemplates` can now take a list of global
+macro settings as the second argument on its command line. The substitution file
+syntax is documented in the Application Developers Guide.
+
+### Cross-builds targeting win32-x86-mingw
+
+Some Linux distributions now package the MinGW cross-compiler which makes it
+possible to cross-build the win32-x86-mingw target from a linux-x86 host. Build
+configuration files for this combination are now included; adjust the settings
+in `configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw` and add win32-x86-mingw to
+the `CROSS_COMPILER_TARGET_ARCHS` variable in `configure/CONFIG_SITE` or in
+`configure/os/CONFIG_SITE.linux-x86.Common`.
+
+### Architecture win32-x86-cygwin Removed
+
+The ability to compile non-cygwin binaries using the Cygwin build tools is no
+longer supported by current versions of Cygwin, so this architecture has been
+removed. Use the MinWG tools and the win32-x86-mingw architecture instead.
+
+### RTEMS and VxWorks Test Harnesses
+
+The original libCom test harness has been renamed `libComTestHarness`,
+and two additional test harnesses have been created `dbTestHarness` and
+`filterTestHarness` which are all built for RTEMS and vxWorks targets.
+The new ones include tests in src/ioc/db/test and src/std/filters/test.
+
+Running the new tests requires additional .db and .dbd files to be loaded at
+runtime, which can be found in the relevant source directory or its O.Common
+subdirectory. If the target can access the Base source tree directly it may be
+simplest to cd to the relevant source directory before running the test. If not,
+the files needed are listed in the generated 'testspec' file found in the
+associated build (O.*arch*) directory.
+
+For RTEMS users the current directory is determined in a BSP specific way.
+See `rtems_init.c` and `setBootConfigFromNVRAM.c` in `src/libCom/RTEMS`.
+
+### New API to hook into thread creation
+
+A hook API has been added allowing user-supplied functions to be called
+whenever a thread starts. The calls are made from the thread's context,
+and can be used to control additional thread properties not handled inside
+EPICS base, e.g. setting the scheduling policy or CPU affinity (on SMP
+systems).
+
+The API also supports a mapping operation, calling a user-supplied function
+for every thread that is currently running.
+
+### New scan rate units
+
+Scan rates defined in the menuScan.dbd file may now be specified in seconds,
+minutes, hours or Hertz, and plural time units will also be accepted (seconds
+are used if no unit is mentioned in the choice string). At `iocInit` each
+scan rate is compared with the OS's clock tick and a warning printed if the
+rate is too fast or likely to be more than 10% different to the requested rate.
+For example the rates given below are all valid, although non-standard (the
+default menuScan choices that come with Base have not been changed):
+
+```
+ menu(menuScan) {
+ choice(menuScanPassive, "Passive")
+ choice(menuScanEvent, "Event")
+ choice(menuScanI_O_Intr, "I/O Intr")
+ choice(menuScan1_hour, "1 hour")
+ choice(menuScan0_5_hours, "0.5 hours")
+ choice(menuScan15_minutes, "15 minutes")
+ choice(menuScan5_minutes, "5 minutes")
+ choice(menuScan1_minute, "1 minute")
+ choice(menuScan10_seconds, "10 seconds")
+ choice(menuScan5_seconds, "5 seconds")
+ choice(menuScan2_seconds, "2 seconds")
+ choice(menuScan1_second, "1 second")
+ choice(menuScan2_Hertz, "2 Hertz")
+ choice(menuScan5_Hertz, "5 Hertz")
+ choice(menuScan10_Hertz, "10 Hz")
+ }
+```
+
+### Alarm filtering added to input record types
+
+The record types ai, calc, longin and mbbi have a new alarm filter added to
+them. This provides a low-pass filter that can be used to delay the reporting of
+alarms caused by the input level passing the HIGH, HIHI, LOW or LOLO values. The
+filter is controlled with a new AFTC field that sets the filter's time constant.
+The default value for this field is zero, which keeps the record's original
+alarm behaviour.
+
+The record must be scanned often enough for the filtering action to work
+effectively and the alarm severity can only change when the record is processed,
+but that processing does not have to be regular; the filter uses the time since
+the record last processed in its calculation. Setting AFTC to a positive number
+of seconds will delay the record going into or out of a minor alarm severity or
+from minor to major severity until the input signal has been in that range for
+that number of seconds.
+
+### Post events on Waveform record's NORD field
+
+When the record type or device support modify the NORD field of a waveform
+record, the record support code now posts `DBE_VALUE` and `DBE_LOG` events for that
+field, signaling the array length change to any client monitoring the NORD
+field.
+
+### Attributes of Non-VAL Fields
+
+Non-VAL fields now report meaningful information for precision, units,
+graphic limits, control limits, and alarm limits instead of simply using
+PREC, EGU, HOPR, LOPR, DRVL, DRVH, HIHI, HIGH, LOW, and LOLO. All delay
+fields have a default precision of 2 digits, units "s" and control limits
+of 0 to 100,000 seconds (these precision and limit values can be changed
+for each record type as a whole at runtime by updating a registered global
+variable). Input fields like A-L of the calc record read their metadata
+from the corresponding INPn link if possible.
+
+#### epicsStdioRedirect.h merged into epicsStdio.h
+
+The definitions from the header file epicsStdioRedirect.h have been moved
+into epicsStdio.h so all calls to printf(), puts() and putchar() in files that
+include that OSI header will now be subject to stdout redirection. In past
+releases (3.14.7 and later) it was necessary to request the redirection support
+by including the epicsStdioRedirect.h header file. The header file is still
+provided, but now it just includes epicsStdio.h.
+
+#### Named Soft Events
+
+Soft events can now be given meaningful names instead of just using the
+numbers 1-255. The EVNT field is now a `DBF_STRING`. The `post_event()` API
+is now deprecated but still works. It should be replaced by code that in advance
+looks up the `EVNTPVT` event handle associated with the named event by
+calling `eventNameToHandle(char *)`, and when that event occurs passes
+that handle to the new `postEvent(EVNTPVT)` routine (which may be called
+from interrupt level). A new iocsh command `postEvent name` will
+trigger a named event from the command-line or a startup script (on vxWorks the
+expression `postEvent(eventNameToHandle("name"))` must be used
+instead though).
+
+#### Parallel Builds
+
+As EPICS sites get computers with more CPUs they report additional bugs in our
+parallel build rules. Various issues have been fixed by separating out the build
+rules that generate dependency (.d) files, ensuring that they are constructed at
+the appropriate time in the build.
+
+These rule changes can cause additional warning messages to appear when building
+support modules. Where an application provides its own Makefile rules it may now
+have to add rules to construct an associated dependency file. In many cases
+though the change needed is just to replace a dependency for a
+`target$(OBJ)` with the `target$(DEP)` so this
+
+```
+ myLib$(OBJ): myLib_lex.c
+```
+
+becomes
+
+```
+ myLib$(DEP): myLib_lex.c
+```
+
+To debug build issues associated with dependency files, use the command
+`make --debug=m` which tells GNUmake to display information about what it is doing
+during the first pass when it updates its makefiles.
+
+### Removed tsDefs.h
+
+The deprecated tsDefs API was provided for 3.13 compatibility only, and has now
+been removed. Convert any remaining code that used it to call the epicsTime API
+instead.
+
+### Changes to epicsVersion.h
+
+The two macros `EPICS_UPDATE_LEVEL` and `EPICS_CVS_SNAPSHOT` have
+been deleted from the epicsVersion.h file; they were deprecated in R3.14 and can
+be replaced with `EPICS_PATCH_LEVEL` and `EPICS_DEV_SNAPSHOT`
+respectively.
+
+A new pair of macros has been added to make version number comparisons easier.
+Code that will not work with a version of Base before 3.15.0 can now be
+written like this to prevent it from compiling:
+
+```
+ #if defined(VERSION_INT) && EPICS_VERSION_INT < VERSION_INT(3,15,0,0)
+ # error EPICS Base R3.15.0 or later is required
+ #endif
+ ```
+
+### Added support for iocLogPrefix
+
+Added a `iocLogPrefix` command to `iocsh`. This adds a
+prefix to all messages from this IOC (or other log client) as they get sent to the
+iocLogServer. This lets sites use the `fac=` syntax for
+displaying the facility, process name etc. in log viewers like the
+`cmlogviewer`.
+
+### Reworked the epicsEvent C & C++ APIs
+
+ - Renamed the enum epicsEventWaitStatus to epicsEventStatus
+ - Defined epicsEventWaitStatus as a macro for epicsEventStatus
+ - Renamed epicsEventWaitOk to epicsEventOk
+ - Renamed epicsEventWaitError to epicsEventError
+ - Defined epicsEventWaitOK and epicsEventWaitError as macros
+ - Added epicsEventTrigger(id) which triggers an event and returns OK or an
+ error status if the underlying OS primitives report an error
+ - Added epicsEventMustTrigger(id) which halts on error
+ - Defined epicsEventSignal(id) as a macro for epicsEventMustTrigger(id)
+ - Added a new C++ method epicsEvent::trigger() which throws an
+ epicsEvent::invalidSemaphore in the event of an error
+ - epicsEvent::signal() makes an inline call to epicsEvent::trigger()
+ - epicsEventWait() and epicsEventWaitWithTimeout() now return an error
+ status if the underlying OS primitives report an error
+ - All the epicsEventMust...() routines are now implemented in the common
+ libCom/osi/epicsEvent.cpp source file, and call cantProceed() instead of
+ mis-using assert()
+ - Implemented epicsEventShow() on Posix
+ - Win32: Removed all epicsShareAPI decorations
+
+### Enabled histogram record type
+
+The histogram record was not included in the base.dbd file in any 3.14 release,
+but has now been added along with its associated soft device support. The build
+system now generates the list of all the record.dbd files in base automatically
+in src/std/rec/Makefile.
+
+### Reorganization of src/
+
+Reorganization of subdirectories of src/ to better represent the relation
+between different parts as described in the following table.
+
+This change also allows the number of libraries built to be reduced to:
+libCap5.so, libca.so, libdbCore.so, libdbStaticHost.so,
+libCom.so, libcas.so, libdbRecStd.so, and libgdd.so
+
+| Component | Dependency | Library name | Description |
+| ------------------ | ----------------- | ------------ | ----------------------------------------------------- |
+| src/tools | | | Build system scripts |
+| src/libCom | src/tools | Com | Utility routines and OS-independant API |
+| src/template | src/tools | | User application templates (e.g. makeBaseApp) |
+| src/ca/client | src/libCom | ca | Channel Access client |
+| src/ca/legacy/gdd | src/ca/client | gdd | Generic data layer for PCAS |
+| src/ca/legacy/pcas | src/ca/legacy/gdd | cas | Portable Channel Access Server |
+| src/ioc | src/ca | dbCore | Core database processing functions |
+| src/std | src/ioc | dbRecStd | Standard records, soft device support and the softIoc |
+
+In order to better reflect these relations the following
+directories and files were moved as described:
+
+#### Relocations
+
+Category | Previous | New
+:--- | :--- | :---
+libCom | srcRTEMS | src/libCom/RTEMS
+| | src/toolsComm/flex | src/libCom/flex |
+| | src/toolsComm/antelope | src/libCom/yacc
+| | src/dbStatic/alarm.h | src/libCom/misc
+| | .../alarmString.h | src/libCom/misc
+IOC Core Components | src/bpt | src/ioc/bpt
+| | src/db | src/ioc/db
+| | src/dbStatic | src/ioc/dbStatic
+| | src/dbtools | src/ioc/dbtemplate
+| | src/misc | src/ioc/misc
+| | src/registry | src/ioc/registry
+| | src/rsrv | src/ioc/rsrv [1](#rsrv)
+Standard Record Definitions | src/dev/softDev | src/std/dev
+| | src/rec | src/std/rec
+| | src/softIoc | src/std/softIoc
+Channel Access | src/ca | src/ca/client
+| | src/catools | src/ca/client/tools
+| | src/cap5 | src/ca/client/perl
+| | src/gdd | src/ca/legacy/gdd
+| | src/cas | src/ca/legacy/pcas
+| | src/excas | src/ca/legacy/pcas/ex
+User Templates | src/makeBaseApp | src/template/base
+| | src/makeBaseExt | src/template/ext
+Dispersed | src/util [2](#util) | src/ca/client
+| | | src/ca/client/test
+| | | src/libCom/log
+| | src/as [3](#as) | src/libCom/as
+| | | src/ioc/as
+
+1
+RSRV is built as part of dbCore due to its tight (bidirectional) coupling
+with the other database code.
+
+2
+The contents for src/util/ moved to three locations. The caRepeater init script
+was moved to src/ca/client/. `ca_test` is now in src/ca/client/test/.
+The iocLogServer was moved into the same directory (src/libCom/log) as
+the log client code.
+
+3
+The Access Security code has been divided, with the parts not related to the
+database (lexer/parser and trap registration) becoming part of libCom.
+The remaining components are included in the dbCore library
+
+### Moved src/RTEMS/base directory
+
+These files are now found under src/RTEMS.
+
+### Removed 3.13 compatibility
+
+Removed the 3.13 `/config` directory and build compatibility rules and
+variables, and various conversion documents.