* int64b/master: (25 commits) std/rec: streamline variable names in int64in/int64out std/rec/test: recMiscTest check in64in/out ioc/db: dbUnitTest helps support int64 std/rec: ioc64in/outRecord typed rset minor std/rec: fix copyright in int64in sources std: remove SCM keywords from int64in and int64out sources std/rec: fix promptgroups in dbd.pod files std/rec: add and improve pod for int64in and int64out std/rec: add pod documentation content for int64out std/rec: add pod documentation for int64out record dbStatic: dbPutStringNum() overflow handling dbStatic: more informative error for bad field value dbStatic: dbPutStringNum(, "") not an error Release Notes cvtFastPerform: Rename reserved member names, fix for vxWorks Simplify epicsConvertDoubleToFloat() More cvtFastPerform changes Collate and report by precision Restructure cvtFastPerform, fix VxWorks build ...
955 lines
41 KiB
HTML
955 lines
41 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.16.1 Release Notes</title>
|
|
</head>
|
|
|
|
<body lang="en">
|
|
<h1 align="center">EPICS Base Release 3.16.1</h1>
|
|
|
|
<p style="color:red">This version of EPICS Base has not been released yet.</p>
|
|
|
|
|
|
<h2 align="center">Changes made on the 3.16 branch since 3.16.0.1</h2>
|
|
<!-- Insert new items immediately below this template ...
|
|
|
|
<h3>Title...</h3>
|
|
|
|
<p>Description</p>
|
|
|
|
-->
|
|
|
|
<h3>IOC Database Support for 64-bit integers</h3>
|
|
|
|
<p>The IOC now supports the 64-bit integer field types <tt>DBF_INT64</tt> and
|
|
<tt>DBF_UINT64</tt>, and there are new record types <tt>int64in</tt> and
|
|
<tt>int64out</tt> derived from the <tt>longin</tt> and <tt>longout</tt> types
|
|
respectively that use the <tt>DBF_INT64</tt> data type for their VAL and related
|
|
fields. The usual range of Soft Channel device support are included for these
|
|
new record types.</p>
|
|
|
|
<p>All internal IOC APIs such as dbAccess can handle the new field types and
|
|
their associated request values <tt>DBR_INT64</tt> and <tt>DBR_UINT64</tt>,
|
|
which are implemented using the <tt>epicsInt64</tt> and <tt>epicsUInt64</tt>
|
|
typedef's from the <tt>epicsTypes.h</tt> header.</p>
|
|
|
|
<p>The waveform record type has been updated to support these new field types.
|
|
<strong>All waveform device support layers must be updated to recognize the new
|
|
type enumeration values</strong>, which had to be inserted before the
|
|
<tt>FLOAT</tt> value in the enum <tt>dbfType</tt> and in <tt>menuFtype</tt>. C
|
|
or C++ code can detect at compile-time whether this version of base provides
|
|
64-bit support by checking for the presence of the <tt>DBR_INT64</tt> macro as
|
|
follows (Note that <tt>DB<b>F</b>_INT64</tt> is an enum tag and not a
|
|
preprocessor macro):</p>
|
|
|
|
<blockquote><pre>
|
|
#ifdef DBR_INT64
|
|
/* Code where Base has INT64 support */
|
|
#else
|
|
/* Code for older versions */
|
|
#endif
|
|
</pre></blockquote>
|
|
|
|
<p>Channel Access does not (and probably never will) directly support 64-bit
|
|
integer types, so the new field types are presented to the CA server as
|
|
<tt>DBF_DOUBLE</tt> values. This means that field values larger than 2^52
|
|
(0x10_0000_0000_0000 = 4503599627370496) cannot be transported over Channel
|
|
Access without their least significant bits being truncated. The EPICS V4
|
|
pvAccess network protocol <em>can</em> transport 64-bit data types however, and
|
|
a future release of the pvaSrv module will connect this ability to the IOC.</p>
|
|
|
|
<h3>Add EPICS_CA_MCAST_TTL</h3>
|
|
|
|
<p>Add option EPICS_CA_MCAST_TTL to set the Time To Live (TTL) of any IP multi-cast
|
|
CA search or beacon packets sent.</p>
|
|
|
|
<h3>EPICS_CA_MAX_ARRAY_BYTES is optional</h3>
|
|
|
|
<p>
|
|
A new configuration environment variable EPICS_CA_AUTO_ARRAY_BYTES is used by libca and RSRV
|
|
(CA clients and IOC CA server).
|
|
The default EPICS_CA_AUTO_ARRAY_BYTES=YES removes the limitation of EPICS_CA_MAX_ARRAY_BYTES
|
|
and always attempts to allocate sufficient for a request.
|
|
The value of EPICS_CA_MAX_ARRAY_BYTES is ignored.</>
|
|
|
|
<p>Explicitly setting EPICS_CA_AUTO_ARRAY_BYTES=NO continues to honor EPICS_CA_AUTO_ARRAY_BYTES
|
|
as in previous releases.</p>
|
|
|
|
<p>The PCAS server (used by cagateway) now always acts as if EPICS_CA_AUTO_ARRAY_BYTES=YES were
|
|
set.</p>
|
|
|
|
<h3>Channel Access "modernization"</h3>
|
|
|
|
<p>Drop support for CA clients advertising protocol versions less than 4.</p>
|
|
|
|
<p>This effects clients from Base older than 3.12.0-beta1.
|
|
Newer clients will continue to be able to connect to older servers.
|
|
Older clients will be ignored by newer servers.</p>
|
|
|
|
<p>This allows removal of UDP echo and similar protocol features which
|
|
are not compatible with secure protocol design practice.</p>
|
|
|
|
<h3>Lookup-tables using the subArrray record</h3>
|
|
|
|
<p>The subArray record can now be used as a lookup-table from a constant array
|
|
specified in its INP field. For example:</p>
|
|
|
|
<pre>
|
|
record(subArray, "powers-of-2") {
|
|
field(FTVL, "LONG")
|
|
field(MALM, 12)
|
|
field(INP, [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048])
|
|
field(INDX, 0)
|
|
field(NELM, 1)
|
|
}
|
|
</pre>
|
|
|
|
<p>The INDX field selects which power of 2 to set the VAL field to. In previous
|
|
releases the INP field would have to have been pointed to a separate waveform
|
|
record that was initialized with the array values somehow at initialization
|
|
time.</p>
|
|
|
|
<h3>Synchronized Timestamps with TSEL=-2</h3>
|
|
|
|
<p>Most Soft Channel input device support routines have supported fetching the
|
|
timestamp through the INP link along with the input data. However before now
|
|
there was no guarantee that the timestamp provided by a CA link came from the
|
|
same update as the data, since the two were read from the CA input buffer at
|
|
separate times without maintaining a lock on that buffer in between. This
|
|
shortcoming could be fixed as a result of the new link support code, which
|
|
allows code using a link to pass a subroutine to the link type which will be run
|
|
with the link locked. The subroutine may make multiple requests for metadata
|
|
from the link, but must not block.</p>
|
|
|
|
|
|
<h3>Extensible Link Types</h3>
|
|
|
|
<blockquote>
|
|
|
|
<p>A major new feature introduced with this release of EPICS Base is an
|
|
Extensible Link Type mechanism, also known as Link Support or JSON Link Types.
|
|
This addition permits new kinds of link I/O to be added to an IOC in a similar
|
|
manner to the other extension points already supported (e.g. record, device and
|
|
driver support).</p>
|
|
|
|
<p>A new link type must implement two related APIs, one for parsing the JSON
|
|
string which provides the link address and the other which implements the link
|
|
operations that get called at run-time to perform I/O. The link type is built
|
|
into the IOC by providing a new <tt>link</tt> entry in a DBD file.</p>
|
|
|
|
|
|
<h4>New Link Types Added</h4>
|
|
|
|
<p>This release contains two new JSON link types, <tt>const</tt> and
|
|
<tt>calc</tt>:</p>
|
|
|
|
<ul>
|
|
|
|
<li>The <tt>const</tt> link type is almost equivalent to the old CONSTANT link
|
|
type with the updates described below to accept arrays and strings, except that
|
|
there is no need to wrap a scalar string constant inside array brackets since a
|
|
constant string will never be confused with a PV name.</li>
|
|
|
|
<li>The <tt>calc</tt> link type allows CALC expressions to be used to combine
|
|
values from other JSON links to produce its value. Until additional JSON link
|
|
types are created though, the <tt>calc</tt> link type has little practical
|
|
utility as it can currently only fetch inputs from other <tt>calc</tt> links or
|
|
from <tt>const</tt> links.</li>
|
|
|
|
</ul>
|
|
|
|
<pre>
|
|
field(INP, {calc:{expr:"A+B+1",
|
|
args:[5, # A
|
|
{const:6}] # B
|
|
}})
|
|
</pre>
|
|
|
|
<p>The new link types are documented in a
|
|
<a href="links.html">separate</a><!-- href for the EPICS website -->
|
|
<a href="../html/links.html">document</a><!-- href for install tree -->
|
|
.</p>
|
|
|
|
|
|
<h4>Device Support Addressing using <tt>JSON_LINK</tt></h3>
|
|
|
|
<p>The API to allow device support to use JSON addresses is currently
|
|
incomplete; developers are advised not to try creating device support that
|
|
specifies a <tt>JSON_LINK</tt> address type.</p>
|
|
|
|
|
|
<h4>Support Routine Modifications for Extensible Link Types</h4>
|
|
|
|
<p>For link fields in external record types and soft device support to be able
|
|
to use the new link types properly, various changes are required to utilize the
|
|
new Link Support API as defined in the dbLink.h header file and outlined below.
|
|
The existing built-in Database and Channel Access link types have been altered
|
|
to implement the link APIs, so will work properly after these conversions:</p>
|
|
|
|
<ul>
|
|
|
|
<li>Make all calls to <tt>recGblInitConstantLink()</tt> unconditional on the
|
|
link type, i.e. change this code:
|
|
|
|
<pre>
|
|
if (prec->siml.type == CONSTANT) {
|
|
recGblInitConstantLink(&prec->siml, DBF_USHORT, &prec->simm);
|
|
}
|
|
</pre>
|
|
|
|
into this:
|
|
|
|
<pre>
|
|
recGblInitConstantLink(&prec->siml, DBF_USHORT, &prec->simm);
|
|
</pre>
|
|
|
|
Note that <tt>recGblInitConstantLink()</tt> still returns TRUE if the field was
|
|
successfully initialized from the link (implying the link is constant).<br />
|
|
This change will work properly with all Base releases currently in use.</li>
|
|
|
|
<li>Code that needs to identify a constant link should be modified to use the
|
|
new routine <tt>dbLinkIsConstant()</tt> instead, which returns TRUE for constant
|
|
or undefined links, FALSE for links whose <tt>dbGetLink()</tt> routine may
|
|
return different values on different calls. For example this:
|
|
|
|
<pre>
|
|
if (prec->dol.type != CONSTANT)
|
|
</pre>
|
|
|
|
should become this:
|
|
|
|
<pre>
|
|
if (!dbLinkIsConstant(&prec->dol))
|
|
</pre>
|
|
|
|
When the converted software is also required to build against older versions of
|
|
Base, this macro definition may be useful:
|
|
|
|
<pre>
|
|
#define dbLinkIsConstant(lnk) ((lnk)->type == CONSTANT)
|
|
</pre>
|
|
</li>
|
|
|
|
<li>Any code that calls dbCa routines directly, or that explicitly checks if a
|
|
link has been resolved as a CA link using code such as
|
|
|
|
<pre>
|
|
if (prec->inp.type == CA_LINK)
|
|
</pre>
|
|
|
|
will still compile and run, but will only work properly with the old CA link
|
|
type. To operate with the new extensible link types such code must be modified
|
|
to use the new generic routines defined in dbLink.h and should never attempt to
|
|
examine or modify data inside the link. After conversion the above line would
|
|
probably become:
|
|
|
|
<pre>
|
|
if (dbLinkIsVolatile(&prec->inp))
|
|
</pre>
|
|
|
|
A volatile link is one like a Channel Access link which may disconnect and
|
|
reconnect without notice at runtime. Database links and constant links are not
|
|
volatile; unless their link address is changed they will always remain in the
|
|
same state they started in. For compatibility when building against older
|
|
versions of Base, this macro definition may be useful:
|
|
|
|
<pre>
|
|
#define dbLinkIsVolatile(lnk) ((lnk)->type == CA_LINK)
|
|
</pre>
|
|
</li>
|
|
|
|
<li>The current connection state of a volatile link can be found using the
|
|
routine <tt>dbIsLinkConnected()</tt> which will only return TRUE for a volatile
|
|
link that is currently connected. Code using the older dbCa API returning this
|
|
information used to look like this:
|
|
|
|
<pre>
|
|
stat = dbCaIsLinkConnected(plink);
|
|
</pre>
|
|
|
|
which should become:
|
|
<pre>
|
|
stat = dbIsLinkConnected(plink);
|
|
</pre>
|
|
|
|
Similar changes should be made for calls to the other dbCa routines.</li>
|
|
|
|
|
|
<li>A full example can be found by looking at the changes to the calcout record
|
|
type, which has been modified in this release to use the new dbLink generic
|
|
API.</li>
|
|
|
|
</ul>
|
|
|
|
</blockquote>
|
|
|
|
|
|
<h3>Constant Link Values</h3>
|
|
|
|
<p>Previously a constant link (i.e. a link that did not point to another PV,
|
|
either locally or over Channel Access) was only able to provide a single numeric
|
|
value to a record initialization; any string given in a link field that was not
|
|
recognized as a number was treated as a PV name. In this release, constant links
|
|
can be expressed using JSON array syntax and may provide array initialization of
|
|
values containing integers, doubles or strings. An array containing a single
|
|
string value can also be used to initialize scalar strings, so the stringin,
|
|
stringout, lsi (long string input), lso (long string output), printf, waveform,
|
|
subArray and aai (analog array input) record types and/or their soft device
|
|
supports have been modified to support this.</p>
|
|
|
|
<p>Some examples of constant array and string initialized records are:</p>
|
|
|
|
<pre>
|
|
record(stringin, "const:string") {
|
|
field(INP, ["Not-a-PV-name"])
|
|
}
|
|
record(waveform, "const:longs") {
|
|
field(FTVL, LONG)
|
|
field(NELM, 10)
|
|
field(INP, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
}
|
|
record(aai, "const:doubles") {
|
|
field(FTVL, DOUBLE)
|
|
field(NELM, 10)
|
|
field(INP, [0, 1, 1.6e-19, 2.718, 3.141593])
|
|
}
|
|
record(aSub, "select") {
|
|
field(FTA, STRING)
|
|
field(NOA, 4)
|
|
field(INPA, ["Zero", "One", "Two", "Three"])
|
|
field(FTB, SHORT)
|
|
field(NOB, 1)
|
|
field(FTVA, STRING)
|
|
field(NOVA, 1)
|
|
field(SNAM, "select_asub")
|
|
}
|
|
</pre>
|
|
|
|
<p>Reminder: Link initialization with constant values normally only occurs at
|
|
record initialization time. The calcout and printf record types are the only
|
|
exceptions in the Base record types to this rule, so it is generally not useful
|
|
to change a const link value after iocInit.</p>
|
|
|
|
|
|
<h3>Database Parsing of "Relaxed JSON" Values</h3>
|
|
|
|
<p>A database file can now provide a "relaxed JSON" value for a database field
|
|
value or an info tag. Only a few field types can currently accept such values,
|
|
but the capability is now available for use in other places in the future. When
|
|
writing to a JSON-capable field at run-time however, only strictly compliant
|
|
JSON may be used (the dbStaticLib parser rewrites relaxed JSON values into
|
|
strict JSON before passing them to the datase for interpretation, where the
|
|
strict rules must be followed).</p>
|
|
|
|
<p>"Relaxed JSON" was developed to maximize compatibility with the previous
|
|
database parser rules and reduce the number of double-quotes that would be
|
|
needed for strict JSON syntax. The parser does accept strict JSON too though,
|
|
which should be used when machine-generating database files. The differences
|
|
are:</p>
|
|
|
|
<ul>
|
|
|
|
<li>Strings containing only the characters <tt><b>a-z A-Z 0-9 _ - + .</b></tt>
|
|
do not have to be enclosed in double-quote characters.</li>
|
|
|
|
<li>The above rule applies to map keys as well as to regular string values.</li>
|
|
|
|
<li>The JSON keywords <tt>null</tt>, <tt>true</tt> and <tt>false</tt> (all
|
|
lower-case) will be recognized as keywords, so they must be quoted to use any of
|
|
these single words as a string.</li>
|
|
|
|
<li>Comments may be used, introduced as usual by the <tt><b>#</b></tt>
|
|
character and extending to the end of the line.</li>
|
|
|
|
</ul>
|
|
|
|
<p>A JSON field or info value is only enclosed in quotes when the value being
|
|
provided is a single string, and even here the quotes can be omitted in some
|
|
cases as described above. The following shows both correct and incorrect
|
|
excerpts from a database file:</p>
|
|
|
|
<pre>
|
|
record(ai, math:pi) {
|
|
field(INP, {const: 3.14159265358979}) # Correct
|
|
field(SIOL, "{const: 3.142857}") # Wrong
|
|
|
|
info(autosave, { # White-space and comments are allowed
|
|
fields:[DESC, SIMM],
|
|
pass0:[VAL]
|
|
}) # Correct
|
|
}
|
|
</pre>
|
|
|
|
<p>Note that the record, field and info-tag names do <em>not</em> accept JSON
|
|
values, so they follows the older bareword rules for quoting where the colon
|
|
<tt><b>:</b></tt> and several additional characters are legal in a bareword
|
|
string. Only the value (after the comma) is parsed as JSON. The autosave module
|
|
has not been modified to accept JSON syntax, the above is only an example of
|
|
how JSON might be used.</p>
|
|
|
|
<h3>Echoless comments in iocsh</h3>
|
|
|
|
<p>The way comments are parsed by the iocsh interpreter has changed. The
|
|
interpreter can be selectively disabled from echoing comments coming from
|
|
a script by starting those lines with '#-' rather than just '#'.</p>
|
|
|
|
|
|
<h3>Typed record support methods</h3>
|
|
|
|
<p>The table of record support functions (rset methods for short) no longer
|
|
has entries of type <tt>RECSUPFUN</tt> (which says: any number and type of
|
|
arguments). Instead, rset methods are now typed by default. The
|
|
<tt>RECSUPFUN</tt> typedef has been deprecated and casts to it as well as
|
|
using the untyped <tt>struct rset</tt> will create compilation warnings.</p>
|
|
|
|
<p>Existing code (e.g. external record supports) will generate such
|
|
warnings when compiled against this version of Base, but it will work
|
|
without changes.</p>
|
|
|
|
<p>For a conversion period, the new typed rset definitions are activated
|
|
by defining <tt>USE_TYPED_RSET</tt>, preferably by setting
|
|
<tt>USR_CPPFLAGS += -DUSE_TYPED_RSET</tt> inside a Makefile.
|
|
After activating the new typed rset in this way and making the following
|
|
changes, the result should still compile and work properly against older
|
|
versions of Base.</p>
|
|
|
|
<p>The first parameter of <tt>init_record</tt> and <tt>process</tt> has been
|
|
changed to <tt>struct dbCommon *</tt>. Record types that use
|
|
<tt>void*</tt> here should be changed to use <tt>struct dbCommon*</tt>, and
|
|
cast the argument to their own <tt>xxxRecord *</tt>.</p>
|
|
|
|
<p>When compiled against this release, compiler warnings about incompatible
|
|
types for the method pointers should be taken seriously. When compiled
|
|
against older versions of base, such warnings are unavoidable.</p>
|
|
|
|
<p>Record types written in C++ need to take more drastic measures because of
|
|
the stricter type checking in C++. To remain compatible with older versions
|
|
of base you need something like:</p>
|
|
|
|
<blockquote><pre>
|
|
#include "epicsVersion.h"
|
|
#ifdef VERSION_INT
|
|
#if EPICS_VERSION_INT < VERSION_INT(3,16,0,2)
|
|
#define RECSUPFUN_CAST (RECSUPFUN)
|
|
#else
|
|
#define RECSUPFUN_CAST
|
|
#endif
|
|
#else
|
|
#define RECSUPFUN_CAST (RECSUPFUN)
|
|
#endif
|
|
</pre></blockquote>
|
|
|
|
<p>and then replace <tt>(RECSUPFUN)</tt> with <tt>RECSUPFUN_CAST</tt>
|
|
when initializing the rset.
|
|
Further changes might be needed, e.g. to adapt <tt>const</tt>-ness of
|
|
method parameters.</p>
|
|
|
|
<hr>
|
|
|
|
<h2 align="center">Changes made between 3.15.3 and 3.16.0.1</h2>
|
|
|
|
<h3>Build support for CapFast and dbst removed</h3>
|
|
|
|
<p>The build rules associated with the CapFast-related tools <tt>sch2edif</tt>
|
|
and <tt>e2db</tt> and the <q>database optimization</q> tool <tt>dbst</tt> have
|
|
been removed, along with the <tt>DB_OPT</tt> build configuration variable.</p>
|
|
|
|
<h3>compressRecord buffering order</h3>
|
|
|
|
<p>The compressRecord has a new field <tt>BALG</tt> which can select between
|
|
FIFO (append) and LIFO (prepend) ordering for insertion of new elements. FIFO
|
|
ordering is the default, matching the behviour of previous versions.</p>
|
|
|
|
<h3>Valgrind Instrumentation</h3>
|
|
|
|
<p>Valgrind is a software debugging suite provided by many Linux distributions.
|
|
The header valgrind/valgrind.h is now included in, and installed by, Base.
|
|
When included by a C or C++ source file this header defines some macros which
|
|
expand to provide hints to the Valgrind runtime.
|
|
These have no effect on normal operation of the software, but when run using the
|
|
valgrind tool they can help to find memory leaks and buffer overflows.
|
|
Suitable hints have been added to several free-lists within libCom, including
|
|
freeListLib, allowing valgrind to provide more accurate information about the
|
|
source of potential leaks.</p>
|
|
|
|
<p>valgrind.h automatically disables itself when the build target is not
|
|
supported by the valgrind tool.
|
|
It can also explicitly be disabled by defining the macro <em>NVALGRIND</em>.
|
|
See <em>src/libCom/Makefile</em> for a commented-out example.</p>
|
|
|
|
<p>As a matter of policy valgrind.h will never be included by any header file
|
|
installed by Base, so its use will remain purely an implementation
|
|
detail hidden from application software.
|
|
Support modules which choose to use valgrind.h are advised to do
|
|
likewise.</p>
|
|
|
|
<h3>Database Multi-locking</h3>
|
|
|
|
<p>The IOC record locking code has been re-written with an expanded API; global
|
|
locks are no longer required by the IOC database implementation.</p>
|
|
|
|
<p>The new API functions center around dbScanLockMany(), which behaves like
|
|
dbScanLock() applied to an arbitrary group of records. dbLockerAlloc() is used
|
|
to prepare a list or record pointers, then dbScanLockMany() is called. When it
|
|
returns, all of the records listed may be accessed (in any order) until
|
|
dbScanUnlockMany() is called.</p>
|
|
|
|
<p>The Application Developer's Guide has been updated to describe the API and
|
|
implementation is more detail.</p>
|
|
|
|
<p>Previously a global mutex 'lockSetModifyLock' was locked and unlocked during
|
|
dbScanLock(), acting as a sequencing point for otherwise unrelated calls. The
|
|
new dbLock.c implementation does not include any global mutex in dbScanLock() or
|
|
dbScanLockMany(). Locking/unlocking of unrelated lock sets is now completely
|
|
concurrent.</p>
|
|
|
|
<h3>Generate Version Header</h3>
|
|
|
|
<p>A Perl script and Makefile rules have been added to allow modules to generate
|
|
a C header file with a macro defined with an automatically updated identifier.
|
|
This is a VCS revision ID (Darcs, Git, Mercurial, Subversion, and Bazaar are
|
|
supported) or the date/time of the build if no VCS system is in use.</p>
|
|
|
|
<p>The makeBaseApp example template has been updated with a new device support
|
|
which makes this identifier visible via a lsi (long string input) record.</p>
|
|
|
|
<h3>epicsTime API return status</h3>
|
|
|
|
<p>The epicsTime routines that used to return epicsTimeERROR now return a
|
|
specific S_time_ status value, allowing the caller to discover the reason for
|
|
any failure. The identifier <tt>epicsTimeERROR</tt> is no longer defined, so any
|
|
references to it in source code will no longer compile. The identifier
|
|
epicsTimeOK still exists and has the value 0 as before, so most code that uses
|
|
these APIs can be changed in a way that is backwards-compatible with the
|
|
previous return status.</p>
|
|
|
|
<p>Time providers that have to return a status value and still need to be built
|
|
with earlier versions of Base can define the necessary status symbols like
|
|
this:</p>
|
|
|
|
<blockquote><pre>
|
|
#include "epicsTime.h"
|
|
|
|
#ifndef M_time
|
|
/* S_time_... status values were not provided before Base 3.16 */
|
|
#define S_time_unsynchronized epicsTimeERROR
|
|
#define S_time_...whatever... epicsTimeERROR
|
|
#endif
|
|
</pre></blockquote>
|
|
|
|
<h3>Refactoring of epicsReadline</h3>
|
|
|
|
<p>The epicsReadline code has been reorganized to allow the commandline history
|
|
editor to be disabled at runtime. The EPICS_COMMANDLINE_LIBRARY build setting
|
|
still selects the preferred editor, but the new <tt>IOCSH_HISTEDIT_DISABLE</tt>
|
|
environment variable can be set at runtime to disable history editing and make
|
|
the IOC or other program use the basic editor instead. This is useful when
|
|
starting and controlling an IOC from another program through its stdin and
|
|
stdout streams since history editors often insert invisible escape codes into
|
|
the stdout stream, making it hard to parse.</p>
|
|
|
|
<h3>Callback subsystem API</h3>
|
|
|
|
<p>Added a new macro <tt>callbackGetPriority(prio, callback)</tt> to the
|
|
callback.h header and removed the need for dbScan.c to reach into the internals
|
|
of its CALLBACK objects.</p>
|
|
|
|
|
|
<h2 align="center">Changes from the 3.15 branch since 3.15.5</h2>
|
|
|
|
<!-- Insert inherited items immediately below here ... -->
|
|
|
|
<h2 align="center">Changes from the 3.14 branch since 3.15.5</h2>
|
|
|
|
<!-- Insert inherited items immediately below here ... -->
|
|
|
|
<h3>Fix DNS related crash on exit</h3>
|
|
|
|
<p>The attempt to fix DNS related delays for short lived CLI programs (eg. caget)
|
|
in lp:1527636 introduced a bug which cased these short lived clients to crash on exit.
|
|
This bug should now be fixed.</p>
|
|
|
|
<h3>Server bind issue on Windows</h3>
|
|
|
|
<p>When a National Instruments network variables CA server is already running on
|
|
a Windows system and an IOC or PCAS server is started, the IOC's attempt to
|
|
bind a TCP socket to the CA server port number fails, but Windows returns a
|
|
different error status value than the IOC is expecting in that circumstance
|
|
(because the National Instruments code requests exclusive use of that port,
|
|
unlike the EPICS code) so the IOC fails to start properly. The relevent EPICS
|
|
bind() checks have now been updated so the IOC will request that a dynamic port
|
|
number be allocated for this TCP socket instead when this happens.</p>
|
|
|
|
<h3>Checking Periodic Scan Rates</h3>
|
|
|
|
<p>Code has been added to the IOC startup to better protect it against bad
|
|
periodic scan rates, including against locales where <q><tt>.</tt></q> is not
|
|
accepted as a decimal separator character. If the scan period in a menuScan
|
|
choice string cannot be parsed, the associated periodic scan thread will no
|
|
longer be started by the IOC and a warning message will be displayed at iocInit
|
|
time. The <tt>scanppl</tt> command will also flag the faulty menuScan value.</p>
|
|
|
|
|
|
<h2 align="center">Changes made between 3.15.4 and 3.15.5</h2>
|
|
|
|
<h3>dbStatic Library Speedup and Cleanup</h3>
|
|
|
|
<p>Loading of database files has been optimized to avoid overproportionally
|
|
long loading times for large databases. As a part of this, the alphabetical
|
|
ordering of records instances (within a record type) has been dropped. In the
|
|
unexpected case that applications were relying on the alphabetic order, setting
|
|
<tt>dbRecordsAbcSorted = 1</tt> before loading the databases will retain the
|
|
old behavior.</p>
|
|
|
|
<p>The routine <tt>dbRenameRecord()</tt> has been removed, as it was intended
|
|
to be used by database configuration tools linked against a host side version
|
|
of the dbStatic library that is not being built anymore.</p>
|
|
|
|
<h3>Launchpad Bug-fixes</h3>
|
|
|
|
<p>In addition to the more detailed change descriptions below, the following
|
|
Launchpad bugs have also been fixed in this release:</p>
|
|
|
|
<ul>
|
|
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1440186">
|
|
#1440186</a> Crash due to a too small buffer being provided in
|
|
dbContextReadNotifyCache</li>
|
|
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1479316">
|
|
#1479316</a> Some data races found using Helgrind</li>
|
|
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1495833">
|
|
#1495833</a> biRecord prompt groups are nonsensical</li>
|
|
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1606848">
|
|
#1606848</a> WSAIoctl SIO_GET_INTERFACE_LIST failed in Windows</li>
|
|
</ul>
|
|
|
|
<h3>Whole-Program Optimization for MS Visual Studio Targets</h3>
|
|
|
|
<p>When using the Microsoft compilers a new build system variable is provided
|
|
that controls whether whole program optimization is used or not. For static
|
|
builds using Visual Studio 2010 this optimization must be disabled. This is
|
|
controlled in the files configure/os/CONFIG_SITE.Common.windows-x64-static and
|
|
configure/os/CONFIG_SITE.Common.win32-x86-static by setting the variable
|
|
<tt>OPT_WHOLE_PROGRAM = NO</tt> to override the default value
|
|
<tt>YES</tt> that would otherwise be used.</p>
|
|
|
|
<p>Note that enabling this optimization slows down the build process. It is not
|
|
possible to selectively disable this optimization, when building a particular
|
|
module say; Microsoft's linker will restart itself automatically with the
|
|
<tt>-LTCG</tt> flag set and display a warning if it is asked to link any object
|
|
files that were compiled with the <tt>-GL</tt> flag.</p>
|
|
|
|
<h3>Add dynamic (variable length) array support to PCAS</h3>
|
|
|
|
<p>Dynamic array sizing support was added to the IOC server (RSRV) in the
|
|
Base-3.14.12 release, but has not until now been supported in the <q>Portable
|
|
Channel Access Server</q> (PCAS). Channel Access server applications using the
|
|
PCAS may not need to be modified at all; if they already push monitors with
|
|
different gdd array lengths, those variable sizes will be forwarded to any CA
|
|
clients who have requested variable length updates. The example CAS server
|
|
application has been modified to demonstrate this feature.</p>
|
|
|
|
<p>In implementing the above, the gdd method <tt>gdd::put(const gdd *)</tt> now
|
|
copies the full-sized array from the source gdd if the destination gdd is of
|
|
type array, has no allocated memory and a boundary size of 0.</p>
|
|
|
|
<h3>Additional epicsTime conversion</h3>
|
|
|
|
<p>The EPICS timestamp library (epicsTime) inside libCom's OSI layer has
|
|
been extended by routines that convert from <tt>struct tm</tt> to the EPICS
|
|
internal <tt>epicsTime</tt> type, assuming UTC - i.e. without going through
|
|
the timezone mechanism. This solves issues with converting from the structured
|
|
type to the EPICS timestamp at driver level from multiple threads at a high
|
|
repetition rate, where the timezone mechanism was blocking on file access.</p>
|
|
|
|
<h3>MinGW Cross-builds from Linux</h3>
|
|
|
|
<p>The build configuration files that allow cross-building of the 32-bit
|
|
win32-x86-mingw cross-target have been adjusted to default to building shared
|
|
libraries (DLLs) as this is now supported by recent MinGW compilers. The 64-bit
|
|
windows-x64-mingw cross-target was already being built that way by default. The
|
|
configuration options to tell the minGW cross-compiler to link programs with
|
|
static versions of the compiler support libraries have now been moved into the
|
|
CONFIG_SITE.linux-x86.<i>target</i> files.</p>
|
|
|
|
<h3>General Time updates</h3>
|
|
|
|
<p>The <tt>iocInit</tt> code now performs a sanity check of the current time
|
|
returned by the generalTime subsystem and will print a warning if the wall-clock
|
|
time returned has not been initialized yet. This is just a warning message; when
|
|
a time provider does synchonize the IOC will subsequently pick up and use the
|
|
correct time. This check code also primes the registered event system provider
|
|
if there is one so the <tt>epicsTimeGetEventInt()</tt> routine will work on IOCs
|
|
that ask for event time within an interrupt service routine.</p>
|
|
|
|
<p>The osiClockTime provider's synchronization thread (which is only used on
|
|
some embedded targets) will now poll the other time providers at 1Hz until the
|
|
first time it manages to get a successful timestamp, after which it will poll
|
|
for updates every 60 seconds as before.</p>
|
|
|
|
<p>The routine <tt>generalTimeGetExceptPriority()</tt> was designed for use by
|
|
backup (lower priority) time providers like the osiClockTime provider which do
|
|
not have their own absolute time reference and rely on other providers for an
|
|
absolute time source. This routine no longer implements the ratchet mechanism
|
|
that prevented the time it returned from going backwards. If the backup clock's
|
|
tick-timer runs fast the synchronization of the backup time provider would never
|
|
allow it to be corrected backwards when the ratchet was in place. The regular
|
|
<tt>epicsTimeGetCurrent()</tt> API still uses the ratchet mechanism, so this
|
|
change will not cause the IOC to see time going backwards.</p>
|
|
|
|
<h3>Microsoft Visual Studio builds</h3>
|
|
|
|
<p>The build configuration files for builds using the Microsoft compilers have
|
|
been updated, although there should be no noticable difference at most sites.
|
|
One extra compiler warning is now being suppressed for C++ code, <tt>C4344:
|
|
behavior change: use of explicit template arguments results in ...</tt> which is
|
|
gratuitous and was appearing frequently in builds of the EPICS V4 modules.</p>
|
|
|
|
<p>Cross-builds of the windows-x64 target from a win32-x86 host have been
|
|
removed as they don't actually work within the context of a single <tt>make</tt>
|
|
run. Significant changes to the build configuration files would be necessary for
|
|
these kinds of cross-builds to work properly, which could be done if someone
|
|
needs them (email Andrew Johnson before working on this, and see
|
|
<a href="http://stackoverflow.com/questions/5807647/how-do-you-compile-32-bit-and-64-bit-applications-at-the-same-time-in-visual-stu">
|
|
this stack-overflow answer</a> for a starting point).</p>
|
|
|
|
<h3>Bazaar keywords such as 'Revision-Id' removed</h3>
|
|
|
|
<p>In preparation for moving to git in place of the Bazaar revision control
|
|
system we have removed all the keywords from the Base source code.</p>
|
|
|
|
<h3>Linux systemd service file for CA Repeater</h3>
|
|
|
|
<p>Building this version of Base on a Linux system creates a systemd service
|
|
file suitable for starting the Channel Access Repeater under systemd. The file
|
|
will be installed into the target bin directory, from where it can be copied
|
|
into the appropriate systemd location and modified as necessary. Installation
|
|
instructions are included as comments in the file.</p>
|
|
|
|
|
|
<h2 align="center">Changes made between 3.15.3 and 3.15.4</h2>
|
|
|
|
<h3>New string input device support "getenv"</h3>
|
|
|
|
<p>A new "getenv" device support for both the stringin and lsi (long string
|
|
input) record types can be used to read the value of an environment variable
|
|
from the IOC at runtime. See base/db/softIocExit.db for sample usage.</p>
|
|
|
|
<h3>Build rules and DELAY_INSTALL_LIBS</h3>
|
|
|
|
<p>A new order-only prerequisite build rule has been added to ensure that
|
|
library files (and DLL stubs on Windows) get installed before linking any
|
|
executables, which resolves parallel build problems on high-powered CPUs. There
|
|
are some (rare) cases though where a Makefile has to build an executable and run
|
|
it to be able to compile code for a library built by the same Makefile. With
|
|
this new build rule GNUmake will complain about a circular dependency and the
|
|
build will probably fail in those cases. To avoid this problem the failing
|
|
Makefile should set <tt>DELAY_INSTALL_LIBS = YES</tt> before including the
|
|
<tt>$(TOP)/configure/RULES</tt> file, disabling the new build rule.</p>
|
|
|
|
<h3>IOC environment variables and build parameters</h3>
|
|
|
|
<p>The IOC now sets a number of environment variables at startup that provide
|
|
the version of EPICS Base it was built against (EPICS_VERSION_...) and its build
|
|
architecture (ARCH). In some cases this allows a single iocBoot/ioc directory to
|
|
be used to run the same IOC on several different architectures without any
|
|
changes.</p>
|
|
|
|
<p>There are also 3 new environment parameters (EPICS_BUILD_...) available that
|
|
C/C++ code can use to find out the target architecture, OS class and compiler
|
|
class it was built with. These may be useful when writing interfaces to other
|
|
languages.</p>
|
|
|
|
<h3>New implementation of promptgroup/gui_group field property</h3>
|
|
|
|
<p>The mechanism behind the "promptgroup()" field property inside a record type
|
|
definition has been changed. Instead of using a fixed set of choices,
|
|
the static database access library now collects the used gui group names
|
|
while parsing DBD information. Group names should start with a two-digit number
|
|
plus space-dash-space to allow proper sorting of groups.</p>
|
|
|
|
<p>The include file <tt>guigroup.h</tt> that defined the fixed set of choices
|
|
has been deprecated. Instead, use the conversion functions between index number
|
|
and group string that have been added to dbStaticLib.</p>
|
|
|
|
<p>When a DBD file containing record-type descriptions is expanded, any
|
|
old-style <tt>GUI_xxx</tt> group names will be replaced by a new-style
|
|
string for use by the IOC. This permits an older record type to be used with
|
|
the 3.15.4 release, although eventually record types should be converted by
|
|
hand with better group names used.</p>
|
|
|
|
<h3>CA server configuration changes</h3>
|
|
|
|
<p>RSRV now honors EPICS_CAS_INTF_ADDR_LIST and binds only to the provided list
|
|
of network interfaces. Name searches (UDP and TCP) on other network interfaces
|
|
are ignored. For example on a computer with interfaces 10.5.1.1/24, 10.5.2.1/24,
|
|
and 10.5.3.1/24, setting "EPICS_CAS_INTF_ADDR_LIST='10.5.1.1 10.5.2.1'" will
|
|
accept traffic on the .1.1 and .2.1, but ignore from .3.1</p>
|
|
|
|
<p>RSRV now honors EPICS_CAS_IGNORE_ADDR_LIST and ignores UDP messages received
|
|
from addresses in this list.</p>
|
|
|
|
<p>Previously, CA servers (RSRV and PCAS) would build the beacon address list
|
|
using EPICS_CA_ADDR_LIST if EPICS_CAS_BEACON_ADDR_LIST was no set. This is no
|
|
longer done. Sites depending on this should set both envronment variables to the
|
|
same value.</p>
|
|
|
|
<h3>IPv4 multicast for name search and beacons</h3>
|
|
|
|
<p>libca, RSRV, and PCAS may now use IPv4 multicasting for UDP traffic (name
|
|
search and beacons). This is disabled by default. To enable multicast address(s)
|
|
must be listed in EPICS_CA_ADDR_LIST for clients and EPICS_CAS_INTF_ADDR_LIST
|
|
for servers (IOCs should set both). For example:
|
|
"EPICS_CAS_INTF_ADDR_LIST='224.0.2.9' EPICS_CA_ADDR_LIST=224.0.2.9".</p>
|
|
|
|
<p>Please note that no IPv4 multicast address is officially assigned for Channel
|
|
Access by IANA. The example 224.0.2.9 is taken from the AD-HOC Block I range.<p>
|
|
|
|
<h3>Moved <tt>mlockall()</tt> into its own epicsThread routine</h3>
|
|
|
|
<p>Since EPICS Base 3.15.0.2 on Posix OSs the initialization of the epicsThread
|
|
subsystem has called <tt>mlockall()</tt> when the OS supports it and thread
|
|
priority scheduling is enabled. Doing so has caused problems in third-party
|
|
applications that call the CA client library, so the functionality has been
|
|
moved to a separate routine <tt>epicsThreadRealtimeLock()</tt> which will be
|
|
called by the IOC at iocInit (unless disabled by setting the global variable
|
|
<tt>dbThreadRealtimeLock</tt> to zero).</p>
|
|
|
|
<h3>Added dbQuietMacroWarnings control</h3>
|
|
|
|
<p>When loading database files, macros get expanded even on comment lines. If a
|
|
comment contains an undefined macro, the load still continues but an error
|
|
message gets printed. For this release the error message has been changed to a
|
|
warning, but even this warning can be made less verbose by setting this new
|
|
variable to a non-zero value before loading the file, like this:</p>
|
|
|
|
<blockquote><pre>
|
|
var dbQuietMacroWarnings 1 <i>iocsh</i>
|
|
dbQuietMacroWarnings=1 <i>VxWorks</i>
|
|
</pre></blockquote>
|
|
|
|
<p>This was <a href="https://bugs.launchpad.net/bugs/541119">Launchpad bug
|
|
541119</a>.</p>
|
|
|
|
|
|
<h2 align="center">Changes from the 3.14 branch between 3.15.3 and 3.15.4</h2>
|
|
|
|
<h3>NTP Time Provider adjusts to OS tick rate changes</h3>
|
|
|
|
<p>Dirk Zimoch provided code that allows the NTP Time provider (used on VxWorks
|
|
and RTEMS only) to adapt to changes in the OS clock tick rate after the provider
|
|
has been initialized. Note that changing the tick rate after iocInit() is not
|
|
advisable, and that other software might still misbehave if initialized before
|
|
an OS tick rate change. This change was back-ported from the 3.15 branch.</p>
|
|
|
|
<h3>Making IOC ca_get operations atomic</h3>
|
|
|
|
<p>When a CA client gets data from an IOC record using a compound data type such
|
|
as <tt>DBR_TIME_DOUBLE</tt> the value field is fetched from the database in a
|
|
separate call than the other metadata, without keeping the record locked. This
|
|
allows some other thread such as a periodic scan thread a chance to interrupt
|
|
the get operation and process the record in between. CA monitors have always
|
|
been atomic as long as the value data isn't a string or an array, but this race
|
|
condition in the CA get path has now been fixed so the record will stay locked
|
|
between the two fetch operations.</p>
|
|
|
|
<p>This fixes <a href="https://bugs.launchpad.net/epics-base/+bug/1581212">
|
|
Launchpad bug #1581212</a>, thanks to Till Strauman and Dehong Zhang.</p>
|
|
|
|
<h3>New CONFIG_SITE variable for running self-tests</h3>
|
|
|
|
<p>The 'make runtests' and 'make tapfiles' build targets normally only run the
|
|
self-tests for the main <tt>EPICS_HOST_ARCH</tt> architecture. If the host is
|
|
able to execute self-test programs for other target architectures that are being
|
|
built by the host, such as when building a <tt>-debug</tt> version of the host
|
|
architecture for example, the names of those other architectures can be added to
|
|
the new <tt>CROSS_COMPILER_RUNTEST_ARCHS</tt> variable in either the
|
|
<tt>configure/CONFIG_SITE</tt> file or in an appropriate
|
|
<tt>configure/os/CONFIG_SITE.<host>.Common</tt> file to have the test
|
|
programs for those targets be run as well.</p>
|
|
|
|
<h3>Additional RELEASE file checks</h3>
|
|
|
|
<p>An additional check has been added at build-time for the contents of the
|
|
configure/RELEASE file(s), which will mostly only affect users of the Debian
|
|
EPICS packages published by NSLS-2. Support modules may share an install path,
|
|
but all such modules must be listed adjacent to each other in any RELEASE files
|
|
that point to them. For example the following will fail the new checks:</p>
|
|
|
|
<blockquote><pre>
|
|
AUTOSAVE = /usr/lib/epics
|
|
ASYN = /home/mdavidsaver/asyn
|
|
EPICS_BASE = /usr/lib/epics
|
|
</pre></blockquote>
|
|
|
|
<p>giving the compile-time error</p>
|
|
|
|
<blockquote><pre>
|
|
This application's RELEASE file(s) define
|
|
EPICS_BASE = /usr/lib/epics
|
|
after but not adjacent to
|
|
AUTOSAVE = /usr/lib/epics
|
|
Module definitions that share paths must be grouped together.
|
|
Either remove a definition, or move it to a line immediately
|
|
above or below the other(s).
|
|
Any non-module definitions belong in configure/CONFIG_SITE.
|
|
</pre></blockquote>
|
|
|
|
|
|
<p>In many cases such as the one above the order of the <tt>AUTOSAVE</tt> and
|
|
<tt>ASYN</tt> lines can be swapped to let the checks pass, but if the
|
|
<tt>AUTOSAVE</tt> module depended on <tt>ASYN</tt> and hence had to appear
|
|
before it in the list this error indicates that <tt>AUTOSAVE</tt> should also be
|
|
built in its own private area; a shared copy would likely be incompatible with
|
|
the version of <tt>ASYN</tt> built in the home directory.</p>
|
|
|
|
<h3>String field buffer overflows</h3>
|
|
|
|
<p>Two buffer overflow bugs that can crash the IOC have been fixed, caused by
|
|
initializing a string field with a value larger than the field size
|
|
(<a href="https://bugs.launchpad.net/bugs/1563191">Launchpad bug
|
|
#1563191</a>).</p>
|
|
|
|
<h3>Fixed stack corruption bug in epicsThread C++ API</h3>
|
|
|
|
<p>The C++ interface to the epicsThread API could corrupt the stack on thread
|
|
exit in some rare circumstances, usually at program exit. This bug has been
|
|
fixed (<a href="https://bugs.launchpad.net/bugs/1558206">Launchpad bug
|
|
#1558206</a>).</p>
|
|
|
|
<h3>RTEMS NTP Support Issue</h3>
|
|
|
|
<p>On RTEMS the NTP Time Provider could in some circumstances get out of sync
|
|
with the server because the osdNTPGet() code wasn't clearing its input socket
|
|
before sending out a new request. This
|
|
(<a href="https://bugs.launchpad.net/bugs/1549908">Launchpad bug 1549908</a>)
|
|
has now been fixed.</p>
|
|
|
|
<h3>CALC engine bitwise operator fixes</h3>
|
|
|
|
<p>The bitwise operators in the CALC engine have been modified to work properly
|
|
with values that have bit 31 (0x80000000) set. This modification involved
|
|
back-porting some earlier changes from the 3.15 branch, and fixes
|
|
<a href="https://code.launchpad.net/bugs/1514520">Launchpad bug
|
|
#1514520</a>.</p>
|
|
|
|
<h3>Fix <tt>ipAddrToAsciiAsync()</tt>: Don't try to join the daemon thread</h3>
|
|
|
|
<p>On process exit, don't try to stop the worker thread that makes DNS lookups
|
|
asynchronous. Previously this would wait for any lookups still in progress,
|
|
delaying the exit unnecessarily. This was most obvious with catools (eg.
|
|
cainfo).
|
|
<a href="https://bugs.launchpad.net/bugs/1527636">lp:1527636</a></p>
|
|
|
|
<h3>Fix <tt>epicsTime_localtime()</tt> 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>
|
|
|
|
|
|
</body>
|
|
</html>
|