EPICS Base Release

This is the final release in the Base-3.14 series, please upgrade to the Base-3.15 series or to EPICS 7.

Changes between and

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:

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.

Back-port podToHtml.pl and Rules from Base-3.15

This script permits Base to be built with Perl installations that do not provide the podchecker and pod2html scripts (e.g. Fedora 27).

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.

Changes between and

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 between and

Launchpad Bug-fixes

In addition to the more detailed change descriptions below, the following Launchpad bugs have also been fixed in this release:

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

Build configuration files have been back-ported from the 3.15 branch that allow cross-building of the windows-x64-mingw target from either linux-x86 or linux-x86_64 hosts. Similar support for the 32-bit win32-x86-mingw cross-target was added in Base- Adjust the settings in the configuration file configure/os/CONFIG_SITE.linux-x86.windows-x64-mingw and add windows-x64-mingw to the CROSS_COMPILER_TARGET_ARCHS variable in configure/CONFIG_SITE or in configure/os/CONFIG_SITE.linux-x86.Common.

The Linux MinGW cross-builds now use the compiler flags -static-libgcc -static-libstdc++ which avoids having to copy some DLLs onto the Windows system to be able to run the generated binaries. These compiler flags can be disabled by editing the configure/os/CONFIG_SITE.linux-x86.target file for Linux distributions where the cross-build toolset doesn't make static versions of those libraries available. The RHEL-6.8 MinGW toolset does not package a static version of the library winpthread-1 so on that host OS it is still necessary to provide a copy of the libwinpthread-1.dll file for the Windows system to use. The simplest way to do this is to manually copy it into the IOC application's bin/win32-x86-mingw or bin/windows-x64-mingw directory after building the IOC, like this (note that Windows DLLs are always installed into the bin directory, not the lib directory):

$ cp /usr/i686-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll bin/win32-x86-mingw
$ cp /usr/x86_64-w64-mingw32/sys-root/mingw/bin/libwinpthread-1.dll bin/windows-x64-mingw

Some additional MinGW-specific changes have also been back-ported from the Base-3.15 branch.

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.

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.

ipAddrToAsciiAsync.: Don't try to join the daemon thread

On process exit, no longer try to stop the worker thread used by to make DNS lookups asynchronous. Previously this would wait for any cancelled, but still in progress, lookups. 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.

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.

Changes between and

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.

MinGW Cross-builds from Linux

Build configuration files have been back-ported from the 3.15 branch that allows cross-building of the win32-x86-mingw target from either linux-x86 or linux-x86_64 hosts. Many Linux distributions now package the necessary MinGW cross-build tools and libraries to support this. 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.

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):

For example:

make CMD_INCLUDES=/opt/local/include CMD_LDFLAGS=-L/opt/local/lib

Back-ported dbLoadRecordsHook from the 3.15 branch

See the Release Notes from the Base 3.15.1 release for details.

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 */

Back-ported the tapfiles build target from 3.15

This GNUmake 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.

Fix buffer overflow in epicsStrnRawFromEscaped()

Launchpad bug 1388313 reported by Bruce Hill and Chris Ford.

Better Cygwin IOC Application Support

IOC applications built for Cygwin with shared libraries need to have PATH configured to include all of the bin directories for support modules listed in the RELEASE file. For applications run from the Windows cmd.exe shell the Makefile in the application's iocBoot/ioc directory can be set to build a file dllPath.bat which performs the appropriate changes to PATH, but this file uses syntax which is unique to the cmd.exe shell. Cygwin applications can now add a target relPaths.sh to this Makefile, which will generate a file appropriate for sourcing in the Bash shell instead.

The makeBaseApp.pl templates now include this file in the list of targets to be built in the iocBoot/ioc/Makefile for Cygwin architectures.

Reject NULL callback functions in ca_array_*_callback

The two CA routines ca_array_get_callback() and ca_array_put_callback() were not checking the pfunc callback function argument for NULL. Passing in a NULL would cause the client library to segfault when the callback was called. Doing this will now result in the error status ECA_BADFUNCPTR being returned. This chage fixes Launchpad bug 1369626.

Support for Solaris 11

The build rules have been updated to support Solaris 11. Note that APS staff may not be able to maintain EPICS on Solaris for much longer, so the existing support code is likely to bit-rot and future versions of the OS may not be able to build or run EPICS applications unless someone else picks up the maintenance tasks.

Generating OS-specific include files

A fix has been applied to the build rules to permit OS-specific header files to be generated by adding them to the appropriate INC_<osclass> variable. To avoid problems with parallel builds, the rule to generate a header file should look something like this:

	$(MKDIR) -p $(dir $@)
	generate-file -o $(notdir $@)
	$(MV) $(notdir $@) $@

Added CA->version function to CA Perl Bindings

This new function returns the version string from Base. The ca*.pl tools have been updated to display this in their help output.

epicsString.h comparison functions fixed

The case-independent string comparison functions epicsStrCaseCmp() and epicsStrnCaseCmp() were returning incorrect results when the strings did not match; if the left-hand string is a shorter sub-set of the right-hand one the result should be -1. These functions now match their BSD equivalents.

Windows -static targets included

The win32-x86 and windows-x64 host target architectures can now cross-build the associated -static target, i.e. win32-x86-static or windows-x64-static (these targets can also be used as regular host architectures). Users could always have added configuration files themselves to build these, but we needed them for continuous integration testing of static builds.

iOS Build Rules fixed

The problem building for the ios-x86 simulator target architecture has been resolved.

Changes between and

New test for environment variables

A new test program epicsEnvTest has been added to the libCom tests which checks environment variable APIs. It was written to confirm that threads see environment variable values that have been set in their parent thread. VxWorks 6.x boot images must be configured with ENV_VAR_USE_HOOKS set to FALSE for the correct behaviour to occur (a test failure on VxWorks explains this).

Inclusion of <top>/cfg/* files refined

The way the build system includes files installed in the <top>/cfg/* directory has been cleaned up. Files whose names begin with CONFIG will now get included by the CONFIG step, and files whose names begin with RULES will get included in the RULES step. These files are only ever included when GNUMake is working in an application build (O.) directory and T_A is defined, so they cannot be used to create generic build targets at other levels.

Files whose names don't start with either CONFIG or RULES are no longer included automatically, but such files can still be installed into <top>/cfg by naming them in the CFG variable.

Fixed iocsh stream redirection for several commands

A number of iocsh commands did not respond correctly to redirection of their output using the iocsh '>file' or '2>error-file' syntax, and redirecting an empty command could create files with garbage names. There may still be a few commands that do not properly redirect their output, please notify the core developers if you discover any. Thanks to Eric Norum for the iocsh changes.

For externally developed commands, the simplest way to support redirection in your C/C++ code is to #include "epicsStdioRedirect.h" instead of stdio.h.

Fixed crash on loading record instance of unknown type

Fixed segfault when dbLoadRecords tried to load a record of a type that was not defined in its DBD files.

Hex literal support in epicStrtod()

Some OS implementations of the standard C library routine strtod() do not recognize hexadecimal integers, in particular the libraries provided on Windows and VxWorks. The internal implementation of epicsStrtod() that these targets use now recognizes the 0x prefix and will convert hex numbers correctly. Thanks to Dirk Zimoch for suggesting this change.

Added support for 64-bit Cygwin and MinGW targets

Both windows-x64-mingw and cygwin-x86_64 build targets are now provided.

Windows build issues

Thanks to Peter Heesterman for suggesting a number of small changes that clean up build issues on Windows, mostly related to symbol import and export to/from DLLs.

CAS: GDD Reference Count Underflow

Thanks to Bruce Hill a source of an underflow in a GDD reference count in the CAS code has been fixed.

Support for Apple Xcode 5.0

This adds the ability to build for iOS 7.0 and the ARMv8 64-bit CPU on the newest iPhone 5S device. Unfortunately the Xcode upgrade breaks the build of the ios-x86 simulator target, although the ios-arm target successfully builds code which runs fine on the real hardware.

Reading TSEL field

The TSEL link field has two complementary uses; it is read to fetch a time-stamp event number for the TSE field, or if pointed to the .TIME field of another record the record's timestamp is copied directly from the target record. However with the latter usage if the TSEL link is itself read back instead of pointing to the .TIME field the link appears to have changed to point to the VAL field. This is due to an internal detail, and makes it impossible to save the TSEL field's value using autosave. This has been fixed, and now the TSEL field should always read back the same PV that it was pointed to.

dbLoadTemplate variable limits adjustable

The dbLoadTemplate command used to allocate a fixed amount of memory for the template macro values that it used to 5000 bytes, and also limited the number of variables that could defined to 100. These limits can now be changed at runtime using the variable dbTemplateMaxVars which sets the maximum number of macro variables that can be used; the amount of memory allocated for value storage is 50 times this number. This variable is registered as an iocsh variable in the base.dbd file, and can be adjusted as necessary before each individual call to dbLoadTemplate.

The code now checks for and prevents any attempt to define more than the set number of variables, but it does not check for overruns of the storage buffer. This means that template files which define many long macro value strings could still cause a buffer overflow and crash the IOC at startup, but increasing the variable is all that is needed to allow that template file to be loaded.

Improvements to dbpf

It is now possible to use the dbpf command to put a long string value into a UCHAR array field, previously only CHAR arrays were supported by this command even though through Channel Access could put a long string to either type. The error message printed by dbpf when a value conversion fails has also been significantly improved.

Support for VxWorks 6.9

Various changes have been made that were needed to allow Base to build and run properly on VxWorks 6.9.

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.

Added osdFindSymbol for Windows

Dirk Zimoch implemented the epicsLoadLibrary(), epicsLoadError() and epicsFindSymbol() routines for Windows OS targets.

More dbStatic commands accept "" or "*" to mean 'all'

The IOC commands dbDumpRecordType, dbDumpMenu and dbDumpRecord will now accept either an empty string or any string beginning with an asterisk '*' to mean all record types or menus. Previously the 'all' option for these commands required passing in a NULL value, which could be done from the vxWorks shell but was not possible from iocsh.

VxWorks sysAtReboot Registration

The increasing intelligence of the GNU compiler and linker broke the method that was being used by the VxWorks code to register a reboot hook that can close down TCP connections nicely before the network stack gets disabled. This has been fixed and no longer uses a C++ static contructor to execute that code.


An IOC application that sets INSTALL_LOCATION in its configure/CONFIG_SITE file no longer has to set IOCS_APPL_TOP there as well, unless the IOC uses a different path than the build host to reach the application's top directory in its filesystem. The IOCS_APPL_TOP variable now defaults to the value of INSTALL_LOCATION, so setting the latter automatically sets the former. This change fixes Launchpad bug 1165257.


Moved the declaration of bcopyLongs() from this header into RTEMS/osdVME.h. Its original location broke the build for vxWorks 6.9 (the int nlongs argument becomes size_t in 6.9, thus conflicting with this declaration). The only local implementation of this routine is found in RTEMS/devLibVMEOSD.c, but it is not used anywhere in Base.

Allow empty database files

The IOC used to report an error if dbLoadRecords or dbLoadDatabase was asked to load an empty file or one containing just whitespace and/or comments. Such files are now permitted, simplifying the task of automated database generation programs which might discover they have nothing to output.

High-Resolution Time Provider on MacOS

MacOS does not provide the clock_gettime() API with CLOCK_REALTIME that other Posix systems implement, so we previously used gettimeofday() to fetch the current date & time from the OS. That older routine only provides the time with a resolution of 1 microsecond though, whereas clock_gettime() gives results with a nanosecond resolution. This release uses a new MachTime time provider on MacOS which uses the Mach Kernel's CALENDAR_CLOCK service to fetch the time, and provides nanosecond resolution.

Time drift in periodic scans

The implementation of the periodic scan code has been modified to remove long-term drift associated with OS thread sheduling. The new code keeps scan times much more closely tied to the system clock tick, only allowing the scan period to drift if the record processing time takes longer to execute than the interval between scans. If this happens the scan thread is made to wait for an additional half-period but at most 1 second before the records are scanned again, to allow lower priority threads some time to process on a preemptive priority scheduled OS. After 10 repeated over-runs a warning will be logged, with an increasing delay between messages up to hourly.

This fixes launchpad bug 597054.

Changes between and

Hex literals in CALC expressions

In previous releases, CALC expressions could contain hexadecimal literal integers on a target if the OS implementation of strtod() allows them (the vxWorks implementation does not). Now hex literal integers can be used in CALC expressions on all architectures. Hexadecimal floating point literals may have worked on some architectures in the past, but will no longer be accepted.

CAS: Added propertyEventMask support

Server tools should now be able to detect subscriptions to and send updates for DBE_PROPERTY events, using a casEventMask value returned by the new caServer::propertyEventMask() method.

caRepeater now built by default

Previously caRepeater was only built for host architectures, so builds for cross-compiled but workstation-type targets like linux-arm did not build it. Explicit exceptions prevent it being built on architectures like vxWorks, RTEMS and iOS which do not support normal executable programs.

Array Subroutine (aSub) record type fixes

Problem with NAN values in MLST/ALST fields

The ai, ao, calc, calcout, dfanout, sel and sub record types could stop posting monitors if they got NAN values in their MLST or ALST fields. A change has been included so this should no longer be the case.

MacOS build defaults changed

The default build settings for darwin-x86 targets have been changed to match the latest version of XCode; see configure/os/CONFIG_SITE.Common.darwin-x86 if you need to revert back to building with GCC or to include the i386 CPU architecture.

Build problem with db dependencies

The dependency output for .db and .acf files created by makeDbDepends.pl did not show the directories of the depended files. The makeDbDepends.pl script has been replaced by mkmf.pl for this purpose after modifying it to accept multiple -I include directory options and more than one source file on the command line. The makeDbDepends.pl script has been removed from Base.

Native linux-arm builds added

The configuration files needed for a linux-arm system to build Base for itself have now been added. Both the Shell and Perl versions of the startup EpicsHostArch scripts now recognize both arm6l and arm7l CPUs and return the generic linux-arm host architecture name for them.

New Microblaze Target Architecture

A new cross-compiled target architecture is included for the Xilinx Microblaze FPGA soft-core CPU architecture running Linux.

Win32 Numeric string to enum/menu/device conversions

Microsoft's C run-time library has a bug in the sscanf() function such that the "%n" format specifier does not always work. The string to enum, menu and device conversion functions have been modified to avoid this problem, but a numeric string will no longer be converted properly on any architecture if it has trailing whitespace characters.

Launchpad Bugs Resolved

The following are links to bugs in the Launchpad bug tracker that have been fixed in this release:

Calcout and Seq record timestamps

Both the calcout and seq record types were not updating the record's timestamp before calling db_post_events() for some field updates. The calcout record type will now update the record's timestamp before it posts a channel access monitor on the DLYA field; this happens twice during record processing if the ODLY field is larger than 0.

Timestamps from all seq record monitor events have been wrong since 1995 or earlier, the time being provided was from the last time the record processed. Now the record timestamp will be updated between reading each DOL1..DOLA link and posting the monitor on the associated DO1..DOA field. The VAL field is never given a value by the record processing code, but is used for posting monitors when the alarm status or severity gets updated at the end of record processing. Alarm monitors are now timestamped properly at that time.

Comments in iocsh scripts

The IOC shell was very particular about comments in previous versions of Base. If the # character was indented using white-space characters it had to be followed immediately by a white-space, comma or parenthesis character, and macLib would report errors if the rest of the comment contained any undefined macros. These restrictions have now been removed. The comment character can come from expanding a macro without it having to be followed by white-space, although in this case macLib will still report errors due to undefined or circular macro definitions.

MacOS-X: Don't use Ports/Fink unless configured

Previous releases would automatically use headers and link to libraries found in the DarwinPorts and Fink installation directories. This is now controlled by entries in the CONFIG_SITE.darwinCommon.darwinCommon file in the configure/os directory, which are commented out by default. Recent versions of MacOS-X come with an implementation of readline, so those additional code repositories are no longer required.

Changes between and

Path for Cap5 loadable library changed

The perl CA module makes use of a loadable library, which used to be loaded from the base/lib/<host-arch> directory. However different versions of Perl require different loadable library binaries as the Perl ABI can change. Now the library will be installed into and loaded from the directory base/lib/perl/<version>/<archname> where both <version> and <archname> are taken from the Perl configuration. This makes it possible for the same Perl script to be run on both RHEL5 and RHEL6 workstations say, even though they use different versions of Perl.

To achieve that, first build EPICS Base using the older OS version. Then on a machine running the newer version, go into the base/src/cap5 directory and run a make rebuild command. This will rebuild the libCap5.so file and install it into the location appropriate for its Perl version and architecture.

Build configurations updated for Apple iOS targets

The build process can now construct universal binaries containing both ARMv6 and ARMv7 code, and several defaults have been changed when building for iOS targets:

Added -b option to dbExpand

This turns off monotonic checking of breakpoint tables.

Launchpad Bugs Resolved

The following are links to bugs in the Launchpad bug tracker that have been fixed in this release:

Added database sanity checks to iocInit

Two menus may legitimately be modified by users; some checks have been added that run at iocInit and make sure the choices haven't been changed too much for the IOC to function properly:

Fix various catools issues

Array handling in the caget and camonitor programs has been debugged, fixing launchpad bug 794749 along with a few other related issues dating back to the addition of variable length array support.

Another race condition in errlog cleaned up

If it was still busy when the IOC was closed down, the errlog thread could have preempted the exit handler and freed the various internal pvtData mutex and event objects too soon.

Top-level make target changes

Several make targets have been changed. Note that these can only be used from an application's <top> directory.

make uninstall.<arch>
Deletes the bin/<arch> and lib/<arch> directories for <arch> only. Note that <arch> does not have to be an architecture that this host is configured to build, it works for any arch.
make archuninstall
Deletes the bin/<arch> and lib/<arch> directories for all architectures that this host is configured to build. Should not affect files used for multiple architectures, or for host or target architectures that this host is not configured to build.
make uninstall
Does archuninstall and also deletes the other install directories include, db, dbd, doc, html, templates and java. This will affect subsequent builds for other architectures, but it doesn't delete their bin/<arch> or lib/<arch> contents.
make realuninstall
Deletes all install directories for all architectures.
make distclean
Does realclean realuninstall as before, and also now does a cvsclean, which removes file remnants from CVS operations named .#* and editor backups named *~ throughout the source tree.

Compress record type

This record now posts monitors on its NUSE field whenever its value changes. A new field OUSE was added to support this.

Remove C++ build rule for .C files

An early convention on Unix systems was to name C++ files with an upper-case extention, .C. This does not work on Windows or MacOS where the filesystems are case-insensitive, and the C++ build rule was causing problems so has been eliminated. Any remaining C++ source files that are still using this convention will have to be renamed, preferably to .cpp

Support make -s on Windows

The flag to silence build output did not work on some Windows architecture combinations. This has now been fixed.

iocLogServer now supports logrotate

The feature in the iocLogServer that closed and reopened the logfile used to ignore the SIGHUP signal when the log filename did not change. This has now been changed so these logfiles can be used with the standard Linux logrotate package.

Changes between 3.14.12 and

This release only contains changes that fix bugs or add build configuration files for new or updated target architectures. No functionality has been changed, and as this is a patch release the software has not gone through as rigorous a testing regime as it does for a normal minor release.

Launchpad Bugs Resolved

The following are links to bugs in the Launchpad bug tracker that have been fixed in this release:

New/Updated target architectures

The following target architectures have been added or updated:

This PowerPC CPU is used on the Emerson MVME4100 VME CPU board (from Ernest Williams, SLAC).
New generic 32-bit PowerPC targets for vxWorks 6.x, using hardware or software floating-point. These targets can be used instead of the CPU-specific ppc603, ppc604, mpc8540 and mpc8548 targets (and their _long alternatives, these targets are all compiled with the -mlongcall flag) to reduce the number of distinct build targets needed when supporting multiple PowerPC board types.
Updated for iOS 4.3, which is now the default OS version (from Tom Palaia, ORNL).

IOCSH_STARTUP_SCRIPT environment variable

The function iocsh(const char *pathname) now sets the environment variable IOCSH_STARTUP_SCRIPT to the value of its pathname argument before it starts executing the script commands.


This target now automatically links binary files with the bspExt library, and adds the extension .elf to their filenames, matching the other mvme targets.

RTEMS Network Buffer Configuration

Add the macros RTEMS_NETWORK_CONFIG_MBUF_SPACE and RTEMS_NETWORK_CONFIG_MBUF_SPACE to rtems_netconfig.c to allow customization of the network buffer space allocated. The configuration files for the RTEMS-mvme3100, RTEMS-mvme5500 and RTEMS-beatnik targets now default to allocating 2MB for mbufs and 5MB for clusters; other RTEMS targets will continue to use 180KB and 350KB rspectively.

RTEMS TFTP filesystem

Use the new mount API to initialize TFTP on newer RTEMS versions.

C++ build issues on older Solaris compiler

Dirk Zimoch reported some problems building with an older SUNWspro C++ compiler which have been resolved where possible.

FreeBSD broadcast problem

The ifreq_size macro in freebsd/osdsock.h must be different in BSD 4.4.

Thread exit synchronization

When finished waiting for a thread to exit, signal the event in case other threads are waiting also.

Win32 osdTime provider fix

Jeff Hill fixed the last time compare in PLL drift factor update loop.

Errlog can lose messages

Systems that generate large numbers of errlog messages or have a slow message listener could overwrite older messages in the message buffer after the buffer wraps. This also corrects and annotates the test code to describe what's being checked.

When the IOC is shutting down, the errlog thread should process all queued messages before it quits.

Back-slash escapes for Win32

Stephen Norum pointed out the need for various Perl scripts to escape back-slash characters in Windows file paths.

catools on Windows

Windows 7 does not properly support line-mode buffering of stdio streams; the catools programs used this mode to ensure that they could be used in pipelines, but in Windows 7 they became fully buffered and are not flushed when the program exits, so buffering of stdout has now been completely disabled on Windows.

Changes between 3.14.11 and 3.14.12

Launchpad Bugs Resolved

The following are links to bugs in the Launchpad bug tracker that have been fixed in this release:

Support for Cygwin 1.7

Base can now built with shared libraries on Cygwin 1.7.x, although only with the gcc-3 compiler. Cygwin 1.5.x only works when compiled without shared libraries (set STATIC_BUILD=YES and SHARED_LIBRARIES=NO in configure/CONFIG_SITE). There is code in Base now that depends on the Cygwin version, so make sure that you rebuild Base if you upgrade your Cygwin installation.


epicsEvent is now explicitly required to act as a simple binary semaphore. A single epicsEventSignal call must awaken just one thread when multiple threads are waiting for the event. A test that checks for this has been added to epicsEventTest and the Application Developer's Guide has been updated to describe this requirement.

Enable array puts to subArray records

It is now possible to put an array into the VAL field of a soft channel subArray record whose INP field is empty. Processing the record then causes the sub-array extraction process to be done on the current VAL array. This can be used to feed a sequence of values into some other record (set INDX=1 and NELM=MALM and read one element out of the VAL field each time).

Added windows-x64 target

64-bit binaries for Microsoft Windows platforms can now be built using the target architecture windows-x64, which is also a valid cross-build target for a win32-x86 host. We do not currently support or recommend trying to use 64-bit builds on MinGW or Cygwin.

Deleted osf-alpha targets

Kazuro Furukawa has been unable to compile EPICS Base on this target for the last few releases and it's not really needed any more, so the targets have been deleted from this release.

Expanded CALC expressions

The calc and calcout records can now accept infix expressions up to 79 characters long, although you have to use long string support to read or write any that are more than 39 characters. The postfix interpreter now sports an integer literal token as well as the double literal one, which reduces the maximum size of a postfix buffer needed for any specific size of infix buffer by a factor of 2/3.

Added Apple iOS target architectures

Tom Pelaia II and Mark Engbretson contributed build configuration files to cross-compile Base for Apple's iOS operating system as used in the iPhone and iPad. The target architecture for these is ios-arm, and there is also an ios-x86 target which compiles for the iPhone Simulator running on darwin-x86.

To build these for iOS, uncomment the CROSS_COMPILER_TARGET_ARCHS definition in configure/os/CONFIG_SITE.darwin-x86.Common and check the settings in configure/os/CONFIG_SITE.Common.iosCommon.

Dynamic arrays over CA

Dynamic array sizing was developed by Michael Abbott at the 2010 EPICS Codeathon. It permits a CA client to fetch only the currently valid elements of an array by specifying a COUNT of zero to either of the ca_array_get_callback() or ca_create_subscription() routines. It has never before been legal to pass a COUNT of zero to the ca_array_get_callback() routine, but this development does introduce a subtle change to the published API of the ca_create_subscription() routine.

In previous releases a COUNT of zero for a subscription meant use the ca_element_count() for the channel, but from this release it can return fewer elements (never more), at the behest of the server. The number of elements can vary with subsequent array update events, so a client that uses this technique must use the count field of the event_handler_args in its callback function each time it is called to obtain the correct element count from the server. Note that the ca_element_count() value for a channel is only updated at connection time, and supplies the maximum number of elements that the server array variable can hold.

Dynamic arrays are currently only supported by the CA client library and IOC server RSRV, the Perl CA library and the catools programs. The portable CAS does not understand them, and database links that connect over CA do not attempt to use them either. CA clients that try to use this functionality with a server that does not support it will receive the same full-sized zero-filled arrays that previous releases supported.

CA over TCP connections

Merged the CA-over-TCP changes developed by Ralph and Jeff at the 2008 EPICS Codeathon for the CA client library and both servers (CAS and RSRV). This adds a new CA configuration variable CA_NAME_SERVERS which is used by the client library as a list of host names or addresses of CA servers to be connected to and queried over TCP sockets. This can be used to tunnel CA connections over ssh. See the CA reference manual for more details.

Record Types aai and aao

New capr.pl script

This Perl program attempts to replicate the behaviour of the IOC command 'dbpr' over Channel Access, printing the fields and values of the named record. Run capr.pl -h for usage information.

devLib cleanup

DTYP and INP/OUT order

The fields DTYP and INP/OUT can now be specified in any order in a database instance (.db) file.

Rewrite epicsThreadOnce()

Michael Davidsaver suggested a better implementation of epicsThreadOnce() which makes it possible for all architectures to detect recursive initialization functions. This change also renames the routines to remove the original macro, and fixes some questionable usage in places.

Many Record Types

Record types were not setting many 'last value' fields at initialization, assuming that the VAL field would always hold the default value and thus not giving correct initial monitor behavior in some circumstances.

Compress Record Type

Fixed a crash when ALG (algorithm) was changed to Average at runtime.

configure/RELEASE Enhancements

Variable definitions in a configure/RELEASE file may now use the := or ?= assignment syntax. Release file processing now prints a warning if an include file can't be not found (use -include if this is expected) or if an undefined macro is used, and aborts if a circular definition is expanded. The variable EPICS_HOST_ARCH can now be used, but target-architecture-specific values must be set in a target-specific configure/RELEASE file such as RELEASE.Common.linux-x86.

VxWorks 6.7 and 6.8 support

Added build support for the latest Wind River releases. This does not include the ability to run on SMP vxWorks systems though, those will need some more extensive modifications.

RTEMS 4.10 support

Added support for the latest release of RTEMS. There is no longer a distinction between executive and malloc memory pools. The new mount() API is used.

Dependency file generation

Changes to the way in which we generate header dependency files, which are now named with a .d suffix instead of .depends. We now use the compiler to generate these where possible, and create them in the O.$(T_A) directory.

Installed file permissions

We now install libraries and other non-executable files with mode 444 rather than 644.

CA Perl5: strings and array subscriptions

In some circumstances a string received from CA might not have been properly zero-terminated; this has now been fixed. CA::create_subscription() would not accept a zero for the subscription array length; this is now permitted, in the underlying CA API this means use the native length from the server.

Linking Readline on Linux

Different Linux distributions have different requirements when linking readline; some need -lcurses, others -lncurses and others don't require either. The configure/os/CONFIG_SITE.Common.linux-* files now make this configuration easy to choose between different settings for the COMMANDLINE_LIBRARY variable. If your build fails as it's trying to create the antelope binary in the Base directory src/toolsComm/antelope/O.arch this is almost certainly the problem. You will need to do a make rebuild from the top of Base after fixing the setting of COMMANDLINE_LIBRARY.

CA Command Line Tools Changes

Three new options were added to the caget and camonitor utilities, to allow printing float values (rounded) as hex, octal or binary.

Changes between 3.14.10 and 3.14.11

Time provider on Win32

A race condition meant that sometimes EPICS programs (including the internal programs such as flex and antelope) built for Win32 architectures would not start properly on Windows systems that have multiple CPUs. This race has been fixed.

Build system dependency change

In order to get GNU make parallel execution (-j option) to work proprely for multiple target architectures, a new dependency had to be added. Now all cross-compiled builds depend on their host build. This means that when a make crosstargetarch command is issued, the EPICS_HOST_ARCH target build will be executed first, followed by the crosstargetarch build. Builds done in an O.arch directory will still only build the arch targets however.

Channel Access changes

Mantis 361 fix - ca_add_fd_registration users might not receive select wakeup

Mantis 359 fix - ca client library flow control mode related issues

Mantis 357 fix - high throughput multithreaded ca client appl thread could be trapped in lib.

Mantis 285 fix - CA Documentation doesn't distinguish sync groups from ca_put_callback()

Mantis 346 fix - deleting the chid passed in from within put cb handler causes failure

Mantis 284 fix - channel clear protocol warning messages from PCAS

Mantis 237 fix - SEGV from simple CA client during context destroy

Mantis 242 fix - invalid DBR type not screened in client library when doing a put

Portable Channel Access Server changes

These changes impact the Gateway (Proxy server) and other servers but not the IOC.

Mantis 360 fix - server is unresponsive for one of its clients, when async io postponed and in flow control mode

Mantis 358 fix - PCAS service snap-in has no way to determine if its a put, or a put calback.

Mantis 356 fix - medm display sometimes hangs until the motor stops when controling motor through gw.

Mantis 350 fix - Incoming data corruption under heavy CAS load.

Mantis 340 fix - leak when performing a read and conversion fails.

Mantis 348 fix - A call to 'assert (item.pList == this)' failed in ../../../../src/cas/generic/st/ioBlocked.cc line 112

Mantis 345 fix - Compilation warning: complaint about missing gddDestructor

Mantis 343 fix - gddScalar::new() operator is not fully thread safe

Mantis 333 fix - resTable::removeAll() does not reset the item count

Mantis 335 fix - excas fails in clearOutstandingReads - maybe requires an R3.13 client

Mantis 329 fix - GW hang, pthread_mutex_lock failed: error Invalid argument message

Mantis 352 fix - gateway hangs temporarily under heavy load on 8-core 64bit RHEL5

Timer Queue Library

Mantis 336 fix - timer queue should have try / catch block around call to user's expiration callback

Mantis 332 fix - epicsTimerTest failure, windows vista 64, dual core SMP system


Mantis 328 fixed - orderly shutdown for soft IOC fails

Application configure files

The configuration directory files installed by makeBaseApp.pl have been changing in recent releases to make them work more like the files in the Base configuration directory. The CONFIG_APP file has gone, and its functionality is now performed by the CONFIG file which should only be modified in exceptional circumstances. The variables that used to be set in the CONFIG file now appear in the new CONFIG_SITE file, and can be overridden for specific combinations of host and target architectures by creating a file with name matching one of these patterns:

Note that the setting for CHECK_RELEASE in the CONFIG_SITE files is not compatible with previous releases of Base; if you are creating an application that has to work with earlier releases, move the CHECK_RELEASE setting back to the configure/Makefile where it used to live.

The RELEASE file(s) can now define the variable RULES if you wish the application to use build rules from some module other than EPICS_BASE. The rules must appear in a configure subdirectory just like they do in Base.

Compile-time assertions

A new macro has been added to epicsAssert.h which performs assertion checks at compile-time. STATIC_ASSERT(expr) can only be used when expr can be evaluated by the compiler, and will cause the compilation to fail if it evaluates to false. The resulting compiler error message might appear a little obscure, but it does provide some explanation and contains the line where the failure was discovered. Future versions of the C++ standard will probably contain a similar facility static_assert(expr, message) but will require compiler support to be implemented.

Several changes made to dbDefs.h

The definitions for the macros YES, NO, NONE, min() and max() have been deleted. YES and NO have been replaced by menuYesNoYES and menuYesNoNO from the menuYesNo.h file where they were used in several record types. The other macros were not being used anywhere in Base, sncseq or Asyn.

The macro LOCAL that was a synonym for static is now deprecated and will be deleted in R3.15, please adjust your code to use the latter keyword. All uses of the READONLY macro from shareLib.h must now be replaced by the keyword const as the macro has been deleted.

The dbDefs.h file was unnecessarily including various other libCom header files which may have to be manually added to out-of-tree source files that relied on this. The general rule for header files is that a header should only include other headers that are needed for its own inclusion in any source file. The #include statements that might need to be added are:

A new macro CONTAINER(pointer, type, member) has been added which calculates and returns a pointer to the parent structure when given a pointer to a member, the structure type and the name of the member in that structure. On GNU compilers the type of the pointer is checked to ensure that it matches the member, so code using this macro should be built using gcc for additional confidence.

Long-deprecated errSymFind() function deleted

This functionality was replaced by errSymLookup() many releases ago.

Perl CA library shutdown

The Perl CA library has been modified to properly flush the Channel Access I/O queues when a program using the library exits.

bi, bo, mbbi, mbbo ENUM string fields

The existing Channel Access protocol transports 26 bytes for each ENUM string, but the fields used to hold ENUM strings in the discrete record types were configured to be 16 (mbbi/mbbo) or 20 (bi/bo) bytes long. These have all been increased to match the CA limit.

Use of SIGALRM disabled

Previous releases that supported HPUX required that EPICS trap and be able to generate the SIGALRM signal in order to break out of a blocking socket system call on those systems (Posix only). There were two API routines that had to be called by any code using sockets to properly support this. Since we no longer support HPUX this code is no longer required, and as it breaks the Posix timer interface on Linux it has been disabled in this release. The API routines now do nothing on all platforms, and will be removed before the 3.15 Release of Base.

Universal Binaries on Darwin

It is now possible to configure Base on Darwin to build universal binaries containing an installation-specific choice of 32- and 64-bit CPU architectures. This is controlled through the definition of the ARCH_CLASS variable in the configure/os/CONFIG_SITE.Common.<arch> file for the particular target architecture you are using (darwin-ppc, darwin-x86 or darwin-ppcx86). There are comments and example settings in those files. Note that to my knowledge EPICS Base has not been thoroughly tested on the 64-bit darwin architectures.

HPUX, SGI and VMS files deleted

We have not supported or tested EPICS Base on HPUX for several releases; the support files for this and other unsupported operating systems have been removed.

PINI Processing and PHAS values

The PINI field now has its own menu type with four more choices, RUN, RUNNING, PAUSE and PAUSED. The earlier NO and YES values for this field remain as before and cause the same processing as before. The new values cause records to be processed during the announcement of the new initHookAtIocRun, initHookAfterIocRunning, initHookAtIocPause and initHookAfterIocPaused states respectively.

Records with PINI=YES will be processed during the iocBuild stage of iocInit, follwed by records with PINI=RUN during the iocRun stage and records with PINI=RUNNING during the initHookAfterIocRunning stage. If an iocPause command is given, any records with PINI=PAUSE will be processed at the initHookAtIocPause stage followed by records with PINI=PAUSED will be processed at the initHookAfterIocPaused stage. A subsequent iocRun command causes the PINI=RUN and PINI=RUNNING records to be processed again.

The PHAS field now controls the order in which records are processed as a result of the PINI mechanism; within each stage, lower values of PHAS are scanned before higher ones.

Additional initHook states

Several new initHook states have been added which are announced while the IOC is being paused or restarted. The original states remain unchanged, although a couple of the later ones are deprecated where using the new states makes more sense. The enum that defines all the states is now:

typedef enum {
    initHookAtIocBuild = 0,         /* Start of iocBuild/iocInit commands */
    initHookAfterIocBuilt,          /* End of iocBuild command */

    initHookAtIocRun,               /* Start of iocRun command */
    initHookAfterIocRunning,        /* End of iocRun/iocInit commands */

    initHookAtIocPause,             /* Start of iocPause command */
    initHookAfterIocPaused,         /* End of iocPause command */

/* Deprecated states, provided for backwards compatibility.
 * These states are announced at the same point they were before,
 * but will not be repeated if the IOC gets paused and restarted.
    initHookAfterInterruptAccept,   /* After initHookAfterDatabaseRunning */
    initHookAtEnd,                  /* Before initHookAfterIocRunning */
} initHookState;

The two deprecated states will only ever be announced once, whereas the newer ones will repeat as often as the iocPause and iocRun commands are executed.

Soft Channel ai device support and SMOO

The (probably unwritten) rules for ai device support have always required that any device support which sets the VAL field and returns "2" should also perform any other operations normally performed by the ai's convert() routine. In practice very few devices did this, but there are some which makes it impossible to move that smoothing function into the body of the record. This change adds the support for SMOO filtering to the soft channel device support for the ai record. The filter is short-circuited when a link recovers from a failure.

New link flags for alarm severity/status inheritance

Two new options have been introduced as alternatives to the existing NMS and MS flags: MSI (Maximize Severity INVALID) and MSS (Maximize Severity and Status).

When a link is flagged MSI the receiving record inherits the target's alarm severity just as it does with the MS flag, but only if that severity is INVALID.

When a link is flagged MSS the receiving record inherits the target's alarm status as well as its severity, thereby preserving the alarm status through MSS chains instead of setting that status to LINK.

Analog records get_alarm_double() semantics changed

The get_alarm_double() routine in several record types has been changed to make it easier for CA client applications to display the correct warning and alarm limits for a record.

Originally these routines would always return the current values from the associated alarm limit fields, but now they will return epicsNAN (not-a-number) instead if the severity field of the corresponding limit is NO_ALARM. This allows CA clients to suppress the display of unused limits.

New math constants epicsNAN and epicsINF

Two new math constants have been added to epicsMath.h: epicsNAN (not a number) and epicsINF (infinity).

New event type DBE_PROPERTY

A new event type (flag in the Channel Access event mask) has been added to support subscriptions that get events whenever a property of the PV changes. This will allow clients to get notified on changes of control limits, graphical limits, state strings etc.

The CA commandline tool camonitor and the CA Perl interface support the new event type. As a first working example, the mbbi and mbbo records have been extended to send a DBE_PROPERTY event when their status strings are modified. A more general mechanism to specify sending DBE_PROPERTY events through the DBD file will appear in 3.15.

Client application developers are encouraged to start using DBE_PROPERTY subscriptions to fetch channel attribute data.

Channel Access command line tool changes

The caget/caput/camonitor programs in src/catools now use '\' escape sequences for non-printable characters.

They provide a new option -F to set an output field separator to be used instead of the default space character.

New functions for escaping non-printables in epicsString.h

The existing routines used to escape non-printable characters have been replaced by a new set of functions that are prototyped in the epicsString.h header file:

int epicsStrnRawFromEscaped(char *outbuf, size_t outsize, const char *inbuf, size_t inlen);
epicsShareFunc int epicsStrnEscapedFromRaw(char *outbuf, size_t outsize, const char *inbuf, size_t inlen);
epicsShareFunc size_t epicsStrnEscapedFromRawSize(const char *inbuf, size_t inlen);

Both conversion functions take the output buffer (and its size), and the input buffer (and its size) as argument. They will convert non-printable characters from/to their '\'-escaped versions. The third function scans a raw input string and returns the number of characters needed for the escaped version.

The existing function interfaces will be kept for compatibility, but their further use is deprecated.


Partial puts are not supported. An attempt to put more bytes than currently free will be rejected.

Long string support

The IOC now provides support for strings longer than 40 characters through Channel Access in a manner that is fully backwards compatible with older versions of the CA library, although not all CA clients can make use of this at the moment.

Adding the suffix '$' to the field name of an IOC PV name (through either Channel Access or Database Access) causes the native type of that field to be reported as an array of DBF_CHAR, as long as the field type is DBF_STRING, DBF_INLINK, DBF_OUTLINK or DBF_FWDLINK. It is then possible to use a DBF_CHAR array to read, write and monitor values from that field, and the 40 character string length limit imposed by the DBF_STRING type is replaced by the amount of storage allocated for the string on the IOC (for link fields the limit is related to the maximum length of a record name).

The caget/caput/camonitor programs in src/catools can now use long strings by adding the command-line option -S which causes them to handle an array of DBF_CHAR as a string. Both MEDM and EDM can already present such DBF_CHAR arrays as strings in their text widgets (although you do have to configure the widget to format it as text), so this solution already works with some CA clients, although by no means all clients support it yet.

Darwin no longer uses _environ

The Darwin version of epicsEnvShow (in src/libCom/osi/os/Darwin/osdEnv.c) now uses _NSGetEnviron() to get the pointer to the environment string table.

gpHash argument type changed

Out-of-tree users of libCom's gpHash routines should change the type of their pointer to their gpHash table to avoid compiler warnings. The first argument to all of the gph...() routines used to be a void * (or a pointer to one for gphInit()) but is now a struct gphPvt * (struct gphPvt ** for gphInit) for better type safety. The definition of the structure has not been made public, although a declaration is provided in gpHash.h.

New hash functions in epicsString.h

The existing routines used to hash strings have been replaced by a new pair of functions that are prototyped in the epicsString.h header file:

unsigned int epicsStrHash(const char *str, unsigned int seed);
unsigned int epicsMemHash(const char *str, size_t length, unsigned int seed);

The seed argument should normally be zero, but can be used to chain several hash calculations together to create a single value from multiple strings or memory buffers. The resulting value should be masked with the appropriate number of bits for the desired hash width. These functions both use the same algorithm, and on most CPUs should be faster that the previous hash functions used in Base. Use epicsStrHash() on nil-terminated strings, epicsMemHash() if the data might contain zero bytes.

Support for dynamic loading

The existing OSI epicsFindSymbol API has been expanded to support dynamic loading of binary files, on architectures where the facilities necessary to implement this are provided (currently Linux, Solaris, Darwin and vxWorks). A new but optional command is provided for iocsh which calls the new epicsLoadLibrary() function. In order to include this command in an IOC, you must include the dlload.dbd file; the command will then be installed when the IOC's ioc_registerRecordDeviceDriver routine is run.

To dynamically load a new routine for use with the sub or aSub record types, you also have to register the subroutines at runtime. You can use the EPICS build system and the registerRecordDeviceDriver.pl script to write the necessary code for you, you just have to create a .dbd file that declares the functions in the library and add the derived .cpp file to the library sources. The product of your build should be a LOADABLE_LIBRARY to ensure that the correct linker commands are used.

After a shared library is loaded into the IOC using the new iocsh dlload command you will usually have to run the lib_registerRecordDeviceDriver routine to register the components that were mentioned in the .dbd file. After registration the functions can be found as normal by setting the SNAM field of your sub or aSub record instances. Once loaded, shared libraries cannot be unloaded again as there is no way to be sure that some other part of the IOC doesn't still have a pointer to something inside the module.

Components provided by a shared library can include functions for sub and aSub records, iocsh commands, time providers and sequence programs. Record and device support code may be possible, but there are complications in creating the .dbd file so we don't recommend it yet. It is possible to load libraries after iocInit, but the code is not re-entrant so should only be used from the main thread. Adding new record types or device support will not work after iocInit.

Perl5 CA library

The CA::put and CA::put_callback methods now use the native type of the PV to determine which data type to use in all cases; earlier versions looked at the Perl data type for single-valued PVs, but this was truncating some double values into integers.

generalTime and epicsTime updates

Allow time providers to supply timestamps in interrupt context. A pair of new API routines in epicsTime.h epicsTimeGetCurrentInt() and epicsTimeGetEventInt() will check the most recently successful current-time or event-time provider and forward requests to the routine registered by that provider, if any. The priority list is not traversed, so if the latest provider has not registered an interrupt-safe routine by calling generalTimeAddIntCurrentProvider() or generalTimeAddIntEventProvider() as appropriate, these API routines will return failure. The resulting timestamp is not protected against backwards movement either.

Added a routine generalTimeHighestCurrentName() which returns the name of the highest prority registered current time provider. Comparing this with the name returned by generalTimeCurrentProviderName() permits an alarm to be generated if an IOC is not able to use the time provider it was designed to use. The General Time stringin device support keyword @TOPTCP has been added to make this name available in a database record.

The following routines have been renamed, but the old name may still be used since a macro with the old name has been added:

Old Name New Name
generalTimeCurrentTpRegister generalTimeRegisterCurrentProvider
generalTimeEventTpRegister generalTimeRegisterEventProvider
generalTimeCurrentTpName generalTimeCurrentProviderName
generalTimeEventTpName generalTimeEventProviderName

The routine generalTimeCreateSyncTimer() was not useful in practice due to time provider initialization issues, nor was its implementation protected properly for use on SMP systems so it has been deleted. The deprecated and empty synchronize() method from the epicsTime class has also gone.

RTEMS Release

RTEMS release 4.9.2 or newer is required. EPICS now configures RTEMS to use unified executive/malloc memory pools if available (RTEMS 4.10 and up).


RTEMS stack sizes have been reduced. This allows more clients in machines with limited memory.

RTEMS file descriptor allocation has been increased.

Added record aliases

Record definitions can declare their own alias names along with the field values, or a separate alias statement can also be used:


Aliases can only be created for records that have already been loaded by the IOC, although they don't have to appear in the same .db file. A CA client can discover that a record name is an alias by fetching its .NAME field, which will always return the canonical name for the record. These new routines in the dbStaticLib library handle aliases:

long dbCreateAlias(DBENTRY *pdbentry, const char *paliasName);
int dbIsAlias(DBENTRY *pdbentry);
int dbGetNAliases(DBENTRY *pdbentry)
long dbDeleteAliases(DBENTRY *pdbentry);

Aliases are located using the existing record instance API. Use dbIsAlias() to test whether a record is actually an alias or not. Aliasees can be deleted like record instances using dbDeleteRecord() which will not delete the underlying record if the DBENTRY refers to the alias (deleting a record instance does delete all its aliases though). The dbDeleteAliases() routine deletes all aliases of the selected record, and will return an error if used on an alias.

Any out-of-tree tools that scan through all the records in the database using dbFirstRecord() and dbNextRecord() may need modifying to avoid duplicate processing of aliased record instances. Also note that the set of info items for a record instance are not shared with its aliases, which each have their own info item namespace.

Added support for RTEMS-mvme2700

Supplied by Matt Rippa <[email protected]>. Should work for MVME2400, too.

CA Commandline tools: priority support

A new option -p was added to all Channel Access command line tools to allow specifying the CA priority.

Linux: Use libncurses

Changed linux builds to link against libncurses instead of libcurses (suggested by Peter Zumbruch).

Changes between 3.14.9 and 3.14.10

GCC_EXEC_PREFIX references removed from configuration files

Definition of GCC_EXEC_PREFIX removed from CONFIG.CrossCommon and unexport of GCC_EXEC_PREFIX removed from vxWorks and RTEMS builds.

RTEMS Release

RTEMS release 4.9 or newer is required. If you are using the RTEMS NFS time provider you need to use RTEMS 4.9.1 or newer.

RTEMS epicsEventWaitWithTimeout

Correctly return epicsEventWaitTimeout when event is not pending and timeout value is 0.0 seconds.

epicsRingPointer, epicsRingBytes

Fixed a race condition exposed by compilers with more agressive optimization.

camonitor timestamp support

The camonitor program now supports the ability to display both server- and client-side timestamps, simultaneously if requested. The old command-line options -r -i and -I that controlled the timestamp display have been replaced with a new -t option that takes additional argument letters to control which timestamp sources and output format should be used.

See the Command Line Tools section of the Channel Access reference manual or run camonitor -h for a summary of the options.

New "stdio" stringout device support

A new device support has been added that allows a stringout record to output one-line messages to stdout, stderr or the errlog subsystem. Use DTYP="stdio" and set the OUT field to one of "@stdout", "@stderr" or "@errlog" to control the message destination. A newline is appended to the contents of the record's VAL field when printing.

General Time subsystem

The way in which EPICS gets the time has been significantly revised since R3.14.9 with the introduction of the General Time subsystem. Two kinds of pluggable time providers are now supported, which return either the current time or the latest timestamp of a numbered Time Event from a hardware event system. All IOCs must have at least one Current Time provider, but Event Time providers are optional. The General Time subsystem guarantees that the timestamps returned never step backwards, even when switching between time providers.

A Current Time Provider reports the current wall-clock time if it is able to when asked; if it can't it says so, and the time subsystem will then ask the next provider in its list and so on until someone replies with the time. Event Time providers are handled similarly, except that they are asked for the timestamp associated with a particular Time Event number rather than the current wall-clock time. The registered time providers can be listed using the IOC command generalTimeReport(int interest) and some time providers also have their own separate report commands.

Different target architectures come with different default Current Time providers in Base. The Unix-like architectures rely on the underlying operating system clock, which normally involves running something like ntpd as a separate process. The real-time operating systems vxWorks and RTEMS install two Current Time providers; the native operating system clock at the lowest priority (this provider includes a task to periodically reset the operating system clock from a higher priority time provider), and an NTP time provider which synchronizes the underlying operating sytem tick timer with an NTP server. Microsoft Windows targets using the Win32 API use a Windows-specific time provider which contains a built-in PLL.

There are no Event Time providers included with Base except for an optional "Last Resort" Event provider which can be installed if a site wants to be sure that every Time Event number will have a recent timestamp associated with it even if the hardware event system goes down. The Last Resort Event Time provider returns the current time for every Time Event number. To install this provider, run the command installLastResortEventProvider from your IOC startup script.

Additional information about General Time and the time providers included with Base can be found in the IOC Application Developers Guide for R3.14.10, sections 9.7 and 20.6. General Time was originally written by David H. Thompson and Sheng Peng at ORNL, subsequently worked on by Babak Kalantari and Timo Korhonen of PSI, and merged into Base by Peter Denison from Diamond. Andrew Johnson provided input into the design at various points and made various code revisions after the merge.

New ioc/dllPath.bat file for Win32

When creating an IOC with one of the win32-x86 target architectures, a file dllPath.bat is now generated in the iocBoot/iocxxx directory which can be run to adjust the PATH variable to include all of the support application bin directories which might contain DLLs that the IOC uses. The PATH also includes the IOC application's own bin directory, which simplifies starting up the IOC as well.

New epicsEndian.h header

Any C or C++ code can #include "epicsEndian.h" which defines four macros. The main one is EPICS_BYTE_ORDER and is defined to be either EPICS_ENDIAN_LITTLE or EPICS_ENDIAN_BIG (these are numeric constants 1234 and 4321 respectively). The fourth macro is called EPICS_FLOAT_WORD_ORDER and is needed because some ARM systems use mixed-endian format floats.

Note that just knowing the CPU's endianness doesn't tell you the complete story about the byte order that your hardware registers will present to the CPU; byte swapping is often performed automatically by PCI to VME bridge devices and by other kinds of bus converter, so "portable" drivers aren't always.

Array Subroutine Record added (aSub)

A heavily modified version of Andy Foster's genSub record type has been added, called the aSub (Array Subroutine) record type. The new name is so that genSub records can continue to be used in IOCs that need those features that have changed or been removed in creating the aSub record type. The main differences between genSub and aSub are:

epicsTimeEventDeviceTime support for soft channel input records

The Soft Channel device support for all input record types now supports the fetching of the timestamp along with the data when the record's TSE field is set to epicsTimeEventDeviceTime (-2). This works for both DB and CA links. However the timestamp will only be fetched if the record's TSEL link is not set, so you can't point TSEL to another record to read the -2 value into TSE (that's because to make this work properly would require that the TSEL link be read twice every time the record processes; once in the soft channel device support, and again when the record type calls recGblGetTimeStamp().

devLib: CR/CSR Support added

Thanks to Eric Bjorklund for providing a patch to devLib that gives access to the CR/CSR address space (for those on a VME64 CPU with appropriate support from your BSP).

ascaStats, dbcaStats, seqcaStats

Query routines have been added that count CA client connections made by Access Security rules and Database Channel Access links. A similar routine will be added to version 2.0.12 of the sequencer for counting sequence program CA links:

void ascaStats(int *pchans, int *pdiscon);
void dbcaStats(int *pchans, int *pdiscon);
void seqcaStats(int *pchans, int *pdiscon);

The pchans parameter should point to integer storage which will be set to the total number of channels open, while the value at the pdiscon pointer will be set to the number of channels currently disconnected. Prototypes for these routines can be found in the header files asCa.h and dbCaTest.h (seqCom.h for the sequencer).

Messages from errlog

J. Lewis Muir provided patches to ensure that all messages printed on the IOC's console by the errlog subsystem are sent to the stderr output stream rather than to stdout.


This thread calls upon vendor libraries which may use significant amounts of stack. Account for this by providing the ipToAsciiProxy thread with an epicsThreadStackBig stack.

iocBuild, iocRun and iocPause

These three new commands are mainly intended for use with DESY's redundant IOC software but they might have some uses for others too. iocBuild allow an IOC to be initialized and set up ready for a quick start without actually making it live; a subsequent iocRun will bring it to the same state as an iocInit would have. Once an IOC has been started (using either iocInit or iocBuild + iocRun) the iocPause command can be used to freeze it, disconnecting its PVs and stopping all scan activity. The iocRun command restarts the IOC from this state.

While this might seem like a useful thing to be able to do, we have not tested it on IOCs using real-world I/O, and it is not unlikely that pausing an operational IOC could cause irremdial havok to any device support, sequence programs and other software which is not expecting it, so use with care and make sure you test it first. An IOC that is kept paused for more than a minute or two could fill up its network buffers and become impossible to restart without rebooting.

IOC Support on 64-bit archs

A fairly significant number of changes have been that were necessary to allow the IOC code to run properly on 64-bit CPU architectures where a long is 64 bits wide. This was not as simple as replacing every instance of the typename long with epicsInt32 because that would have broken a lot of external code unnecessarily. The generated record.h file now uses the typenames from epicsTypes.h to declare record fields, thus field sizes are the same on both 32- and 64-bit platforms (on 64-bit, a DBF_LONG does not map to long but to int). This change does not affect status return values, which are still implemented using the native long type for the platform.

Conversion of empty strings to character types

While changing the conversion routines in db/dbConvert.c and db/dbFastLinkConv.c to support 64-bit architectures as described above, it was noticed that an empty string converts to the value 0 for all types other than DBF_CHAR and DBF_UCHAR where it converts to the ASCII character '0', value 0x30. Since these types are usually used for storing small integers or boolean values rather than ASCII characters, it was decided that this conversion is wrong so it has been changed to match the other numeric conversions.

epicsShareAPI deprecated inside IOC

APIs that are intended for use inside the IOC, the epicsShareAPI attribute is slowly being removed. This keyword is only used on MS Windows where it indicates to the compiler that the function should use Pascal calling conventions rather than C ones, and was necessary to be able to call such functions from MS Visual Basic. APIs for use by client code (CA and libCom) will generally retain the attribute if they already had it.

Record types ANSIfied

Thanks to John Hammonds at the EPICS Codeathon, the record type implementations have been converted from K&R to ANSI C prototypes.

Added Perl5 CA library

Base now provides a CA client library interface for Perl5 scripts in src/cap5 and includes as examples some implementations of the catools programs written in Perl. Documentation on how to use the Perl library is available in base/html/CA.html after the build completes. This library cannot currently be built on Windows targets.

IOC ignores SIGHUP

iocInit() installs an signal handler for ignoring SIGHUP. This fixes a problem that appeared with soft IOCs run as a procServ child on some Linux systems, where a disconnecting CA client would cause the soft IOC to get a SIGHUP and exit.

Build System Reorganization

Several changes have been made to the build system, although these changes should not affect the contents of Makefiles or any applications using Base. They do however require that the version of GNU Make used be 3.81 or later. These changes are briefly:

Access security configuration files

Rules and macros were added for creating an *.acf file, access security configuration file, from an *.acs file using the C preprocessor. An .acs file has the same format as an .acf file with the addition of '#include "<filename>"' and '#define <macroname> <value>' lines. The C preprocessor includes the #include files and performs the macro substitutions.

Changes to subArray record error behaviour

In previous versions the INDX field of a subArray record was set to zero if the array that it reads through its INP field became empty. From this release the INDX field will only be modified by the record's process() routine if INDX is greater than MALM. In the event that the no data is read through the INP link, the subArray's UDF field will be set and a UDF/INVALID alarm will be generated.

scanOnce(precord) argument

The argument to scanOnce() is a pointer to the record to be scanned. This used to be a void * pointer, but is now a dbCommon * pointer. Record types written in C that call scanOnce() will still compile without having to change the source code (although a comiler warning may be generated), but any record types implemented in C++ will have to be fixed to cast the record instance pointer to a dbCommon * instead.

New Architectures

The following target architectures have been added to this release, although the core developers lack the ability to test all of them:

Added compile line header search directories

The compile line list of directories to search for header files now includes O.Common and the existing os subdirectories of SRC_DIRS <src_dir>/os/<OS_CLASS>, <src_dir>/os/posix, and <src_dir>/os/default.

Parallel make now supported

The -j jobs option is now supported for users of GNU Make version 3.80 or later. The -j option speeds up building by allowing multiple jobs (build commands) to be run in parallel; this will have the most effect on hosts with multiple symmetric processors, but can also speed up uni-processor builds. Builds still work as before when run without -j, but using the -j option with an earlier version of GNU make will fail since this relies on the $(eval) function which was introduced in GNU Make 3.80.

The -j option has been tested with this version of EPICS Base, but it may not work for Extensions or IOC applications unless their dependancies are specified correctly.

New DIRS directory dependancy specifications are required to determine the directory build order with -j. For example if we have 2 directories, src and configure, and the configure directory must be built before the src directory, the Makefile should contain:

 DIRS = configure src
 src_DEPEND_DIRS = configure

The directory dependancy specifications are only needed when -j is given to make. Without the -j the order of directories in the DIRS definition determines the build order as before.

Breakpoint tables

Some sites may be using breakpoint tables that are not monotonic in one direction. In R3.14.9 both axes of a breaktable had to be monotonic; a table will not be loaded if either the raw or engineering values change direction. There are situations where this check is too strict however, so a new variable named dbBptNotMonotonic has been added that disables this check if its value is non-zero.

Breakpoint tables are often included in an IOC's .dbd file, but they can also be loaded from a .db file (although VDCT will probably not understand them). Since there is no way to set the above variable inside the dbExpand program that expands out an IOC's .dbd file (which also rejects non-monotonic breaktables), all applications that use such tables will have to load those tables separately, using either dbLoadDatabase or dbLoadRecords.

RTEMS on processors with MOTLOAD bootstrap

Added support for more 'Global Environment Variables'. Documented in the EPICS/RTEMS tutorial.

RTEMS on processors with PPCBUG bootstrap

Set NTP server as well as nameserver and log server from server bootstrap settting.

RTEMS compiler flags

The -ansi flag has been removed from CONFORM_FLAGS_STRICT and CONFORM_CXXFLAGS_STRICT -- there are many useful library functions whose prototypes are disabled when -ansi is used.

SEL record (Mantis #295)

The value in the SELN field was not being checked against its limit, potentially causing a crash on some architectures.

Calc expressions

VAL keyword
The keyword VAL is now supported in CALC expressions. In a calc or calcout record it returns the current contents of the VAL field (which can be written to by a CA put, so it might not be the result from last time the expression was evaluated). In Access Security expressions it returns the result of the previous evaluation of the rule expression. In other uses of the calcPerform engine, the result may not be well-defined.
Thanks to Benjamin Franksen these functions can now accept any number of arguments, thus MAX(A,B,C,D,E,F,G,H,I,J,K,L) and MIN(A)are now legal expressions. The FINITE function returns a non-zero value as long as none of its arguments are NaN or Inf values, while ISNAN returns non-zero if any of its arguments are NaN values.

softIoc now starts shell by default

To prevent an interactive shell from being started, give a -S (upper case) option on the softIoc command line. The old -s (lower case) option is still accepted, but now does nothing.

Error messages from dbLoadRecords

Some error messages output by the dbLoadRecords parser should be easier to understand, having been reworded to report what was actually the problem rather than just which routine found the error...

Command registration for iocsh

The iocsh command registration data and routines have been moved out of the src/iocsh directory (which now no longer exists) into a file for each library. At the same time, the iocsh implementation code has been moved into libCom. There is no libiocsh.a library created any more, so any applications (such as the sequencer) which explicitly list iocsh in a xxx_LIBS definition in their Makefile(s) will need to be modified to have the library name removed. In most cases though the library will have been included using the EPICS_BASE_IOC_LIBS or EPICS_BASE_HOST_LIBS variables that are set in Base, and thus no changes will be needed.

Changes between and 3.14.9

Cygwin Builds

The cygwin make version 3.81-1 does not handle MS-DOS path names and thus does not work for EPICS builds with RELEASE file definitions. From the discussion on the cygwin mailing list it looks like this will be fixed in make version 3.82. In the meantime make version 3.80 or a fixed make can be downloaded from this website.

New Architectures

The following target architectures have been added to this release, although the core developers lack the ability to test all of them:

vxWorks compiler optimization level

Wind River Systems do not support optimization levels beyond -O2 for vxWorks applications compiled using gcc, so optimized vxWorks builds are now set to -O2 only (we currently use -O3 everywhere else).


There was a bug in the portable channel access server library that prevented the PV Gateway from being able to handle and pass on alarm acknowledgements from the EPICS Alarm Handler ALH. This has been fixed in this release and should only require that the gatewey be recomplied against this version of Base.


The parser for the substitutions file accepted by dbLoadTemplate() has been revised, and is now stricter than it used to be — unmatched characters that were accepted and discarded without warning before will now generate errors. The quote characters at the two ends of a quoted string value must now match, although either single or double quotes can be used. Escaped characters inside a quoted string should pass safely through to the underlying dbLoadRecord() command. The characters permitted in a bareword parameter (i.e. a filename or value that is not inside quotes) have been reduced from the overly wide set allowed before; the permitted characters now comprise: a-z A-Z 0-9 _ - + : . / \ [ ] < > ;

Escaped characters in record fields

Field value strings loaded from a database file by dbLoadRecords() can now use C89-compatible escaped character codes such as \", \', \t, \n, \064 and \x7e. The parser also now checks for and reports strings that have a newline character in them as an error - if you want a newline in a field, use the \n escaped version. These escapes only apply to the value part of a field() entry in .db file though; no other strings have escape codes translated.

libCom/test and db/test

These test programs are no longer installed into the bin/arch directory. Running all these programs on any host architecture is as simple as typing make runtests in the base top level directory or in any appropriate subdirectory. The runtests target uses Perl's Test::Harness module to execute all of the test programs and summarize the result. It is also possible to run individual tests as desired, by executing them from the relevent O.<arch> directory; the program output is designed to be comprehensible to humans.

For vxWorks and RTEMS, a test harness has been created that will run all of the test programs in a suitable order. At a vxWorks target shell, type:

ld </path/to/base/bin/vxWorks-arch/vxTestHarness.munch
cd "/path/to/writable/directory"

On RTEMS, boot the bin/arch/rtemsTestHarness binary.

You may wish to capture the output from running these to a file to more easily check the results, since there is no wrapper program to collect and summarize the results of the individual test programs.

Breakpoint tables

The handling of breakpoint table data has been reworked. It is now possible to give table data in either ascending or descending order, and the breakpoint data may have a negative slope such that the engineering values increase while the raw values decrease and vice versa. The only restriction on the data is that is must be monatonically increasing or decreasing, so you can't use a breakpoint table for curves that have local minima or maxima. This restriction is checked for when the breakpoint table is loaded.

Support for vxWorks 6

The build configuration support for vxWorks 6.x has changed significantly, having been recombined with the older vxWorks 5.x support. The two target architectures vxWorks6-mv2100 and vxWorks6-mv5100 have been removed; IOCs built under vxWorks 6.x using these architectures must revert to the original vxWorks-ppc603_long and vxWorks-ppc604_long architectures instead. The configuration file CONFIG_SITE.Common.vxWorksCommon now specifies the vxWorks version number, as well as the filesystem path to the installation of vxWorks using the WIND_BASE variable.

postfix and calcPerform

The calc expression parser and exective have undergone a signficant overhaul, although the API and expression language supported are backwards compatible with one minor exception, described below. Significant improvements have been made to both the API and the expression language: Multiple values can be calculated and assignments made in a calc expression; Error reporting for humans is now supported by the expression parser, and code can discover what inputs and outputs are needed and generated by an expression.

Assignment operations are now possible, using the new := operator which must have an expression variable (A through L) to its immediate left. Multiple expressions can be included in the calculation string, separated by a semicolon ;, all but one of which must be assignments. The value of the whole string is determined by the single non-assignment expression, which may appear anywhere in the string. For example, the following string causes a single CALC record to output the successive values of a sine curve in 1 degree intervals: sin(a); a:=a+d2r

Previously any expression that performed an invalid operation which would generate a NaN or Inf result would be stopped immediately and return an error to the caller. Now it is possible to perform operations that generate NaN or infinite results, and the results are returned as normal. The result of the expression or the value assigned to a variable may thus be a NaN or an infinity. To permit this to be checked within the expression, the new operators finite(), isinf() and isnan() have been added to the expression language. The literal values Inf and NaN are also now supported in expressions.

The only incompatible change to the expression language was to change the NOT operator from performing a unary minus operation to an integer bitwise not; the former meaning is illogical and as a result was probably not used much, if at all — nobody complained when I discussed this on tech-talk...

The extended API and the expression language are now discussed in detail in chapter 19 (libCom) of the R3.14.9 version of the IOC Application Developer's Guide.

calc and calcout record, asLib

As a result of the above changes to the calc expression parser and executive, both the calc and calcout records and the Access Security library have been modified to take advantage of the new error diagnostics. The Access Security library has been made to reject any expression that contains an assignment operation, to prevent any possible security holes that might be caused by this significant change to the expression rules.

The calc and calcout records have had some subtle changes applied: To mitigate the effects of the Inf/NaN behaviour change, the result of an expression is checked for NaN, which will result in the UDF field being set and an Undefined/INVALID_ALARM being raised as a result.

An empty string is no longer a legal expression, therefor the CALC and OCAL fields have been changed so that their default value is a literal "0" string. Also any calcout record device support must now add the line #include "postfix.h" before the #include "calcoutRecord.h" line in the source code.


The recGblResetAlarms() routine (which is called by all record types towards the end of record processing) now optionally calls a single hook routine via the function pointer recGblAlarmHook after it has updated a record's alarm status and severity. See regGbl.h for the hook routine prototype definition, the routine is also given the previous values of the record's status and severity. The hook routine must not block, since this would hold up record processing.

ai, bi, mbbi and mbbiDirect records

These record types now support raw simulation mode. If the value of the SIMM field is 2 (enum string "RAW"), the SIOL link value is placed into the RVAL field and passed through the raw to engineering units conversion process just like the real device support's raw value would be.


The TIME field of a record is now displayed in a human readable format. TIME used to have an interest level of 4 since it was output in hex and not very easy to understand, but it has now been moved to interest level 2.


The convertRelease.pl parser now supports the use of -include statements in configure/RELEASE files as well as include statements.

MIPS support

Changes were needed to the configure/tools/munch.pl script to support vxWorks-MIPS targets.


A new facility is provided in libCom for use in generating automated test programs. Many (but not all) of the test programs in libCom/test have been converted to use this facility.


Off-by-one buffer overflow error fixed in dbFindField() which only seemed to affect vxWorks-(intel) targets.


Create a POSIX-compliant TZ environment variable from EPICS_TIMEZONE. Previous versions had an incorrect format which was ignored by tzset().

Added space for user extensions. This provides the infrastructure for the spy command.

Fixed error in epicsThreadGetName for non-EPICS threads.

Added hooks for application routines to supply special network configuration parameters. The RTEMS startup code calls epicsRtemsInitPreSetBootConfigFromNVRAM just before reading values from NVRAM and epicsRtemsInitPostSetBootConfigFromNVRAM just afterwards. See epicsRtemsInitHooks.h for prototypes and global variables.


e_flex has been modified to accept DOS line endings as well as Unix ones. The scan.c file was recreated using e_flex itself and the flex.skel file on the modified scan.l.DISTRIB source. initscan.c is not required or used for the EPICS build, so it has been removed.


devLib is now built for all architectures, whereas before it was only built on RTEMS and vxWorks. However for it to be usable there must be an appropriate table of OS-specific routines provided. For those OSs that don't implement these routines a default table is defined which will result in an error on any attempt to use devLib routines, but the default table can be overridden in an external library that provides an appropriate table. This subtle change was implemented to allow use of the SIS 3100 PCI to VME bridge from Linux, and needs no change to the other implementations of devLibOSD.c.


Added epicsThreadResume command.


mallocMustSucceed and callocMustSucceed accept 0-byte requests. Note that these routines may return a NULL pointer in such cases.

Mac OS X (Darwin)

Added support for EPICS_HOST_ARCH=darwin-ppcx86 for building libraries/applications which will run on both PowerPC and Intel x86 targets.

Added support for EPICS_HOST_ARCH=darwin-x86.

Changes between and


On architectures whose native version of strtod() actually works properly (i.e. converts +/-Inf[inity] and NaN strings to their double equivalents) we managed to break the use of this in the R3.14.8.1 release. This is now fixed.

Changes between 3.14.8 and

Version Numbering

This release adds a fourth level of version number, which we haven't used since R3.13.1.1. The intention is to imply that R3.14.8.1 includes some small but important changes since R3.14.8 but no signficant new behaviours or API modifications. This fourth level has required us to modify the version number system and the macros in the epicsVersion.h file slightly though. We have taken the opportunity to introduce a new variable EPICS_SITE_VERSION to the file configure/CONFIG_SITE that adds an optional site-specific version number; sites that were achieving this by editing the configure/CONFIG_BASE_VERSION file should switch to setting EPICS_SITE_VERSION instead.


Mantis entries fixed:

232 - non-preemptive mode client relying on ca_poll does not always reconnect

Win32 symbol changes

These changes are required to allow software outside of Base to be built on win32 architectures.

Changes between 3.14.7 and 3.14.8

New host targets

Configure files are now available to support the win32-x86-mingw (MinGW C++ compiler) and win32-x86-cygwin (WIN32 API with cygwin C++ compiler) host targets.

Configure files were also added for linux-x86_64 and solaris-sparc64 but these files are for experimental purposes only and to show that we are working on these targets. Currently these two 64 bit targets are not passing our test suite, so they must not be used in production systems.

Runtime Hardware Address Changes

An Extended Device Support mechanism has been introduced which is designed as a safe way to widen the API between iocCore and the device support software it interfaces with. An extended device support can now be notified of changes to a record's hardware address, and is given the chance to approve or reject that change.

As a result of introducing this notification mechanism, any device support that was capable of handling runtime address changes in prior versions of Base will have to be updated to provide the new interface, since the absence of extended device support is now taken to mean that runtime address changes are not understood by the device support. This requirement is not expected to affect many EPICS sites.

POSIX thread priority scheduling

POSIX thread priority scheduling is now supported. There is a new user option USE_POSIX_THREAD_PRIORITY_SCHEDULING in the CONFIG_SITE configure file for using POSIX thread priority scheduling. For now the default value is NO. This has only been tested on a few versions of linux. On linux, in order, to use real time priorities the option must be set to YES and the ioc must be started with root privilages.


The definition VX_DIR was removed from configure/RELEASE and moved to configure/os/CONFIG_SITE.Common.vxWorksCommon. The configure/RELEASE* files should contain location definitions for EPICS modules only.


The definition RTEMS_BASE (and RTEMS_VERSION) were removed from configure/RELEASE and moved to configure/os/CONFIG_SITE.Common.RTEMS. The configure/RELEASE* files should contain location definitions for EPICS modules only.

event generator and event receiver record support

All apsEvent specific record support has been removed from base

drvTS and apsEvent support

The following files have been removed from base: drvTS.h drvTS.c, egDefs.h egRecord.c egRecord.dbd egeventRecord.c egeventRecord.c egeventRecord.dbd erDefs.h erDefs.h erRecord.c erRecord.dbd ereventDefs.h ereventRecord.c ereventRecord.dbd

These are removed from EPICS base. The version that previously came with base was the version that worked with the APS event system. It is available from APS. The version that works with the newer event systems that evolved from the APS system is available from the Swiss Light Source.

task watchdog

It was possible for taskwd (task watchdog) to not detect when some of the standard tasks failed. This is because they were passing their threadid rather than using epicsThreadGetIdSelf. It was possible to call taskwdInsert before the threadid was actually set.

dbLock and dbBkpt

dbLockGetLockId incorrectly always returned 0. dbBkpt (database breakpoint facility) is the only code that needed this. This caused unknown errors if the dbBkpt facility is used.


The maximum size was initialized to 65636 instead of 65536.


Add additional cast to prevent 'strict aliaising' warnings.


I/O redirection from vxWorks startup scripts now works.


This new variable which can be controlled using the iocsh var command (or by simple assignment in the vxWorks shell) allows users to change the behaviour of dbLoadRecords() when it finds a duplicate record definition. The default behaviour has always been to permit multiple record() statements for the same record name when loading record instances, but by setting dbRecordsOnceOnly to any non-zero value, duplicates will instead generate an error message instead. It is expected that this will only be used in special circumstances, to detect the presence of unintentional duplicates where it is known that they should not exist.

select record

This record now sets and posts monitors on its SELN field indicating which of the inputs was selected, independent of which selection mechanism was selected via the SELM field. This makes it much more useful, especially when the High, Low or Median mechanisms are chosen.


Macro expansions in any program using the macLib facility from libCom can now include a default value which will be used if the macro named is not defined at the moment of substitution. The syntax for this is $(name=default) or ${name=default}. The default string can itself contain other macros like this: $(name=$(default)). This feature has actually been present since R3.14.6.


On a powerPC, during iocInit, a crash could occur. In particular the SYNAPPS version of save_restore experienced crashes. This is now fixed.


Mantis entries fixed.

221 - should shutdown full duplex comm on udp sockets if not used

192 - concurrency bug in channel access to local DB

181 - ca_host_name() now returns the host name of the client, not the host:port of the server

161 - issues surrounding manipulation of CA contexts

153 - CA (caput) client does not reconnect after server suspend-continue-shutdown cycle

111 - non-preemptive clients disconnect if ca_poll() isnt called regularly

portable ca server

Mantis entries fixed.

196 - portable server library intermittent hang on UNIX systems

191 - corrupt value when doing a put through portable server (little endian host)

175 - example portable server array PV 'alan' does not have time stamps

gdd (used by portable server)

Mantis entries fixed.

211 - GDD: aitConvertStringEnum16 does nothing if pEnumStringTable==NULL

RTEMS port

Added support for setting NFS server/mount information from PPCBUG argument strings.

rtems_shutdown_executive is now called on IOC exit. On many BSPs this will return control to the bootstrap PROM.

Set POSIX TZ environment variable from NVRAM, or failing that, from EPICS_TIMEZONE.

Cleaned up support for obtaining network configuration from NVRAM.

Added support for some additional boards.

Set iocsh prompt from host name.

Initialize in-memory filesystem from tar image following executable in bootstrap flash memory. This allows for fully standalone IOCs -- no TFTP/NFS server required.

Set IOC_NAME and IOC_STARTUP_SCRIPT environment variables from bootstrap parameters.

vxWorks port

Fixed mantis entry.

179 -base does not build with vxWorks 6.0

225 - On vxWorks epicsThreadCreate returned -1 instead of 0 if a thread could not be created. This is fixed.

OS X port

Builds on Tiger.

Readline now used by default.

WIN32 port

Fixed mantis entries.

195 - explicitly unloading Com.dll causes crash

230 - assert fail of caget, caput, etc under msvc 8

231 - manifest files not installed under visual C++ 8

POSIX port

Fixed mantis entries.

186 - failure after exit command if log client is running

222 - osiSpawnDetachedProcess doesnt close open files in dupicate process on POSIX

Changes between 3.14.6 and 3.14.7


The select record type has for a long time made use of a coule of magic numbers (1e+30 and -1e+30) to mean "not a real value", which prevents the record from working properly if one or other of these appears as an actual data value. These have been changed to use +Inf and -Inf or NaN instead, so +/-1e+30 may be used as a data value.

ai, ao, dfanout and subroutine Records

These record types have been modified to respond better to NaN values as follows: if the VAL field contains a NaN value, the UDF field will be set and an undefined value alarm will be triggered.


epicsStdlib.h declares epicsStrtod() which provides a version of strtod which handles NAN/INF on all architectures. All uses of strtod() in base have been converted to use epicsStrtod().

epicsStdlib.h also declares epicsScanFloat() and epicsScanDouble() which replace calls to sscanf with routines which handle NAN/INF on all architectures.

epicsThreadCreate Stacksize Posix

The posix implementation of epicsThreadCreate() now makes pthread calls to set the stack size. The sizes returned by epicsThreadGetStackSize() for the inputs epicsThreadStackSmall, epicsThreadStackMedium and epicsThreadStackBig are 128K, 256K and 512K respectively on at least the architectures Linux, Solaris, HPUX and Darwin (different values are used on vxWorks and RTEMS). This allows creation of many more threads on most systems.


dbNotifyCancel now waits if the userCallback is active when dbNotifyCancel is called. Previously it just returned. NOTE CAREFULLY. This means that the userCallback must not free the putNotify structure.

CA commandline tools

caget and camonitor now have an additional "-s" option to explicitly request server-side string conversion, which - in case of the regular CA server - leads to "precision" info (e.g. the PREC field of an EPICS record) being honoured.

POSIX signals

Signals are blocked in all but the main thread. Applications/drivers which require signal delivery to a subthread will need to be modified.


Three new functions are implemented: epicsExit, epicsExitCallAtExits, and epicsAtExit. These are similar to exit and atexit, i.e. they provide the ability to register a function to be called when the process exits. They are provided becase neither vxWorks or win32 properly implement exit and atexit. Note that they apply to an IOC stopping NOT to a thread exiting.

epicsStdio and epicsStdioRedirect

In order to support iocsh redirection of stdin, stdout, and stderr, epicsStdio.h defines the following new functions: epicsGetStdin, epicsGetStdout, epicsGetStderr, epicsSetStdin, epicsSetStdout, epicsSetStderr, and epicsStdoutPrintf. epicsStdioRedirect.h defines macros that redefine stdin, stdout, stderr, and printf.

Any code that includes epicsStdioRedirect.h will automatically have it's stdio redirected. It has been added to many files in base. If code called by dbior wants it's output redirected, it must also include this file.

IOC Test Facilities

Any command that previously had an argument for a report file name no longer has the argument. The new iocsh redirection capability is now used. For example the former command:

    dbl "0" reportName
Is now:
    dbl > reportName
Note that this does NOT work on the vxWorks shell only on iocsh. On the vxWorks shell the following command can be given:
    iocshCmd("dbl > reportName")


errlog now calls epicsAtExit and releases all resources when epicsExitCallAtExits is called.


epicsStrGlobMatch() routine added.


Input/output redirection added.

iocshCmd routine added (callable from vxWorks shell).

help command uses globbing.


The ODLY (Output Delay) was not handled properly. This is fixed.


make sure reset gets called when size of INP array changes.

dbAccess DBR_ENUM_STRS for field DTYP

Data Base Request Option DBR_ENUM_STRS for the DTYP field of soft records can cause an IOC to crash.


RTEMS implementation of epicsMessageQueuePending() now works.

Added support for MVME2100 BSP.

Added support for building RTEMS bootable images.

iocBoot/ioc* build change

The cdCommands and envPaths files are now created in ioc* directory only when the ARCH defined in the ioc*/Makefile is present in BUILD_ARCHS for the build.

Changes between 3.14.5 and 3.14.6

CA command line tools complete

The complete set of Channel Access command line tools (caget, caput, camonitor, cainfo) is available as announced during the May 2004 Collab. meeting. Documentation is part of the CA Reference Manual. Be aware of possible name conflicts with existing local tools.

IOC template file configure/RULES.iocBoot removed

The directory name wildcards that were defined here have been moved to iocBoot/Makefile, which as a result is no longer unique in having its own configure/RULES file.

APS Virtual Linac template removed

This is really a demo and a complete EPICS IOC application, not a template. It will be made available separately.

EPICS_HOST_ARCH win32-x86-cygwin renamed to cygwin-x86

The EPICS_HOST_ARCH win32-x86-cygwin was renamed cygwin-x86 to avoid confusion about what OS interfaces are used on Windows: native win32 or cygwin's emulation of POSIX. Now we have


The time server's IP address used by the vxWorks clock routines was not reading the default value from the generated envData.c file but going straight to the boot host if no environment variable by that name was set.


These files are now parsed by a program that recognizes and ignores comment lines. Previous versions of this parser would extract settings from these files even if they appear on a line starting with a '#' character, so the last line containing a setting for any variable would give the value used as the default. This was first noticed in R3.14.5 where a commented-out setting for the EPICS_TIMEZONE parameter was added after the uncommented version.

db test shell commands

Many of the commands crashed if given no arguments. They are now more crash proof.

db_access - conversion of double to float

When a CA user asked for display or control limits as a float a 0 value was returned as -1.17549435E-38. This is now fixed.

New DBD rule

A new dbd rule will create a <name>Include.dbd from files specified in a <name>_DBD macro definition. An include line will be placed in the <name>Include.dbd for each file specified in the <name>_DBD definition. If a Makefile contains

        xxx_DBD = f1.dbd f2.dbd f3.dbd 

an xxxInclude.dbd file will be created containing the lines

        include "f1.dbd"
        include "f2.dbd"
        include "f1.dbd"

and dbExpand will be invoked to create the xxx.dbd file from the xxxInclude.dbd.

Solaris Builds

Old solaris 6 specific compiler options have been removed.

New make targets cvsclean and archclean

The new top level Makefile only target, cvsclean, removes cvs .#* files in all dirs of the top directory tree.

The new archclean target is like the clean target except that O.Common directories are not removed.


Add epicsSnStrPrintEscaped.


epicsExportAddress(typ,obj) now generates an extern named pvar_typ_obj and epicsExportRegistrar(func) an extern named pvar_func_obj. Previously both just named the variable pobj.

epicsRegisterFunction(name) in conjunction with the dbd 'function' keyword can be used to register functions referred to by record subroutine name fields.

Access Security

The access security configuration rules now accept quoted strings where just names were allowed previously.

All dump routines now have FP version.

A new shell command "ascar(int level)" is now available. It produces a report of the INP channel access connections. Level (0,1,2) produces (a summary report, summary plus unconnected channels, summary plus report of all channels)

Channel Access Client Library

Channel Access Portable Server (used by the CA gateway and others)

Changes between 3.14.4 and 3.14.5


Don't seg-fault if no argument is passed to dbtr.

New build targets.

New files have been created in configure/os to allow CROSS_COMPILER_TARGET_ARCHS to include solaris-sparc-gnu and solaris-sparc-debug when EPICS_HOST_ARCH is solaris-sparc. Also CROSS_COMPILER_TARGET_ARCHS can now include linux-x86-debug when EPICS_HOST_ARCH is linux-x86.

New epicsString.h function

A new function epicsStrnCaseCmp has been added. It is like strncmp except that it ignores case.

R3.13 compatability files

R3.13 compatability files are no longer generated automatically during the build. configure/CONFIG_SITE contains two new macros for building compatibility files. They are set to NO but can be set to YES. The macros are:

APS Virtual LINAC Templates

A new set of templates has been included in R3.14.5 to implement a Virtual LINAC in an ioc using databases and sequence programs. The Virtual LINAC simulates the generation and transmission of an electron beam down a LINAC. Several steering coils, BPMs, and other typical accelerator components are simulated to provide a realistic interaction between the operator and the "LINAC". Since it is an entirely soft application, it will work on any platform. An medm display is provided as the primary GUI. It can also be used to experiment with other CA client tools.

To install the templates, use the following commands:

  <base>/bin/<arch>/makeBaseApp.pl -t vlinac vlinac
  <base>/bin/<arch>/makeBaseApp.pl -i -t vlinac vlinac

For further information, see:


Stringin record time-stamp soft device support

Add simple device support for converting time to nicely-formatted string using INP field as epicsTimeToStrftime format string:
record(stringin, "$(user)now")
    field(DESC, "Current time and date")
    field(DTYP, "Soft Timestamp")
    field(INP, "@%Y-%m-%d %H:%M:%S.%03f")

Channel Access Portable Server (used by the CA gateway and others)

Channel Access Original Server (used in IOC)

Channel Access Client Library


Better error messages are now generated.

dbCaPutLinkCallback is a new function. It provides the ability to implement record/driver support that does not complete until a channel access put callback has completed. See the Application Developer's Guide for details.

dbCaAddLinkCallback is a new function. The caller can provide a connect and monitor callback. See the Application Developer's Guide for details.


Soft device that uses dbCaPutLinkCallback has been written for ao, bo, calcout, longout, mbbo, mbboDirect, and stringout records. The dbd definitions have been added to devSoft.dbd. In other to use the new support the DTYP field is defined:

    field(DTYP,"Async Soft Channel")


The CALC and OCAL fields now have a size of 40 so that they are the same as the calcRecord.

calcoutRecord now has associated device support. The default support will act just like the old calcout. Support bis also available that uses dbCaPutLinkCallback.


The fields ZRST,...,FFST are now special(SPC_MOD).


The fields ZRST,...,FFST are now special(SPC_MOD). init_record now checks to see if state strings or values are defined during pass 0. Previously if another record had a DBR_STRING link to an mbboRecord it thought the field was a USHORT instead of an ENUM.


A new function has been added epicsStrPrintEscaped, which converts the standard C escape characters to \xxx characters.

IOC shell system command

The 'system' command has been added to the IOC shell. To enable this command, add registrar(iocshSystemCommand) to an application database description file.

Changes between 3.14.3 and 3.14.4


This has been removed from base.

Format string checking

'printf-style' functions like errlogPrintf have their arguments verified against their format string when compiled with gcc.

IOC shell command-line editing on vxWorks

The IOC shell now uses the vxWorks ledLib routines so command-line editing is now the same in the IOC shell as it is in the vxWorks shell.

CA client library crashes when the same PV name is on multiple servers

If the CA client library was searching for a PV name that was hosted on more than one server a segmentation violation occurred when printing a diagnostic message resulting in a failure of the CA client library. The bug was introduced in R3.14.3. The code was tested on WIN32 prior to release, but the problem has so far been reproduced only on Linux.

Thanks to Ernest Williams at the SNS for discovering and helping to diagnose the problem.

Disconnection callback function called when CA channel known to be disconnected

If a CA circuit timed out during the connect sequence then the CA client library called the applications's disconnect callback function indicating a disconnect state transition when the channel was already known to be disconnected. This has caused the sequencer to improperly maintain its connected channel count. Other CA client side tools may also be impacted.

Recent versions of vxWorks appear to experience a connect failure if the vxWorks IP kernel reassigns the same ephemeral TCP port number as was assigned during a previous lifetime. The IP kernel on the vxWorks system hosting the CA server might have a stale entry for this ephemeral port that has not yet timed out which prevents the client from connecting with the ephemeral port assigned by the IP kernel. Eventually, after EPICS_CA_CONN_TMO seconds, the TCP connect sequence is aborted and the client library closes the socket, opens a new socket, receives a new ephemeral port assignment, and successfully connects.

Thanks to Mark Rivers for initially reporting the bug and energetically assisting with identifying the cause.

Changes between 3.14.2 and 3.14.3

TPRO output

The record processing trace output generated when the .TPRO field of a record is non-zero now includes the name of the thread that is actually doing the processing.

calcRecord and calcoutRecord

Previously if a dbGetLink failed on one of the input links, dbGetLink was not called for the remaining links. Now it is.

put notify

put notify did not act properly if a record had disp=TRUE, i.e. if puts are disabled. It now returns putNotifyPutDisabled.


This is no longer supported


devLib is now supported on vxWorks and RTEMS. It has been moved from src/vxWorks/src to src/libCom/osi. devLibVirtualOS has been extended to support allocating A24 addresss and an init method.

vxWorks dependent modules moved

The following have been moved from src/vxWorks/src to src/libCom/osi/os/vxWorks: camacLib.h, drvTS.c, drvTS.h, epicsDynLink.c, epicsDynLink.h, module_types.h, task_params.h, veclist.c. Brief documentation has been added to the Application Developer's Guide.

Close-On-Exec flag set for all sockets created in EPICS base

On POSIX systems if a Channel Access application spawns off 3rd party software with an exec() call then all open file desriptors are inherited unless the close-on-exec flag is set for each file descriptor. A new wrapper function was created so that all sockets created in EPICS base will have the close-on-exec flag set on POSIX systems. The function which spawns the CA repeater with exec() used to close all open files except stdin/stdout/stderr. This step was no longer required and therefore was removed from the code.

Temporary Files on Windows

The tmpfile() function on windows requires that all temporary files be stored in the root folder. The antelope (yacc) tool in base was calling tmpfile() and this was causing problems at sites where win32 systems use remotely mounted secure file systems. A wrapper function called "FILE * epicsTempFile()" that creates a temporary file on WIN32 with a name epicsNNN using one of the following paths was installed into libCom. It searches starting with (1) below and stops when it finds a specified path that exists. On POSIX systems, and systems that default to POSIX behavior, epicsTempFile() simply calls tmpfile().

  1. where the TMP environment variable specifies
  2. in c:\tmp
  3. in the current working directory

envPaths file

For operating systems other than vxWorks, there is now a target file created in each iocBoot/ioc directory called envPaths, which performs the same functions as the cdCommands file in vxWorks but using environment variables. The entries in envPaths are derived from the contents of the application's configure/RELEASE file.

Macros in database filenames

Database (.db and .dbd) filenames passed to dbLoadDatabase, dbLoadRecords and inside dbLoadTemplate substitutions files will now have environment variable macros expanded before opening. These are expressed using the standard ${MACRO} syntax. Inside a template substitutions file the filename must be enclosed in double quotation marks if macros are used.

registerRecordDeviceDriver output subroutine renamed

The registration routine generated by the registerRecordDeviceDriver.pl perl script now includes the name of the application, thus requiring a one-line change to any IOC startup files produced with earlier R3.14 releases of base. The actual name is taken from a second command line argument supplied to the script by the modified make rules, and is derived from the name of the fully expanded dbd file from which the necessary information is extracted. The change needed to every startup script involves using this new name in place of the old registerRecordDeviceDriver. Assuming that your application's fully expanded dbd file is called example.dbd you would modify the lines


to become


dbExpand -o outfile option

A commandline option -o has been added to the dbExpand program to allow the name of its output file to be specified. If there are any errors in the input file(s) the output file will not be generated or modified at all. The rules to expand DBD files have been changed to make use of this.

New keyword variable() supported in dbd files

Database definition (.dbd) files can now contain declarations of simple static variables, a facility intended for driver debugging purposes. These variable(name) or variable(name,type) declarations are preserved by dbExpand (type is int if omitted), and will be converted by registerRecordDeviceDriver.pl into code that registers them with iocsh. The variables themselves must be defined in some existing C or C++ code and marked using the macro epicsExportAddress(type,name). Only plain int and double types are supported.


A facility for performing macro expansion using environment variables as macro definitions has been added to libCom/macLib. The ioc shell now performs macro expansion using this on all input lines (other than comments) before printing and executing the line.

iocsh var command

For simple applications such as controlling the value of debugging flags. Devlopers with more complex expression handling requirements should consider use of the cexp package. The available variables are defined by the new variable dbd file keyword.


Tell iocsh to make a copy of the argument string before passing it to the handler function.


Operating-system independent replacement for strdup().


The epicsMessageQueue API has been changed. All functions and methods to receive a message now have an additional argument which specifies the size of the receiver buffer. The receive functions/methods return -1 and the received message is discarded if the received message will not fit in the buffer. See the Application Developer's Guide (libCom OSI) for details.

This is an incompatible change. All R3.14.2 applications which use epicsMessageQueue must be modified before they can be compiled and used with R3.14.3

Error Message Logging

A bug occurring only in Microsoft Windows port of the error message logging client was fixed. The symptoms were problems getting a Microsoft Windows based IOC to make entries in the log file.

A bug occurring in the error message logging server where a partial message arrives w/o a <CR> and then a <CR> from a previous message was found in the input buffer was fixed. The problem must have existed for a long time but probably was not occurring frequently. The symptom was garbled output in the log file.

An IP kernel deadlock vulnerability occurring when vxWorks's tNetTask calls logMsg because of a transient mbuf starvation situation has been fixed. The fix was to not call logFdAdd for the log client's socket and instead create a specialized vxWorks device driver which calls errlogPrintf for each incoming message and then call logFdAdd for a file descriptor opened with that device driver. The desirable functional change being errlogPrintf's capability to discard messages when it gets behind (because of a transient mbuf starvation situation). The fix also means that any code that calls errlogAddListener on vxWorks, e.g. CMLOG, will now receive the logMsg messages.

Channel Access Client Library Client Context Cleanup Race Condition

The symptom is a CA client program that fails with a segmentation violation on Linux shortly after calling ca_task_exit()or ca_context_destroy(). A fix will show up in R3.14.3. Regression tests were updated to detect this type of problem.

Red Hat 7.3 Linux Process Rundown Bug

There appears to be a bug in the Red Hat 7.3 process rundown where posix thread support is defective when file scope destructors are being run. The symptom was a hang during process exit. A workaround was installed.

Multiple CA Servers on MAC OSX

A patch was made to allow multiple CA servers on MAC OSX. OSX is a recent branch off of BSD and therefore requires socket option SO_REUSEPORT.

Changes between 3.14.1 and 3.14.2

Build System

Major changes have been made to the build system. The good news is that the rules for support and ioc applications are now greatly simplified. The bad news is that it does mean changes for existing 3.14.1 applications. Please see:


for details. If you are using the function DBD keyword it no longer exists. Please read this conversion document for details.

Application Developer's Guide

The old chapter "New Feature's for 3.14" has been replaced by a new chapter "Getting Started". Please read it. It provides a simplified set of rules that can be used to build most support and ioc applications. Many minor changes have also been made.


A bug in dbGetLink resulted in nRequest not being given the value 0 if the link is a constant link. This in turn caused the waveform record to always set NORD=NELEM. Thus if an application trys to write a waveform via the steps:

    write nNew elements into array >>

This sets NORD = nNew. But because of the dbGetLink bug, the soft device support attached to the waveform record sets NORD to NELM.

This problem is fixed. The actual bug was in macros in dbAccessDefs.h

Access Security

The host names are now converted to lower case. This fixes incompatibilities between various platforms.

string records

Both the stringin and stringout records have two new DBF_MENU fields: APST and MPST. These control whether CA monitors are fired if the new VAL field string is identical to the old one. The default (zero) menu value is "On Change" with behaviour identical to before, set to "Always" if you want a record to fire monitors every time the record is processed (analagous to setting ADEL/MDEL=-1 for numeric record types).


A new facility that provides the capabilities of vxWorks msgQLib. See the Application Developer's Guide (libCom OSI) for details.

epicsStdio and errlogPrintf

A new facility has been added to libCom described by epicsStdio.h. It contains the functions epicsSnprintf and epicsVsnprintf. These are like the C99 functions snprintf and vsnprintf, which are like sprintf and vsprintf except that they accept a argument limiting the number of characters written.

The errlogPrintf facility has been modified to use this facility. Thus it is not longer subject to a possible buffer overflow.


This is a new function provided by the Database Scanning facility. Given an index for the choices defined by menuScan.h, it returns the scan period in seconds. The argument can just be the scan field of a database record. If the index is not associated with a periodic scan rate, the value 0.0 is returned.

New epicsString.h function

A new function epicsStrCaseCmp has been added. It is like strcmp except that it ignores case.


macParseDefns did not check for handle==NULL. The documentation for macParseDefns was not correct.

Changes between 3.14.0beta2 and 3.14.1

function - New Database Definition Keyword

dbStaticLib and related programs now accept a new keyword in DBD files:


Where name is the name of a function with "C" linkage that is included in the IOC binary. This function will be automatically registered with the registry at the same time as the record/device/driver tables, and is intended to make using subroutine records much easier on non-vxWorks systems.. Prior R3.14 releases required there to be a static registration routine for such subroutines.

dbStaticLib has two additional routines to support this, dbDumpFunction() and dbWriteFunctionFP(). dbDumpFunction has been added to the iocsh command table.


When executing commands from a script file, iocsh now echoes each command to the terminal before execution. This makes it much easier to see where errors are being reported.

Solaris build requirement

uname must be defined for builds on solaris hosts because it is used to determine the solaris version.

Linux build note

Under linux-x86 only, when SHARED_LIBRARIES=YES it is now possible to have one or more directory paths burned into products as run-time locations for the shared libraries. In configure/os/CONFIG_SITE.Common.linux-x86 add any such absolute paths to the new make variable SHRLIB_SEARCH_DIRS (lib/<arch> will be automatically appended to each directory given).


A *[nn].db file will be created from an *.template and a *[nn].substitutions file ,where nn has a value between 0 and 99.

Support for 64 bit long

Many changes were made to support architectures on which a long is a 64 bit integer. The basic change was to change:

The changes include the following:

Hardware Link Definitions

The various parts of hardware link definitions now accept HEX values, e.g.

field(INP,"L0 A1 C0 S0xa @")



A macro has been defined so that client code can be written that is compatible between 3.13 and 3.14.

epicsMutex for posix

Mac OS X

Now supported as development platform and as IOC.


Additional RTEMS-pc386 network drivers are available


Configurable iocsh command-line editing support (none, readline, libtecla)

CA Reference Manual

Many additions.

CA Client Library

Bugs related to connection speed when creating new channels and other channels are not found fixed. Bugs related to proper schedualing in file descriptor manager based clients fixed. Many other bugs were fixed. Performance was significantly improved.

Original CA Server Library (still employed in R3.14 by iocCore)

A bug was fixed where the server was in rare situations using excessive CPU.

Portable CA Server LIbrary

Several bugs were fixed when performing integration testing with the channel access gateway.


Many bugs and missing features fixed.

Changes since beta1


Field UDF now has a promptgroup. This allows users to set UDF false via DCTs.


errlog no longer contains an atexit that calls errlogFlush. This did not work on all operating systems. cantProceed, iocsh, and ca_task_exit all call errlogFlush. Other applications may also have to call if before terminating.


mbboRecord now implements method cvt_dbaddr for the VAL field. If no state vales or state strings are defined then it sets field_type and dbr_field_type to DBF_USHORT.

timeStamp changes

Changes have been made to:

epicsTime.h now has the definitions:

#define epicsTimeEventBestTime -1
#define epicsTimeEventDeviceTime -2

These are values for the TSE field of dbCommon.

If the TSEL field refers to the TIME field of a record then recGblGetTimeStamp sets TIME equal to the time it gets from the record the TSEL references. This works for both database and channel access links. In this case field TSE is not used.


aiRecord and aoRecord: Setting eoff=egul

Instead of init_record executing code like

    if ((pai->linr == menuConvertLINEAR) && pdset->special_linconv) {
        pai->eoff = pai->egul;

It now executes:

    if ((pai->eslo==1.0) && (pai->eoff==0.0)) {
        pai->eoff = pai->egul;

aoRecord has a similar change

This was done so that old device support which does not implement special_linconv still works.

CA puts to disabled record

If a CA client issues a put to a disabled record then, when the record is ena bled, database puts to the record will not make the record process until a CA pu t is again issued. This is fixed.

TPRO - trace processing

If dbProcess is called recursively by different tasks, it did not properly handle TPRO. Consider the following database:

record(ao,"mrkao") {
    field(OUT,"mrkai CA")
record(ai,"mrkai") {

If a channel access put is sent to mrkao, no message is issued when mrkai is processed.

This is now fixed.


If in your st.cmd file you issue the command.


And set the TSE field of any record to a non zero value, then a crash will occur when recGblGetTimeStamp is called.

This is now fixed.


nsev not sevr must be checked to decide if dbPutLink should be called.


Whenever a connection is made, a request to retrieve the control, display, and alarm linits and the precision and units is automatically issued. Previously this was only done if dbCaGetAttributes was called. This it is no longer necessary to call dbCaGetAttributes.


This now returns a non zero value if the result is nan (not a number).

Record Name Length

The size of the name field has been expanded from 29 to 61, i.e. record names can now have 60 characters.


initialProcess is now called before interruptAccept. This means that initial processing will be done before periodically scanned and I/O Inter scanned records start processing.


Casts have been removed that suppressed valuable error messages


All existing manipulations of UDF in process() are removed and udf is set FALSE when the raw value is successfully read.


In do_sel udf is not set false at the beginning. If selm has an invalid value recGblSetSevr(psel,SOFT_ALARM,MAJOR_ALARM) is called.

cdCommands file

Fixed a bug and revised the use of the IOCS_APPL_TOP setting in an application's <top>/configure/CONFIG file (which specifies the path to <top> as seen by the IOC) to apply the same modifications to all paths output in the cdCommands file.


All routines with Recdes of Fielddes in their name are obsolete and removed. A new routine dbDumpField replaces dbDumpFldDes.

Changes since alpha2

All changes for release 3.13.5 that also apply to 3.14 have been made.

devAiSoftRaw and devAoSoftRaw

A new state is defined for the LINR field. The name is "SLOPE", which allows any device type to be used with manual settings of the EOFF and ESLO fields. With this setting, the device support's special_linconv() routine is only called when LINR=LINEAR.

The RTEMS TFTP remote filesystem driver now supports a limited form of the chdir() system call. One restriction is that all pathnames passed to chdir() must end in a / character, so IOC shell commands to change directories must be given as

cd ../db/

EPICS Release base 3.14.0alpha2

Since the alpha1 release some major changes were made to the build system, to some of the libCom facilities, and to the iocsh facilities.

The unbundled version of the sequencer has been build and tested with this release. You must obtain a version of the sequencer that has been built against alpha2.

A verion of the HPlanGpib support has been built and tested with this release. Again you must obtain a version that builds with alpha2.

A new update to the Application Developer's Guide is available for this release.

Build changes

Converting alpha1 applications to alpha2

Build modifications in alpha2 require the following changes to existing R3.14 applications.


GNU compiler builds are now determined by the value of EPICS_HOST_ARCH and are no longer specified in CONFIG_SITE. All references to the ANSI (ACC/GCC) and CPLUSPLUS (CCC/G++) macros have been removed.


Most of the library routines and files starting with the prefix osi have been changed to start with epics. Several also had major changes to their user interface. See the latest version of the Application Developer's Guide for details.

EPICS Release base 3.14.0alpha1 Notes

This is the first release of 3.14. This is the first release that supports iocCore on platforms besides vxWorks.

iocCore is now supported on the following platforms:

A new version of the Application Developers Guide is available. The following gives links to the new Application Developer's Guide and to RTEMS information.


Most of the Application Developer's Guide has only minor changes. The following are new.

It must be emphasized that this is an alpha release.

Building Applications