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
7.9 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.
EPICS Release 7.0.3.1
IMPORTANT NOTE: Some record types in this release will not be compatible with device support binaries compiled against earlier versions of those record types, because importing the record documentation from the EPICS Wiki as described below also modified the order of some of the fields in the record definitions. As long as all support modules and IOCs are rebuilt from source after updating them to use this release of EPICS Base, these changes should not have any affect.
logClient reliability
On supported targets (Linux, Mac, Windows) logClient will attempt to avoid dropping undelivered log messages when the connection to the log server is closed/reset.
Timers and delays use monotonic clock
Many internal timers and delay calculations use a monotonic clock epicsTimeGetMonotonic() instead of the realtime epicsTimeGetCurrent(). This is intended to make IOCs less susceptible to jumps in system time.
Iocsh on error ...
A new statement is added to enable IOC shell commands to signal error conditions, and for scripts to respond. This first is through the new function
int iocshSetError(int err);
A script may be prefixed with eg. "on error break" to stop at the failed command.
on error continue | break | wait [value] | halt
A suggested form for IOC shell commands is:
static void doSomethingCallFunc(const iocshArgBuf *args)
{
iocshSetError(doSomething(...)); /* return 0 == success */
}
Relocatable Builds
Allows built trees to be copied or moved without invalidating RPATH entries.
The LINKER_USE_RPATH Makefile variable (see configure/CONFIG_SITE) may be
set to YES, NO, and a new third option ORIGIN. This is limited to
targets using the ELF executable format (eg. Linux).
When LINKER_USE_RPATH=ORIGIN, the variable LINKER_ORIGIN_ROOT is set to
one of the parents of the build directory. Any libraries being linked
to which are found under this root will have a relative RPATH entry.
Other libraries continue to result in absolute RPATH entries.
An effect of this might change a support library from being linked with
-Wl,-rpath /build/epics-base/lib/linux-x86
to being linked with
-Wl,-rpath \$ORIGIN/../../../epics-base/lib/linux-x86
if the support module directory is /build/mymodule
and LINKER_ORIGIN_ROOT=/build.
The API functions epicsGetExecDir() and epicsGetExecName() are also
added to osiFileName.h to provide runtime access to the directory or
filename of the executable with which the process was started.
Decouple LINKER_USE_RPATH and STATIC_BUILD
Previously, setting STATIC_BUILD=NO implied LINKER_USE_RPATH=NO.
This is no longer the case. Setting LINKER_USE_RPATH=YES will
always emit RPATH entries. This was found to be helpful when linking
against some 3rd party libraries which are only available as shared objects.
Channel Access Security: Check Hostname Against DNS
Host names given in a HAG entry of an IOC's Access Security Configuration
File (ACF) have to date been compared against the hostname provided by the CA
client at connection time, which may or may not be the actual name of that
client. This allows rogue clients to pretend to be a different host, and the
IOC would believe them.
An option is now available to cause an IOC to ask its operating system to look
up the IP address of any hostnames listed in its ACF (which will normally be
done using the DNS or the /etc/hosts file). The IOC will then compare the
resulting IP address against the client's actual IP address when checking
access permissions at connection time. This name resolution is performed at
ACF file load time, which has a few consequences:
-
If the DNS is slow when the names are resolved this will delay the process of loading the ACF file.
-
If a host name cannot be resolved the IOC will proceed, but this host name will never be matched.
-
Any changes in the hostname to IP address mapping will not be picked up by the IOC unless and until the ACF file gets reloaded.
Optionally, IP addresses may be added instead of, or in addition to, host names in the ACF file.
This feature can be enabled before iocInit with
var("asCheckClientIP",1)
or with the VxWorks target shell use
asCheckClientIP = 1
New and modified epicsThread APIs
epicsThreadCreateOpt()
A new routine epicsThreadCreateOpt() is an alternative to
epicsThreadCreate() which takes some arguments via a structure (struct epicsThreadOpts) to allow for future extensions.
typedef struct epicsThreadOpts {
unsigned int priority;
unsigned int stackSize;
unsigned int joinable;
} epicsThreadOpts;
#define EPICS_THREAD_OPTS_INIT { \
epicsThreadPriorityLow, epicsThreadStackMedium, 0}
epicsThreadId epicsThreadCreateOpt(const char * name,
EPICSTHREADFUNC funptr, void * parm, const epicsThreadOpts *opts);
The final opts parameter may be NULL to use the default values of thread
priority (low) and stack size (medium). Callers wishing to provide alternative
settings for these thread options or to create a joinable thread (see below)
should create and pass in an epicsThreadOpts structure as shown below.
Always initialize one of these structures using the EPICS_THREAD_OPTS_INIT
macro to ensure that any additional fields that get added in the future are
set to their default values.
void startitup(void) {
epicsThreadOpts opts = EPICS_THREAD_OPTS_INIT;
epicsThreadId tid;
opts.priority = epicsThreadPriorityMedium;
tid = epicsThreadCreateOpt("my thread", &threadMain, NULL, &opts);
}
C or C++ Code that also needs to build on earlier versions of Base can use
#ifdef EPICS_THREAD_OPTS_INIT to determine whether the
epicsThreadCreateOpt() API is available on this Base version.
Thread stack sizes
The stackSize member of the epicsThreadOpts structure and the equivalent
parameters to the epicsThreadCreate() and epicsThreadMustCreate() routines
can now be passed either one of the epicsThreadStackSizeClass enum values or
a value returned from the epicsThreadGetStackSize() routine.
epicsThreadMustJoin()
If the new joinable flag of an epicsThreadOpts structure is non-zero (the
default value is zero), the new API routine epicsThreadMustJoin() must be
called with the thread's epicsThreadId when/after the thread exits, to free
up thread resources. This function will block until the thread's main function
has returned, allowing the parent to wait for its child thread. The child's
epicsThreadId will no longer be valid and should not be used after the
epicsThreadMustJoin() routine returns.
A thread that was originally created with its joinable flag set may itself
call epicsThreadMustJoin(), passing in its own epicsThreadId. This marks the
thread as no longer being joinable, so it will then free the thread resources
itself when its main function returns. The epicsThreadId of a thread that is
not joinable gets invalidated as soon as its main function returns.
Non-VME RTEMS targets now define pdevLibVME
Previously IOC executables that made calls to devLib routines would fail to link when built for some non-VME based RTEMS targets, which would have to be explicitly filtered out by sites that build Base for those targets. This fix makes that no longer necessary, all RTEMS targets should now link although the IOC won't be able to be used with the VME I/O on those systems (that we don't have VMEbus I/O support for in libCom).