Files
epics-base/documentation/RELEASE-7.0.8.md
Dirk Zimoch 90a727c901 Fix spelling errors
Most errors found with:

codespell -L cach,thst,odly,aslo,parm,parms,inpu,ges,prset,pevent,ptd,pring,valu,noo,noe,ned,inout,ro,siz,froms,nd,fo,singl,sart,multy,tthe,allong,ment,inate,nodel,tring,alse,ture,thi,wille,numer

Some more manually found (its -> it's)

c++20: Do not use apostrophe (e.g. can't) in unquoted #error message
2025-12-01 19:00:04 -08:00

9.4 KiB

Release Notes

This document describes the changes that were included in the release of EPICS noted below. Release entries are now provided in a separate document for each version in the EPICS 7 series, but all are combined into a single page for publishing on the EPICS website. Separate release documents are also included from the older Base 3.15 and 3.16 series.

The external PVA submodules continue to maintain their own release notes files as before, but the entries describing changes in those submodules since version 7.0.5 have been copied into the associated EPICS Release Notes files, and will be added to new EPICS Release Notes published in the future.

EPICS Release 7.0.8

bi "Raw Soft Channel" use MASK

If MASK is non-zero, The raw device support will now apply MASK to the value read into RVAL. eg. allows extraction of a bit from an input integer.

record(longin, "integer") {
    field(VAL, "0xff")
}
record(bi, "bit1") {
    field(DESC, "extract bit 1")
    field(DTYP, "Raw Soft Channel")
    field(INP , "integer")
    field(MASK, "0x2")
    field(ZNAM, "Clear")
    field(ONAM, "Set")
}

ANSI escapes in stderr

ANSI escape character sequences may now be printed to the stderr stream. These escapes will appear in logs captured from that stream. Tools which parse and/or render these logs may need to be adjusted to either strip out the escapes, or to translate them into markup. (see ansi2html for example)

Allow explicit append with dbRecordsOnceOnly!=0

Previously setting dbRecordsOnceOnly!=0 prevented any further changes to a record via a .db file. eg.

record(ai, "myrec") {}

dbRecordsOnceOnly!=0 previously disallowed appending fields with either form:

record("*", "myrec") {} # error
record(ai, "myrec") {}  # error

Beginning with this release, dbRecordsOnceOnly!=0 allows appending when explicitly intended (when record type is "*").

record("*", "myrec") {} # allowed
record(ai, "myrec") {}  # error

Add $EPICS_CLI_TIMEOUT

Add support for CA tools timeout from environment variable $EPICS_CLI_TIMEOUT which sets the default the default timeout for caget et al. The -w argument continues to take precedence.

Fixed leak from a non-EPICS thread on WIN32

On Windows targets, if a thread not created by epicsThreadCreate*() directly or indirectly calls an epicsThread*() function, a specific tracking struct is allocated. Prior to this release the allocation would not be free()d, resulting in a memory leak.

A similar issue on POSIX targets was previously fixed.

Change compiler for FreeBSD to clang

The default compiler for FreeBSD targets changes from GCC to clang.

Expose dbCreateAlias in IOC shell

Add a new IOC shell command dbCreateAlias allow record aliases to be added. Intended for use before iocInit. eg. to add an alias "bar" for a record "foo".

dbLoadRecords("some.db") # includes: record(ai, "foo") { ...
dbCreateAlias("foo", "bar")
iocInit()

dbEvent eventsRemaining missed on cancel

In some cases, RSRV may queue a subscription update, but not flush it. This partially addresses this issue.

Previously, if a subRecord has an invalid INP* link, it was silently failing (and not running the proc function). Now the the status code returned by the subroutine is returned from dbProcess().

COMMANDLINE_LIBRARY fallback to GNU_DIR

Fall back to the previous behavior when searching for readline.h with older compilers.

Search for readline installed via HomeBrew.

Look for /opt/local/include/readline on OSX.

Always stop worker threads

The SCAN and callback threads are now stopped during normal IOC shutdown.

Allow runtime bypass of free list allocator

The environment variable $EPICS_FREELIST_BYPASS may be set to YES to cause the freeListLib functions to always call directly to malloc()/free(). May be useful when troubleshooting some kinds of memory allocation bugs which would otherwise be "hidden". eg. use-after-free data races. This may also improve the results of dynamic analysis tools which are not aware of this internal free list.

compress record enhancement

The compress record now supports the use of partially-filled buffers when using any of the N-to-one algorithms. This is achieved by setting the new field PBUF to YES.

Extended timestamp channel filter

The "ts" filter can now retrieve the record's timestamp in several numeric and string formats, some of which support full nanosecond precision.

Hal$ caget -a test:channel
test:channel                   2021-03-11 18:23:48.265386 42
Hal$ caget -f9 'test:channel.{"ts": {"num": "dbl"}}'
test:channel.{"ts": {"num": "dbl"}} 984331428.265386105
Hal$ caget 'test:channel.{"ts": {"str": "iso"}}'
test:channel.{"ts": {"str": "iso"}} 2021-03-11T18:23:48.265386+0100
Hal$ caget -f1 'test:channel.{"ts": {"num": "ts"}}'
test:channel.{"ts": {"num": "ts"}} 2 984331428.0 265386163.0

More information is included in the filters documentation, which can be found in the html/filters.html document that is generated during the build

Allow adding new error symbols at any time

errSymbolAdd can now be called after early initialization.

Add conditional output (OOPT) to the longout record

The longout record can now be configured using its new OOPT and OOCH fields to (not) write to its output link depending on the contents of VAL, in a similar manner to the calcout record. More information can be found on the reference page for the longout record type that accompanies this release.

This functionality was suggested in lp# 1398215 and may be added to other output record types if the community finds it useful, please send feedback about the feature to tech-talk.

IOC Shell

Tab completion

When built with optional GNU libreadline support, the interactive IOC shell will perform tab completion for command names as well as for some arguments of the built-in commands. For example, the record name argument of dbpr, and the path name argument of cd.

Externally defined commands have a limited ability to opt into completion by using the new iocshArgStringRecord and iocshArgStringPath argument types. Both function identically to iocshArgString but indicate how to suggest completion strings.

Builds on macOS (darwin-x86 or darwin-aarch64 targets) normally use Apple's libedit library in readline compatibility mode, which doesn't support the tab completion API that GNU readline provides. You can use Homebrew or some other third-party package manager to install the GNU readline package, then edit the configure/os/CONFIG_SITE.darwinCommon.darwinCommon file to have EPICS use the real thing to get tab completion in the IOC shell. The default settings in that file currently look for and use a Homebrew-installed readline if present.

Persist history

Attempt to read and write command to a file (./.iocsh_history by default). Name may be overwritten with by setting $EPICS_IOCSH_HISTFILE to an alternate path, or disabled by setting to an empty string.

Changes to help output

Rework the help command output to improve formatting and readability, and include a visual marker (a line of underlines) between different help commands.

Add FMOD as CALC Expression

The floating point modulo function FMOD(NUM,DEN) has been added to the CALC expression engine and is available to all software using that (calc and calcout record types, access security library and some extensions).

Submodule updates

The pvData module was updated to version 8.0.6:

  • Compatible changes
    • Actually enable JSON-5 output in PVStructure::Formatter::JSON when available.
    • Fix unaligned access issues for some ARM/Linux targets.

The pvAccess module was updated to version 7.1.7:

  • Changes
    • Registering the PVA server with the IOC now sets the PVAS_SERVER_PORT variable in the environment.

The pva2pva module was updated to version 1.4.1:

  • Bug Fixes
    • dbLoadGroup was fixed
  • Additions
    • Support for "meta" member at top of array of structs

The pvDatabase module was updated to version 4.7.1:

  • Added data distributor plugin which can be used for distributing data between a group of clients. The plugin is triggered by the request string of the form:

    _[distributor=group:<group id>;set:<set_id>;trigger:<field_name>;updates:<n_updates>;mode:<update_mode>]

    The plugin parameters are optional and are described below:

    • group: this parameter indicates a group that client application belongs to (default value: "default"); groups of clients are completely independent of each other

    • set: this parameter designates a client set that application belongs to within its group (default value: "default")

    • trigger: this is the PV structure field that distinguishes different channel updates (default value: "timeStamp"); for example, for area detector images one could use the "uniqueId" field of the NTND structure

    • updates: this parameter configures how many sequential updates a client (or a set of clients) will receive before the data distributor starts updating the next one (default value: "1")

    • mode: this parameter configures how channel updates are to be distributed between clients in a set:

      • one: update goes to one client per set
      • all: update goes to all clients in a set
      • default is "one" if client set id is not specified, and "all" if set id is specified