Files
pcas/documentation/RELEASE_NOTES.html
2016-01-05 17:17:58 -06:00

4240 lines
174 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>EPICS Base R3.14.12.6 Release Notes</title>
</head>
<body lang="en">
<h1 align="center">EPICS Base Release 3.14.12.6</h1>
<h2 align="center">Changes between 3.14.12.5 and 3.14.12.6</h2>
<!-- Insert new items immediately below here ... -->
<h3>Fix epicsTime_localtime() on Windows</h3>
<p>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
<a href="https://bugs.launchpad.net/bugs/1528284">Launchpad bug 1528284</a>.</p>
<h3>Clean up after GNU readline()</h3>
<p>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.</p>
<h1 align="center">EPICS Base Release 3.14.12.5</h1>
<h2 align="center">Changes between 3.14.12.4 and 3.14.12.5</h2>
<h3>aoRecord raw conversion overflows</h3>
<p>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.</p>
<h3>Changes to &lt;top&gt;/cfg/* files</h3>
<p>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 &lt;top&gt;/configure/RULES_BUILD
files.</p>
<p>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.&lt;arch&gt;
directories.</p>
<p>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.</p>
<h3>MinGW Cross-builds from Linux</h3>
<p>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.</p>
<h3>Build rules for RTEMS GESYS modules</h3>
<p>RTEMS target builds can now be configured to make GESYS modules by changing
the <CODE>USE_GESYS=NO</code> setting in the file
configure/os/CONFIG_SITE.Common.RTEMS to <code>YES</code>.</p>
<h3>Added Make variables for command-line use</h3>
<p>The following variables are now used during the build process, reserved for
setting on the command-line only (Makefiles should continue to use the
<code>USR_</code> equivalents):</p>
<ul>
<li>CMD_INCLUDES</li>
<li>CMD_CPPFLAGS</li>
<li>CMD_CFLAGS</li>
<li>CMD_CXXFLAGS</li>
<li>CMD_LDFLAGS</li>
<li>CMD_DBFLAGS</li>
<li>CMD_DBDFLAGS</li>
<li>CMD_ARFLAGS</li>
</ul>
<p>For example:</p>
<blockquote><pre>
make CMD_INCLUDES=/opt/local/include CMD_LDFLAGS=-L/opt/local/lib
</pre></blockquote>
<h3>Back-ported dbLoadRecordsHook from the 3.15 branch</h3>
<p>See the Release Notes from the Base 3.15.1 release for details.</p>
<h3>Enhanced API for asTrapWrite listeners</h3>
<p>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.</p>
<p>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:</p>
<blockquote><pre>
#include "asLib.h"
/* ... */
#ifdef asTrapWriteWithData
/* Enhanced API */
#endif
</pre></blockquote>
<h3>Back-ported the <q>tapfiles</q> build target from 3.15</h3>
<p>This GNUmake target runs the same tests as the <q>runtests</q> target, but
instead of summarizing or displaying the output for each test script it creates
a <q>.tap</q> file inside the architecture build directory which contains the
detailed test output. The output file can be parsed by continuous integration
packages such as <a href="http://www.jenkins-ci.org/">Jenkins</a> to show the
test results.</p>
<h3>Fix buffer overflow in epicsStrnRawFromEscaped()</h3>
<p>Launchpad <a href="https://bugs.launchpad.net/bugs/1388313">bug
1388313</a> reported by Bruce Hill and Chris Ford.</p>
<h3>Better Cygwin IOC Application Support</h3>
<p>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.</p>
<p>The makeBaseApp.pl templates now include this file in the list of targets to
be built in the iocBoot/ioc/Makefile for Cygwin architectures.</p>
<h3>Reject NULL callback functions in ca_array_*_callback</h3>
<p>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 <a href="https://bugs.launchpad.net/bugs/1369626">Launchpad bug
1369626</a>.</p>
<h3>Support for Solaris 11</h3>
<p>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.</p>
<h3>Generating OS-specific include files</h3>
<p>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_&lt;osclass&gt; variable.
To avoid problems with parallel builds, the rule to generate a header file
should look something like this:</p>
<blockquote><pre>
$(COMMON_DIR)/os/vxWorks/file.h:
$(MKDIR) -p $(dir $@)
<i>generate-file</i> -o $(notdir $@)
$(MV) $(notdir $@) $@
</pre></blockquote>
<h3>Added CA->version function to CA Perl Bindings</h3>
<p>This new function returns the version string from Base. The ca*.pl tools have
been updated to display this in their help output.</p>
<h3>epicsString.h comparison functions fixed</h3>
<p>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.</p>
<h3>Windows -static targets included</h3>
<p>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.</p>
<h3>iOS Build Rules fixed</h3>
<p>The problem building for the ios-x86 simulator target architecture has been
resolved.</p>
<h2 align="center">Changes between 3.14.12.3 and 3.14.12.4</h2>
<h3>New test for environment variables</h3>
<p>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).</p>
<h3>Inclusion of &lt;top&gt;/cfg/* files refined</h3>
<p>The way the build system includes files installed in the &lt;top&gt;/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.</p>
<p>Files whose names don't start with either CONFIG or RULES are no longer
included automatically, but such files can still be installed into
&lt;top&gt;/cfg by naming them in the CFG variable.</p>
<h3>Fixed iocsh stream redirection for several commands</h3>
<p>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.</p>
<p>For externally developed commands, the simplest way to support redirection in
your C/C++ code is to <tt>#include "epicsStdioRedirect.h"</tt> instead of
<tt>stdio.h</tt>.</p>
<h3>Fixed crash on loading record instance of unknown type</h3>
<p>Fixed segfault when dbLoadRecords tried to load a record of a type that was
not defined in its DBD files.</p>
<h3>Hex literal support in epicStrtod()</h3>
<p>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.</p>
<h3>Added support for 64-bit Cygwin and MinGW targets</h3>
<p>Both windows-x64-mingw and cygwin-x86_64 build targets are now provided.</p>
<h3>Windows build issues</h3>
<p>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.</p>
<h3>CAS: GDD Reference Count Underflow</h3>
<p>Thanks to Bruce Hill a source of an underflow in a GDD reference count in the
CAS code has been fixed.</p>
<h3>Support for Apple Xcode 5.0</h3>
<p>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.</p>
<h3>Reading TSEL field</h3>
<p>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.</p>
<h3>dbLoadTemplate variable limits adjustable</h3>
<p>The <tt>dbLoadTemplate</tt> 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 <tt>dbTemplateMaxVars</tt> 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 <tt>dbLoadTemplate</tt>.</p>
<p>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.</p>
<h3>Improvements to dbpf</h3>
<p>It is now possible to use the <tt>dbpf</tt> 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 <tt>dbpf</tt> when a value conversion
fails has also been significantly improved.</p>
<h3>Support for VxWorks 6.9</h3>
<p>Various changes have been made that were needed to allow Base to build and
run properly on VxWorks 6.9.</p>
<h3>Improvements to aToIPAddr()</h3>
<p>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.</p>
<h4>Added osdFindSymbol for Windows</h4>
<p>Dirk Zimoch implemented the epicsLoadLibrary(), epicsLoadError() and
epicsFindSymbol() routines for Windows OS targets.</p>
<h4>More dbStatic commands accept "" or "*" to mean 'all'</h4>
<p>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.</p>
<h4>VxWorks sysAtReboot Registration</h4>
<p>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.</p>
<h4>IOCS_APPL_TOP and INSTALL_LOCATION</h4>
<p>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 <a href="https://bugs.launchpad.net/bugs/1165257">Launchpad bug
1165257</a>.</p>
<h4>devLibVME.h</h4>
<p>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.</p>
<h4>Allow empty database files</h4>
<p>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.</p>
<h4>High-Resolution Time Provider on MacOS</h4>
<p>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.</p>
<h4>Time drift in periodic scans</h4>
<p>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.</p>
<p>This fixes <a href="https://bugs.launchpad.net/bugs/597054">launchpad bug
597054</a>.</p>
<h2 align="center">Changes between 3.14.12.2 and 3.14.12.3</h2>
<h4>Hex literals in CALC expressions</h4>
<p>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.</p>
<h4>CAS: Added propertyEventMask support</h4>
<p>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.</p>
<h4>caRepeater now built by default</h4>
<p>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.</p>
<h4>Array Subroutine (aSub) record type fixes</h4>
<ul>
<li>Changing the number of valid elements in a VALx field now triggers
monitors</li>
<li>The NEVx fields now post monitors, following the EFLG setting</li>
<li>The artificial limit of 10,000,000 array elements has been removed</li>
</ul>
<h4>Problem with NAN values in MLST/ALST fields</h4>
<p>The ai, ao, calc, calcout, dfanout, sel and sub record types could stop
posting monitors if they got NAN values in their MLST or ALST fields. A change
has been included so this should no longer be the case.</p>
<h4>MacOS build defaults changed</h4>
<p>The default build settings for darwin-x86 targets have been changed to match
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.</p>
<h4>Build problem with db dependencies</h4>
<p>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.</p>
<h4>Native linux-arm builds added</h4>
<p>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.</p>
<h4>New Microblaze Target Architecture</h4>
<p>A new cross-compiled target architecture is included for the Xilinx
Microblaze FPGA soft-core CPU architecture running Linux.</p>
<h4>Win32 Numeric string to enum/menu/device conversions</h4>
<p>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.</p>
<h4>Launchpad Bugs Resolved</h4>
<p>The following are links to bugs in the Launchpad bug tracker that have been
fixed in this release:</p>
<ul>
<li>1090009
<a href="https://bugs.launchpad.net/bugs/1090009">
osdSufficentSpaceInPoolQuery fails on vxWorks 2 GB system</a></li>
<li>999167
<a href="https://launchpad.net/bugs/999167">
Missing epicsShareFunc for casStatsFetch</a></li>
<li>950555
<a href="https://launchpad.net/bugs/950555">
String substitution removes part of path when linking versioned shared
libraries</a></li>
<li>907761
<a href="https://launchpad.net/bugs/907761">
reading only 1st char of link in "long string" ($) syntax fails in read
error</a></li>
<li>903448
<a href="https://launchpad.net/bugs/903448">
RHEL5 nss ldap update cause stack size related failure</a>
<p>
This bug fix changed the stack sizes for both Posix and Windows targets as
follows:</p>
<table>
<tr><th>epicsThreadStackSizeClass</th><th>New Stack Size</th></tr>
<tr><td>epicsThreadStackSmall</td>
<td>0x10000 &times; sizeof (void *)</td></tr>
<tr><td>epicsThreadStackMedium</td>
<td>0x20000 &times; sizeof (void *)</td></tr>
<tr><td>epicsThreadStackBig</td>
<td>0x40000 &times; sizeof (void *)</td></tr>
</table></li>
</ul>
<h4>Calcout and Seq record timestamps</h4>
<p>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.</p>
<p>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.</p>
<h4>Comments in iocsh scripts</h4>
<p>The IOC shell was very particular about comments in previous versions of
Base. If the <tt>#</tt> 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.</p>
<h4>MacOS-X: Don't use Ports/Fink unless configured</h4>
<p>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 <tt>CONFIG_SITE.darwinCommon.darwinCommon</tt> file in the
<tt>configure/os</tt> 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.</p>
<h2 align="center">Changes between 3.14.12.1 and 3.14.12.2</h2>
<h4>Path for Cap5 loadable library changed</h4>
<p>The perl CA module makes use of a loadable library, which used to be loaded
from the base/lib/&lt;host-arch&gt; 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/&lt;version&gt;/&lt;archname&gt; where both &lt;version&gt; and
&lt;archname&gt; 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.</p>
<p>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 <tt>make rebuild</tt> command. This will rebuild the libCap5.so file and
install it into the location appropriate for its Perl version and architecture.</p>
<h4>Build configurations updated for Apple iOS targets</h4>
<p>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:</p>
<ul>
<li>The default value for IOS_VERSION is now 5.0, edit the setting in
<tt>configure/os/CONFIG_SITE.Common.iosCommon</tt> to use an older version.</li>
<li>With the introduction of iOS 5.0 we have switched the C++ compiler for
ios-arm from GNU g++ to using the LLVM-based clang++ (the GNU compilers are
apparetnly no longer included with the SDK). This can be switched back by
editing the new <tt>CONFIG_SITE.Common.ios-arm</tt> file.</li>
<li>Like the Darwin builds, universal binaries can now be compiled for the
ios-arm target, containing either or both ARMv6 and ARMv7 instructions. This is
configured by setting ARCH_CLASS in the new <tt>CONFIG_SITE.Common.ios-arm</tt>
file. The default is now to build for ARMv7 only, which is not compatible with
the original iPhone 1 or 3G, or with the iPod Touch Generations 1 or 2.</li>
</ul>
<h4>Added <tt>-b</tt> option to dbExpand</h4>
<p>This turns off monotonic checking of breakpoint tables.</p>
<h4>Launchpad Bugs Resolved</h4>
<p>The following are links to bugs in the Launchpad bug tracker that have been
fixed in this release:</p>
<ul>
<li>697509
<a href="https://launchpad.net/bugs/697509">
Thread synchronization issue in libCom/osi/os/WIN32/osdTime.cpp</a></li>
<li>697516
<a href="https://launchpad.net/bugs/697516">
Crash occurs in Com.dll if filetime is before the EPICS epoch </a></li>
<li>697517
<a href="https://launchpad.net/bugs/697517">
WIN32 osdtime should handle the system time change properly</a></li>
<li>697519
<a href="https://launchpad.net/bugs/697519">
The incorrect way to compute the roll-over in WIN32 osdTime.cpp</a></li>
<li>736273
<a href="https://launchpad.net/bugs/736273">
nonstandard c++ mutable ref in cac</a></li>
<li>786979
<a href="https://launchpad.net/bugs/786979">
incorrect ref counting for timer queues</a></li>
<li>794749
<a href="https://launchpad.net/bugs/794749">
3.14.12 caget without -c always requests maximum element count</a></li>
<li>816678
<a href="https://launchpad.net/bugs/816678">
g++ generic thunk generation fails virtual varargs</a></li>
<li>831648
<a href="https://launchpad.net/bugs/831648">
RTEMS dynamically loaded app fails to execute osdTimeRegister</a></li>
<li>835138
<a href="https://launchpad.net/bugs/835138">
Incorrect calculation oss priorities for posix threads</a></li>
<li>861214
<a href="https://launchpad.net/bugs/861214">
epicsThreadOnce crashes in static object destructor on win32</a></li>
<li>861627
<a href="https://launchpad.net/bugs/861627">
RULES.db has incorrect dbExpand flags</a></li>
<li>878372
<a href="https://launchpad.net/bugs/878372">
in-memory channel, ca client subscribe isnt thread safe</a></li>
<li>878387
<a href="https://launchpad.net/bugs/878387">
In memory channel clear fails from put callback function</a></li>
</ul>
<h4>Added database sanity checks to iocInit</h4>
<p>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:</p>
<ul>
<li><tt>menuConvert</tt> is checked to flag problems with IOCs converted from
3.13.x, where the SLOPE choice didn't exist.</p>
<li><tt>menuScan</tt> is checked to ensure the three initial choices are still
present and that there is at least one periodic scan rate.</li>
</ul>
<h4>Fix various catools issues</h4>
<p>Array handling in the caget and camonitor programs has been debugged, fixing
<a href="https://bugs.launchpad.net/bugs/794749">launchpad bug 794749</a> along
with a few other related issues dating back to the addition of variable length
array support.</p>
<h4>Another race condition in errlog cleaned up</h4>
<p>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.</p>
<h4>Top-level make target changes</h4>
<p>Several make targets have been changed. Note that these can only be used from
an application's &lt;top&gt; directory.</p>
<dl>
<dt><code>make uninstall.&lt;arch&gt;</code></dt>
<dd>Deletes the bin/&lt;arch&gt; and lib/&lt;arch&gt; directories for
&lt;arch&gt; only. Note that &lt;arch&gt; does not have to be an
architecture that this host is configured to build, it works for any
arch.</dd>
<dt><code>make archuninstall</code></dt>
<dd>Deletes the bin/&lt;arch&gt; and lib/&lt;arch&gt; 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.</dd>
<dt><code>make uninstall</code></dt>
<dd>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/&lt;arch&gt; or
lib/&lt;arch&gt; contents.</dd>
<dt><code>make realuninstall</code></dt>
<dd>Deletes all install directories for all architectures.</dd>
<dt><code>make distclean</code></dt>
<dd>Does realclean realuninstall as before, and also now does a cvsclean,
which removes file remnants from CVS operations named <code>.#*</code> and
editor backups named <code>*~</code> throughout the source tree.</dd>
</dl>
<h4>Compress record type</h4>
<p>This record now posts monitors on its NUSE field whenever its value changes.
A new field OUSE was added to support this.</p>
<h4>Remove C++ build rule for <code>.C</code> files</h4>
<p>An early convention on Unix systems was to name C++ files with an upper-case
extention, <code>.C</code>. 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 <code>.cpp</code></p>
<h4>Support <code>make -s</code> on Windows</h4>
<p>The flag to silence build output did not work on some Windows architecture
combinations. This has now been fixed.</p>
<h4>iocLogServer now supports logrotate</h4>
<p>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.</p>
<h2 align="center">Changes between 3.14.12 and 3.14.12.1</h2>
<p>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.</p>
<h4>Launchpad Bugs Resolved</h4>
<p>The following are links to bugs in the Launchpad bug tracker that have been
fixed in this release:</p>
<ul>
<li>693534
<a href="https://launchpad.net/bugs/693534">
errlog causes crash on IOC exit</a></li>
<li>701673
<a href="https://launchpad.net/bugs/701673">
Large array problem in 3.14.12</a></li>
<li>717252
<a href="https://launchpad.net/bugs/771252">
local caput causes ioc crash on win32</a></li>
<li>750549
<a href="https://launchpad.net/bugs/750549 ">
epicsTime has non-portable c++ static initialization</a></li>
<li>753137
<a href="https://launchpad.net/bugs/753137">
Makefile dependency checking of database files is broken</a></li>
</ul>
<h4>New/Updated target architectures</h4>
<p>The following target architectures have been added or updated:</p>
<dl>
<dt>vxWorks-mpc8548</dt>
<dt>vxWorks-mpc8548-debug</dt>
<dd style="margin-bottom: 1ex">This PowerPC CPU is used on the Emerson MVME4100
VME CPU board (from Ernest Williams, SLAC).</dd>
<dt>vxWorks-ppc32</dt>
<dt>vxWorks-ppc32sf</dt>
<dt>vxWorks-ppc32-debug</dt>
<dt>vxWorks-ppc32sf-debug</dt>
<dd style="margin-bottom: 1ex">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.</dd>
<dt>ios-386</dt>
<dt>ios-arm</dt>
<dd style="margin-bottom: 1ex">Updated for iOS 4.3, which is now the default OS
version (from Tom Palaia, ORNL).</dd>
</dl>
<h4>IOCSH_STARTUP_SCRIPT environment variable</h4>
<p>The function <tt>iocsh(const char *pathname)</tt> now sets the environment
variable <tt>IOCSH_STARTUP_SCRIPT</tt> to the value of its pathname
argument before it starts executing the script commands.</p>
<h4>RTEMS-mvme5500</h4>
<p>This target now automatically links binary files with the bspExt library, and
adds the extension <tt>.elf</tt> to their filenames, matching the other mvme
targets.</p>
<h4>RTEMS Network Buffer Configuration</h4>
<p>Add the macros <tt>RTEMS_NETWORK_CONFIG_MBUF_SPACE</tt> and
<tt>RTEMS_NETWORK_CONFIG_MBUF_SPACE</tt> 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.</p>
<h4>RTEMS TFTP filesystem</h4>
<p>Use the new mount API to initialize TFTP on newer RTEMS versions.</p>
<h4>C++ build issues on older Solaris compiler</h4>
<p>Dirk Zimoch reported some problems building with an older SUNWspro C++
compiler which have been resolved where possible.</p>
<h4>FreeBSD broadcast problem</h4>
<p>The <tt>ifreq_size</tt> macro in freebsd/osdsock.h must be different in BSD
4.4.</p>
<h4>Thread exit synchronization</h4>
<p>When finished waiting for a thread to exit, signal the event in case other
threads are waiting also.</p>
<h4>Win32 osdTime provider fix</h4>
<p>Jeff Hill fixed the last time compare in PLL drift factor update loop.</p>
<h4>Errlog can lose messages</h4>
<p>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.</p>
<p>When the IOC is shutting down, the errlog thread should process all queued
messages before it quits.</p>
<h4>Back-slash escapes for Win32</h4>
<p>Stephen Norum pointed out the need for various Perl scripts to escape
back-slash characters in Windows file paths.</p>
<h4>catools on Windows</h4>
<p>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.</p>
<h2 align="center">Changes between 3.14.11 and 3.14.12</h2>
<h4>Launchpad Bugs Resolved</h4>
<p>The following are links to bugs in the Launchpad bug tracker that have been
fixed in this release:</p>
<ul>
<li>541258
<a href="https://bugs.launchpad.net/epics-base/+bug/541258">
compiler warnings in base</a></li>
<li>541264
<a href="https://bugs.launchpad.net/epics-base/+bug/541264">
CA subscription element count is fixed - eliminates compressed video
option</a></li>
<li>541331
<a href="https://bugs.launchpad.net/epics-base/+bug/541331">
Several devLib routines don't use vector table</a></li>
<li>541391
<a href="https://bugs.launchpad.net/epics-base/+bug/541391">
when subscribing for zero elements, array element count should be
dynamic</a></li>
<li>545385
<a href="https://bugs.launchpad.net/epics-base/+bug/545385">
SIGFPE calculating epicsNAN, epicsINF</a></li>
<li>546991
<a href="https://bugs.launchpad.net/epics-base/+bug/546991">
prev. value fields not initialized in init_record</a></li>
<li>551909
<a href="https://bugs.launchpad.net/epics-base/+bug/551909">
macExpandString writes out of boundary</a></li>
<li>552803
<a href="https://bugs.launchpad.net/epics-base/+bug/552803">
Compress record segfaults on ALG (algorithm) change</a></li>
<li>571121
<a href="https://bugs.launchpad.net/epics-base/+bug/571121">
Perl issue compiling with INSTALL_LOCATION set</a></li>
<li>572589
<a href="https://bugs.launchpad.net/epics-base/+bug/572589">
Make dbl emit empty strings for non-existent fields</a></li>
<li>595154
<a href="https://bugs.launchpad.net/epics-base/+bug/595154">
C++ errors building base using cygwin1.7</a></li>
<li>595240
<a href="https://bugs.launchpad.net/epics-base/+bug/595240">
C code uses C++ keywords as variable names</a></li>
<li>595242
<a href="https://bugs.launchpad.net/epics-base/+bug/595242">
C code uses C++ "//" style comments</a></li>
<li>615916
<a href="https://bugs.launchpad.net/epics-base/+bug/615916">
Bug in RULES.Db breaks parallel make when using MSI</a></li>
<li>625034
<a href="https://bugs.launchpad.net/epics-base/+bug/625034">
Remove compiler checks for VMS in src/toolsComm/flex</a></li>
<li>626848
<a href="https://bugs.launchpad.net/epics-base/+bug/626848">
Build with GNU make 3.82 fails when installing libraries</a></li>
<li>626859
<a href="https://bugs.launchpad.net/epics-base/+bug/626859">
RTEMS build does not create .d dependancy files</a></li>
<li>627511
<a href="https://bugs.launchpad.net/epics-base/+bug/627511">
MSVC linker fails if input lib dirs start with forward slash</a></li>
<li>644263
<a href="https://bugs.launchpad.net/epics-base/+bug/644263">
EPICS softIOC always dies in response to SIGHUP</a></li>
<li>650000
<a href="https://bugs.launchpad.net/epics-base/+bug/650000">
caput tool won't write to mbbo w/o state strings</a></li>
<li>663875
<a href="https://bugs.launchpad.net/epics-base/+bug/663875">
NTP broadcasts break NTP synchronization (RTEMS)</a></li>
<li>667384
<a href="https://bugs.launchpad.net/epics-base/+bug/667384">
are the request and response bytes pending reversed in casr?</a></li>
<li>680702
<a href="https://bugs.launchpad.net/epics-base/+bug/680702">
calc and calcout record get_precision bug</a></li>
</ul>
<h4>Support for Cygwin 1.7</h4>
<p>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 <tt>STATIC_BUILD=YES</tt> and <tt>SHARED_LIBRARIES=NO</tt> in
<tt>configure/CONFIG_SITE</tt>). 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.</p>
<h4>epicsEvent</h4>
<p>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.</p>
<h4>Enable array puts to subArray records</h4>
<p>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).</p>
<h4>Added windows-x64 target</h4>
<p>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.</p>
<h4>Deleted osf-alpha targets</h4>
<p>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.</p>
<h4>Expanded CALC expressions</h4>
<p>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.</p>
<h4>Added Apple iOS target architectures</h4>
<p>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.</p>
<p>To build these for iOS, uncomment the <tt>CROSS_COMPILER_TARGET_ARCHS</tt>
definition in <tt>configure/os/CONFIG_SITE.darwin-x86.Common</tt> and check the
settings in <tt>configure/os/CONFIG_SITE.Common.iosCommon</tt>.</p>
<h4>Dynamic arrays over CA</h4>
<p>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.</p>
<p>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.</p>
<p>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.</p>
<h4>CA over TCP connections</h4>
<p>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 <tt>CA_NAME_SERVERS</tt> 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.</p>
<h4>Record Types aai and aao</h4>
<ul>
<li>Fixed bug in memory allocation that caused crashes when linking other
records to aai or aao.</li>
<li>Fixed bug where NELM was modified instead of NORD.</li>
<li>Added Soft Channel device support.</li>
<li>Added SIOL link and proper simulation mode for Soft Channel support.</li>
<li>Added MPST, APST and HASH fields for monitor on change support like in
waveform record.</li>
</ul>
<h4>New capr.pl script</h4>
<p>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 <tt>capr.pl -h</tt> for usage information.</p>
<h4>devLib cleanup</h4>
<ul>
<li>Add VME connect/disconnect IRQ calls to the "virtual os" table</li>
<li>It is now possible to compile all devLib code on targets without runtime
support</li>
<li>All internal functions are made static. Some were not before.</li>
<li>Move VME calls to <tt>devLibVME.h</tt>. <tt>devLib.h</tt> contains general
defintions and error codes.</li>
<li>For compatibility <tt>devLib.h</tt> includes <tt>devLibVME.h</tt> unless the
macro <tt>NO_DEVLIB_COMPAT</tt> is defined.</li>
<li>The "virtual os" table was renamed from <tt>pdevLibVirtualOS</tt> to
<tt>pdevLibVME</tt> reflecting the fact that other bus types will need seperate
tables.</li>
<li>The "virtual os" table API has been moved to a different header file,
<tt>devLibVMEImpl.h</tt>.</li>
</ul>
<h4>DTYP and INP/OUT order</h4>
<p>The fields DTYP and INP/OUT can now be specified in any order in a database
instance (.db) file.</p>
<h4>Rewrite epicsThreadOnce()</h4>
<p>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.</p>
<h4>Many Record Types</h4>
<p>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.</p>
<h4>Compress Record Type</h4>
<p>Fixed a crash when ALG (algorithm) was changed to Average at runtime.</p>
<h4>configure/RELEASE Enhancements</h4>
<p>Variable definitions in a <tt>configure/RELEASE</tt> file may now use the
<tt>:=</tt> or <tt>?=</tt> assignment syntax. Release file processing now
prints a warning if an include file can't be not found (use <tt>-include</tt> if
this is expected) or if an undefined macro is used, and aborts if a circular
definition is expanded. The variable <tt>EPICS_HOST_ARCH</tt> can now be used,
but target-architecture-specific values must be set in a target-specific
<tt>configure/RELEASE</tt> file such as <tt>RELEASE.Common.linux-x86</tt>.</p>
<h4>VxWorks 6.7 and 6.8 support</h4>
<p>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.</p>
<h4>RTEMS 4.10 support</h4>
<p>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.</p>
<h4>Dependency file generation</h4>
<p>Changes to the way in which we generate header dependency files, which are
now named with a <tt>.d</tt> suffix instead of <tt>.depends</tt>. We now use
the compiler to generate these where possible, and create them in the
<tt>O.$(T_A)</tt> directory.</p>
<h4>Installed file permissions</h4>
<p>We now install libraries and other non-executable files with mode 444 rather
than 644.</p>
<h4>CA Perl5: strings and array subscriptions</h4>
<p>In some circumstances a string received from CA might not have been properly
zero-terminated; this has now been fixed. <tt>CA::create_subscription()</tt>
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.</p>
<h4>Linking Readline on Linux</h4>
<p>Different Linux distributions have different requirements when linking
readline; some need <tt>-lcurses</tt>, others <tt>-lncurses</tt> and others
don't require either. The <tt>configure/os/CONFIG_SITE.Common.linux-*</tt>
files now make this configuration easy to choose between different settings for
the <tt>COMMANDLINE_LIBRARY</tt> variable. If your build fails as it's trying
to create the <tt>antelope</tt> binary in the Base directory
<tt>src/toolsComm/antelope/O.<i>arch</i></tt> this is almost certainly the
problem. You will need to do a <tt>make rebuild</tt> from the top of Base after
fixing the setting of <tt>COMMANDLINE_LIBRARY</tt>.</p>
<h4>CA Command Line Tools Changes</h4>
<p>Three new options were added to the <tt>caget</tt> and <tt>camonitor</tt>
utilities, to allow printing float values (rounded) as hex, octal or binary.</p>
<h2 align="center">Changes between 3.14.10 and 3.14.11</h2>
<h4>Time provider on Win32</h4>
<p>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.</p>
<h4>Build system dependency change</h4>
<p>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
<tt>make <i>crosstargetarch</i></tt> command is issued, the EPICS_HOST_ARCH
target build will be executed first, followed by the <i>crosstargetarch</i>
build. Builds done in an O.<i>arch</i> directory will still only build the
<i>arch</i> targets however.</p>
<h4>Channel Access changes</h4>
<p>Mantis 361 fix - ca_add_fd_registration users might not receive select
wakeup</p>
<p>Mantis 359 fix - ca client library flow control mode related issues</p>
<p>Mantis 357 fix - high throughput multithreaded ca client appl thread could
be trapped in lib.</p>
<ul>
<li>Discovered during code review. Not seen in practice, but possible</li>
</ul>
<p>Mantis 285 fix - CA Documentation doesn't distinguish sync groups from
ca_put_callback()</p>
<p>Mantis 346 fix - deleting the chid passed in from within put cb handler
causes failure</p>
<p>Mantis 284 fix - channel clear protocol warning messages from PCAS</p>
<p>Mantis 237 fix - SEGV from simple CA client during context destroy</p>
<p>Mantis 242 fix - invalid DBR type not screened in client library when
doing a put</p>
<h4>Portable Channel Access Server changes</h4>
<p> These changes impact the Gateway (Proxy server) and other servers but not
the IOC.</h4>
<p>Mantis 360 fix - server is unresponsive for one of its clients, when
async io postponed and in flow control mode</p>
<p>Mantis 358 fix - PCAS service snap-in has no way to determine if its a put,
or a put calback.</p>
<p>Mantis 356 fix - medm display sometimes hangs until the motor stops when
controling motor through gw.</p>
<p>Mantis 350 fix - Incoming data corruption under heavy CAS load.</p>
<p>Mantis 340 fix - leak when performing a read and conversion fails.</p>
<p>Mantis 348 fix - A call to 'assert (item.pList == this)'
failed in ../../../../src/cas/generic/st/ioBlocked.cc line 112</p>
<p>Mantis 345 fix - Compilation warning: complaint about missing
gddDestructor</p>
<p>Mantis 343 fix - gddScalar::new() operator is not fully thread safe</p>
<p>Mantis 333 fix - resTable::removeAll() does not reset the item count</p>
<p>Mantis 335 fix - excas fails in clearOutstandingReads - maybe requires an
R3.13 client</p>
<p>Mantis 329 fix - GW hang, pthread_mutex_lock failed: error Invalid
argument message</p>
<p>Mantis 352 fix - gateway hangs temporarily under heavy load on 8-core
64bit RHEL5</p>
<ul>
<li>High throughput performance appears to be much better now for both scalars
and large arrays, but more testing needed in operational gateways</li>
</ul>
<h4>Timer Queue Library</h4>
<p>Mantis 336 fix - timer queue should have try / catch block around call to
user's expiration callback</p>
<p>Mantis 332 fix - epicsTimerTest failure, windows vista 64, dual core
SMP system</p>
<h4>LibCom</h4>
<p>Mantis 328 fixed - orderly shutdown for soft IOC fails</p>
<h4>Application configure files</h4>
<p>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:</p>
<ul>
<li>CONFIG_SITE.&lt;host-arch&gt;.Common</li>
<li>CONFIG_SITE.Common.&lt;target-arch&gt;</li>
<li>CONFIG_SITE.&lt;host-arch&gt;.&lt;target-arch&gt;</li>
</ul>
<p>Note that the setting for <tt>CHECK_RELEASE</tt> 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
<tt>CHECK_RELEASE</tt> setting back to the configure/Makefile where it used to
live.</p>
<p>The RELEASE file(s) can now define the variable <tt>RULES</tt> 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.</p>
<h4>Compile-time assertions</h4>
<p>A new macro has been added to epicsAssert.h which performs assertion checks
at compile-time. <tt>STATIC_ASSERT(<i>expr</i>)</tt> can only be used when
<tt><i>expr</i></tt> 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 <tt>static_assert(<i>expr</i>,
<i>message</i>)</tt> but will require compiler support to be implemented.</p>
<h4>Several changes made to dbDefs.h</h4>
<p>The definitions for the macros <tt>YES</tt>, <tt>NO</tt>, <tt>NONE</tt>,
<tt>min()</tt> and <tt>max()</tt> have been deleted. <tt>YES</tt> and
<tt>NO</tt> have been replaced by <tt>menuYesNoYES</tt> and <tt>menuYesNoNO</tt>
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.</p>
<p>The macro <tt>LOCAL</tt> that was a synonym for <tt>static</tt> is now
deprecated and will be deleted in R3.15, please adjust your code to use the
latter keyword. All uses of the <tt>READONLY</tt> macro from shareLib.h must
now be replaced by the keyword <tt>const</tt> as the macro has been deleted.</p>
<p>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 <tt>#include</tt> statements that might need to be added are:</p>
<ul>
<li>#include &lt;stdarg.h&gt;</li>
<li>#include "errlog.h"</li>
<li>#include "errMdef.h"</li>
<li>#include "ellLib.h"</li>
<li>#include "epicsTypes.h"</li>
</ul>
<p>A new macro <tt>CONTAINER(pointer, type, member)</tt> 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.</p>
<h4>Long-deprecated errSymFind() function deleted</h4>
<p>This functionality was replaced by errSymLookup() many releases ago.</p>
<h4>Perl CA library shutdown</h4>
<p>The Perl CA library has been modified to properly flush the Channel Access
I/O queues when a program using the library exits.</p>
<h4>bi, bo, mbbi, mbbo ENUM string fields</h4>
<p>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.</p>
<h4>Use of SIGALRM disabled</h4>
<p>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.</p>
<h4>Universal Binaries on Darwin</h4>
<p>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.&lt;arch&gt; 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.</p>
<h4>HPUX, SGI and VMS files deleted</h4>
<p>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.</p>
<h4>PINI Processing and PHAS values</h4>
<p>The PINI field now has its own menu type with four more choices,
<tt>RUN</tt>, <tt>RUNNING</tt>, <tt>PAUSE</tt> and <tt>PAUSED</tt>. The earlier
<tt>NO</tt> and <tt>YES</tt> 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 <tt>initHookAtIocRun</tt>,
<tt>initHookAfterIocRunning</tt>, <tt>initHookAtIocPause</tt> and
<tt>initHookAfterIocPaused</tt> states respectively.</p>
<p>Records with <tt>PINI=YES</tt> will be processed during the <tt>iocBuild</tt>
stage of <tt>iocInit</tt>, follwed by records with <tt>PINI=RUN</tt> during the
<tt>iocRun</tt> stage and records with <tt>PINI=RUNNING</tt> during the
<tt>initHookAfterIocRunning</tt> stage. If an <tt>iocPause</tt> command is
given, any records with <tt>PINI=PAUSE</tt> will be processed at the
<tt>initHookAtIocPause</tt> stage followed by records with <tt>PINI=PAUSED</tt>
will be processed at the <tt>initHookAfterIocPaused</tt> stage. A subsequent
<tt>iocRun</tt> command causes the <tt>PINI=RUN</tt> and <tt>PINI=RUNNING</tt>
records to be processed again.</p>
<p>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.</p>
<h4>Additional initHook states</h4>
<p>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:</p>
<blockquote>
<pre>typedef enum {
initHookAtIocBuild = 0, /* Start of iocBuild/iocInit commands */
initHookAtBeginning,
initHookAfterCallbackInit,
initHookAfterCaLinkInit,
initHookAfterInitDrvSup,
initHookAfterInitRecSup,
initHookAfterInitDevSup,
initHookAfterInitDatabase,
initHookAfterFinishDevSup,
initHookAfterScanInit,
initHookAfterInitialProcess,
initHookAfterCaServerInit,
initHookAfterIocBuilt, /* End of iocBuild command */
initHookAtIocRun, /* Start of iocRun command */
initHookAfterDatabaseRunning,
initHookAfterCaServerRunning,
initHookAfterIocRunning, /* End of iocRun/iocInit commands */
initHookAtIocPause, /* Start of iocPause command */
initHookAfterCaServerPaused,
initHookAfterDatabasePaused,
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;</pre>
</blockquote>
<p>The two deprecated states will only ever be announced once, whereas the newer
ones will repeat as often as the <tt>iocPause</tt> and <tt>iocRun</tt> commands
are executed.</p>
<h4>Soft Channel ai device support and SMOO</h4>
<p>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.</p>
<h4>New link flags for alarm severity/status inheritance</h4>
<p>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).</p>
<p>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.</p>
<p>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.</p>
<h4>Analog records get_alarm_double() semantics changed</h4>
<p>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.</p>
<p>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.</p>
<h4>New math constants epicsNAN and epicsINF</h4>
<p>Two new math constants have been added to epicsMath.h: <tt>epicsNAN</tt>
(not a number) and <tt>epicsINF</tt> (infinity).
<h4>New event type DBE_PROPERTY</h4>
<p>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.</p>
<p>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.</p>
<p>Client application developers are encouraged to start using DBE_PROPERTY
subscriptions to fetch channel attribute data.</p>
<h4>Channel Access command line tool changes</h4>
<p>The caget/caput/camonitor programs in src/catools now use '\' escape
sequences for non-printable characters.</p>
<p>They provide a new option <tt>-F</tt> to set an output field separator
to be used instead of the default space character.</p>
<h4>New functions for escaping non-printables in epicsString.h</h4>
<p>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:</p>
<pre>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);</pre>
<p>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.</p>
<p>The existing function interfaces will be kept for compatibility, but their
further use is deprecated.</p>
<h4>epicsRingBytes</h4>
<p>Partial puts are not supported.
An attempt to put more bytes than currently free will be rejected.</p>
<h4>Long string support</h4>
<p>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.</p>
<p>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).</p>
<p>The caget/caput/camonitor programs in src/catools can now use long strings by
adding the command-line option <tt>-S</tt> 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.</p>
<h4>Darwin no longer uses _environ</h4>
<p>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.</p>
<h4>gpHash argument type changed</h4>
<p>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 <tt>gph...()</tt> routines used to be a <tt>void&nbsp;*</tt> (or a
pointer to one for <tt>gphInit()</tt>) but is now a <tt>struct
gphPvt&nbsp;*</tt> (<tt>struct gphPvt&nbsp;**</tt> for <tt>gphInit</tt>) for
better type safety. The definition of the structure has not been made public,
although a declaration is provided in <tt>gpHash.h</tt>.</p>
<h4>New hash functions in epicsString.h</h4>
<p>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:</p>
<pre>unsigned int epicsStrHash(const char *str, unsigned int seed);
unsigned int epicsMemHash(const char *str, size_t length, unsigned int seed);</pre>
<p>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.</p>
<h4>Support for dynamic loading</h4>
<p>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
<tt>epicsLoadLibrary()</tt> function. In order to include this command in an
IOC, you must include the <tt>dlload.dbd</tt> file; the command will then be
installed when the IOC's <tt>ioc_registerRecordDeviceDriver</tt> routine is
run.</p>
<p>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 <tt>LOADABLE_LIBRARY</tt> to
ensure that the correct linker commands are used.</p>
<p>After a shared library is loaded into the IOC using the new iocsh
<tt>dlload</tt> command you will usually have to run the
<tt>lib_registerRecordDeviceDriver</tt> 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.</p>
<p>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.</p>
<h4>Perl5 CA library</h4>
<p>The <tt>CA::put</tt> and <tt>CA::put_callback</tt> 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.</p>
<h4>generalTime and epicsTime updates</h4>
<p>Allow time providers to supply timestamps in interrupt context. A pair of
new API routines in epicsTime.h <tt>epicsTimeGetCurrentInt()</tt> and
<tt>epicsTimeGetEventInt()</tt> 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 <tt>generalTimeAddIntCurrentProvider()</tt> or
<tt>generalTimeAddIntEventProvider()</tt> as appropriate, these API routines
will return failure. The resulting timestamp is not protected against
backwards movement either.</p>
<p>Added a routine <tt>generalTimeHighestCurrentName()</tt> which returns the
name of the highest prority registered current time provider. Comparing this
with the name returned by <tt>generalTimeCurrentProviderName()</tt> 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
<tt>@TOPTCP</tt> has been added to make this name available in a database
record.</p>
<p>The following routines have been renamed, but the old name may still be
used since a macro with the old name has been added:</p>
<blockquote>
<table border="1">
<tbody>
<tr>
<th>Old Name</th>
<th>New Name</th>
</tr>
<tr>
<td><tt>generalTimeCurrentTpRegister</tt></td>
<td><tt>generalTimeRegisterCurrentProvider</tt></td>
</tr>
<tr>
<td><tt>generalTimeEventTpRegister</tt></td>
<td><tt>generalTimeRegisterEventProvider</tt></td>
</tr>
<tr>
<td><tt>generalTimeCurrentTpName</tt></td>
<td><tt>generalTimeCurrentProviderName</tt></td>
</tr>
<tr>
<td><tt>generalTimeEventTpName</tt></td>
<td><tt>generalTimeEventProviderName</tt></td>
</tr>
</tbody>
</table>
</blockquote>
<p>The routine <tt>generalTimeCreateSyncTimer()</tt> 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 <tt>synchronize()</tt> method from the
epicsTime class has also gone.</p>
<h4>RTEMS Release</h4>
<p>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).</p>
<h4>RTEMS</h4>
<p>RTEMS stack sizes have been reduced. This allows more clients in machines
with limited memory.</p>
<p>RTEMS file descriptor allocation has been increased.</p>
<h4>Added record aliases</h4>
<p>Record definitions can declare their own alias names along with the field
values, or a separate alias statement can also be used:</p>
<blockquote>
<pre>record(ai,"canonicalName")
{
alias("firstAlias")
}
alias("canonicalName","secondAlias")</pre>
</blockquote>
<p>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:</p>
<blockquote>
<pre>long dbCreateAlias(DBENTRY *pdbentry, const char *paliasName);
int dbIsAlias(DBENTRY *pdbentry);
int dbGetNAliases(DBENTRY *pdbentry)
long dbDeleteAliases(DBENTRY *pdbentry);</pre>
</blockquote>
<p>Aliases are located using the existing record instance API. Use
<tt>dbIsAlias()</tt> to test whether a record is actually an alias or not.
Aliasees can be deleted like record instances using <tt>dbDeleteRecord()</tt>
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
<tt>dbDeleteAliases()</tt> routine deletes all aliases of the selected
record, and will return an error if used on an alias.</p>
<p>Any out-of-tree tools that scan through all the records in the database
using <tt>dbFirstRecord()</tt> and <tt>dbNextRecord()</tt> 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.</p>
<h4>Added support for RTEMS-mvme2700</h4>
<p>Supplied by Matt Rippa &lt;mrippa@gemini.edu&gt;. Should work for
MVME2400, too.</p>
<h4>CA Commandline tools: priority support</h4>
<p>A new option <tt>-p</tt> was added to all Channel Access command line
tools to allow specifying the CA priority.</p>
<h4>Linux: Use libncurses</h4>
<p>Changed linux builds to link against libncurses instead of libcurses
(suggested by Peter Zumbruch).</p>
<h2 align="center">Changes between 3.14.9 and 3.14.10</h2>
<h4>GCC_EXEC_PREFIX references removed from configuration files</h4>
<p>Definition of GCC_EXEC_PREFIX removed from CONFIG.CrossCommon and
unexport of GCC_EXEC_PREFIX removed from vxWorks and RTEMS builds.</p>
<h4>RTEMS Release</h4>
<p>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.</p>
<h4>RTEMS epicsEventWaitWithTimeout</h4>
<p>Correctly return epicsEventWaitTimeout when event is not pending and
timeout value is 0.0 seconds.</p>
<h4>epicsRingPointer, epicsRingBytes</h4>
<p>Fixed a race condition exposed by compilers with more agressive
optimization.</p>
<h4>camonitor timestamp support</h4>
<p>The <tt>camonitor</tt> program now supports the ability to display both
server- and client-side timestamps, simultaneously if requested. The old
command-line options <tt>-r</tt> <tt>-i</tt> and <tt>-I</tt> that controlled
the timestamp display have been replaced with a new <tt>-t</tt> option that
takes additional argument letters to control which timestamp sources and
output format should be used.</p>
<p>See the Command Line Tools section of the Channel Access reference manual
or run <tt>camonitor -h</tt> for a summary of the options.</p>
<h4>New "stdio" stringout device support</h4>
<p>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.</p>
<h4>General Time subsystem</h4>
<p>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.</p>
<p>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 <tt>generalTimeReport(int interest)</tt> and some time
providers also have their own separate report commands.</p>
<p>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.</p>
<p>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
<tt>installLastResortEventProvider</tt> from your IOC startup script.</p>
<p>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.</p>
<h4>New ioc/dllPath.bat file for Win32</h4>
<p>When creating an IOC with one of the win32-x86 target architectures, a
file <tt>dllPath.bat</tt> 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.</p>
<h4>New epicsEndian.h header</h4>
<p>Any C or C++ code can <tt>#include "epicsEndian.h"</tt> 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.</p>
<p>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.</p>
<h4>Array Subroutine Record added (aSub)</h4>
<p>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:</p>
<ul>
<li>The fields <tt>UFA..UFU</tt>, <tt>UFVA..UFVU</tt>, <tt>TOVA..TOVU</tt>
and <tt>VERS</tt> have been removed.</li>
<li>The <tt>INPA..INPU</tt> and <tt>OUTA..OUTU</tt> link fields can now be
changed at runtime.</li>
<li>A new set of fields <tt>NEA..NEU</tt> and <tt>NEVA..NEVU</tt> have been
added which hold the current element count for the associated input and
ouput fields. These count fields ensure that putting an array to the
<tt>A..U</tt> or <tt>VALA..VALU</tt> fields cannot permanently shorten
the number of elements that the array fields can hold.</li>
<li>The default value for the <tt>FTA..FTU</tt> and <tt>FTVA..FTVU</tt>
fields has been changed from "STRING" to "DOUBLE", to reduce the memory
footprint of unneeded fields.</li>
<li>aSub subroutines can be asynchronous, using the usual method of setting
prec-&gt;pact to <tt>TRUE</tt> before returning and arranging for the
record's <tt>process()</tt> routine to be called to signal completion.
The output links are not written until the asynchronous completion
callback, and input links are not read at asnychronous completion.</li>
</ul>
<h4>epicsTimeEventDeviceTime support for soft channel input records</h4>
<p>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
<tt>recGblGetTimeStamp()</tt>.</p>
<h4>devLib: CR/CSR Support added</h4>
<p>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).</p>
<h4>ascaStats, dbcaStats, seqcaStats</h4>
<p>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:</p>
<blockquote>
<pre>void ascaStats(int *pchans, int *pdiscon);
void dbcaStats(int *pchans, int *pdiscon);
void seqcaStats(int *pchans, int *pdiscon);</pre>
</blockquote>
<p>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).</p>
<h4>Messages from errlog</h4>
<p>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.</p>
<h4>ipToAsciiProxy</h4>
<p>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.</p>
<h4>iocBuild, iocRun and iocPause</h4>
<p>These three new commands are mainly intended for use with DESY's redundant
IOC software but they might have some uses for others too. <tt>iocBuild</tt>
allow an IOC to be initialized and set up ready for a quick start without
actually making it live; a subsequent <tt>iocRun</tt> will bring it to the
same state as an <tt>iocInit</tt> would have. Once an IOC has been started
(using either <tt>iocInit</tt> or <tt>iocBuild</tt> + <tt>iocRun</tt>) the
<tt>iocPause</tt> command can be used to freeze it, disconnecting its PVs and
stopping all scan activity. The <tt>iocRun</tt> command restarts the IOC
from this state.</p>
<p>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.</p>
<h4>IOC Support on 64-bit archs</h4>
<p>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
<tt>long</tt> is 64 bits wide. This was not as simple as replacing every
instance of the typename <tt>long</tt> with <tt>epicsInt32</tt> 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 <tt>DBF_LONG</tt> does <em>not</em> map to <tt>long</tt> but to
<tt>int</tt>). This change does not affect status return values, which are
still implemented using the native <tt>long</tt> type for the platform.</p>
<h4>Conversion of empty strings to character types</h4>
<p>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 <tt>DBF_CHAR</tt> and <tt>DBF_UCHAR</tt> where it converts to the ASCII
character <tt>'0'</tt>, 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.</p>
<h4>epicsShareAPI deprecated inside IOC</h4>
<p>APIs that are intended for use inside the IOC, the <tt>epicsShareAPI</tt>
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.</p>
<h4>Record types ANSIfied</h4>
<p>Thanks to John Hammonds at the EPICS Codeathon, the record type
implementations have been converted from K&amp;R to ANSI C prototypes.</p>
<h4>Added Perl5 CA library</h4>
<p>Base now provides a CA client library interface for Perl5 scripts in
<tt>src/cap5</tt> and includes as examples some implementations of the
catools programs written in Perl. Documentation on how to use the Perl
library is available in <tt>base/html/CA.html</tt> after the build completes.
This library cannot currently be built on Windows targets.</p>
<h4>IOC ignores SIGHUP</h4>
<p>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.</p>
<h4>Build System Reorganization</h4>
<p>Several changes have been made to the build system, although these changes
should not affect the contents of <tt>Makefile</tt>s 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:</p>
<ul>
<li><p>A new tool is provided that expands out <tt>@VAR@</tt> macros. By
default it knows the value of <tt>@TOP@</tt>, <tt>@ARCH@</tt> and any
paths defined in the application's <tt>configure/RELEASE</tt> file such
as @EPICS_BASE@, but additional macros can be defined in the
<tt>Makefile</tt> that uses it by adding to the <tt>EXPAND_VARS</tt>
variable like the example following, which creates an <tt>@EXE@</tt>
macro that expands out to <tt>.exe</tt> on windows targets and to nothing
on other platforms:</p>
<pre> EXPAND_VARS += EXE=$(EXE)</pre>
<p>Files that contain <tt>@VAR@</tt> macros to be substituted must have
an at sign <tt><b>@</b></tt> as the last character of their name and be
listed in the <tt>EXPAND</tt> variable of their <tt>Makefile</tt>. The
expanded file will have the same name as the original with the
<tt><b>@</b></tt> suffix removed, and is then available for compiling or
installing using any other build mechanism.</p>
</li>
<li><p>Support has been added for installing Perl library modules. The
<tt>Makefile</tt> variable <tt>PERL_MODULES</tt> can be set to a list of
names of files to be installed into the <tt>$(TOP)/lib/perl</tt>
directory. The above macro expansion facility can then be used in perl
programs that use these libraries to set the perl search path to include
that directory. The syntax for this is as follows:</p>
<pre> use lib '@TOP@/lib/perl';
use MyModule;</pre>
<p>The filenames listed in <tt>PERL_MODULES</tt> can include subdirectory
path components and the build system will preserve these in the installed
result.</p>
</li>
<li>The Perl scripts that were in <tt>configure/tools</tt> are now found in
the new <tt>src/tools</tt> directory, and get installed into the
appropriate <tt>bin/<i>hostarch</i></tt> directory at build time. Some of
these scripts are no longer required and have been removed, and others
are being modified to make them more modular, extracting common routines
into perl library modules.</li>
<li>The generated files that were created by running make in the
<tt>configure</tt> directory are no longer required, having been replaced
by additional mechanisms inside the build system files. This removes a
common source of build problems.</li>
</ul>
<h4>Access security configuration files</h4>
<p>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
"&lt;filename&gt;"' and '#define &lt;macroname&gt; &lt;value&gt;' lines. The
C preprocessor includes the #include files and performs the macro
substitutions.</p>
<h4>Changes to subArray record error behaviour</h4>
<p>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.</p>
<h4>scanOnce(precord) argument</h4>
<p>The argument to <tt>scanOnce()</tt> is a pointer to the record to be
scanned. This used to be a <tt>void *</tt> pointer, but is now a
<tt>dbCommon *</tt> pointer. Record types written in C that call
<tt>scanOnce()</tt> 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 <tt>dbCommon *</tt> instead.</p>
<h4>New Architectures</h4>
<p>The following target architectures have been added to this release,
although the core developers lack the ability to test all of them:</p>
<ul>
<li>linux-cris
<ul>
<li>linux-cris_v10</li>
<li>linux-cris_v32</li>
</ul>
</li>
<li>linux-xscale_be (tested with MOXA UC-7408 Plus)</li>
</ul>
<h4>Added compile line header search directories</h4>
<p>The compile line list of directories to search for header files now
includes O.Common and the existing os subdirectories of SRC_DIRS
&lt;src_dir&gt;/os/&lt;OS_CLASS&gt;, &lt;src_dir&gt;/os/posix, and
&lt;src_dir&gt;/os/default.</p>
<h4>Parallel make now supported</h4>
<p>The <tt>-j <i>jobs</i></tt> option is now supported for users of GNU Make
version 3.80 or later. The <tt>-j</tt> 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
<tt>-j</tt>, but using the <tt>-j</tt> option with an earlier version of GNU
make will fail since this relies on the <tt>$(eval)</tt> function which was
introduced in GNU Make 3.80.</p>
<p>The <tt>-j</tt> 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.</p>
<p>New DIRS directory dependancy specifications are required to determine the
directory build order with <tt>-j</tt>. 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:</p>
<blockquote>
<pre> DIRS = configure src
src_DEPEND_DIRS = configure</pre>
</blockquote>
<p>The directory dependancy specifications are only needed when <tt>-j</tt>
is given to make. Without the <tt>-j</tt> the order of directories in the
DIRS definition determines the build order as before.</p>
<h4>Breakpoint tables</h4>
<p>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 <tt>dbBptNotMonotonic</tt> has been added that disables this
check if its value is non-zero.</p>
<p>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
<tt>dbExpand</tt> 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
<tt>dbLoadDatabase</tt> or <tt>dbLoadRecords</tt>.</p>
<h4>RTEMS on processors with MOTLOAD bootstrap</h4>
<p>Added support for more 'Global Environment Variables'. Documented in the
EPICS/RTEMS tutorial.</p>
<h4>RTEMS on processors with PPCBUG bootstrap</h4>
<p>Set NTP server as well as nameserver and log server from server bootstrap
settting.</p>
<h4>RTEMS compiler flags</h4>
<p>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.</p>
<h4>SEL record (Mantis #295)</h4>
<p>The value in the SELN field was not being checked against its limit,
potentially causing a crash on some architectures.</p>
<h4>Calc expressions</h4>
<dl>
<dt><tt>VAL</tt> keyword</dt>
<dd>The keyword <tt>VAL</tt> 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 <i>not</i> 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.</dd>
<dt><tt>MIN</tt>, <tt>MAX</tt>, <tt>FINITE</tt>, <tt>ISNAN</tt>
functions</dt>
<dd>Thanks to Benjamin Franksen these functions can now accept any number
of arguments, thus <tt>MAX(A,B,C,D,E,F,G,H,I,J,K,L)</tt> and
<tt>MIN(A)</tt>are now legal expressions. The <tt>FINITE</tt> function
returns a non-zero value as long as none of its arguments are NaN or
Inf values, while <tt>ISNAN</tt> returns non-zero if any of its
arguments are NaN values.</dd>
</dl>
<h4>softIoc now starts shell by default</h4>
<p>To prevent an interactive shell from being started, give a <tt>-S</tt>
(upper case) option on the softIoc command line. The old <tt>-s</tt> (lower
case) option is still accepted, but now does nothing.</p>
<h4>Error messages from dbLoadRecords</h4>
<p>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...</p>
<h4>Command registration for iocsh</h4>
<p>The iocsh command registration data and routines have been moved out of
the <tt>src/iocsh</tt> 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 <tt>libiocsh.a</tt> library created any more, so any
applications (such as the sequencer) which explicitly list <tt>iocsh</tt> in
a <tt>xxx_LIBS</tt> 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 <tt>EPICS_BASE_IOC_LIBS</tt> or
<tt>EPICS_BASE_HOST_LIBS</tt> variables that are set in Base, and thus no
changes will be needed.</p>
<h2 align="center">Changes between 3.14.8.2 and 3.14.9</h2>
<h4>Cygwin Builds</h4>
<p>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 <a
href="https://projects.coin-or.org/BuildTools/wiki/current-issues">this
website</a>.</p>
<h4>New Architectures</h4>
<p>The following target architectures have been added to this release,
although the core developers lack the ability to test all of them:</p>
<ul>
<li>darwin-ppcx86</li>
<li>darwin-x86</li>
<li>freebsd-x86</li>
<li>freebsd-x86_64</li>
<li>interix-x86</li>
<li>linux-arm</li>
<li>osf-alpha</li>
<li>osf-alpha-gnu</li>
<li>vxWorks-mpc8540</li>
<li>vxWorks-ppc604_altivec</li>
</ul>
<h4>vxWorks compiler optimization level</h4>
<p>Wind River Systems do not support optimization levels beyond <tt>-O2</tt>
for vxWorks applications compiled using gcc, so optimized vxWorks builds are
now set to <tt>-O2</tt> only (we currently use <tt>-O3</tt> everywhere
else).</p>
<h4>cas</h4>
<p>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.</p>
<h4>dbLoadTemplate</h4>
<p>The parser for the substitutions file accepted by dbLoadTemplate() has
been revised, and is now stricter than it used to be &#x2014; 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: <tt>a-z A-Z 0-9 _ - + : . / \ [ ] &lt; &gt; ;</tt></p>
<h4>Escaped characters in record fields</h4>
<p>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.</p>
<h4>libCom/test and db/test</h4>
<p>These test programs are no longer installed into the bin/<i>arch</i>
directory. Running all these programs on any host architecture is as simple
as typing <tt>make runtests</tt> 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.&lt;arch&gt; directory; the program output is designed to be
comprehensible to humans.</p>
<p>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:</p>
<blockquote>
<pre>ld &lt;/path/to/base/bin/vxWorks-<i>arch</i>/vxTestHarness.munch
cd "/path/to/writable/directory"
epicsRunLibComTests</pre>
</blockquote>
<p>On RTEMS, boot the <tt>bin/<i>arch</i>/rtemsTestHarness</tt> binary.</p>
<p>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.</p>
<h4>Breakpoint tables</h4>
<p>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.</p>
<h4>Support for vxWorks 6</h4>
<p>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 <tt>vxWorks6-mv2100</tt> and <tt>vxWorks6-mv5100</tt> have been
removed; IOCs built under vxWorks 6.x using these architectures must revert
to the original <tt>vxWorks-ppc603_long</tt> and <tt>vxWorks-ppc604_long</tt>
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.</p>
<h4>postfix and calcPerform</h4>
<p>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.</p>
<p>Assignment operations are now possible, using the new <tt>:=</tt> operator
which must have an expression variable (<tt>A</tt> through <tt>L</tt>) to its
immediate left. Multiple expressions can be included in the calculation
string, separated by a semicolon <tt>;</tt>, 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:
<tt>sin(a); a:=a+d2r</tt></p>
<p>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 <tt>finite()</tt>, <tt>isinf()</tt> and <tt>isnan()</tt> have been
added to the expression language. The literal values <tt>Inf</tt> and
<tt>NaN</tt> are also now supported in expressions.</p>
<p>The only incompatible change to the expression language was to change the
<tt>NOT</tt> 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 &#x2014; nobody complained when I discussed this on
tech-talk...</p>
<p>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.</p>
<h4>calc and calcout record, asLib</h4>
<p>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.</p>
<p>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.</p>
<p>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
<tt>"0"</tt> string. Also any calcout record device support must now add the
line <tt>#include "postfix.h"</tt> before the
<tt>#include "calcoutRecord.h"</tt> line in the source code.</p>
<h4>recGblAlarmHook</h4>
<p>The <tt>recGblResetAlarms()</tt> 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 <tt>recGblAlarmHook</tt> 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.</p>
<h4>ai, bi, mbbi and mbbiDirect records</h4>
<p>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.</p>
<h4>dbpr</h4>
<p>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.</p>
<h4>configure/RELEASE*</h4>
<p>The <tt>convertRelease.pl</tt> parser now supports the use of
<tt>-include</tt> statements in configure/RELEASE files as well as
<tt>include</tt> statements.</p>
<h4>MIPS support</h4>
<p>Changes were needed to the <tt>configure/tools/munch.pl</tt> script to
support vxWorks-MIPS targets.</p>
<h4>epicsUnitTest</h4>
<p>A new facility is provided in libCom for use in generating automated test
programs. Many (but not all) of the test programs in <tt>libCom/test</tt>
have been converted to use this facility.</p>
<h4>dbStaticLib</h4>
<p>Off-by-one buffer overflow error fixed in dbFindField() which only seemed
to affect vxWorks-(intel) targets.</p>
<h4>RTEMS</h4>
<p>Create a POSIX-compliant TZ environment variable from EPICS_TIMEZONE.
Previous versions had an incorrect format which was ignored by tzset().</p>
<p>Added space for user extensions. This provides the infrastructure for the
spy command.</p>
<p>Fixed error in epicsThreadGetName for non-EPICS threads.</p>
<p>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.</p>
<h4>e_flex</h4>
<p><tt>e_flex</tt> has been modified to accept DOS line endings as well as
Unix ones. The <tt>scan.c</tt> file was recreated using <tt>e_flex</tt>
itself and the <tt>flex.skel</tt> file on the modified
<tt>scan.l.DISTRIB</tt> source. <tt>initscan.c</tt> is not required or used
for the EPICS build, so it has been removed.</p>
<h4>devLib</h4>
<p>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
<tt>devLibOSD.c</tt>.</p>
<h4>iocsh</h4>
<p>Added epicsThreadResume command.</p>
<h4>libCom</h4>
<p>mallocMustSucceed and callocMustSucceed accept 0-byte requests. Note that
these routines may return a NULL pointer in such cases.</p>
<h4>Mac OS X (Darwin)</h4>
<p>Added support for EPICS_HOST_ARCH=darwin-ppcx86 for building
libraries/applications which will run on both PowerPC and Intel x86
targets.</p>
<p>Added support for EPICS_HOST_ARCH=darwin-x86.</p>
<h2 align="center">Changes between 3.14.8.1 and 3.14.8.2</h2>
<h4>epicsStrtod</h4>
<p>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.</p>
<h2 align="center">Changes between 3.14.8 and 3.14.8.1</h2>
<h4>Version Numbering</h4>
<p>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 <tt>EPICS_SITE_VERSION</tt>
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
<tt>EPICS_SITE_VERSION</tt> instead.</p>
<h4>CA</h4>
<p>Mantis entries fixed:</p>
<p>232 - non-preemptive mode client relying on ca_poll does not always
reconnect</p>
<h4>Win32 symbol changes</h4>
<p>These changes are required to allow software outside of Base to be built
on win32 architectures.</p>
<ul>
<li>win32 epicsShareAPI changes to libCom
<p>The win32 Pascal calling convention (epicsShareAPI) has been removed
from the following header files in libCom/misc: adjustment.h,
cantProceed.h, epicsConvert.h, epicsStdlib.h, epicsString.h.</p>
</li>
<li>epicsString
<p>A new function epicsStrtok_r has been added because win32 does not
implement strtok_r.</p>
</li>
<li>epicsStdlib
<p>All function described in epicsStdlib.h are now implemented in
epicsStdlib.c</p>
</li>
<li>win32 epicsShareExtern changes in dbStaticLib
<p>The type name mapping array mapdbfType defined in dbFldTypes.h has had
the correct export modifier keywords added to it for use on win32.</p>
</li>
</ul>
<h2 align="center">Changes between 3.14.7 and 3.14.8</h2>
<h4>New host targets</h4>
<p>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.</p>
<p>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.</p>
<h4>Runtime Hardware Address Changes</h4>
<p>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.</p>
<p>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.</p>
<h4>POSIX thread priority scheduling</h4>
<p>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.</p>
<h4>VX_DIR</h4>
<p>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.</p>
<h4>RTEMS_BASE</h4>
<p>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.</p>
<h4>event generator and event receiver record support</h4>
All apsEvent specific record support has been removed from base
<h4>drvTS and apsEvent support</h4>
<p>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</p>
<p>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.</p>
<h4>task watchdog</h4>
<p>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.</p>
<h4>dbLock and dbBkpt</h4>
<p>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.</p>
<h4>gpHashLib.c</h4>
<p>The maximum size was initialized to 65636 instead of 65536.</p>
<h4>epicsExport.h</h4>
<p>Add additional cast to prevent 'strict aliaising' warnings.</p>
<h4>iocsh</h4>
<p>I/O redirection from vxWorks startup scripts now works.</p>
<h4>dbRecordsOnceOnly</h4>
<p>This new variable which can be controlled using the iocsh <tt>var</tt>
command (or by simple assignment in the vxWorks shell) allows users to change
the behaviour of <tt>dbLoadRecords()</tt> 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 <tt>dbRecordsOnceOnly</tt> 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.</p>
<h4>select record</h4>
<p>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.</p>
<h4>macLib</h4>
<p>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
<tt>$(name=default)</tt> or <tt>${name=default}</tt>. The default string can
itself contain other macros like this: <tt>$(name=$(default))</tt>. This
feature has actually been present since R3.14.6.</p>
<h4>errlog</h4>
<p>On a powerPC, during iocInit, a crash could occur. In particular the
SYNAPPS version of save_restore experienced crashes. This is now fixed.</p>
<h4>ca</h4>
<p>Mantis entries fixed.</p>
<p>221 - should shutdown full duplex comm on udp sockets if not used</p>
<p>192 - concurrency bug in channel access to local DB</p>
<p>181 - ca_host_name() now returns the host name of the client, not the
host:port of the server</p>
<p>161 - issues surrounding manipulation of CA contexts</p>
<p>153 - CA (caput) client does not reconnect after server
suspend-continue-shutdown cycle</p>
<p>111 - non-preemptive clients disconnect if ca_poll() isnt called
regularly</p>
<h4>portable ca server</h4>
<p>Mantis entries fixed.</p>
<p>196 - portable server library intermittent hang on UNIX systems</p>
<p>191 - corrupt value when doing a put through portable server (little
endian host)</p>
<p>175 - example portable server array PV 'alan' does not have time stamps</p>
<h4>gdd (used by portable server)</h4>
<p>Mantis entries fixed.</p>
<p>211 - GDD: aitConvertStringEnum16 does nothing if
pEnumStringTable==NULL</p>
<h4>RTEMS port</h4>
<p>Added support for setting NFS server/mount information from PPCBUG
argument strings.</p>
<p>rtems_shutdown_executive is now called on IOC exit. On many BSPs this will
return control to the bootstrap PROM.</p>
<p>Set POSIX TZ environment variable from NVRAM, or failing that, from
EPICS_TIMEZONE.</p>
<p>Cleaned up support for obtaining network configuration from NVRAM.</p>
<p>Added support for some additional boards.</p>
<p>Set iocsh prompt from host name.</p>
<p>Initialize in-memory filesystem from tar image following executable in
bootstrap flash memory. This allows for fully standalone IOCs -- no TFTP/NFS
server required.</p>
<p>Set IOC_NAME and IOC_STARTUP_SCRIPT environment variables from bootstrap
parameters.</p>
<h4>vxWorks port</h4>
<p>Fixed mantis entry.</p>
<p>179 -base does not build with vxWorks 6.0</p>
<p>225 - On vxWorks epicsThreadCreate returned -1 instead of 0 if a thread
could not be created. This is fixed.</p>
<h4>OS X port</h4>
<p>Builds on Tiger.</p>
<p>Readline now used by default.</p>
<h4>WIN32 port</h4>
<p>Fixed mantis entries.</p>
<p>195 - explicitly unloading Com.dll causes crash</p>
<p>230 - assert fail of caget, caput, etc under msvc 8</p>
<p>231 - manifest files not installed under visual C++ 8</p>
<h4>POSIX port</h4>
<p>Fixed mantis entries.</p>
<p>186 - failure after exit command if log client is running</p>
<p>222 - osiSpawnDetachedProcess doesnt close open files in dupicate process
on POSIX</p>
<h2 align="center">Changes between 3.14.6 and 3.14.7</h2>
<h4>selRecord</h4>
<p>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.</p>
<h4>ai, ao, dfanout and subroutine Records</h4>
<p>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.</p>
<h4>epicsStdlib.h/epicsStrtod()</h4>
<p>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().</p>
<p>epicsStdlib.h also declares epicsScanFloat() and epicsScanDouble() which
replace calls to sscanf with routines which handle NAN/INF on all
architectures.</p>
<h4>epicsThreadCreate Stacksize Posix</h4>
<p>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.</p>
<h4>dbNotify</h4>
<p>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.</p>
<h4>CA commandline tools</h4>
<p>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.</p>
<h4>POSIX signals</h4>
<p>Signals are blocked in all but the main thread. Applications/drivers which
require signal delivery to a subthread will need to be modified.</p>
<h4>epicsExit</h4>
<p>Three new functions are implemented: <tt>epicsExit</tt>,
<tt>epicsExitCallAtExits</tt>, and <tt>epicsAtExit</tt>. These are similar to
<tt>exit</tt> and <tt>atexit</tt>, 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 <tt>exit</tt> and
<tt>atexit</tt>. Note that they apply to an IOC stopping NOT to a thread
exiting.</p>
<h4>epicsStdio and epicsStdioRedirect</h4>
<p>In order to support iocsh redirection of <tt>stdin</tt>, <tt>stdout</tt>,
and <tt>stderr</tt>, <tt>epicsStdio.h</tt> defines the following new
functions: <tt>epicsGetStdin</tt>, <tt>epicsGetStdout</tt>,
<tt>epicsGetStderr</tt>, <tt>epicsSetStdin</tt>, <tt>epicsSetStdout</tt>,
<tt>epicsSetStderr</tt>, and <tt>epicsStdoutPrintf</tt>.
<tt>epicsStdioRedirect.h</tt> defines macros that redefine <tt>stdin</tt>,
<tt>stdout</tt>, <tt>stderr</tt>, and <tt>printf</tt>.</p>
<p>Any code that includes <tt>epicsStdioRedirect.h</tt> 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.</p>
<h4>IOC Test Facilities</h4>
<p>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:</p>
<pre> dbl "0" reportName</pre>
<pre>Is now:</pre>
<pre> dbl &gt; reportName</pre>
Note that this does NOT work on the vxWorks shell only on iocsh. On the
vxWorks shell the following command can be given:
<pre> iocshCmd("dbl &gt; reportName")</pre>
<h4>errlog</h4>
<p>errlog now calls <tt>epicsAtExit</tt> and releases all resources when
<tt>epicsExitCallAtExits</tt> is called.</p>
<h4>libCom</h4>
<p>epicsStrGlobMatch() routine added.</p>
<h4>iocsh</h4>
<p>Input/output redirection added.</p>
<p>iocshCmd routine added (callable from vxWorks shell).</p>
<p>help command uses globbing.</p>
<h4>calcoutRecord</h4>
<p>The ODLY (Output Delay) was not handled properly. This is fixed.</p>
<h4>compressRecord</h4>
<p>make sure reset gets called when size of INP array changes.</p>
<h4>dbAccess DBR_ENUM_STRS for field DTYP</h4>
<p>Data Base Request Option DBR_ENUM_STRS for the DTYP field of soft records
can cause an IOC to crash.</p>
<h4>RTEMS</h4>
<p>RTEMS implementation of epicsMessageQueuePending() now works.</p>
<p>Added support for MVME2100 BSP.</p>
<p>Added support for building RTEMS bootable images.</p>
<h4>iocBoot/ioc* build change</h4>
<p>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.</p>
<h2 align="center">Changes between 3.14.5 and 3.14.6</h2>
<h4>CA command line tools complete</h4>
<p>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.</p>
<h4>IOC template file configure/RULES.iocBoot removed</h4>
<p>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.</p>
<h4>APS Virtual Linac template removed</h4>
<p>This is really a demo and a complete EPICS IOC application, not a
template. It will be made available separately.</p>
<h4>EPICS_HOST_ARCH win32-x86-cygwin renamed to cygwin-x86</h4>
<p>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</p>
<ul>
<li>win32-x86 Uses native win32 interfaces with MS compiler.</li>
<li>win32-x86-borland Uses native win32 interfaces with borland
compiler.</li>
<li>win32-x86-gnu Uses native win32 interfaces with cygwin gnu compiler.
(Not implemented yet.)</li>
<li>cygwin-x86 Uses cygwin POSIX interfaces with cygwin gnu compiler.</li>
</ul>
<h4>EPICS_TS_NTP_INET</h4>
<p>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.</p>
<h4>CONFIG_ENV and CONFIG_SITE_ENV</h4>
<p>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 <code>EPICS_TIMEZONE</code> parameter was added
<em>after</em> the uncommented version.</p>
<h4>db test shell commands</h4>
<p>Many of the commands crashed if given no arguments. They are now more
crash proof.</p>
<h4>db_access - conversion of double to float</h4>
<p>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.</p>
<h4>New DBD rule</h4>
<p>A new dbd rule will create a &lt;name&gt;Include.dbd from files specified
in a &lt;name&gt;_DBD macro definition. An include line will be placed in the
&lt;name&gt;Include.dbd for each file specified in the &lt;name&gt;_DBD
definition. If a Makefile contains</p>
<pre> DBD=xxx.dbd
xxx_DBD = f1.dbd f2.dbd f3.dbd </pre>
<p>an xxxInclude.dbd file will be created containing the lines</p>
<pre> include "f1.dbd"
include "f2.dbd"
include "f1.dbd"</pre>
<p>and dbExpand will be invoked to create the xxx.dbd file from the
xxxInclude.dbd.</p>
<h4>Solaris Builds</h4>
<p>Old solaris 6 specific compiler options have been removed.</p>
<h4>New make targets cvsclean and archclean</h4>
<p>The new top level Makefile only target, cvsclean, removes cvs .#* files in
all dirs of the top directory tree.</p>
<p>The new archclean target is like the clean target except that O.Common
directories are not removed.</p>
<h4>epicsString</h4>
<p>Add epicsSnStrPrintEscaped.</p>
<h4>epicsExport</h4>
<p>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.</p>
<p>epicsRegisterFunction(name) in conjunction with the dbd 'function' keyword
can be used to register functions referred to by record subroutine name
fields.</p>
<h4>Access Security</h4>
<p>The access security configuration rules now accept quoted strings where
just names were allowed previously.</p>
<p>All dump routines now have FP version.</p>
<p>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)</p>
<h4>Channel Access Client Library</h4>
<ul>
<li>Fixed "subscription updates intermittently do not resume when
unresponsive circuit reconnects" bug
<ul>
<li>Scope:
<p>This bug was introduced in R3.14.5 and does not exist in any other
release.</p>
</li>
<li>Symptom:
<p>Subscription updates intermittently do not resume depending on
circumstances when unresponsive circuit reconnects</p>
</li>
<li>Additional Information:
<p>A decision was made to add a change to EPICS R3.14.5 so that when
a TCP circuit is temporarily unresponsive the channel, but not the
circuit, is immediately disconnected. This change was determined to
be necessary to improve overall system robustness in the face of IOC
or network overload. Unfortunately, an error was made when installing
these changes. I am sorry about any inconvenience that this has
caused. Thanks to Ken Evans at the APS for discovering this
problem.</p>
</li>
</ul>
</li>
<li>Fixed "ca_replace_access_rights_event() fails if passed a nill function
pointer" bug
<ul>
<li>Scope:
<p>This bug probably exists in all R3.14 releases.</p>
</li>
<li>Symptom:
<p>Passing a nill function pointer to
ca_replace_access_rights_event() should install a noop handler, but
this currently causes a failure.</p>
</li>
<li>Additional information:
<p>Regression tests have been installed to detect this mistake.</p>
</li>
</ul>
</li>
<li>Fixed "CA client library crash when clear channel request occurs in get
callback handler" bug
<ul>
<li>Scope:
<p>This bug was introduced in R3.14.5 and does not exist in any other
release.</p>
</li>
<li>Symptom:
<p>CA client library crash when clear channel request occurs in get
callback handler</p>
</li>
<li>Additional information:
<p>When testing the striptool application, Ken Evans, discovered a
bug in the CA client library occurring when a clear channel request
occurs in get callback handler. Regression tests have been updated so
that this mistake will not slip through testing undetected in a
future release.</p>
</li>
</ul>
</li>
<li>Fixed "Double server subscription install when subscription request
occurs in connection callback handler" bug
<ul>
<li>Scope:
<p>This bug was introduced in R3.14.5 and does not exist in any other
release. Subscription request must be made from within connection
callback handler</p>
</li>
<li>Symptom:
<p>It has been discovered (by Ken Evans while testing the gateway)
that certain subscription requests were persisting in the gateway
after clients had deleted them. This bug causes additional resources
to be consumed, but does not result in a crash.</p>
</li>
<li>Additional information
<p>Additional debugging has revealed that the CA client library in
this situation inadvertently made the subscription request twice:
once at the users&#x2019; request, and later on again when the
library auto installed subscriptions for disconnected channels.</p>
</li>
</ul>
</li>
<li>Fixed "failure when deleting channel in get callback handler" bug
<ul>
<li>Scope:
<p>Probably introduced in a previous R3.14 release.</p>
</li>
<li>Symptom:
<p>An intermittent C++ exceptions during regression testing.</p>
</li>
</ul>
</li>
</ul>
<ul>
<li>Behavior Changes
<ul>
<li>Process blocks attempting to exit if the application does not call
ca_context_destroy()
<p>In EPICS release R3.14 the CA client library is implemented using
axillary threads. If the application does not call
ca_context_destroy() these threads will still be running, and
depending on operating system conventions the process may
<em>not</em> exit if the main thread exits, but axillary threads are
still running. Note that ca_context_destroy() is functionally
equivalent to the deprecated call ca_task_exit().</p>
</li>
</ul>
</li>
</ul>
<h4>Channel Access Portable Server (used by the CA gateway and others)</h4>
<ul>
<li>Fixed "assert fail when writing string through Portable CA Server" bug
<ul>
<li>Scope:
<p>This bug is only present in the portable CA server and so it does
<em>not</em> impact IOC based applications. The bug is present in the
CA gateway and any portable CA server based application. This problem
may have been recently introduced when GDD was patched to properly
handle fixed sized strings.</p>
</li>
<li>Symptom:
<p>Failure, when writing large string through the portable CA server.
There appears to be a possibility of the wrong string being written
when a smaller string is used. You may see the following message.</p>
<p>A call to "assert (! this-&gt;pValue-&gt;unreference ())" failed
in ..\..\..\..\include\smartGDDPointer.h line 88.</p>
</li>
<li>Additional Information:
<p>Thanks to Stephanie Alison at SLAC for discovering the bug and to
Ken Evans at the APS for reminding me to fix it.</p>
</li>
</ul>
</li>
</ul>
<h2 align="center">Changes between 3.14.4 and 3.14.5</h2>
<h4>dbtr</h4>
<p>Don't seg-fault if no argument is passed to dbtr.</p>
<h4>New build targets.</h4>
<p>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.</p>
<h4>New epicsString.h function</h4>
<p>A new function epicsStrnCaseCmp has been added. It is like strncmp except
that it ignores case.</p>
<h4>R3.13 compatability files</h4>
<p>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:</p>
<ul>
<li>COMPAT_TOOLS_313
<p>This will install the compatibility files needed to build R3.13
extensions built with this R3.14 base.</p>
</li>
<li>COMPAT_313
<p>This will install the compatibility files needed to build R3.13
extensions and IOC applications built with this R3.14 base.</p>
</li>
</ul>
<h4>APS Virtual LINAC Templates</h4>
<p>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.</p>
<p>To install the templates, use the following commands:</p>
<pre> mkdir <top>
cd <top>
&lt;base&gt;/bin/&lt;arch&gt;/makeBaseApp.pl -t vlinac vlinac
&lt;base&gt;/bin/&lt;arch&gt;/makeBaseApp.pl -i -t vlinac vlinac</pre>
<p>For further information, see:</p>
<pre> &lt;top&gt;/vlinacApp/misc/README
&lt;top&gt;/vlinacApp/misc/Virtual_Linac_Info.pdf</pre>
<h4>Stringin record time-stamp soft device support</h4>
Add simple device support for converting time to nicely-formatted string
using INP field as epicsTimeToStrftime format string:
<pre>record(stringin, "$(user)now")
{
field(DESC, "Current time and date")
field(DTYP, "Soft Timestamp")
field(INP, "@%Y-%m-%d %H:%M:%S.%03f")
}</pre>
<h4>Channel Access Portable Server (used by the CA gateway and others)</h4>
<ul>
<li>Fixed failure occurring if client disconnected while asynchronous PV
attach was outstanding, or, for enumerated native type process variables,
while enumerated string table cache asynchronous IO was outstanding. This
problem does not occur in IOCs because they are not yet based on the
portable server library. This bug was first detected by Ken Evans in the
production CA gateway at the APS.</li>
</ul>
<h4>Channel Access Original Server (used in IOC)</h4>
<ul>
<li>A bug causing the server threads to become stuck in a state where they
process requests, but no longer send responses, if in the past the system
was experiencing network buffer starvation has been fixed. This problem
existed probably in all previous EPICS releases, but network buffer
starvation issues have become more prevalent starting with Tornado
2.0.</li>
<li>Users noticed that UDP related output from the casr diagnostic was
easily confused with the information from casr for TCP circuits. This has
been fixed.</li>
</ul>
<h4>Channel Access Client Library</h4>
<ul>
<li>Disconnect behavior is now more robust in response to congestion. When
a channel times out, the channel is disconnected, but not the circuit.
The circuit is only disconnected when the internal TCP/IP keepalive timer
fires or if teh IOC reboots with the same IP address. This will result in
less UDP search traffic during periods of congestion and also less TCP/IP
circuit thrashing. A side effect will be that if a user turns off a
vxWorks IOC, changes its IP address, and then reboots it, then the user
will need to wait out the full duration of the TCP/IP keepalive timer
before the client will reconnect. This is undoubtedly a negative side
effect, but it is felt that the improvements in robustness justify the
confusion resulting in the small number of situations that a vxWorks
IOC's IP address is changed.</li>
<li>In previous releases if a directory service returns the address of a CA
server that does <em>not</em> have the PV that is being sought then the
client library could end up sending search requests at a very high rate.
This problem has been fixed by placing all disconnected channels in a
queue implementing a short delay prior to there being ready again for
periodic name resolution requests.</li>
<li>In previous R3.14 releases the CA client library's search datagram
interval exponential backoff was flawed. CA's search datagram interval
exponential backoff should proceed following the sequence 30mS, 60mS,
120mS, 240mS, and so on. Or a similar behavior with higher initial delays
resulting from a round trip time delay estimate greater than 30 mS.
However, instead the backoff delays were 30mS, 30mS, 30mS, 30mS, 30mS,
30mS, 60mS, 120mS, 240mS, and on. This bug also impacted what CA does
when a channel disconnects or there is a beacon anomaly ( a new server
event). The intent was to start the search delay for disconnected
channels in these situations at 2 seconds but due to the above bug the
delay was more like 64mS. This bug appears only in earlier versions of
EPICS R3.14.</li>
<li>A bug has been found in the CA repeater supplied with EPICS R3.14.2
through R3.14.4 (inclusive). The symptom will be clients running for more
than a few minuites do not connect to a newly introduced server. Fixed in
R3.14.5.</li>
</ul>
<h4>dbCa</h4>
<p>Better error messages are now generated.</p>
<p>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.</p>
<p>dbCaAddLinkCallback is a new function. The caller can provide a connect
and monitor callback. See the Application Developer's Guide for details.</p>
<h4>devXxSoftCallback</h4>
<p>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:</p>
<pre> field(DTYP,"Async Soft Channel")</pre>
<h4>calcoutRecord</h4>
<p>The CALC and OCAL fields now have a size of 40 so that they are the same
as the calcRecord.</p>
<p>calcoutRecord now has associated device support. The default support will
act just like the old calcout. Support bis also available that uses
dbCaPutLinkCallback.</p>
<h4>mbbiRecord</h4>
<p>The fields ZRST,...,FFST are now special(SPC_MOD).</p>
<h4>mbboRecord</h4>
<p>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.</p>
<h4>epicsString</h4>
<p>A new function has been added epicsStrPrintEscaped, which converts the
standard C escape characters to \xxx characters.</p>
<h4>IOC shell system command</h4>
<p>The 'system' command has been added to the IOC shell. To enable this
command, add <code>registrar(iocshSystemCommand)</code> to an application
database description file.</p>
<h2 align="center">Changes between 3.14.3 and 3.14.4</h2>
<h4>sCalcPostfix</h4>
<p>This has been removed from base.</p>
<h4>Format string checking</h4>
<p>'printf-style' functions like errlogPrintf have their arguments verified
against their format string when compiled with gcc.</p>
<h4>IOC shell command-line editing on vxWorks</h4>
<p>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.</p>
<h4>CA client library crashes when the same PV name is on multiple
servers</h4>
<p>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.</p>
<p>Thanks to Ernest Williams at the SNS for discovering and helping to
diagnose the problem.</p>
<h4>Disconnection callback function called when CA channel known to be
disconnected</h4>
<p>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.</p>
<p>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.</p>
<p>Thanks to Mark Rivers for initially reporting the bug and energetically
assisting with identifying the cause.</p>
<h2 align="center">Changes between 3.14.2 and 3.14.3</h2>
<h4>TPRO output</h4>
<p>The record processing trace output generated when the <code>.TPRO</code>
field of a record is non-zero now includes the name of the thread that is
actually doing the processing.</p>
<h4>calcRecord and calcoutRecord</h4>
<p>Previously if a dbGetLink failed on one of the input links, dbGetLink was
not called for the remaining links. Now it is.</p>
<h4>put notify</h4>
<p>put notify did not act properly if a record had disp=TRUE, i.e. if puts
are disabled. It now returns putNotifyPutDisabled.</p>
<h4>fastlock.h</h4>
<p>This is no longer supported</p>
<h4>devLib</h4>
<p>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.</p>
<h4>vxWorks dependent modules moved</h4>
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.
<h4>Close-On-Exec flag set for all sockets created in EPICS base</h4>
<p>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.</p>
<h4>Temporary Files on Windows</h4>
<p>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().</p>
<ol>
<li>where the TMP environment variable specifies</li>
<li>in c:\tmp</li>
<li>in the current working directory</li>
</ol>
<h4>envPaths file</h4>
<p>For operating systems other than vxWorks, there is now a target file
created in each <code>iocBoot/ioc</code> directory called
<code>envPaths</code>, which performs the same functions as the
<code>cdCommands</code> file in vxWorks but using environment variables. The
entries in <code>envPaths</code> are derived from the contents of the
application's <code>configure/RELEASE</code> file.</p>
<h4>Macros in database filenames</h4>
<p>Database (<code>.db</code> and <code>.dbd</code>) filenames passed to
<code>dbLoadDatabase</code>, <code>dbLoadRecords</code> and inside
<code>dbLoadTemplate</code> substitutions files will now have environment
variable macros expanded before opening. These are expressed using the
standard <code>${MACRO}</code> syntax. Inside a template substitutions file
the filename must be enclosed in double quotation marks if macros are
used.</p>
<h4>registerRecordDeviceDriver output subroutine renamed</h4>
<p>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 <code>registerRecordDeviceDriver</code>. Assuming
that your application's fully expanded dbd file is called
<code>example.dbd</code> you would modify the lines</p>
<blockquote>
<pre>dbLoadDatabase("dbd/example.dbd",0,0)
registerRecordDeviceDriver(pdbbase)</pre>
</blockquote>
<p>to become</p>
<blockquote>
<pre>dbLoadDatabase("dbd/example.dbd",0,0)
example_registerRecordDeviceDriver(pdbbase)</pre>
</blockquote>
<h4>dbExpand <code>-o outfile</code> option</h4>
<p>A commandline option <code>-o</code> 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.</p>
<h4>New keyword <code>variable()</code> supported in dbd files</h4>
<p>Database definition (.dbd) files can now contain declarations of simple
static variables, a facility intended for driver debugging purposes. These
<code>variable(name)</code> or <code>variable(name,type)</code> declarations
are preserved by dbExpand (<code>type</code> is <code>int</code> 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
<code>epicsExportAddress(type,name)</code>. Only plain <code>int</code> and
<code>double</code> types are supported.</p>
<p><strong>macEnvExpand</strong></p>
<p>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.</p>
<p><strong>iocsh var command</strong></p>
<p>For simple applications such as controlling the value of debugging flags.
Devlopers with more complex expression handling requirements should consider
use of the <strong>cexp</strong> package. The available variables are defined
by the new <code>variable</code> dbd file keyword.</p>
<p><strong>iocshArgPersistentString</strong></p>
<p>Tell iocsh to make a copy of the argument string before passing it to the
handler function.</p>
<p><strong>epicsStrDup</strong></p>
<p>Operating-system independent replacement for strdup().</p>
<p><strong>epicsMessageQueue</strong></p>
<p>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.</p>
<p>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</p>
<h4>Error Message Logging</h4>
<p>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.</p>
<p>A bug occurring in the error message logging server where a partial
message arrives w/o a &lt;CR&gt; and then a &lt;CR&gt; 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.</p>
<p>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.</p>
<h4>Channel Access Client Library Client Context Cleanup Race Condition</h4>
<p>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.</p>
<h4>Red Hat 7.3 Linux Process Rundown Bug</h4>
<p>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.</p>
<h4>Multiple CA Servers on MAC OSX</h4>
<p>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.</p>
<h2 align="center">Changes between 3.14.1 and 3.14.2</h2>
<p><strong>Build System</strong></p>
<p>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:</p>
<p><a
href="../2-docs/ConvertingR3.14.1AppsToR3.14.2.html">ConvertingR3.14.1AppsToR3.14.2</a></p>
<p>for details. If you are using the <strong>function</strong> DBD keyword it
no longer exists. Please read this conversion document for details.</p>
<p><strong>Application Developer's Guide</strong></p>
<p>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.</p>
<p><strong>dbGetLink</strong></p>
<p>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:</p>
<pre> prset-&gt;get_array_info(paddr,&amp;no_elements,&amp;offset);
write nNew elements into array &gt;&gt;
prset-&gt;put_array_info(paddr,nNew);</pre>
<p>This sets NORD = nNew. But because of the dbGetLink bug, the soft device
support attached to the waveform record sets NORD to NELM.</p>
<p>This problem is fixed. The actual bug was in macros in dbAccessDefs.h</p>
<p><strong>Access Security</strong></p>
<p>The host names are now converted to lower case. This fixes
incompatibilities between various platforms.</p>
<p><strong>string records</strong></p>
<p>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).</p>
<p><strong>epicsMessageQueue</strong></p>
<p>A new facility that provides the capabilities of vxWorks msgQLib. See the
Application Developer's Guide (libCom OSI) for details.</p>
<p><strong>epicsStdio and errlogPrintf</strong></p>
<p>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.</p>
<p>The errlogPrintf facility has been modified to use this facility. Thus it
is not longer subject to a possible buffer overflow.</p>
<p><strong>scanPeriod</strong></p>
<p>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.</p>
<p><strong>New epicsString.h function</strong></p>
<p>A new function epicsStrCaseCmp has been added. It is like strcmp except
that it ignores case.</p>
<p><strong>macLib</strong></p>
<p>macParseDefns did not check for handle==NULL. The documentation for
macParseDefns was not correct.</p>
<h2 align="center">Changes between 3.14.0beta2 and 3.14.1</h2>
<p><strong>function - New Database Definition Keyword</strong></p>
<p>dbStaticLib and related programs now accept a new keyword in DBD files:</p>
<pre>function(name)</pre>
<p>Where <code>name</code> 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.</p>
<p>dbStaticLib has two additional routines to support this, dbDumpFunction()
and dbWriteFunctionFP(). dbDumpFunction has been added to the iocsh command
table.</p>
<p><strong>iocsh</strong></p>
<p>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.</p>
<p><strong>Solaris build requirement</strong></p>
<p><code>uname</code> must be defined for builds on solaris hosts because it
is used to determine the solaris version.</p>
<p><strong>Linux build note</strong></p>
<p>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/&lt;arch&gt; will be automatically appended to each directory given).</p>
<p><strong>RULES.Db</strong></p>
<p>A <code>*[nn].db</code> file will be created from an
<code>*.template</code> and a <code>*[nn].substitutions</code> file ,where
<code>nn</code> has a value between 0 and 99.</p>
<p><strong>Support for 64 bit long</strong></p>
<p>Many changes were made to support architectures on which a long is a 64
bit integer. The basic change was to change:</p>
<ul>
<li>long =&gt; epicsInt32 for anything that might get transfered to/from
network buffers</li>
<li>unsigned long =&gt; epicsUInt32 for anything that might get transfered
to/from network buffers</li>
</ul>
<p>The changes include the following:</p>
<ul>
<li>cvtFast</li>
<li>xxxRecord.h NOTE: In addition to the changes for long all enum fields
are now epicsEnum16</li>
<li>dbStaticLib</li>
<li>db_access</li>
<li>dbConvert and dbFastLinkConv</li>
</ul>
<p><strong>Hardware Link Definitions</strong></p>
<p>The various parts of hardware link definitions now accept HEX values,
e.g.</p>
<pre>field(INP,"L0 A1 C0 S0xa @")</pre>
<p>NOTES:</p>
<ul>
<li>This may not be compatible with Database Configuration Tools</li>
<li>If records are written via dbStaticLib the falues will NOT be written
in HEX.</li>
</ul>
<p><strong>dbDumpFldDes</strong></p>
<p>A macro has been defined so that client code can be written that is
compatible between 3.13 and 3.14.</p>
<p><b>epicsMutex for posix</b></p>
<ul>
<li>No longer supports epicsMutexLockWithTimeout. This was done to allow a
more efficient posix implementation.</li>
<li>If PTHREAD_MUTEX_RECURSIVE is provided then the implementation uses
only pthread_mutex. This is much faster (2 to 3 times as fast) as the
previous implementation.</li>
</ul>
<p><strong>Mac OS X</strong></p>
<p>Now supported as development platform and as IOC.</p>
<p><strong>RTEMS</strong></p>
<p>Additional RTEMS-pc386 network drivers are available</p>
<p><strong>iocsh</strong></p>
<p>Configurable iocsh command-line editing support (none, readline,
libtecla)</p>
<p><strong>CA Reference Manual</strong></p>
<p>Many additions.</p>
<p><strong>CA Client Library</strong></p>
<p>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.</p>
<p><strong>Original CA Server Library (still employed in R3.14 by
iocCore)</strong></p>
<p>A bug was fixed where the server was in rare situations using excessive
CPU.</p>
<p><strong>Portable CA Server LIbrary</strong></p>
<p>Several bugs were fixed when performing integration testing with the
channel access gateway.</p>
<p><strong>GDD</strong></p>
<p>Many bugs and missing features fixed.</p>
<center>
<h2>Changes since beta1</h2>
</center>
<p><strong>dbCommon.dbd</strong></p>
<p>Field UDF now has a promptgroup. This allows users to set UDF false via
DCTs.</p>
<p><strong>errlog</strong></p>
<p>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.</p>
<p><strong>mbboRecord</strong></p>
<p>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.</p>
<p><strong>timeStamp changes</strong></p>
<p>Changes have been made to:</p>
<ul>
<li>Allow device support to set the time stamp (field TIME) of a
record.</li>
<li>Allow a record to receive it's time stamp from another record,</li>
</ul>
<p>epicsTime.h now has the definitions:</p>
<pre>#define epicsTimeEventBestTime -1
#define epicsTimeEventDeviceTime -2</pre>
<p>These are values for the TSE field of dbCommon.</p>
<ul>
<li><strong>epicsTimeEventBestTime</strong> means that code supplying the
time stamp should get the most accurate time possible. Currently this
only has meaning on vxWorks and if drvTS is supplying the time via some
hardware timing system. It means get the latest time from the hardware
system rather than from the vxWorks tick time. drvTs previously accepted
a hardcoded value of -1.</li>
<li><strong>epicsTimeEventDeviceTime</strong> means that recGblGetTimeStamp
doesn't modify the time field. This allows device support to supply the
time stamp.</li>
</ul>
<p>If the <strong>TSEL</strong> field refers to the <strong>TIME</strong>
field of a record then <strong>recGblGetTimeStamp</strong> sets
<strong>TIME</strong> equal to the time it gets from the record the
<strong>TSEL</strong> references. This works for both database and channel
access links. In this case field TSE is not used.</p>
<pre> </pre>
<p><strong>aiRecord and aoRecord: Setting eoff=egul</strong></p>
<p>Instead of init_record executing code like</p>
<pre> if ((pai-&gt;linr == menuConvertLINEAR) &amp;&amp; pdset-&gt;special_linconv) {
pai-&gt;eoff = pai-&gt;egul;
}</pre>
<p>It now executes:</p>
<pre> if ((pai-&gt;eslo==1.0) &amp;&amp; (pai-&gt;eoff==0.0)) {
pai-&gt;eoff = pai-&gt;egul;
}</pre>
<p>aoRecord has a similar change</p>
<p>This was done so that old device support which does not implement
special_linconv still works.</p>
<p><strong>CA puts to disabled record</strong></p>
<p>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.</p>
<p><strong>TPRO - trace processing</strong></p>
<p>If dbProcess is called recursively by different tasks, it did not properly
handle TPRO. Consider the following database:</p>
<pre>record(ao,"mrkao") {
field(OUT,"mrkai CA")
field(TPRO,"1")
}
record(ai,"mrkai") {
field(TPRO,"1")
}</pre>
<p>If a channel access put is sent to mrkao, no message is issued when mrkai
is processed.</p>
<p>This is now fixed.</p>
<p><strong>TSconfigure</strong></p>
<p>If in your st.cmd file you issue the command.</p>
<p>TSconfigure(0,0,0,0,0,0,1)</p>
<p>And set the TSE field of any record to a non zero value, then a crash will
occur when recGblGetTimeStamp is called.</p>
<p>This is now fixed.</p>
<p><strong>calcoutRecord</strong></p>
<p>nsev not sevr must be checked to decide if dbPutLink should be called.</p>
<p><strong>dbCa</strong></p>
<p>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.</p>
<p><strong>calcPerform</strong></p>
<p>This now returns a non zero value if the result is nan (not a number).</p>
<p><strong>Record Name Length</strong></p>
<p>The size of the name field has been expanded from 29 to 61, i.e. record
names can now have 60 characters.</p>
<p><strong>iocInit</strong></p>
<p>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.</p>
<p><strong>ellLib</strong></p>
<p>Casts have been removed that suppressed valuable error messages</p>
<p><strong>mbbiRecord</strong></p>
<p>All existing manipulations of UDF in process() are removed and udf is set
FALSE when the raw value is successfully read.</p>
<p><strong>selRecord</strong></p>
<p>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.</p>
<p><strong>cdCommands file</strong></p>
<p>Fixed a bug and revised the use of the IOCS_APPL_TOP setting in an
application's &lt;top&gt;/configure/CONFIG file (which specifies the path to
&lt;top&gt; as seen by the IOC) to apply the same modifications to all paths
output in the cdCommands file.</p>
<p><strong>dbStaticLib</strong></p>
<p>All routines with Recdes of Fielddes in their name are obsolete and
removed. A new routine dbDumpField replaces dbDumpFldDes.</p>
<center>
<h2>Changes since alpha2</h2>
</center>
All changes for release 3.13.5 that also apply to 3.14 have been made.
<p><b>devAiSoftRaw and devAoSoftRaw</b></p>
<p>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.</p>
<p>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</p>
<p>cd ../db/</p>
<center>
<h1>EPICS Release base 3.14.0alpha2</h1>
</center>
Since the alpha1 release some major changes were made to the build system, to
some of the libCom facilities, and to the iocsh facilities.
<p>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.</p>
<p>A verion of the HPlanGpib support has been built and tested with this
release. Again you must obtain a version that builds with alpha2.</p>
<p>A new update to the Application Developer's Guide is available for this
release.</p>
<h3>Build changes</h3>
<ul>
<li>Operating system independant builds are now done in an O.Common
subdirectory and then installed instead of being performed directly in an
install directory.</li>
<li>Build definition names (e.g. RECTYPES, MENUS, DBDNAME, and BPTS) have
been changed to specify the name of the file to be created and installed
instead of the source file name.</li>
<li>All db and dbd related definitions and rules have been moved into
base/configure/RULES.Db file. The rules now allow multiple dbd files and
registerRecordDeviceDriver files to be created in a single Makefile.</li>
<li>"gnumake depends" no longer depends on a complete buildInstall.</li>
</ul>
<h3>Converting alpha1 applications to alpha2</h3>
Build modifications in alpha2 require the following changes to existing R3.14
applications.
<ul>
<li>Remove the now unused RULES files
<blockquote>
./configure/RULES.Db<br>
./configure/RULES.registerRecordDeviceDriver</blockquote>
</li>
<li>Delete the following line in ./configure/RULES
<blockquote>
include $(TOP)/configure/RULES.registerRecordDeviceDriver</blockquote>
</li>
<li>In &lt;top&gt;/configure/Makefile change
<blockquote>
@$(PERL) $(TOOLS)/makeConfigAppInclude.pl $(T_A) $@ $(TOP)</blockquote>
to
<blockquote>
@$(PERL) $(TOOLS)/makeConfigAppInclude.pl $(EPICS_HOST_ARCH) $(T_A) $@
$(TOP)</blockquote>
and add the line
<blockquote>
depends: install</blockquote>
to the bottom of the Makefile.</li>
<li>In all *App/*Db/Makefiles change
<blockquote>
include $(TOP)/configure/RULES.Db</blockquote>
to
<blockquote>
include $(TOP)/configure/RULES</blockquote>
</li>
<li>In all *App/src/Makefile files change
<blockquote>
DBDNAME = &lt;name&gt;App</blockquote>
to
<blockquote>
DBD += &lt;name&gt;</blockquote>
and remove the line<br>
<blockquote>
DBDEXPAND = &lt;name&gt;Include.dbd</blockquote>
NOTE: If any of your *App/*Db/Makefiles contain "DBDNAME =" lines you
should make these same changes in that *Db dirctory.</li>
<li>In all *App/src/Makefile Makefiles change
<blockquote>
RECTYPES=&lt;name&gt;.h</blockquote>
to
<blockquote>
DBDINC+=&lt;name&gt;</blockquote>
change
<blockquote>
MENUS=&lt;name&gt;.h</blockquote>
to
<blockquote>
DBDINC+=&lt;name&gt;</blockquote>
change
<blockquote>
BPTS</blockquote>
to
<blockquote>
DBD</blockquote>
change
<blockquote>
INSTALLDB</blockquote>
to
<blockquote>
DB</blockquote>
change
<blockquote>
DBDINSTALL</blockquote>
to
<blockquote>
DBD</blockquote>
</li>
<li>In all example *App/src/Makefile files change
<blockquote>
example_SRCS_DEFAULT += registerRecordDeviceDriver.c</blockquote>
to
<blockquote>
example_SRCS_DEFAULT +=
&lt;name&gt;_registerRecordDeviceDriver.cpp</blockquote>
where &lt;name&gt; is the base name of a &lt;name&gt;.dbd file which was
created from a &lt;name&gt;Include.dbd file and which will be loaded in a
st.cmd or stcmd.host script (e.g. example).</li>
<li>In ./iocBoot/ioc&lt;name&gt;/st.cmd files change
<blockquote>
dbLoadDatabase("dbd/exampleApp.dbd")</blockquote>
to
<blockquote>
dbLoadDatabase("dbd/example.dbd")</blockquote>
</li>
<li>In &lt;top&gt;/iocBoot/ioc&lt;name&gt;/stcmd.host files change
<blockquote>
dbLoadDatabase("../../dbd/exampleApp.dbd",0,0)</blockquote>
to
<blockquote>
dbLoadDatabase("../../dbd/example.dbd",0,0)</blockquote>
</li>
</ul>
<h3>EPICS_HOST_ARCH changes</h3>
<p>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.</p>
<h3>libCom</h3>
<p>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.</p>
<center>
<h2>EPICS Release base 3.14.0alpha1 Notes</h2>
</center>
<p><br>
</p>
<p>This is the first release of 3.14. This is the first release that supports
iocCore on platforms besides vxWorks.</p>
<p>iocCore is now supported on the following platforms:</p>
<ul>
<li>vxWorks
<blockquote>
Tornado II is required.</blockquote>
</li>
<li>RTEMS
<blockquote>
An open source real time operating system. It has been tested on
MVME167 and MC68360 processors. RTEMS also supports
powerPC.</blockquote>
</li>
<li>solaris
<blockquote>
Has been tested on solaris 2.6 and solaris 8 with Sun workshop 6.0 (C++
5.2). Sun workshop 5.0 (C++ 5.0) will not compile this version of
EPICS.</blockquote>
</li>
<li>Linux
<blockquote>
Has been tested on Redhat x86 platforms.</blockquote>
</li>
<li>winNT
<blockquote>
Testing has been done with visual C++ 6.0.</blockquote>
</li>
</ul>
<p>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.</p>
<blockquote>
<a
href="http://www.aps.anl.gov/epics/base/R3-14/index.php">http://www.aps.anl.gov/epics/base/R3-14/index.php</a></blockquote>
<p>Most of the Application Developer's Guide has only minor changes. The
following are new.</p>
<ul>
<li>Chapter 2 describes the new features for 3.14.</li>
<li>Chapter 4 describes the build facility for 3.14</li>
<li>Chapters 19 and 20 describe libCom, which was not previously
documented.</li>
</ul>
<p><br>
It must be emphasized that this is an alpha release.</p>
<ul>
<li>Please don't use it for existing operational systems</li>
<li>Don't build your operational CA clients with it.</li>
<li>The APIs for new components in libCom are still evolving so if you use
them be prepared for changes.</li>
<li>HPUX - No support currently because we could not find good support for
multithreading.</li>
</ul>
<h4>Building Applications</h4>
<ul>
<li>For new applications see Chapters 2 (New Features) and Chapter 4 (Build
Facility) of the Application Developer's Guide.</li>
<li>For existing applications the old config rules are still supported.
Some changes, however, are needed. Documentation is being prepared and
will appear in these release notes sooon.</li>
</ul>
</body>
</html>