Merge 7.0.10 into PSI-7.0

This commit is contained in:
2026-01-06 14:57:16 +01:00
347 changed files with 5707 additions and 2814 deletions

2
.ci

Submodule .ci updated: 0e93b70855...261f218e09

View File

@@ -50,9 +50,9 @@ jobs:
matrix:
# Job names also name artifacts, character limitations apply
include:
- os: ubuntu-24.04
- name: "Ub-24 gcc c++20 Werror"
os: ubuntu-24.04
cmp: gcc
name: "Ub-24 gcc-13 c++20 Werror"
# Turn all warnings into errors,
# except for those we could not fix (yet).
# Remove respective -Wno-error=... flag once it is fixed.
@@ -73,127 +73,141 @@ jobs:
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3'
CMD_LDFLAGS=-Wl,-z,relro"
- os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "windows-x64-mingw"
name: "Ub-22 gcc + MinGW"
- os: ubuntu-22.04
cmp: gcc
configuration: static
cross: "windows-x64-mingw"
name: "Ub-22 gcc + MinGW, static"
- os: ubuntu-22.04
- name: "Ub-22 gcc C++11, static"
os: ubuntu-22.04
cmp: gcc
configuration: static
extra: "CMD_CXXFLAGS=-std=c++11"
name: "Ub-22 gcc C++11, static"
- os: ubuntu-22.04
- name: "Ub-22 gcc u-char"
os: ubuntu-22.04
cmp: gcc
configuration: static
extra: "CMD_CFLAGS=-funsigned-char CMD_CXXFLAGS=-funsigned-char"
name: "Ub-22 gcc unsigned char"
- os: ubuntu-22.04
- name: "Ub-22 clang"
os: ubuntu-22.04
cmp: clang
configuration: default
name: "Ub-22 clang"
- os: ubuntu-22.04
- name: "Ub-22 clang C++11"
os: ubuntu-22.04
cmp: clang
configuration: default
extra: "CMD_CXXFLAGS=-std=c++11"
name: "Ub-22 clang C++11"
- os: ubuntu-22.04
- name: "MacOS clang"
os: macos-latest
cmp: clang
configuration: default
# Cross builds
- name: "Ub gcc + linux-aarch64"
os: ubuntu-latest
cmp: gcc
configuration: default
cross: "linux-aarch64"
- name: "Ub gcc + linux-arm gnueabi"
os: ubuntu-latest
cmp: gcc
configuration: default
cross: "linux-arm@arm-linux-gnueabi"
- name: "Ub gcc + linux-arm gnueabihf"
os: ubuntu-latest
cmp: gcc
configuration: default
cross: "linux-arm@arm-linux-gnueabihf"
- name: "Ub-22 gcc + MinGW"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "windows-x64-mingw"
- name: "Ub-22 gcc + MinGW, static"
os: ubuntu-22.04
cmp: gcc
configuration: static
cross: "windows-x64-mingw"
- name: "Ub-22 gcc + RT-4.9 pc386"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-pc386-qemu@4.9"
- name: "Ub-22 gcc + RT-4.10 pc386"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-pc386-qemu@4.10"
test: NO
- name: "Ub-22 gcc + RT-5.1 pc686"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-pc686-qemu@5"
name: "Ub-22 gcc + RT-5.1 pc686"
- os: ubuntu-22.04
- name: "Ub-22 gcc + RT-5.1 beatnik"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-beatnik@5"
test: NO
name: "Ub-22 gcc + RT-5.1 beatnik"
- os: ubuntu-22.04
- name: "Ub-22 gcc + RT-5.1 xilinx_zynq_a9_qemu"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-xilinx_zynq_a9_qemu@5"
test: NO
name: "Ub-22 gcc + RT-5.1 xilinx_zynq_a9_qemu"
- os: ubuntu-22.04
- name: "Ub-22 gcc + RT-5.1 uC5282"
os: ubuntu-22.04
cmp: gcc
configuration: default
cross: "RTEMS-uC5282@5"
test: NO
name: "Ub-22 gcc + RT-5.1 uC5282"
- os: ubuntu-22.04
cmp: gcc
configuration: default
name: "Ub-22 gcc + RT-4.10"
cross: "RTEMS-pc386-qemu@4.10"
test: NO
# Windows builds
- os: ubuntu-22.04
cmp: gcc
configuration: default
name: "Ub-22 gcc + RT-4.9"
cross: "RTEMS-pc386-qemu@4.9"
- os: macos-latest
cmp: clang
configuration: default
name: "MacOS clang"
- os: windows-2022
- name: "Win-22 MSC-22"
os: windows-2022
cmp: vs2022
configuration: debug
name: "Win-22 MSC-22"
extra: "CMD_CXXFLAGS=-analysis"
extra: "CMD_CXXFLAGS=-analyze"
- os: windows-2022
- name: "Win-22 MSC-22, static"
os: windows-2022
cmp: vs2022
configuration: static-debug
name: "Win-22 MSC-22, static"
extra: "CMD_CXXFLAGS=-analysis"
extra: "CMD_CXXFLAGS=-analyze"
- os: windows-2022
- name: "Win-22 MSC-22, debug"
os: windows-2022
cmp: vs2022
configuration: debug
name: "Win-22 MSC-22, debug"
- os: windows-2022
- name: "Win-22 MSC-22 c++14, debug"
os: windows-2022
cmp: vs2022
configuration: debug
extra: "CMD_CXXFLAGS='-analyze -Zc:__cplusplus -std:c++14'"
- name: "Win-22 MSC-22 c++17, debug"
os: windows-2022
cmp: vs2022
configuration: debug
extra: "CMD_CXXFLAGS='-analyze -Zc:__cplusplus -std:c++17'"
- name: "Win-22 mingw"
os: windows-2022
cmp: gcc
configuration: default
name: "Win-22 mingw"
# Cross builds
- os: ubuntu-latest
cmp: gcc
configuration: default
name: "Cross linux-aarch64"
cross: linux-aarch64
- os: ubuntu-latest
cmp: gcc
configuration: default
name: "Cross linux-arm gnueabi"
cross: linux-arm@arm-linux-gnueabi
- os: ubuntu-latest
cmp: gcc
configuration: default
name: "Cross linux-arm gnueabihf"
cross: linux-arm@arm-linux-gnueabihf
steps:
- uses: actions/checkout@v4

13
.gitignore vendored
View File

@@ -1,3 +1,5 @@
# Before adding patterns here, please read the gitignore
# documentation at https://git-scm.com/docs/gitignore
/cfg/
/bin/
/lib/
@@ -11,14 +13,13 @@
/modules/RELEASE.*.local
/modules/Makefile.local
O.*/
/QtC-*
/.qtc_*
/.vscode/
*.orig
*.log
.*.swp
.DS_Store
.iocsh_history
# Common files generated by other tools
.DS_Store
# Files created by rpmbuild
RPMS
SRPMS
BUILDROOT

10
README
View File

@@ -13,15 +13,7 @@ this distribution.
---------------------------------------------------------
Installation and release information can be found in the
various files in the documentation subdirectory.
Additional information about EPICS including mailing list
archives and subscription instructions, documentation and
training materials, additional components, links to other
websites etc. is available on the EPICS home page at
https://epics.anl.gov/
For more information, see the README.md file.
$Format:%cD$
$Format:%H$
https://code.launchpad.net/epics-base

64
README.md Normal file
View File

@@ -0,0 +1,64 @@
# EPICS Base
EPICS (Experimental Physics and Industrial Control System) is a set of software
tools and applications which provide a software infrastructure for use in
building distributed control systems to operate devices such as Particle
Accelerators, Large Experiments and major Telescopes. EPICS Base is the central
core of the control system toolkit. More details can be found at the
[About page of the official website](https://epics-controls.org/about-epics/)
## Links
- [Official Website](https://epics-controls.org/)
- [Original Website](https://epics.anl.gov/)
- [Repository](https://github.com/epics-base/epics-base)
### Documentation
- [Documentation](https://docs.epics-controls.org/en/latest/)
- [Documentation Repository](https://github.com/epics-docs/epics-docs)
### Community Communication
- [Tech-Talk Mailing List](https://epics.anl.gov/tech-talk/)
- [Matrix Rooms](https://matrix.to/#/#epics:epics-controls.org)
- [News](https://epics-controls.org/news-and-events/)
## Quick Install
Download a release from the
[Downloads page](https://epics-controls.org/resources-and-support/base/downloads)
and unpack it. Inside the unpacked folder run:
```bash
make
```
For more information on how to install on your system see the
[Installation page](https://docs.epics-controls.org/en/latest/getting-started/installation.html)
of the documentation.
### Quick run a softIOC
After building, you can run an example soft-IOC (Input/Output Controller)
which runs a Channel Access server.
```bash
./bin/*/softIoc -x first
```
Run the `dbl` command to list the records it provides:
```bash
epics> dbl
first:BaseVersion
first:exit
epics>
```
## License
EPICS Base is distributed subject to a Software License
Agreement found in the file [LICENSE](./LICENSE) that is included with
this distribution.

View File

@@ -65,7 +65,7 @@ LOADABLE_SHRLIB_LDFLAGS = -shared -fPIC -Wl,-h$@
GNU_LDLIBS_YES = -lgcc
# Use compiler flags to generate header dependancies files
# Use compiler flags to generate header dependencies files
HDEPENDS_METHOD = COMP
HDEPENDS_COMPFLAGS = -MM -MF $@

View File

@@ -24,7 +24,7 @@
# These rules apply to these Makefile-variables:
# USR_CFLAGS C flags
# USR_CXXFLAGS C++ flags
# USR_CPPFLAGS c preprocesser flags
# USR_CPPFLAGS c preprocessor flags
# SRCS source files for building libraries and prods
# USR_SRCS source files for building libraries and prods
# PROD_SRCS source files for building prods

View File

@@ -48,7 +48,7 @@ EPICS_VERSION = 7
EPICS_REVISION = 0
# EPICS_MODIFICATION must be a number >=0 and <256
EPICS_MODIFICATION = 9
EPICS_MODIFICATION = 10
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
# Not included in the official EPICS version number if zero

View File

@@ -1,8 +1,8 @@
# Version number for the Channel Access API and shared library
EPICS_CA_MAJOR_VERSION = 4
EPICS_CA_MINOR_VERSION = 14
EPICS_CA_MAINTENANCE_VERSION = 6
EPICS_CA_MINOR_VERSION = 15
EPICS_CA_MAINTENANCE_VERSION = 1
# Development flag, set to zero for release versions

View File

@@ -147,7 +147,7 @@ CMPLR_SRC_DIRS += . $(foreach dir, .. $(SRC_DIRS), \
ALL_SRC_DIRS = $(CMPLR_SRC_DIRS) $(OS_SRC_DIRS) $(GENERIC_SRC_DIRS)
#--------------------------------------------------
# Directory for OS independant build created files
# Directory for OS independent build created files
COMMON_DIR = ../O.Common
# compile line include directories

View File

@@ -1,7 +1,7 @@
# Version number for the database APIs and shared library
EPICS_DATABASE_MAJOR_VERSION = 3
EPICS_DATABASE_MINOR_VERSION = 24
EPICS_DATABASE_MINOR_VERSION = 25
EPICS_DATABASE_MAINTENANCE_VERSION = 1
# Development flag, set to zero for release versions

View File

@@ -53,3 +53,5 @@ EPICS_IOC_IGNORE_SERVERS=""
# EPICS_IOC_LOG_PORT Log server port number etc.
EPICS_IOC_LOG_PORT=7004
# Posix priority scheduling
EPICS_ALLOW_POSIX_THREAD_PRIORITY_SCHEDULING=YES

View File

@@ -1,7 +1,7 @@
# Version number for the libcom APIs and shared library
EPICS_LIBCOM_MAJOR_VERSION = 3
EPICS_LIBCOM_MINOR_VERSION = 24
EPICS_LIBCOM_MINOR_VERSION = 25
EPICS_LIBCOM_MAINTENANCE_VERSION = 1
# Development flag, set to zero for release versions

View File

@@ -55,7 +55,7 @@ DBD += $(foreach type, $(CROSS_TARGET_OS_TYPES), $(DBD_$(type)))
# DBD_solaris += abcSolaris.dbd
#
# ---------------------------------------------------
# DBD concatination files
# DBD concatenation files
COMMON_DBDCATS += $(addprefix $(COMMON_DIR)/,$(DBDCAT))
DBDCAT_SOURCES += $(foreach file, $($*_DBD), $(DBDCAT_SOURCE) )
@@ -194,7 +194,7 @@ ifneq (,$(strip $(DBDDEPENDS_FILES)))
endif
#---------------------------------------------------------------
# build dependancies, clean rule
# build dependencies, clean rule
inc: $(COMMON_INC) $(INSTALL_INC) $(COMMON_DBDS) $(COMMON_DBDCATS) \
$(INSTALL_DBDS) $(INSTALL_DBD_INSTALLS) $(COMMON_DOCS)

View File

@@ -32,7 +32,7 @@ ifneq ($(RELEASE_CFG_DIR_RULES),)
include $(RELEASE_CFG_DIR_RULES)
endif
# Create EPICS_HOST_ARCH dependancies for GNU make -j option.
# Create EPICS_HOST_ARCH dependencies for GNU make -j option.
# Needed in dirs where EPICS_HOST_ARCH build creates a tool used in
# cross arch builds

View File

@@ -44,7 +44,7 @@ $(foreach dir, $(DIRS), $(dir)$(DIVIDER)install): \
rebuild: $(foreach dir, $(DIRS), $(dir)$(DIVIDER)install)
endif
# Create directory dependancies lines for GNU make -j option
# Create directory dependencies lines for GNU make -j option
# Only works with GNU make 3.81 or later (uses eval function)
define DEP_template1
$(1): $$($(1)_DEPEND_DIRS)

View File

@@ -82,7 +82,7 @@ INC = file.h
# Platform specific files can also be put in
# separate os/OS_CLASS directories!
#
# For almost every file the seach order is:
# For almost every file the search order is:
# ./os/OS_CLASS
# ./os/generic
# .
@@ -136,11 +136,11 @@ PROD_SRCS = ppp.c qqq.c
a_file_SRCS = aa.c bb.c
#
# EPICS libs needed to link PROD, TESTPROD and sharable library
# EPICS libs needed to link PROD, TESTPROD and shareable library
#
# note that DLL_LIBS (the libraries needed to link a shareable
# library) is created by default from the PROD/SYS libraries specified
# below minus the name of the sharable library (LIBRARY)
# below minus the name of the shareable library (LIBRARY)
#
#
# ---------- libraries for a specific product pppp
@@ -169,7 +169,7 @@ USR_LIBS_DEFAULT = foolib
USR_LIBS_WIN32 = -nil-
foolib_DIR = $(FOO_LIB)
# system libs needed to link PROD, TESTPROD and sharable library
# system libs needed to link PROD, TESTPROD and shareable library
#
# ---------- system libraries for all products
# for all systems:

View File

@@ -9,7 +9,7 @@ RTEMS_BSP = beagleboneblack
RTEMS_TARGET_CPU = arm
GNU_TARGET = arm-rtems
OP_SYS_LDLIBS += -Wl,--gc-sections
OP_SYS_LDFLAGS += -Wl,--gc-sections
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/beagleboneblack/lib/
include $(CONFIG)/os/CONFIG.Common.RTEMS

View File

@@ -20,7 +20,6 @@ define MUNCH_CMD
$(RTEMS_TOOLS)/bin/$(OBJCOPY_FOR_TARGET) -O binary -R .comment -S $< $@
endef
OP_SYS_LDLIBS += -Wl,--gc-sections
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/pc686/lib/
include $(CONFIG)/os/CONFIG.Common.RTEMS
@@ -28,7 +27,7 @@ include $(CONFIG)/os/CONFIG.Common.RTEMS
#
# Put text segment where it will work with etherboot
#
OP_SYS_LDFLAGS += -Wl,-Ttext,0x100000
OP_SYS_LDFLAGS += -Wl,-Ttext,0x100000 -Wl,--gc-sections
# This check must appear after the above include

View File

@@ -20,7 +20,7 @@ ARCH_DEP_CFLAGS += -DRTEMS_HAS_ALTIVEC
#ARCH_DEP_CFLAGS += -I$(RTEMS_BASE)/powerpc-rtems5/qoriq_e500/lib/include
#OP_SYS_LDLIBS += -lbspExt #does not use posix stuff ... want to ignore
OP_SYS_LDLIBS += -Wl,--gc-sections
OP_SYS_LDFLAGS += -Wl,--gc-sections
#ARCH_DEP_LDFLAGS = -mcpu=8540 -meabi -msdata=sysv -mstrict-align -mspe -mabi=spe -mfloat-gprs=double
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/$(RTEMS_BSP)/lib

View File

@@ -12,7 +12,7 @@ GNU_TARGET = arm-rtems
#use dhcp/bootp
ARCH_DEP_CFLAGS += -DMY_DO_BOOTP=NULL
OP_SYS_LDLIBS += -Wl,--gc-sections
OP_SYS_LDFLAGS += -Wl,--gc-sections
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/xilinx_zynq_a9_qemu/lib/

View File

@@ -0,0 +1,16 @@
#
# CONFIG.Common.RTEMS-xilinx_zynq_microzed
# Author: Chris Johns <chris@contemporary.software>
#
# All RTEMS targets use the same Makefile fragment
#
#EXE = .elf
RTEMS_BSP = xilinx_zynq_microzed
RTEMS_TARGET_CPU = arm
GNU_TARGET = arm-rtems
OP_SYS_LDLIBS += -Wl,--gc-sections
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/xilinx_zynq_microzed/lib/
include $(CONFIG)/os/CONFIG.Common.RTEMS

View File

@@ -9,7 +9,7 @@ RTEMS_BSP = xilinx_zynq_zedboard
RTEMS_TARGET_CPU = arm
GNU_TARGET = arm-rtems
OP_SYS_LDLIBS += -Wl,--gc-sections
OP_SYS_LDFLAGS += -Wl,--gc-sections
ARCH_DEP_LDFLAGS = -L$(RTEMS_BASE)/$(GNU_TARGET)$(RTEMS_VERSION)/xilinx_zynq_zedboard/lib/

View File

@@ -3,7 +3,7 @@
# Site specific definitions for linux-x86 host - linux-x86 target builds
#-------------------------------------------------------
# Uncomment the followings lines to build with CLANG instead of GCC.
# Uncomment the following lines to build with CLANG instead of GCC.
#
#GNU = NO
#CMPLR_CLASS = clang

View File

@@ -3,7 +3,7 @@
# Site specific definitions for linux-x86_64 host - linux-x86_64 target builds
#-------------------------------------------------------
# Uncomment the followings lines to build with CLANG instead of GCC.
# Uncomment the following lines to build with CLANG instead of GCC.
#
#GNU = NO
#CMPLR_CLASS = clang

View File

@@ -1105,7 +1105,7 @@ HTML_STYLESHEET =
# cascading style sheets that are included after the standard style sheets
# created by doxygen. Using this option one can overrule certain style aspects.
# This is preferred over using HTML_STYLESHEET since it does not replace the
# standard style sheet and is therefor more robust against future updates.
# standard style sheet and is therefore more robust against future updates.
# Doxygen will copy the style sheet files to the output directory.
# Note: The order of the extra stylesheet files is of importance (e.g. the last
# stylesheet in the list overrules the setting of the previous ones in the
@@ -1648,8 +1648,8 @@ EXTRA_PACKAGES =
# Note: Only use a user-defined header if you know what you are doing! The
# following commands have a special meaning inside the header: $title,
# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
# $projectbrief, $projectlogo. Doxygen will replace $title with the empy string,
# for the replacement values of the other commands the user is refered to
# $projectbrief, $projectlogo. Doxygen will replace $title with the empty string,
# for the replacement values of the other commands the user is referred to
# HTML_HEADER.
# This tag requires that the tag GENERATE_LATEX is set to YES.

View File

@@ -21,6 +21,7 @@ RTD_SRC = $(COMMON_DIR)/rtd-src
DOCS += README.md
DOCS += ca-cli.md
DOCS += ReleaseChecklist.md
OLD_NOTES = $(wildcard ../RELEASE-*.md)
DOCS += $(OLD_NOTES:../%=%)

View File

@@ -64,6 +64,7 @@ ca_HEADERS += caerr
ca_HEADERS += caeventmask
ca_HEADERS += db_access
database_HEADERS += callback
database_HEADERS += chfPlugin
database_HEADERS += dbChannel
database_HEADERS += dbCommon

View File

@@ -191,7 +191,7 @@ parameter with one called `EPICS_TZ` and a routine for VxWorks that calculates
the `TIMEZONE` environment variable from the current `TZ` value. This routine
will be run once at start-up, when the EPICS clock has synchronized to its NTP
server. The calculations it contains were worked out and donated to EPICS by
Larry Hoff in 2009; it is unforunate that it has taken 10 years for them to be
Larry Hoff in 2009; it is unfortunate that it has taken 10 years for them to be
integrated into Base.
The default value for the `EPICS_TZ` environment parameter is set in the Base
@@ -521,7 +521,7 @@ 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
unlike the EPICS code) so the IOC fails to start properly. The relevant 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.
@@ -619,7 +619,7 @@ static versions of the compiler support libraries have now been moved into the
The `iocInit` code now performs a sanity check of the current time
returned by the generalTime subsystem and will print a warning if the wall-clock
time returned has not been initialized yet. This is just a warning message; when
a time provider does synchonize the IOC will subsequently pick up and use the
a time provider does synchronize the IOC will subsequently pick up and use the
correct time. This check code also primes the registered event system provider
if there is one so the `epicsTimeGetEventInt()` routine will work on IOCs
that ask for event time within an interrupt service routine.
@@ -642,7 +642,7 @@ change will not cause the IOC to see time going backwards.
### Microsoft Visual Studio builds
The build configuration files for builds using the Microsoft compilers have been
updated, although there should be no noticable difference at most sites. One
updated, although there should be no noticeable difference at most sites. One
extra compiler warning is now being suppressed for C++ code, `C4344: behavior
change: use of explicit template arguments results in ...` which is gratuitous
and was appearing frequently in builds of the EPICS V4 modules.

View File

@@ -661,7 +661,7 @@ the `DB_OPT` build configuration variable.
The compressRecord has a new field `BALG` 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.
ordering is the default, matching the behaviour of previous versions.
### Valgrind Instrumentation

View File

@@ -59,7 +59,7 @@ been split into 4 separate Git repositories. External modules should build
against this new structure with little or no changes needed, except that some
allowance may be needed for the merging of the V4 modules.
There should be rather more description and documantation of these changes
There should be rather more description and documentation of these changes
than is currently available, but as developers we generally much prefer to
write code than documentation. Send questions to the tech-talk mailing list
and we'll be happy to try and answer them!

View File

@@ -0,0 +1,431 @@
# 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; they will
also be manually added to new EPICS Release Notes published in the future.
## EPICS Release 7.0.10
### Reduce symbol and macro pollution from epicsAtomic.h on WIN32
`epicsAtomic.h` no longer pulls in as many unneeded declarations and macros from
`windows.h`. Prior to this change, including `epicsAtomic.h` at the wrong time
could result in unexpected compiler errors. Due to the nature of `windows.h`,
some unneeded declarations are still pulled in, however the number is greatly reduced.
Code that needs these declarations should explicitly include `windows.h` before `epicsAtomic.h`.
### New `afterIocRunning` IOC Shell Command Added
This release incorporates [PR #558](https://github.com/epics-base/epics-base/pull/558) which added a new IOC shell command `afterIocRunning`. This command allows startup scripts to schedule arbitrary commands to be executed automatically after the IOC initialization phase (`iocInit`).
`afterIocRunning` allows you to write better-structured IOC shell files to include in your startup scripts without tracking where `iocInit` is located (and how IOC is deployed) e.g.:
- to achieve the best maintainability (e.g. encapsulation of the context into one file),
- to improve writing boot sequences,
- to improve IOC startup flexibility and scripting capabilities,
- it replaces the community [`afterInit`](https://github.com/paulscherrerinstitute/iocsh_utilities/blob/master/afterInit.c) and [`doAfterIocInit`](https://github.com/epics-modules/std/blob/master/stdApp/src/delayCmd.cpp) IOC shell commands,
- community usage examples:
- [`pf4filters.iocsh`](https://github.com/epics-modules/optics/blob/master/opticsApp/iocsh/pf4filters.iocsh) - enable/disable with a single comment ([full description](https://github.com/epics-base/epics-base/pull/558#issuecomment-2430057167))
- [ALS-U autosave management](https://github.com/epics-base/epics-base/pull/558#issuecomment-2430447220)
#### Features
- Define commands that run after IOC initialization completes.
- Executes following `iocInit` and `autosave` initialization (important for proper PV configuration).
- Supports any valid IOC shell command as an argument.
- Example usages:
- `afterIocRunning "dbpf <PV> <VAL>"`
- `afterIocRunning "date"`
- `afterIocRunning "dbpf $(P)EvtClkSource-Sel 'Upstream (fanout)'"`
- `afterIocRunning "dbpf $(P)Enable-Sel Enabled"`
### fdManager file descriptor limit removed
In order to support file descriptors above 1023, fdManager now uses
`poll()` instead of `select()` on all architectures that support it
(Linux, MacOS, Windows, newer RTEMS).
### New `dbServerStats()` API for iocStats
A new routine provides the ability to request channel and client counts from
named server layers that implement the `stats()` method, or to get a summary
of the counts from all registered server layers. A preprocessor macro
`HAS_DBSERVER_STATS` macro is defined in the `dbServer.h` header file to
simplify code that needs to support older versions of Base as well.
### epicsExport simplifications
`epicsExportAddress()`, `epicsExportRegistrar()` and `epicsRegisterFunction()`
no longer require to be wrapped in `extern "C" { }` in C++ code.
### Support for multiline strings in iocsh files
GitHub [PR #603](https://github.com/epics-base/epics-base/pull/603)
This update introduces support for multiline strings in IOC shell (iocsh) files.
Previously, string values in iocsh files were limited to a single line, making
it difficult to include longer or formatted text. With this change, users can
now define strings that span multiple lines, improving readability and
flexibility when configuring IOC shell scripts.
To create a multiline string, end a line with a backslash (`\`). The following
line, including any leading whitespace, will be joined to the previous line.
If the backslash is immediately followed by any character other than a newline,
it will not be treated as a multiline continuation.
### Enhancement to IOC `dbgrep` command
`dbgrep` now takes an optional second string argument consisting of a list of field names
separated by spaces, e.g. `dbgrep "*PRESSURE*", "VAL DESC"`
### ACF Syntax Forward Compatibility
This release modifies the Access Security Configuration File (ACF) parser to
**standardize the ACF grammar for forward compatibility**.
It does not change the syntax that was accepted by earlier versions of the parser,
so **existing access security configuration files will not need to be modified.**
All ACF definitions will adhere to a consistent syntax format,
which will allow future additions to the access security language
without breaking existing configurations.
In practice, this means the structure of ACF files is now formally defined
and will remain stable going forward,
so any new grammar features will fit into the same pattern.
(Existing ACF files continue to work as-is under the new parser,
so no changes are required for legacy configurations or tools.).
**Generic ACF Syntax:**
The ACF file consists of definitions for User Access Groups (UAG),
Host Access Groups (HAG),
and Access Security Groups (ASG),
using the following general format
(angle brackets below denote placeholders):
```text
UAG(<name>) [{ <user> [, <user> ...] }]
...
HAG(<name>) [{ <host> [, <host> ...] }]
...
ASG(<name>) [{
[INP<index>(<pvname>)
...]
RULE(<level>, NONE | READ | WRITE [, NOTRAPWRITE | TRAPWRITE]) {
[UAG(<name> [, <name> ...])]
[HAG(<name> [, <name> ...])]
[CALC(<calculation>)]
}
...
}]
...
```
Under this schema each definition comprises a keyword,
a name in parentheses,
and (optionally) a braced block of contents.
This uniform structure ensures that
**future keywords or sections**
can be introduced in the same form,
maintaining compatibility with the parser.
For example, if a new type of condition or group is added in a later release,
it would follow the `KEYWORD(name) { ... }` pattern,
so 7.0.10-era parsers can handle or ignore it gracefully
instead of failing on unknown syntax.
**Supported Syntax in EPICS 7.0.10:**
The current release defines the following specific elements
within the above generic format:
- **UAG** -- *User Access Group*.
Defines a group of user names.
- **HAG** -- *Host Access Group*.
Defines a group of host names
(or IP addresses) that clients can connect from.
- **ASG** -- *Access Security Group*.
Defines a security group which records can be assigned to.
An ASG entry may contain a block with input definitions and access rules.
For example:
```text
ASG(MyGroup) {
INPA(myPV1)
INPB(myPV2)
RULE(1, WRITE) { ... }
RULE(1, READ) { ... }
}
```
If no rules are defined for an ASG,
the access permissions default to always allowed.
- **INP<index>(<pvname>)** -- *Input link*.
Declares an input process variable whose value can be used in a CALC condition.
- **RULE(<level>, <permission> [, <logOption>]) { ... }** --
Defines an access rule for the ASG.
Inside the curly braces of a RULE,
**optional conditions** can restrict when that rule applies.
All conditions that are present must be satisfied
(they function as a logical AND):
- **UAG(<name>, ...)** -- User-group condition.
The rule only applies if the Channel Access client's user
is a member of one of the listed UAGs.
- **HAG(<name>, ...)** -- Host-group condition.
The rule only applies if the client's host
(as determined by its IP or hostname) is in one of the listed HAGs
- **CALC("<expression>")** -- Calculation condition.
The rule only applies if the given expression evaluates to true (non-zero).
**Special Semantics for RULEs:**
Rules will continue to allow the prescribed access if and only if
all the predicates the rule contains are satisfied.
- If the rule contains predicates that are unknown to the parser
(indicating future functionality),
then the rule will NOT not match,
but no syntax error will be reported as long as the syntax is correct.
- If the rule contains predicates that the parser does not recognise
which are malformed (e.g. missing parentheses),
then the rule will not match and the parser will report a syntax error.
- In this way rules can be extended with new predicates
without breaking older clients or giving those older clients elevated privileges.
**Special Semantics for unrecognised ACF file elements:**
Any elements that are included in an ACF file will be ignored silently
by a parser that does not understand them.
- If an element is seen in an ACF file that is not understood by the parser,
the parser will simply ignore it silently,
without reporting an error,
as long as its syntax is correct.
- If elements are added to the ACF file that are malformed
(e.g. missing parentheses),
the parser will report a syntax error.
- Thus new elements can be added to ACF files in new EPICS releases
without breaking older clients that loads those files.
In summary, **ACF forward compatibility**
means that from EPICS 7.0.10 onward,
any new access security features will use this established syntax.
The parser will recognize new group types or rule options using the same
`<KEYWORD>(...) { ... }` convention,
ensuring they can be used in files loaded by IOCs running EPICS 7.0.10 or later
without breaking those IOCs or requiring their parser to be modified.
This change **does not require any modifications to existing ACF files
or downstream tools** -- all legacy syntax remains valid,
and the new standardized grammar provides a robust foundation for future extensions.
A full EBNF grammar for the new syntax can be found in the
[IOC Access Security](ACF-Language.md) document added to this release.
### Add `dbglob` to replace `dbgrep`
A new IOC shell command, `dbglob` has been added, with `dbgrep` becoming
an alias of this new function, with the intent of deprecating it in a
future release.
### Conflict-free release note entries for GitHub pull requests
GitHub [PR #628](https://github.com/epics-base/epics-base/pull/628)
This release replaces the developer-edited `documentation/RELEASE_NOTES.md`
source file in the EPICS tree with a process which generates that file from a
series of individual files added for each changeset in the release, thus
preventing merge conflicts when entries are added by many different pull
requests.
For this new approach each pull request must add its own Markdown file to the
`documentation/new-notes` directory, using a unique filename.
When a release is made, all these files will be combined into a single
`RELEASE-<version>.md` file and the `new-notes` directory emptied to prepare
for development of the next release.
Developers can generate the `RELEASE_NOTES.md` file by running `make` in the
`documentation` directory, which will install the result in the `doc` top-level
directory along with the `RELEASE-<version>.md` files describing older EPICS
releases going back to 3.15.
The `documentation/Makefile` provides some other targets which can also be
requested, but they require additional non-EPICS software such as Doxygen and
Sphinx to have been installed first.
Between releases the generated `RELEASE_NOTES.md` file contains the text from
any `new-notes` files added to document changes already merged.
It also provides links to the older `RELEASE-<version>.md` files, so it remains
the starting point for documentation on all release changes.
Detailed instructions on creating new entries are provided in a `README.txt`
file in the `documentation/new-notes` directory.
The release-time process that generates a new `RELEASE-<version>.md` file is
described in the developers' [Release Checklist](ReleaseChecklist.md).
### Add support for `EPICS_DB_INCLUDE_PATH` to `dbLoadTemplate`
GitHub [PR #636](https://github.com/epics-base/epics-base/pull/636)
Allow finding the substitution file through a path in `EPICS_DB_INCLUDE_PATH` or
an additional parameter to the iocsh `dbLoadTemplate` command.
### Expand the use of colour in the IOCs output
This release includes various changes to iocsh.cpp and elsewhere to add and
expand the use of color:
- When loading a startup script, the IOC Shell now displays comment lines in
blue, and uses bold to make command lines stand out from other text.
- The `softIoc -v` output also uses the above color scheme for the commands it
prints.
- The default IOC Shell prompt is now displayed in green; this color can be
modified in the `configure/CONFIG_SITE_ENV` file for all targets, or set for
a specific target by adding a `configure/os/CONFIG_SITE_ENV.<arch>` file.
The value of the `IOCSH_PS1` environment parameter in those files can use the
`ANSI_ENV_*` and `ANSI_*()` color macros found in errlog.h to configure the
appearance of the prompt. The C string literal concatenation syntax can be
used to construct the prompt string:
```Makefile
IOCSH_PS1 = ANSI_ESC_RED "e" ANSI_ESC_YELLOW "p" ANSI_ESC_GREEN "i" \
ANSI_ESC_CYAN "c" ANSI_BLUE("s") "> "
```
- More error messages printed by IOC Shell commands now appear in red, or use
the red `ERROR` prefix that was introduced in previous releases.
- The word "Illegal" has been replaced with "Invalid" in several Shell error
messages.
- The iocsh `var` command now shows the data type of the registered variables
as well as their values.
### Documentation Updates
The reference documentation for the [event](eventRecord.md) record type
has been updated to cover the use of named events which were added in Base
3.14.12.3 and 3.15.1.
Documentation for CALC expression evaluation has been updated for format
enhancements and to add some missing operators.
The best documentation for these expressions can be found in the
[postfix.h](postfix_h.md) header in libCom, but both the
[calc](calcRecord.md) and [calcout](calcoutRecord.md) record reference
pages also cover the infix expressions supported.
### Records calc, calcout and sub extended
The record types calc, calcout and sub have been extended from 12 inputs
A - L to 21 inputs A - U.
The macro `CALCPERFORM_NARGS` reflects this change.
The new inputs can be used in calc links and access security as well.
The size of CALC and OCAL fields has been doubled to 160 chars.
### Allow hex and octal strings in dbPut and dbGet
It is now possible to convert hex and octal strings to integer fields
with `dbPut()`, `dbGet()` and related functions like the iocsh command
`dbpf` or through database links.
Possible incompatibility: Up to now, leading `0`s have been ignored,
now they switch to octal mode.
For backward compatibility, this behavior can be switched off, returning
to the old decimal only conversions, by setting the environment variable
`EPICS_DB_CONVERT_DECIMAL_ONLY` to `YES` (case insensitive) before `iocInit`.
### `dfanout` improvements
The [dfanout](dfanoutRecord.md) record now has invalid output handling with the usual fields
`IVOA` and `IVOV` just like many other output record types.
The number of output links has also been increased from 8 to 16.
### CA Client Library Enhancement
GitHub [PR #711](https://github.com/epics-base/epics-base/pull/711)
* Allow CA clients to determine a server's protocol version.
Adds a call to the CA client API that allows a client to determine the
server's protocol minor version number.
This is needed to allow the ca-nameserver to report a server's protocol
version correctly to a client.
* `ca_host_minor_protocol()` return for disconnected channels
`ca_host_minor_protocol()` now explicitly returns `CA_UKN_MINOR_VERSION`
for a disconnected channel.
### Add environment variable to opt out of POSIX Real-Time scheduling
On POSIX systems, processes with real-time capabilities can opt out of using
Posix thread priority scheduling and memory locking.
Set `EPICS_ALLOW_POSIX_THREAD_PRIORITY_SCHEDULING=NO` to achieve this.
### Avoid early expiration of timers on non-RTOS IOCs
Previously the epicsTimer code rounded down user requested delays
by subtracting one half of the sleep "quantum".
On RTEMS and vxWorks,
this allowed periodic timers which expired on every tick.
However this also resulted in timers expiring slightly
[earlier than requested](https://github.com/epics-base/epics-base/issues/106).
With [PR 744](https://github.com/epics-base/epics-base/pull/744)
rounding is only done for RTEMS and vxWorks, which still have tick timers.
This affects several facilities which use epicsTimer,
including record delays.
For example, `calcout.ODLY` becomes more
[accurate](https://github.com/epics-base/epics-base/issues/106#issuecomment-1260232765)
on non-RTOS IOCs.
### normativeTypes Module
Changes to this module since the previous release:
#### Release 6.0.2
- Fix potential NULL pointer dereference in `NTNDArray::getValueSize()`
### pvAccess Module
Changes to this module since the previous release:
#### Release 7.1.8
- Compatible changes
- Capped the number and age of PVA beacons to avoid a resource leak. Beacons
older than 360 seconds will be destroyed automatically, new beacons will be
ignored if >=2048 exist already.
- Various Clang, MSVC and GCC compiler warnings cleaned up.
### pvData Module
Changes to this module since the previous release:
#### Release 8.0.7
- Compatible changes
- Allow epics::pvData::Timer to be cancelled during callback execution.
- Clang compiler warnings cleaned up.
- Limit periodic timers to one catch-up after missing many events.
### pvaClient Module
Changes to this module since the previous release:
## Release 4.8.1
* Fix error message generation code.

View File

@@ -56,7 +56,7 @@ A suggested form for IOC shell commands is:
### Relocatable Builds
Allows built trees to be copied or moved without invalidating RPATH entires.
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

View File

@@ -147,7 +147,7 @@ This also fixes [lauchpad bug #1714455](https://bugs.launchpad.net/bugs/1714455)
declared in epicsString.h no longer accept octal escaped characters such as
`\123` or `\41`.
- The routine `epicsStrnEscapedFromRaw()` now generates hex
excaped characters for unprintable characters such as `\x1f`.
escaped characters for unprintable characters such as `\x1f`.
- Hex escape character sequences `\xXX` must now contain exactly 2 hex digits.
- An escape sequence `\0` now generates a zero byte in the raw string, but the
other digits `1-9` should not appear after a back-slash.

View File

@@ -117,7 +117,7 @@ with the TCP port number selected.
DBD files generated by the `dbdExpand.pl` script are now sorted within each
item type by the primary name of the item. The result should resolve any
issues with reproducable builds. No option is provided to prevent the sorting,
issues with reproducible builds. No option is provided to prevent the sorting,
previously the order was essentially random and varied each time.
### `dbExpand.pl` sorts records by name

View File

@@ -35,7 +35,7 @@ record(bi, "bit1") {
### ANSI escapes in stderr
ANSI escape charactor sequences may now be printed to the stderr stream.
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.
@@ -227,7 +227,7 @@ The pvDatabase module was updated to version 4.7.1:
`_[distributor=group:<group id>;set:<set_id>;trigger:<field_name>;updates:<n_updates>;mode:<update_mode>]`
The plugin parameters are optional and are described bellow:
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

View File

@@ -25,7 +25,7 @@ although it doesn't currently cover the new processes added to epics-base.
Much of the documentation generated from .dbd.pod files at build time is now
also being converted into MarkDown (.md) files and installed into the top-level
`doc` directory. Some users might find it quicker to look up information about a
record type by opening these files in a text editor intead of opening a browser
record type by opening these files in a text editor instead of opening a browser
and loading the HTML versions or finding and opening the files from the EPICS
Documentation site.
@@ -97,7 +97,7 @@ record("#", "unwanted") {}
### Only keep readline history for interactive sessions
Previously, all IOCsh commands were persisited in the libreadline history
Previously, all IOCsh commands were persisted in the libreadline history
(when readline support is included).
Going forward, only interactive commands are saved.
@@ -111,7 +111,7 @@ already be conditionally casting to/from the appropriate type.
### Fix issues with `_FORTIFY_SOURCE=3`
This release fixes the false positives failures whhen building with `_FORTIFY_SOURCE` level 3.
This release fixes the false positives failures when building with `_FORTIFY_SOURCE` level 3.
The override introduced in 7.0.8.1 has been removed.
### Other

View File

@@ -1,492 +0,0 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>EPICS Release Procedures &amp; Checklist</title>
<style type="text/css" media="print">
<!--
body {
font: 10.5pt/12pt Arial, Helvetica, sans-serif;
}
table {
border-collapse: collapse;
border: thin solid black;
}
tt {
font: 9pt/11pt "Courier New", fixed;
}
td,th {
padding: 2pt 4pt;
vertical-align: top
}
td blockquote {
page-break-inside: avoid;
margin-right: 0;
}
-->
</style>
</head>
<body>
<h1>EPICS Base Release Procedures &amp; Checklist</h1>
<p>This document describes the procedures and provides a checklist of tasks
that should be performed when creating production releases of EPICS Base.</p>
<h3>The Release Process</h3>
<p>We used to have one written down here, but we weren't following it very
closely so now the decision to make a new release is taken during the Core
Developers bi-weekly meetings in an informal manner. The steps detailed below
were written to remind Andrew (or anyone else who does the release) about
everything that has to be done since it's so easy to miss steps.</p>
<h3>Roles</h3>
<p>The following roles are used below:</p>
<dl>
<dt><strong>Release Manager</strong></dt>
<dd>Responsible for managing and tagging the release</dd>
<dt><strong>Core Developers</strong></dt>
<dd>Responsible for maintaining the EPICS software</dd>
<dt><strong>Website Editors</strong></dt>
<dd>Responsible for the EPICS websites</dd>
</dl>
<form>
<table border="1" width="100%">
<tbody>
<tr>
<th>Check</th>
<th>Who</th>
<th>Description</th>
</tr>
<tr>
<th colspan="3">Preparing for a release</th>
</tr>
<tr>
<td>&nbsp;</td>
<td>Release Manager</td>
<td>Notify core developers about the upcoming release and ask about any
remaining tasks that must be finished.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>All developers</td>
<td>Check the bug tracker for any outstanding items and handle
appropriately.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Release Manager</td>
<td>Set a Feature Freeze date, by which time all Git branches for
enhancements and new functionality should have been merged. After this
date, commits and merges should only be made to fix problems that show
up during testing.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Release Manager<br>
&amp; all developers</td>
<td>Request that documentation be updated and information about new
features be added before the release date:
<ul>
<li>Release Notes</li>
<li>Doxygen annotations</li>
<li>Other documents on
<a href="https://docs.epics-controls.org/en/latest/">
docs.epics-controls.org</a></li>
</ul>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Release Manager</td>
<td>Review and update this checklist for the upcoming release.
Update the release version number in the tags and messages below.</td>
</tr>
<tr>
<th colspan="3">Testing</th>
</tr>
<tr>
<td>&nbsp;</td>
<td>Platform Developers</td>
<td>Run the internal test programs on all appropriate platforms.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Platform Developers</td>
<td>Check that all makeBaseApp templates build and run properly, all
<i>xxxApp</i> and <i>xxxBoot</i> types and any internal options, e.g.
setting <tt>STATIC_BUILD=YES</tt> or using a different
<tt>INSTALL_LOCATION</tt> in configure/CONFIG_SITE.</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Release Manager</td>
<td>Check that documentation has been updated:
<ul>
<li>Release Notes</li>
<li>Doxygen annotations</li>
<li>Other documents on
<a href="https://docs.epics-controls.org/en/latest/">
docs.epics-controls.org</a></li>
</ul>
</td>
</tr>
<tr>
<th colspan="3" id="ReleaseApproval">
Release Approval</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Core Developers</td>
<td>Reach a consensus that the software is ready to release.</td>
</tr>
<tr>
<th colspan="3">Creating the final release version</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>
<h4>For each external submodule to be tagged</h4>
<ol>
<li><tt>cd base-7.0/modules/&lt;module&gt;; git grep UNRELEASED</tt>
and insert the submodule's version number into any doxygen
annotations that have a <tt>@since&nbsp;UNRELEASED</tt> comment.
Commit (don't push yet).</li>
<li>Check that the submodule's Release Notes have been updated to
cover all changes; add missing items as necessary, and set the
module version number and release date if appropriate.<br>
Commit the changes to the submodule's Notes file (don't push).</li>
<li>Copy the new submodule version number and Release Notes entries
into a new file named <tt><i>module</i>-<i>release</i></tt> in the
<tt>base-7.0/documentation/new-notes</tt> directory.</li>
<li>Edit the module's release version file
<tt>configure/CONFIG_<i>module</i>_VERSION</tt> and the
<tt>Doxyfile</tt>s in the top-level and/or documentation
directories. In these, set <tt>DEVELOPMENT_FLAG=0</tt> and remove
<tt>-dev</tt> from the <tt>PROJECT_NUMBER</tt> string. Commit these
changes (don't push):
<blockquote><tt>
git commit -m 'Final commit for &lt;submodule-version&gt;'
</tt></blockquote>
</li>
<li>Tag the submodule:
<blockquote><tt>
git tag -m 'ANJ: Tag for EPICS 7.0.9.1' &lt;submodule-version&gt;
</tt></blockquote>
</li>
<li>Generate documentation for modules with <tt>release_notes.dox</tt>
files. Prepare to update the github-pages website as follows:
<blockquote><tt>
cd base-7.0/modules/&lt;module&gt;/documentation<br>
make commit<br>
git push --force upstream gh-pages
</tt></blockquote>
<i>Q: Delay this <tt>git push</tt> until later?</i></li>
<li>Update the Git submodule on the Base-7.0 branch to the
newly-tagged version, check the module's status matches the tag:
<blockquote><tt>
cd base-7.0/modules<br>
git add &lt;module&gt;<br>
git submodule status --cached
</tt></blockquote>
Don't commit the submodule updates yet.
</li>
<li>Edit the module's release version file
<tt>configure/CONFIG_<i>module</i>_VERSION</tt> and its top-level
<tt>Doxyfile</tt>; increment the <tt>MAINTENANCE_VERSION</tt>, set
the <tt>DEVELOPMENT_FLAG</tt> value to 1, and update the
<tt>PROJECT_NUMBER</tt> string, appending <tt>-dev</tt> to the new
module version number. Commit changes.</li>
<li>Push commits and the new tag to the submodule's GitHub repository
(assumed to be the <tt>upstream</tt> remote):
<blockquote><tt>
cd base-7.0/modules/&lt;module&gt;<br>
git push --follow-tags upstream master
</tt></blockquote>
</li>
</ol></td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>
<h4>After all submodules have been updated:</h4>
<ol>
<li> Commit the submodule updates which were added for each submodule
in step 7 above to the 7.0 branch (don't push):
<blockquote><tt>
cd base-7.0/modules<br>
git commit -m "Update git submodules for release"
</tt></blockquote></li>
<li>Make sure that the output from
<tt>git submodule status --cached</tt> only shows the appropriate
version tags in the right-most parenthesized column with no
<tt>-<i>n</i>-g<i>xxxxxxx</i></tt> suffix.</li>
<li>Add and commit the new Release Note entry files that were created
for each submodule in step 3 above (don't push):
<blockquote><tt>
cd base-7.0/documentation<br>
git add new-notes<br>
git commit -m "Add submodule release note entries"
</tt></blockquote></li>
</ol>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>
<h4>In the main epics-base repository</h4>
<ol>
<li><tt>cd base-7.0; git grep UNRELEASED</tt> and insert the release
version to any doxygen annotations that have a
<tt>@since&nbsp;UNRELEASED</tt> comment. Commit (don't push).</li>
<li>Edit the main EPICS Base version file and the built-in module
version files:
<ul>
<li><tt>configure/CONFIG_BASE_VERSION</tt></li>
<li><tt>configure/CONFIG_LIBCOM_VERSION</tt></li>
<li><tt>configure/CONFIG_CA_VERSION</tt></li>
<li><tt>configure/CONFIG_DATABASE_VERSION</tt></li>
</ul>
</li>
<li>Version numbers should be set according to the level of changes
made since the last release. Note that the
<tt>MAINTENANCE_VERSION</tt> or <tt>PATCH_LEVEL</tt> value will have
been incremented immediately after the previous release tag was
applied, so don't double-increment them. Set all
<tt>DEVELOPMENT_FLAG</tt> values to 0 and set the
<tt>EPICS_DEV_SNAPSHOT</tt> to an empty string (no quotes).</li>
<li>Commit the above changes (don't push):
<blockquote><tt>
cd base-7.0<br>
git add configure/CONFIG_*_VERSION<br>
git commit -m "Set core version numbers for release"
</tt></blockquote></li>
<li><p>When <tt>EPICS_DEV_SNAPSHOT</tt> is empty because a release is
being created, the <tt>documentation/Makefile</tt> supports a build
target <tt>release</tt> for creating a new release notes file
<tt>documentation/RELEASE-<i>version</i>.md</tt> from the Markdown
files in the <tt>documentation/new-notes</tt> directory. When run,
it copies the notes entries from all the <tt>new-notes/*.md</tt>
files, then deletes the files and prepares a Git commit to apply
those changes permanently to the repository.</p>
<p>Run these commands to generate the <tt>RELEASE-7.0.9.1.md</tt>
file and remove the individual release note entry files:</p>
<blockquote><tt>
cd base-7.0/documentation<br>
make
</tt></blockquote></li>
<li>The <tt>make release</tt> command add some changes into the Git
index but didn't commit them. These commands let you check what
was done and commit the result (don't push yet!):
<blockquote><tt>
git status<br>
git diff --staged<br>
git commit -m "Generate RELEASE-7.0.9.1.md notes file"
</tt></blockquote>
To undo those Git actions and confirm that happened, run these:
<blockquote><tt>
make unrelease<br>
git status
</tt></blockquote></li>
</ol>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Tag the epics-base module in Git:
<blockquote><tt>
cd base-7.0<br>
git tag -m 'ANJ: Tagged for release' R7.0.9.1
</tt></blockquote>
<p>Don't push to GitHub yet.</p>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td><h4>After tagging the release</h4>
Edit the main EPICS Base version file and the built-in module version
files:
<ul>
<li><tt>configure/CONFIG_BASE_VERSION</tt></li>
<li><tt>configure/CONFIG_LIBCOM_VERSION</tt></li>
<li><tt>configure/CONFIG_CA_VERSION</tt></li>
<li><tt>configure/CONFIG_DATABASE_VERSION</tt></li>
</ul>
<p>Version numbers should be set for the next expected patch/maintenance
release by incrementing the MAINTENANCE_VERSION or PATCH_LEVEL value
in each file. Set all <tt>DEVELOPMENT_FLAG</tt> values to 1 and
<tt>EPICS_DEV_SNAPSHOT</tt> to "-DEV".</p>
<p>Set up the headings in the Release Notes for the next release
version number and restore the warning about this being an unreleased
version of EPICS.</p>
<p>Commit these changes (don't push).</p>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Export the tagged version into a tarfile. The <tt>make-tar.sh</tt>
script generates a gzipped tarfile directly from the tag, excluding the
files and directories that are only used for continuous integration:
<blockquote><tt>
cd base-7.0<br>
./.tools/make-tar.sh R7.0.9.1 ../base-7.0.9.1.tar.gz base-7.0.9.1/
</tt></blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote><tt>
cd ..<br>
gpg --armor --sign --detach-sig base-7.0.9.1.tar.gz
</tt></blockquote>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Test the tar file by extracting its contents and building it on at
least one supported platform. If this succeeds the commits and new git
tag can be pushed to the GitHub repository's 7.0 branch (assumed to be
the <tt>upstream</tt> remote):
<blockquote><tt>
git push --follow-tags upstream 7.0
</tt></blockquote>
</td>
</tr>
<tr>
<th colspan="3">Publish to epics.anl.gov</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Copy the tarfile and its signature to the Base download area of the
website.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Add the new release tar file to the website Base download index
page.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Create or update the website subdirectory that holds the release
documentation, and copy in the files to be published with this
release version.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Update the webpage for the new release with links to the release
documents and tar file.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Link to the release webpage from other relevent areas of the
website - update front page and sidebars.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Add an entry to the website News page, linking to the new version
webpage.</td>
</tr>
<tr>
<th colspan="3">Publish to epics-controls.org</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td>Upload the tar file and its <tt>.asc</tt> signature file to the
epics-controls web-server.
<blockquote><tt>
scp base-7.0.9.1.tar.gz base-7.0.9.1.tar.gz.asc epics-controls:download/base<br>
</tt></blockquote>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Editor</td>
<td><p>Follow instructions on
<a href="https://epics-controls.org/resources-and-support/documents/epics-website-documentation/adding-a-page-for-a-new-release/">
Add a page for a new release</a> to create a new release webpage (not
required for a patch release, just edit the existing page). Update the
TablePress "Point Releases" table and add the new download, and adjust
the Html Snippet for the series download.</p>
<p>Not covered in those instructions: Go to Posts, find a previous
release and use "Duplicate Post", then edit the result and publish it.
This generates the News item.
</p></td>
</tr>
<tr>
<th colspan="3">Publish to GitHub</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Go to the GitHub
<a href="https://github.com/epics-base/epics-base/releases/new?tag=R7.0.9.1">
Create release from tag R7.0.9.1</a> page.
Upload the tar file and its <tt>.asc</tt> signature file to the new
GitHub release page, or just drag-n-drop them into the page.
Copy/paste the text from the previous release and edit. Submit.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>We used to close out bug reports in Launchpad at release-time, this
would be the time to do that if we have an equivalent on GitHub.</td>
</tr>
<tr>
<th colspan="3">Make Announcement</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Announce the release on the tech-talk mailing list.</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>

View File

@@ -0,0 +1,390 @@
# EPICS Base Release Procedures & Checklist
This document describes the procedures and provides a checklist of tasks
that should be performed when creating production releases of EPICS
Base.
## The Release Process
The decision to make a new release is taken during the
Core Developers bi-weekly meetings in an informal manner. The steps
detailed below were written to remind Andrew (or whoever does
the release) exactly what has to be done, since it's so easy to
miss steps.
### Roles
The following roles are used below:
**Release Manager**
Responsible for managing and tagging the release
**Core Developers**
Responsible for maintaining the EPICS software
**Website Editors**
Responsible for the EPICS websites
<table data-border="1" width="100%">
<colgroup>
<col style="width: 20%" />
<col style="width: 80%" />
</colgroup>
<tbody>
<tr>
<th>Who</th>
<th>Description</th>
</tr>
<tr>
<th colspan="3">Preparing for a release</th>
</tr>
<tr>
<td>Release Manager</td>
<td>Notify core developers about the upcoming release and ask about any
remaining tasks that must be finished.</td>
</tr>
<tr>
<td>All developers</td>
<td>Check the bug tracker for any outstanding items and handle
appropriately.</td>
</tr>
<tr>
<td>Release Manager</td>
<td>Set a Feature Freeze date, by which time all Git branches for
enhancements and new functionality should have been merged. After this
date, commits and merges should only be made to fix problems that show
up during testing.</td>
</tr>
<tr>
<td>Release Manager<br />
&amp; all developers</td>
<td>Request that documentation be updated and information about new
features be added before the release date:
<ul>
<li>Release Notes</li>
<li>Doxygen annotations</li>
<li>Other documents on
<a href="https://docs.epics-controls.org/en/latest/">
docs.epics-controls.org</a></li>
</ul></td>
</tr>
<tr>
<td>Release Manager</td>
<td>Review and update this checklist for the upcoming release. Update
the release version number in the tags and messages below.</td>
</tr>
<tr>
<td colspan="2">Testing</td>
</tr>
<tr>
<td>Platform Developers</td>
<td>Run the internal test programs on all appropriate platforms.</td>
</tr>
<tr>
<td>Platform Developers</td>
<td>Check that all makeBaseApp templates build and run properly, all
<em>xxxApp</em> and <em>xxxBoot</em> types and any internal options,
e.g. setting <code>STATIC_BUILD=YES</code> or using a different
<code>INSTALL_LOCATION</code> in configure/CONFIG_SITE.</td>
</tr>
<tr>
<td>Release Manager</td>
<td>Check that documentation has been updated:
<ul>
<li>Release Notes</li>
<li>Doxygen annotations</li>
<li>Other documents on
<a href="https://docs.epics-controls.org/en/latest/">
docs.epics-controls.org</a></li>
</ul></td>
</tr>
<tr>
<td colspan="2" id="ReleaseApproval">Release Approval</td>
</tr>
<tr>
<td>Core Developers</td>
<td>Reach a consensus that the software is ready to release.</td>
</tr>
<tr>
<td colspan="2">Creating the final release version</td>
</tr>
<tr>
<td>Release Manager</td>
<td><h4 id="for-each-external-submodule-to-be-tagged">For each external
submodule to be tagged</h4>
<ol>
<li><code>cd base-7.0/modules/&lt;module&gt;; git grep UNRELEASED</code>
and insert the submodule's version number into any doxygen annotations
that have a <code>@since&nbsp;UNRELEASED</code> comment. Commit (don't push
yet).</li>
<li>Check that the submodule's Release Notes have been updated to cover
all changes; add missing items as necessary, and set the module version
number and release date if appropriate.<br />
Commit the changes to the submodule's Notes file (don't push).</li>
<li>Copy the new submodule version number and Release Notes entries into
a new file named
<em><code>module</code></em><code>-</code><em><code>release</code></em>
in the <code>base-7.0/documentation/new-notes</code> directory.</li>
<li><p>Edit the module's release version file
<code>configure/CONFIG_</code><em><code>module</code></em><code>_VERSION</code>
and the <code>Doxyfile</code>s in the top-level and/or documentation
directories. In these, set <code>DEVELOPMENT_FLAG=0</code> and remove
<code>-dev</code> from the <code>PROJECT_NUMBER</code> string. Commit
these changes (don't push):</p>
<blockquote>
<code> git commit -m 'Final commit for &lt;submodule-version&gt;' </code>
</blockquote></li>
<li><p>Tag the submodule:</p>
<blockquote>
<code> git tag -m 'ANJ: Tag for EPICS 7.0.10' &lt;submodule-version&gt; </code>
</blockquote></li>
<li><p>Generate documentation for modules with
<code>release_notes.dox</code> files. Prepare to update the github-pages
website as follows:</p>
<blockquote>
<code> cd base-7.0/modules/&lt;module&gt;/documentation</code><br />
<code>make commit</code><br />
<code>git push --force upstream gh-pages </code>
</blockquote>
<p><em>Q: Delay this <code>git push</code> until later?</em></p></li>
<li><p>Update the Git submodule on the Base-7.0 branch to the
newly-tagged version, check the module's status matches the tag:</p>
<blockquote>
<code> cd base-7.0/modules</code><br />
<code>git add &lt;module&gt;</code><br />
<code>git submodule status --cached </code>
</blockquote>
<p>Don't commit the submodule updates yet.</p></li>
<li>Edit the module's release version file
<code>configure/CONFIG_</code><em><code>module</code></em><code>_VERSION</code>
and its top-level <code>Doxyfile</code>; increment the
<code>MAINTENANCE_VERSION</code>, set the <code>DEVELOPMENT_FLAG</code>
value to 1, and update the <code>PROJECT_NUMBER</code> string, appending
<code>-dev</code> to the new module version number. Commit changes.</li>
<li><p>Push commits and the new tag to the submodule's GitHub repository
(assumed to be the <code>upstream</code> remote):</p>
<blockquote>
<code> cd base-7.0/modules/&lt;module&gt;</code><br />
<code>git push --follow-tags upstream master </code>
</blockquote></li>
</ol></td>
</tr>
<tr>
<td>Release Manager</td>
<td><h4 id="after-all-submodules-have-been-updated">After all submodules
have been updated:</h4>
<ol>
<li><p>Commit the submodule updates which were added for each submodule
in step 7 above to the 7.0 branch (don't push):</p>
<blockquote>
<code> cd base-7.0/modules</code><br />
<code>git commit -m "Update git submodules for release" </code>
</blockquote></li>
<li>Make sure that the output from
<code>git submodule status --cached</code> only shows the appropriate
version tags in the right-most parenthesized column with no
<code>-</code><em><code>n</code></em><code>-g</code><em><code>xxxxxxx</code></em>
suffix.</li>
<li><p>Add and commit the new Release Note entry files that were created
for each submodule in step 3 above (don't push):</p>
<blockquote>
<code> cd base-7.0/documentation</code><br />
<code>git add new-notes</code><br />
<code>git commit -m "Add submodule release note entries" </code>
</blockquote></li>
</ol></td>
</tr>
<tr>
<td>Release Manager</td>
<td><h4 id="in-the-main-epics-base-repository">In the main epics-base
repository</h4>
<ol>
<li><code>cd base-7.0; git grep UNRELEASED</code> and insert the release
version to any doxygen annotations that have a
<code>@since&nbsp;UNRELEASED</code> comment. Commit (don't push).</li>
<li>Edit the main EPICS Base version file and the built-in module
version files:
<ul>
<li><code>configure/CONFIG_BASE_VERSION</code></li>
<li><code>configure/CONFIG_LIBCOM_VERSION</code></li>
<li><code>configure/CONFIG_CA_VERSION</code></li>
<li><code>configure/CONFIG_DATABASE_VERSION</code></li>
</ul></li>
<li>Version numbers should be set according to the level of changes made
since the last release. Note that the <code>MAINTENANCE_VERSION</code>
or <code>PATCH_LEVEL</code> value will have been incremented immediately
after the previous release tag was applied, so don't double-increment
them. Set all <code>DEVELOPMENT_FLAG</code> values to 0 and set the
<code>EPICS_DEV_SNAPSHOT</code> to an empty string (no quotes).</li>
<li><p>Commit the above changes (don't push):</p>
<blockquote>
<code> cd base-7.0</code><br />
<code>git add configure/CONFIG_*_VERSION</code><br />
<code>git commit -m "Set core version numbers for release" </code>
</blockquote></li>
<li><p>When <code>EPICS_DEV_SNAPSHOT</code> is empty because a release
is being created, the <code>documentation/Makefile</code> supports a
build target <code>release</code> for creating a new release notes file
<code>documentation/RELEASE-</code><em><code>version</code></em><code>.md</code>
from the Markdown files in the <code>documentation/new-notes</code>
directory. When run, it copies the notes entries from all the
<code>new-notes/*.md</code> files, then deletes the files and prepares a
Git commit to apply those changes permanently to the repository.</p>
<p>Run these commands to generate the <code>RELEASE-7.0.10.md</code>
file and remove the individual release note entry files:</p>
<blockquote>
<code> cd base-7.0/documentation</code><br />
<code>make release</code>
</blockquote></li>
<li><p>The <code>make release</code> command add some changes into the
Git index but didn't commit them. These commands let you check what was
done and commit the result (don't push yet!):</p>
<blockquote>
<code> git status</code><br />
<code>git diff --staged</code><br />
<code>git commit -m "Generate RELEASE-7.0.10.md notes file" </code>
</blockquote>
<p>To undo those Git actions and confirm that happened, run these:</p>
<blockquote>
<code> make unrelease</code><br />
<code>git status </code>
</blockquote></li>
</ol></td>
</tr>
<tr>
<td>Release Manager</td>
<td>Tag the epics-base module in Git:
<blockquote>
<code> cd base-7.0</code><br />
<code>git tag -m 'ANJ: Tagged for release' R7.0.10 </code>
</blockquote>
<p>Don't push to GitHub yet.</p></td>
</tr>
<tr>
<td>Release Manager</td>
<td><h4 id="after-tagging-the-release">After tagging the release</h4>
Edit the main EPICS Base version file and the built-in module version
files:
<ul>
<li><code>configure/CONFIG_BASE_VERSION</code></li>
<li><code>configure/CONFIG_LIBCOM_VERSION</code></li>
<li><code>configure/CONFIG_CA_VERSION</code></li>
<li><code>configure/CONFIG_DATABASE_VERSION</code></li>
</ul>
<p>Version numbers should be set for the next expected patch/maintenance
release by incrementing the MAINTENANCE_VERSION or PATCH_LEVEL value in
each file. Set all <code>DEVELOPMENT_FLAG</code> values to 1 and
<code>EPICS_DEV_SNAPSHOT</code> to "-DEV".</p>
<p>Commit these changes (don't push).</p></td>
</tr>
<tr>
<td>Release Manager</td>
<td>Export the tagged version into a tarfile. The
<code>make-tar.sh</code> script generates a gzipped tarfile directly
from the tag, excluding the files and directories that are only used for
continuous integration:
<blockquote>
<code> cd base-7.0</code><br />
<code>./.tools/make-tar.sh R7.0.10 ../base-7.0.10.tar.gz base-7.0.10/ </code>
</blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote>
<code> cd ..</code><br />
<code>gpg --armor --sign --detach-sig base-7.0.10.tar.gz </code>
</blockquote></td>
</tr>
<tr>
<td>Release Manager</td>
<td>Test the tar file by extracting its contents and building it on at
least one supported platform. If this succeeds the commits and new git
tag can be pushed to the GitHub repository's 7.0 branch (assumed to be
the <code>upstream</code> remote):
<blockquote>
<code> git push --follow-tags upstream 7.0 </code>
</blockquote></td>
</tr>
<tr>
<td colspan="2">Publish to epics.anl.gov</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Copy the tarfile and its signature to the Base download area of the
website.</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Add the new release tar file to the website Base download index
page.</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Create or update the website subdirectory that holds the release
documentation, and copy in the files to be published with this release
version.</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Update the webpage for the new release with links to the release
documents and tar file.</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Link to the release webpage from other relevant areas of the website
- update front page and sidebars.</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Add an entry to the website News page, linking to the new version
webpage.</td>
</tr>
<tr>
<td colspan="2">Publish to epics-controls.org</td>
</tr>
<tr>
<td>Website Editor</td>
<td>Upload the tar file and its <code>.asc</code> signature file to the
epics-controls web-server.
<blockquote>
<code> scp base-7.0.10.tar.gz base-7.0.10.tar.gz.asc epics-controls:download/base</code><br />
</blockquote></td>
</tr>
<tr>
<td>Website Editor</td>
<td><p>Follow instructions on
<a href="https://epics-controls.org/resources-and-support/documents/epics-website-documentation/adding-a-page-for-a-new-release/">
Add a page for a new release</a>
to create a new release webpage (not
required for a patch release, just edit the existing page). Update the
TablePress "Point Releases" table and add the new download, and adjust
the Html Snippet for the series download.</p>
<p>Not covered in those instructions: Go to Posts, find a previous
release and use "Duplicate Post", then edit the result and publish it.
This generates the News item.</p></td>
</tr>
<tr>
<td colspan="2">Publish to GitHub</td>
</tr>
<tr>
<td>Release Manager</td>
<td>Go to the GitHub
<a href="https://github.com/epics-base/epics-base/releases/new?tag=R7.0.10">
Create
release from tag R7.0.10</a> page. Upload the tar file and its
<code>.asc</code> signature file to the new GitHub release page, or just
drag-n-drop them into the page. Copy/paste the text from the previous
release and edit. Submit.</td>
</tr>
<tr>
<td>Release Manager</td>
<td>We used to close out bug reports in Launchpad at release-time, this
would be the time to do that if we have an equivalent on GitHub.</td>
</tr>
<tr>
<td colspan="2">Make Announcement</td>
</tr>
<tr>
<td>Release Manager</td>
<td>Announce the release on the tech-talk mailing list.</td>
</tr>
</tbody>
</table>

View File

@@ -13,6 +13,7 @@ EPICS Base Documentation
README
RELEASE_NOTES
ACF-Language
.. toctree::
:maxdepth: 2

View File

@@ -1,7 +0,0 @@
### Reduce symbol and macro pollution from epicsAtomic.h on WIN32
`epicsAtomic.h` no longer pulls in as many unneeded declarations and macros from
`windows.h`. Prior to this change, including `epicsAtomic.h` at the wrong time
could result in unexpected compiler errors. Due to the nature of `windows.h`,
some unneeded declarations are still pulled in, however the number is greatly reduced.
Code that needs these declarations should explicitly include `windows.h` before `epicsAtomic.h`.

View File

@@ -1,23 +0,0 @@
### New `afterIocRunning` IOC Shell Command Added
This release incorporates [PR #558](https://github.com/epics-base/epics-base/pull/558) which added a new IOC shell command `afterIocRunning`. This command allows startup scripts to schedule arbitrary commands to be executed automatically after the IOC initialization phase (`iocInit`).
`afterIocRunning` allows you to write better-structured IOC shell files to include in your startup scripts without tracking where `iocInit` is located (and how IOC is deployed) e.g.:
- to achieve the best maintainability (e.g. encapsulation of the context into one file),
- to improve writing boot sequences,
- to improve IOC startup flexibility and scripting capabilities,
- it replaces the community [`afterInit`](https://github.com/paulscherrerinstitute/iocsh_utilities/blob/master/afterInit.c) and [`doAfterIocInit`](https://github.com/epics-modules/std/blob/master/stdApp/src/delayCmd.cpp) IOC shell commands,
- community usage examples:
- [`pf4filters.iocsh`](https://github.com/epics-modules/optics/blob/master/opticsApp/iocsh/pf4filters.iocsh) - enable/disable with a single comment ([full description](https://github.com/epics-base/epics-base/pull/558#issuecomment-2430057167))
- [ALS-U autosave managment](https://github.com/epics-base/epics-base/pull/558#issuecomment-2430447220)
#### Features
- Define commands that run after IOC initialization completes.
- Executes following `iocInit` and `autosave` initialization (important for proper PV configuration).
- Supports any valid IOC shell command as an argument.
- Example usages:
- `afterIocRunning "dbpf <PV> <VAL>"`
- `afterIocRunning "date"`
- `afterIocRunning "dbpf $(P)EvtClkSource-Sel 'Upstream (fanout)'"`
- `afterIocRunning "dbpf $(P)Enable-Sel Enabled"`

View File

@@ -1,5 +0,0 @@
### fdManager file descriptor limit removed
In order to support file descriptors above 1023, fdManager now uses
`poll()` instead of `select()` on all architectures that support it
(Linux, MacOS, Windows, newer RTEMS).

View File

@@ -1,7 +0,0 @@
### New `dbServerStats()` API for iocStats
A new routine provides the ability to request channel and client counts from
named server layers that implement the `stats()` method, or to get a summary
of the counts from all registered server layers. A preprocessor macro
`HAS_DBSERVER_STATS` macro is defined in the `dbServer.h` header file to
simplify code that needs to support older versions of Base as well.

View File

@@ -1,4 +0,0 @@
### epicsExport simplifications
`epicsExportAddress()`, `epicsExportRegistrar()` and `epicsRegisterFunction()`
no longer require to be wrapped in `extern "C" { }` in C++ code.

View File

@@ -1,14 +0,0 @@
### Support for multiline strings in iocsh files
GitHub [PR #603](https://github.com/epics-base/epics-base/pull/603)
This update introduces support for multiline strings in IOC shell (iocsh) files.
Previously, string values in iocsh files were limited to a single line, making
it difficult to include longer or formatted text. With this change, users can
now define strings that span multiple lines, improving readability and
flexibility when configuring IOC shell scripts.
To create a multiline string, end a line with a backslash (`\`). The following
line, including any leading whitespace, will be joined to the previous line.
If the backslash is immediately followed by any character other than a newline,
it will not be treated as a multiline continuation.

View File

@@ -1,4 +0,0 @@
### Enhancement to IOC `dbgrep` command
`dbgrep` now takes an optional second string argument consisting of a list of field names
separated by spaces, e.g. `dbgrep "*PRESSURE*", "VAL DESC"`

View File

@@ -1,5 +0,0 @@
*** Add `dbglob` to replace `dbgrep`
A new IOC shell command, `dbglob` has been added, with `dbgrep` becoming
an alias of this new function, with the intent of deprecating it in a
future release.

View File

@@ -1,33 +0,0 @@
### Conflict-free release note entries for GitHub pull requests
GitHub [PR #628](https://github.com/epics-base/epics-base/pull/628)
This release replaces the developer-edited `documentation/RELEASE_NOTES.md`
source file in the EPICS tree with a process which generates that file from a
series of individual files added for each changeset in the release, thus
preventing merge conflicts when entries are added by many different pull
requests.
For this new approach each pull request must add its own Markdown file to the
`documentation/new-notes` directory, using a unique filename.
When a release is made, all these files will be combined into a single
`RELEASE-<version>.md` file and the `new-notes` directory emptied to prepare
for development of the next release.
Developers can generate the `RELEASE_NOTES.md` file by running `make` in the
`documentation` directory, which will install the result in the `doc` top-level
directory along with the `RELEASE-<version>.md` files describing older EPICS
releases going back to 3.15.
The `documentation/Makefile` provides some other targets which can also be
requested, but they require additional non-EPICS software such as Doxygen and
Sphinx to have been installed first.
Between releases the generated `RELEASE_NOTES.md` file contains the text from
any `new-notes` files added to document changes already merged.
It also provides links to the older `RELEASE-<version>.md` files, so it remains
the starting point for documentation on all release changes.
Detailed instructions on creating new entries are provided in a `README.txt`
file in the `documentation/new-notes` directory.
The release-time process that generates a new `RELEASE-<version>.md` file is
described in the `documentation/ReleaseChecklist.html` file.

View File

@@ -1,6 +0,0 @@
### Add support for EPICS_DB_INCLUDE_PATH to dbLoadTemplate
GitHub [PR #636](https://github.com/epics-base/epics-base/pull/636)
Allow finding the substitution file using path in `EPICS_DB_INCLUDE_PATH` or
an additional parameter to `dbLoadTemplate`.

View File

@@ -1,32 +0,0 @@
### Expand the use of colour in the IOCs output
This release includes various changes to iocsh.cpp and elsewhere to add and
expand the use of color:
- When loading a startup script, the IOC Shell now displays comment lines in
blue, and uses bold to make command lines stand out from other text.
- The `softIoc -v` output also uses the above color scheme for the commands it
prints.
- The default IOC Shell prompt is now displayed in green; this color can be
modified in the `configure/CONFIG_SITE_ENV` file for all targets, or set for
a specific target by adding a `configure/os/CONFIG_SITE_ENV.<arch>` file.
The value of the `IOCSH_PS1` environment paremeter in those files can use the
`ANSI_ENV_*` and `ANSI_*()` color macros found in errlog.h to configure the
appearance of the prompt. The C string literal concatenation syntax can be
used to construct the prompt string:
```Makefile
IOCSH_PS1 = ANSI_ESC_RED "e" ANSI_ESC_YELLOW "p" ANSI_ESC_GREEN "i" \
ANSI_ESC_CYAN "c" ANSI_BLUE("s") "> "
```
- More error messages printed by IOC Shell commands now appear in red, or use
the red `ERROR` prefix that was introduced in previous releases.
- The word "Illegal" has been replaced with "Invalid" in several Shell error
messages.
- The iocsh `var` command now shows the data type of the registered variables
as well as their values.

View File

@@ -34,7 +34,7 @@ where nnn is the number of the pull request. If you haven't created the pull
request yet you can use the number from a related GitHub issue, or use some
other name, then rename and push it after the PR has been created.
The file should start with a level-3 Markdown title for the entry, like this:
The file *must* start with a level-3 Markdown title for the entry, like this:
### Conflict-free release note entries for GitHub pull requests
@@ -46,6 +46,9 @@ The file should start with a level-3 Markdown title for the entry, like this:
(followed by a blank line to separate it from the next paragraph), or a
link to the PR may be integrated into the text that follows.
* Use blank lines between paragraphs of text, and code-blocks for examples.
* I recommend using [semantic line-breaks](https://sembr.org/) in Markdown
files, it makes editing easier and reduces the number of lines that change
in most commits. This README.txt file isn't formatted as Markdown.
Release note entries are not intended to provide full documentation of major
features. For small features or changes though, they may provide all the

View File

@@ -103,7 +103,7 @@ in the file LICENSE that is included with this distribution.</span></p>
<ul>
<li><a href="#Broadcast">Client and Server Broadcast Addresses Don't
Match</a></li>
<li><a href="#Client">Client Isnt Configured to Use the Server's
<li><a href="#Client">Client Isn't Configured to Use the Server's
Port</a></li>
<li><a href="#Unicast">Unicast Addresses in the EPICS_CA_ADDR_LIST Does
not Reliably Contact Servers Sharing the Same UDP Port on the Same
@@ -759,7 +759,7 @@ to respect the EPICS_CA_MAX_ARRAY_BYTES setting as described below instead.</p>
<p>Starting with version R3.14 the environment variable
EPICS_CA_MAX_ARRAY_BYTES determines the size of the largest array that may pass
through CA. Prior to this version only arrays smaller than 16k bytes could be
transfered. The CA libraries maintains a free list of 16384 byte network
transferred. The CA libraries maintains a free list of 16384 byte network
buffers that are used for ordinary communication. If EPICS_CA_MAX_ARRAY_BYTES
is larger than 16384 then a second free list of larger data buffers is
established and used only after a client send its first large array request.</p>
@@ -1085,7 +1085,7 @@ to standard out.</p>
<p>If a value is specified it is written to the PV. Next, the current value of
the PV is converted to each of the many external data type that can be
specified at the CA client library interface, and each of these is formated and
specified at the CA client library interface, and each of these is formatted and
then output to the console.</p>
<hr>
@@ -1631,7 +1631,7 @@ stdout.</p>
<p>The -s option allows to specify an interest level for calling Channel
Access' internal report function <code>ca_client_status()</code>, that prints lots of
internal informations on stdout, including environment settings, used CA ports
internal information on stdout, including environment settings, used CA ports
etc.</p>
<table border="1">
@@ -1969,7 +1969,7 @@ that the request is sent call <code>ca_flush_io()</code> followed by
<h3><a name="Problems">ENOBUFS Messages</a></h3>
<p>Many Berkley UNIX derived Internet Protocol (IP) kernels use a memory
<p>Many Berkeley UNIX derived Internet Protocol (IP) kernels use a memory
management scheme with a fixed sized low level memory allocation quantum called
an "mbuf". Messages about "ENOBUFS" are an indication that your IP kernel is
running low on mbuf buffers. An IP kernel mbuf starvation situation may lead to

View File

@@ -65,7 +65,7 @@ const char * ca_message_text []
"Sorry, that feature is planned but not supported at this time",
"The supplied string is unusually large",
"The request was ignored because the specified channel is disconnected",
"The data type specifed is invalid",
"The data type specified is invalid",
"Remote Channel not found",
"Unable to locate all user specified channels",
@@ -94,7 +94,7 @@ const char * ca_message_text []
"The supplied string is empty",
"Unable to spawn the CA repeater thread- auto reconnect will fail",
"No channel id match for search reply- search reply ignored",
"Reseting dead connection- will try to reconnect",
"Resetting dead connection- will try to reconnect",
"Server (IOC) has fallen behind or is not responding- still waiting",
"No internet interface with broadcast available",
@@ -196,7 +196,7 @@ int epicsStdCall ca_context_create (
return ECA_ALLOCMEM;
}
epicsThreadPrivateSet ( caClientContextId, (void *) pcac );
epicsThreadPrivateSet ( caClientContextId, pcac );
}
catch ( ... ) {
return ECA_ALLOCMEM;
@@ -381,11 +381,11 @@ int epicsStdCall ca_clear_channel ( chid pChan )
}
else {
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( cac.cbMutex );
@@ -717,6 +717,18 @@ int epicsStdCall ca_context_status ( ca_client_context * pcac, unsigned level )
return ECA_NORMAL;
}
extern "C"
LIBCA_API
void dbCaSyncLocal(void);
void dbCaSyncLocal(void)
{
if(struct ca_client_context * ctxt = ca_current_context()) {
// bounce for access to private data member
ctxt->sync();
}
}
/*
* ca_current_context ()
*

View File

@@ -844,7 +844,7 @@ void verifyBlockInPendIO ( chid chan, unsigned interestLevel )
}
}
else if ( resp != -100 ) {
printf ( "CA didnt block for get to return?\n" );
printf ( "CA didn't block for get to return?\n" );
}
req = 1;
@@ -1739,7 +1739,7 @@ void arrayEventExceptionNotify ( struct event_handler_args args )
if ( args.status == ECA_NORMAL ) {
printf (
"arrayEventExceptionNotify: expected "
"exception but didnt receive one against \"%s\" \n",
"exception but didn't receive one against \"%s\" \n",
ca_name ( args.chid ) );
}
else {
@@ -3233,7 +3233,7 @@ void verifyDisconnect (
/*
* if its a local channel and will never disconnect
* then skip the portions of this test that cant be
* then skip the portions of this test that can't be
* completed.
*/
if ( ca_get_ioc_connection_count () == 0 ) {
@@ -3307,7 +3307,7 @@ void verifyContextRundownFlush ( const char * pName, unsigned interestLevel )
status = ca_create_channel ( pName, 0, 0, 0, & chan );
/*
* currently in-memory channels cant be used with this test
* currently in-memory channels can't be used with this test
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
*/
if ( status != ECA_UNAVAILINSERV ) {
@@ -3335,7 +3335,7 @@ void verifyContextRundownFlush ( const char * pName, unsigned interestLevel )
status = ca_create_channel ( pName, 0, 0, 0, & chan );
SEVCHK ( status, NULL );
/*
* currently in-memory channels cant be used with this test
* currently in-memory channels can't be used with this test
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
*/
if ( status != ECA_UNAVAILINSERV ) {
@@ -3379,7 +3379,7 @@ void verifyContextRundownChanStillExist (
for ( i = 0; i < NELEMENTS ( chan ); i++ ) {
status = ca_create_channel ( pName, 0, 0, 0, & chan[i] );
/*
* currently in-memory channels cant be used with this test
* currently in-memory channels can't be used with this test
* !!!! FIX ME, FIX ME, FIX ME, FIX ME !!!!
*/
if ( status == ECA_UNAVAILINSERV ) {

View File

@@ -192,7 +192,7 @@ bool bhe::updatePeriod (
this->beaconAnomalyNotify ( guard );
/*
* this is the 2nd beacon seen. We cant tell about
* this is the 2nd beacon seen. We can't tell about
* the change in period at this point so we just
* initialize the average period and return.
*/

View File

@@ -49,7 +49,7 @@
/*
* These port numbers are only used if the CA repeater and
* CA server port numbers cant be obtained from the EPICS
* CA server port numbers can't be obtained from the EPICS
* environment variables "EPICS_CA_REPEATER_PORT" and
* "EPICS_CA_SERVER_PORT"
*/

View File

@@ -117,7 +117,7 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
// the local port number below
{
osiSockAddr addr;
memset ( (char *)&addr, 0 , sizeof ( addr ) );
memset ( &addr, 0 , sizeof ( addr ) );
addr.ia.sin_family = AF_INET;
addr.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
addr.ia.sin_port = htons ( PORT_ANY );
@@ -728,6 +728,12 @@ epicsMutex & ca_client_context::mutexRef () const
return this->mutex;
}
void ca_client_context::sync()
{
// bounce through vtable
this->pServiceContext->sync();
}
cacContext & ca_client_context::createNetworkContext (
epicsMutex & mutexIn, epicsMutex & cbMutexIn )
{
@@ -775,11 +781,11 @@ LIBCA_API int epicsStdCall ca_clear_subscription ( evid pMon )
}
else {
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( cac.cbMutex );

View File

@@ -7,4 +7,4 @@
If a value is specified it is written to the PV. Next, the current value
of the PV is converted to each of the many external data type that can
be specified at the CA client library interface, and each of these is
formated and then output to the console.
formatted and then output to the console.

View File

@@ -398,6 +398,8 @@ void cac::flush ( epicsGuard < epicsMutex > & guard )
}
}
void cac::sync() {}
unsigned cac::circuitCount (
epicsGuard < epicsMutex > & guard ) const
{

View File

@@ -115,6 +115,7 @@ public:
// IO management
void flush ( epicsGuard < epicsMutex > & guard );
void sync ();
bool executeResponse ( callbackManager &, tcpiiu &,
const epicsTime & currentTime, caHdrLargeArray &, char *pMsgBody );
@@ -203,6 +204,7 @@ public:
void destroyIIU ( tcpiiu & iiu );
const char * pLocalHostName ();
const resTable < tcpiiu, caServerID > & getServerTable();
private:
epicsSingleton < localHostName > :: reference _refLocalHostName;
@@ -424,4 +426,10 @@ inline double cac ::
return this->connTMO;
}
inline const resTable < tcpiiu, caServerID > & cac ::
getServerTable()
{
return this->serverTable;
}
#endif // ifndef INC_cac_H

View File

@@ -129,6 +129,13 @@ unsigned cacChannel::getHostName (
return 0u;
}
unsigned cacChannel::getHostMinorProtocol (
epicsGuard < epicsMutex > &) const throw ()
{
epicsThreadOnce ( & cacChannelIdOnce, cacChannelSetup, 0);
return 0u;
}
// the default is to assume that it is a locally hosted channel
const char * cacChannel::pHostName (
epicsGuard < epicsMutex > & ) const throw ()

View File

@@ -246,7 +246,8 @@ public:
// !! deprecated, avoid use !!
virtual const char * pHostName (
epicsGuard < epicsMutex > & guard ) const throw ();
virtual unsigned getHostMinorProtocol (
epicsGuard < epicsMutex > &) const throw () ;
// exceptions
class badString {};
class badType {};
@@ -278,6 +279,7 @@ public:
cacChannel::priLev = cacChannel::priorityDefault ) = 0;
virtual void flush (
epicsGuard < epicsMutex > & ) = 0;
virtual void sync () = 0;
virtual unsigned circuitCount (
epicsGuard < epicsMutex > & ) const = 0;
virtual void selfTest (

View File

@@ -1460,6 +1460,17 @@ LIBCA_API const char * epicsStdCall ca_host_name (chid channel);
LIBCA_API unsigned epicsStdCall ca_get_host_name ( chid pChan,
char *pBuf, unsigned bufLength );
/** \brief Return the minor protocol version number used by the host to
* which a channel is currently connected.
*
* \param[in] pChan channel identifier
* \returns The minor protocol version number.
* If the channel is disconnected CA_UKN_MINOR_VERSION is returned.
*/
LIBCA_API unsigned epicsStdCall ca_host_minor_protocol (chid pChan);
#define HAS_CA_HOST_MINOR_PROTOCOL
/** \brief Call their function with their argument whenever
* a new fd is added or removed.
*

View File

@@ -108,7 +108,7 @@
#define ECA_STRTOBIG DEFMSG(CA_K_WARNING, 12) /* defunct */
/// The request was ignored because the specified channel is disconnected
#define ECA_DISCONNCHID DEFMSG(CA_K_ERROR, 13) /* defunct */
/// The data type specifed is invalid
/// The data type specified is invalid
#define ECA_BADTYPE DEFMSG(CA_K_ERROR, 14)
/// Remote Channel not found
#define ECA_CHIDNOTFND DEFMSG(CA_K_INFO, 15) /* defunct */
@@ -146,7 +146,7 @@
#define ECA_NEWADDR DEFMSG(CA_K_WARNING, 31) /* defunct */
/// New or resumed network connection
#define ECA_NEWCONN DEFMSG(CA_K_INFO, 32) /* defunct */
/// Specified task isnt a member of a CA context
/// Specified task isn't a member of a CA context
#define ECA_NOCACTX DEFMSG(CA_K_WARNING, 33) /* defunct */
/// Attempt to use defunct CA feature failed
#define ECA_DEFUNCT DEFMSG(CA_K_FATAL, 34) /* defunct */
@@ -156,7 +156,7 @@
#define ECA_NOREPEATER DEFMSG(CA_K_WARNING, 36) /* defunct */
/// No channel id match for search reply- search reply ignored
#define ECA_NOCHANMSG DEFMSG(CA_K_WARNING, 37) /* defunct */
/// Reseting dead connection- will try to reconnect
/// Resetting dead connection- will try to reconnect
#define ECA_DLCKREST DEFMSG(CA_K_WARNING, 38) /* defunct */
/// Server (IOC) has fallen behind or is not responding- still waiting
#define ECA_SERVBEHIND DEFMSG(CA_K_WARNING, 39) /* defunct */

View File

@@ -115,7 +115,7 @@ int main ( int argc, char ** argv )
return -1;
}
memset ( (char *) &addr, 0 , sizeof (addr) );
memset ( &addr, 0 , sizeof (addr) );
addr.ia.sin_family = AF_INET;
addr.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
addr.ia.sin_port = htons ( 0 ); // any port

View File

@@ -24,14 +24,14 @@
//
// Requirements:
// 1) Allow sufficent headroom so that users will be able to perform
// 1) Allow sufficient headroom so that users will be able to perform
// a reasonable amount of IO within CA callbacks without experiencing
// a push/pull deadlock. If a potential push/pull deadlock situation
// occurs then detect and avoid it and provide diagnostic to the user
// via special status.
// 2) Return status to the user when there is insufficient memory to
// queue a complete message.
// 3) return status to the user when a message cant be flushed because
// 3) return status to the user when a message can't be flushed because
// a connection dropped.
// 4) Do not allocate too much memory in exception situations (such as
// after a circuit disconnect).

View File

@@ -17,7 +17,7 @@
*
* 1) All routines in this file have an encode argument which
* determines if we are converting from the standard format to
* the local format or vise versa. To date only float and double data
* the local format or vice versa. To date only float and double data
* types must be converted differently depending on the encode
* argument - joh
*
@@ -517,7 +517,7 @@ arrayElementCount num /* number of values */
if (num == 1)
pDest->value = pSrc->value;
else {
memcpy((char *)&pDest->value, (char *)&pSrc->value, num);
memcpy(&pDest->value, &pSrc->value, num);
}
}
@@ -584,7 +584,7 @@ arrayElementCount num /* number of values */
pDest->severity = dbr_ntohs(pSrc->severity);
pDest->no_str = dbr_ntohs(pSrc->no_str);
if ( s != d ) {
memcpy((void *)pDest->strs,(void *)pSrc->strs,sizeof(pSrc->strs));
memcpy(pDest->strs, pSrc->strs, sizeof(pSrc->strs));
}
if (num == 1) /* single value */
@@ -845,7 +845,7 @@ arrayElementCount num /* number of values */
if (num == 1)
pDest->value = pSrc->value;
else {
memcpy((void *)&pDest->value, (void *)&pSrc->value, num);
memcpy(&pDest->value, &pSrc->value, num);
}
}
@@ -1004,7 +1004,7 @@ arrayElementCount num /* number of values */
pDest->severity = dbr_ntohs(pSrc->severity);
pDest->no_str = dbr_ntohs(pSrc->no_str);
if ( s != d ) {
memcpy((void *)pDest->strs,(void *)pSrc->strs,sizeof(pSrc->strs));
memcpy(pDest->strs, pSrc->strs, sizeof(pSrc->strs));
}
if (num == 1) /* single value */
@@ -1049,7 +1049,7 @@ arrayElementCount num /* number of values */
pDest->value = pSrc->value;
else /* array chan-- multiple pts */
{
memcpy((void *)&pDest->value, (void *)&pSrc->value, num);
memcpy(&pDest->value, &pSrc->value, num);
}
}
@@ -1268,7 +1268,7 @@ arrayElementCount num /* number of values */
pDest->value = pSrc->value;
else /* array chan-- multiple pts */
{
memcpy((void *)&pDest->value, (void *)&pSrc->value, num);
memcpy(&pDest->value, &pSrc->value, num);
}
}
/****************************************************************************

View File

@@ -154,7 +154,7 @@ void nciu::connect ( unsigned nativeType,
// the callback lock is also taken when a channel
// disconnects to prevent a race condition with the
// code below - ie we hold the callback lock here
// so a channel cant be destroyed out from under us.
// so a channel can't be destroyed out from under us.
this->notify().connectNotify ( guard );
}
@@ -410,6 +410,13 @@ const char * nciu::pHostName (
return this->piiu->pHostName ( guard );
}
unsigned nciu::getHostMinorProtocol (
epicsGuard < epicsMutex > & guard) const throw ()
{
return this->piiu->getHostMinorProtocol (
guard );
}
bool nciu::ca_v42_ok (
epicsGuard < epicsMutex > & guard ) const
{
@@ -618,7 +625,7 @@ unsigned channelNode::getSearchTimerIndex (
}
else {
throw std::runtime_error (
"channel was expected to be in a search timer, but wasnt" );;
"channel was expected to be in a search timer, but wasn't" );;
}
return index;
}

View File

@@ -183,6 +183,8 @@ public:
unsigned getHostName (
epicsGuard < epicsMutex > &,
char * pBuf, unsigned bufLen ) const throw ();
unsigned getHostMinorProtocol (
epicsGuard < epicsMutex > &) const throw ();
void writeException (
epicsGuard < epicsMutex > &, epicsGuard < epicsMutex > &,
int status, const char *pContext, unsigned type, arrayElementCount count );

View File

@@ -116,6 +116,12 @@ const char * netiiu::pHostName (
return pHostNameNetIIU;
}
unsigned netiiu::getHostMinorProtocol (
epicsGuard < epicsMutex > & ) const throw ()
{
return CA_UKN_MINOR_VERSION;
}
osiSockAddr netiiu::getNetworkAddress (
epicsGuard < epicsMutex > & ) const
{
@@ -161,7 +167,7 @@ void netiiu::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &, const epicsTime & )
{
throw std::runtime_error (
"search response occured when not attached to udpiiu?" );
"search response occurred when not attached to udpiiu?" );
}
bool netiiu::searchMsg (

View File

@@ -43,6 +43,8 @@ public:
unsigned bufLength ) const throw () = 0;
virtual const char * pHostName (
epicsGuard < epicsMutex > & ) const throw () = 0;
virtual unsigned getHostMinorProtocol (
epicsGuard < epicsMutex > & ) const throw ();
virtual bool ca_v41_ok (
epicsGuard < epicsMutex > & ) const = 0;
virtual bool ca_v42_ok (

View File

@@ -64,6 +64,8 @@ public:
chid pChan, char * pBuf, unsigned bufLength );
friend const char * epicsStdCall ca_host_name (
chid pChan );
friend unsigned epicsStdCall ca_host_minor_protocol (
chid pChan );
friend const char * epicsStdCall ca_name (
chid pChan );
friend void epicsStdCall ca_set_puser (
@@ -347,6 +349,7 @@ public:
void destroyPutCallback ( epicsGuard < epicsMutex > &, putCallback & );
void destroySubscription ( epicsGuard < epicsMutex > &, oldSubscription & );
epicsMutex & mutexRef () const;
void sync();
template < class T >
void whenThereIsAnExceptionDestroySyncGroupIO ( epicsGuard < epicsMutex > &, T & );
@@ -595,11 +598,11 @@ void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO (
epicsGuardRelease < epicsMutex > guardRelease ( guard );
{
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( this->cbMutex );

View File

@@ -193,6 +193,16 @@ const char * epicsStdCall ca_host_name (
return pChan->io.pHostName ( guard );
}
/*
* ca_host_minorProtocol ()
*/
unsigned epicsStdCall ca_host_minor_protocol (
chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.getHostMinorProtocol( guard );
}
/*
* ca_set_puser ()
*/

View File

@@ -107,7 +107,7 @@ static int makeSocket ( unsigned short port, bool reuseAddr, SOCKET * pSock )
struct sockaddr sa;
} bd;
memset ( (char *) &bd, 0, sizeof (bd) );
memset ( &bd, 0, sizeof (bd) );
bd.ia.sin_family = AF_INET;
bd.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
bd.ia.sin_port = htons ( port );
@@ -165,7 +165,7 @@ bool repeaterClient::sendConfirm ()
int status;
caHdr confirm;
memset ( (char *) &confirm, '\0', sizeof (confirm) );
memset ( &confirm, '\0', sizeof (confirm) );
AlignedWireRef < epicsUInt16 > ( confirm.m_cmmd ) = REPEATER_CONFIRM;
confirm.m_available = this->from.ia.sin_addr.s_addr;
status = send ( this->sock, (char *) &confirm,
@@ -456,7 +456,7 @@ static void register_new_client ( osiSockAddr & from,
* accumulate sockets when there are no beacons
*/
caHdr noop;
memset ( (char *) &noop, '\0', sizeof ( noop ) );
memset ( &noop, '\0', sizeof ( noop ) );
AlignedWireRef < epicsUInt16 > ( noop.m_cmmd ) = CA_PROTO_VERSION;
fanOut ( from, &noop, sizeof ( noop ), freeList );

View File

@@ -353,7 +353,7 @@ void searchTimer::uninstallChanDueToSuccessfulSearchResponse (
// when we get 100% success immediately
// send another search request
//
debugPrintf ( ( "All requests succesful, set timer delay to zero\n" ) );
debugPrintf ( ( "All requests successful, set timer delay to zero\n" ) );
this->timer.start ( *this, currentTime );
}
}

View File

@@ -79,11 +79,11 @@ extern "C" int epicsStdCall ca_sg_delete ( const CA_SYNC_GID gid )
}
else {
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( pcac->cbMutex );
@@ -103,11 +103,11 @@ void sync_group_reset ( ca_client_context & client, CASG & sg )
}
else {
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( client.cbMutex );
@@ -216,11 +216,11 @@ extern "C" int epicsStdCall ca_sg_test ( const CA_SYNC_GID gid )
}
else {
//
// we will definately stall out here if all of the
// we will definitely stall out here if all of the
// following are true
//
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user doesn't periodically call a ca function
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( pcac->cbMutex );

View File

@@ -97,7 +97,7 @@ void tcpRecvWatchdog::beaconArrivalNotify (
guard.assertIdenticalMutex ( this->mutex );
if ( ! ( this->shuttingDown || this->beaconAnomaly || this->probeResponsePending ) ) {
this->timer.start ( *this, this->period );
debugPrintf ( ("saw a normal beacon - reseting circuit receive watchdog\n") );
debugPrintf ( ("saw a normal beacon - resetting circuit receive watchdog\n") );
}
}
@@ -124,7 +124,7 @@ void tcpRecvWatchdog::messageArrivalNotify (
if ( ! ( this->shuttingDown || this->probeResponsePending ) ) {
this->beaconAnomaly = false;
this->timer.start ( *this, this->period );
debugPrintf ( ("received a message - reseting circuit recv watchdog\n") );
debugPrintf ( ("received a message - resetting circuit recv watchdog\n") );
}
}
@@ -182,7 +182,7 @@ void tcpRecvWatchdog::sendBacklogProgressNotify (
// receive at least one message from the server.
if ( this->probeResponsePending && ! this->shuttingDown ) {
this->timer.start ( *this, CA_ECHO_TIMEOUT );
debugPrintf ( ("saw heavy send backlog - reseting circuit recv watchdog\n") );
debugPrintf ( ("saw heavy send backlog - resetting circuit recv watchdog\n") );
}
}

View File

@@ -812,7 +812,7 @@ tcpiiu::tcpiiu (
pSearchDest->setCircuit ( this );
}
memset ( (void *) &this->curMsg, '\0', sizeof ( this->curMsg ) );
memset ( &this->curMsg, '\0', sizeof ( this->curMsg ) );
}
// this must always be called by the udp thread when it holds
@@ -1804,6 +1804,13 @@ const char * tcpiiu::pHostName (
return this->hostNameCacheInstance.pointer ();
}
unsigned tcpiiu::getHostMinorProtocol (
epicsGuard < epicsMutex > & guard) const throw ()
{
guard.assertIdenticalMutex ( this->mutex );
return this->minorProtocolVersion;
}
void tcpiiu::disconnectAllChannels (
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard,
@@ -1817,7 +1824,7 @@ void tcpiiu::disconnectAllChannels (
}
while ( nciu * pChan = this->createRespPend.get () ) {
// we don't yet know the server's id so we cant
// we don't yet know the server's id so we can't
// send a channel delete request and will instead
// trust that the server can do the proper cleanup
// when the circuit disconnects
@@ -1883,7 +1890,7 @@ void tcpiiu::unlinkAllChannels (
while ( nciu * pChan = this->createRespPend.get () ) {
pChan->channelNode::listMember =
channelNode::cs_none;
// we don't yet know the server's id so we cant
// we don't yet know the server's id so we can't
// send a channel delete request and will instead
// trust that the server can do the proper cleanup
// when the circuit disconnects

View File

@@ -83,7 +83,7 @@ double getMaxPeriod()
}
}
else {
epicsPrintf ( "EPICS \"%s\" wasnt a real number\n",
epicsPrintf ( "EPICS \"%s\" wasn't a real number\n",
EPICS_CA_MAX_SEARCH_PERIOD.name );
epicsPrintf ( "Setting \"%s\" = %f seconds\n",
EPICS_CA_MAX_SEARCH_PERIOD.name, maxPeriod );
@@ -242,7 +242,7 @@ udpiiu::udpiiu (
// the local port number below
static const unsigned short PORT_ANY = 0u;
osiSockAddr addr;
memset ( (char *)&addr, 0 , sizeof (addr) );
memset ( &addr, 0 , sizeof (addr) );
addr.ia.sin_family = AF_INET;
addr.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
addr.ia.sin_port = htons ( PORT_ANY );
@@ -514,7 +514,7 @@ void epicsStdCall caRepeaterRegistrationMessage (
saddr.ia.sin_port = htons ( port );
}
memset ( (char *) &msg, 0, sizeof (msg) );
memset ( &msg, 0, sizeof (msg) );
AlignedWireRef < epicsUInt16 > ( msg.m_cmmd ) = REPEATER_REGISTER;
msg.m_available = saddr.ia.sin_addr.s_addr;
@@ -597,7 +597,7 @@ void epicsStdCall caStartRepeaterIfNotInstalled ( unsigned repeaterPort )
tmpSock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( tmpSock != INVALID_SOCKET ) {
ca_uint16_t port = static_cast < ca_uint16_t > ( repeaterPort );
memset ( (char *) &bd, 0, sizeof ( bd ) );
memset ( &bd, 0, sizeof ( bd ) );
bd.ia.sin_family = AF_INET;
bd.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
bd.ia.sin_port = htons ( port );
@@ -1342,6 +1342,12 @@ const char * udpiiu::pHostName (
return netiiu::pHostName ( cacGuard );
}
unsigned udpiiu::getHostMinorProtocol (
epicsGuard < epicsMutex > & cacGuard ) const throw ()
{
return netiiu::getHostMinorProtocol ( cacGuard );
}
bool udpiiu::ca_v42_ok (
epicsGuard < epicsMutex > & cacGuard ) const
{

View File

@@ -239,7 +239,9 @@ private:
unsigned bufLength ) const throw ();
const char * pHostName (
epicsGuard < epicsMutex > & ) const throw ();
bool ca_v41_ok (
unsigned getHostMinorProtocol (
epicsGuard < epicsMutex > & ) const throw ();
bool ca_v41_ok (
epicsGuard < epicsMutex > & ) const;
bool ca_v42_ok (
epicsGuard < epicsMutex > & ) const;

View File

@@ -168,6 +168,8 @@ public:
unsigned getHostName (
epicsGuard < epicsMutex > &,
char *pBuf, unsigned bufLength ) const throw ();
unsigned getHostMinorProtocol (
epicsGuard < epicsMutex > &) const throw ();
bool alive (
epicsGuard < epicsMutex > & ) const;
bool connecting (

View File

@@ -64,7 +64,7 @@ const char * get_error_msg(int status) {
"ECA_NOSUPPORT - Sorry, that feature is planned but not supported at this time",
"ECA_STRTOBIG - The supplied string is unusually large",
"ECA_DISCONNCHID - The request was ignored because the specified channel is disconnected",
"ECA_BADTYPE - The data type specifed is invalid",
"ECA_BADTYPE - The data type specified is invalid",
"ECA_CHIDNOTFND - Remote Channel not found",
"ECA_CHIDRETRY - Unable to locate all user specified channels",
"ECA_INTERNAL - Channel Access Internal Failure",
@@ -83,12 +83,12 @@ const char * get_error_msg(int status) {
"ECA_BADMONID - Bad event subscription (monitor) identifier",
"ECA_NEWADDR - Remote channel has new network address",
"ECA_NEWCONN - New or resumed network connection",
"ECA_NOCACTX - Specified task isnt a member of a CA context",
"ECA_NOCACTX - Specified task isn't a member of a CA context",
"ECA_DEFUNCT - Attempt to use defunct CA feature failed",
"ECA_EMPTYSTR - The supplied string is empty",
"ECA_NOREPEATER - Unable to spawn the CA repeater thread- auto reconnect will fail",
"ECA_NOCHANMSG - No channel id match for search reply- search reply ignored",
"ECA_DLCKREST - Reseting dead connection- will try to reconnect",
"ECA_DLCKREST - Resetting dead connection- will try to reconnect",
"ECA_SERVBEHIND - Server (IOC) has fallen behind or is not responding- still waiting",
"ECA_NOCAST - No internet interface with broadcast available",
"ECA_BADMASK - Invalid event selection mask",
@@ -886,7 +886,7 @@ void CA_get_callback(SV *ca_ref, SV *sub, ...) {
while (items > i
&& SvOK(ST(i))) {
if (SvIOK(ST(i))) {
/* Interger => Count arg, zero means current size */
/* Integer => Count arg, zero means current size */
count = SvIV(ST(i));
if (count < 0 || count > ca_element_count(pch->chan)) {
croak_msg = "Requested array size is out of range";
@@ -962,7 +962,7 @@ SV * CA_create_subscription(SV *ca_ref, const char *mask_str, SV *sub, ...) {
while (items > i
&& SvOK(ST(i))) {
if (SvIOK(ST(i))) {
/* Interger => Count arg, zero means current size */
/* Integer => Count arg, zero means current size */
count = SvIV(ST(i));
if (count < 0 || count > ca_element_count(pch->chan)) {
croak_msg = "Requested array size is out of range";

View File

@@ -23,7 +23,7 @@ ifdef T_A
# Special settings for Darwin:
ifeq ($(OS_CLASS),Darwin)
# Use hdepends command (not GNU compiler flags)
# to generate header file dependancies for Darwin.
# to generate header file dependencies for Darwin.
# Darwin has multiple -arch compiler flags.
HDEPENDS_METHOD = MKMF

View File

@@ -22,7 +22,7 @@ int main(int argc,char **argv)
SEVCHK(ca_context_create(ca_disable_preemptive_callback),"ca_context_create");
SEVCHK(ca_create_channel(argv[1],NULL,NULL,10,&mychid),"ca_create_channel failure");
SEVCHK(ca_pend_io(5.0),"ca_pend_io failure");
SEVCHK(ca_get(DBR_DOUBLE,mychid,(void *)&data),"ca_get failure");
SEVCHK(ca_get(DBR_DOUBLE,mychid,&data),"ca_get failure");
SEVCHK(ca_pend_io(5.0),"ca_pend_io failure");
printf("%s %f\n",argv[1],data);
return(0);

View File

@@ -167,7 +167,7 @@ sub HELP_MESSAGE {
" -w <sec>: Wait time, specifies CA timeout, default is $opt_w second\n",
" -c: Use put_callback to wait for completion\n",
"Format options:\n",
" -t: Terse mode - print only sucessfully written value, without name\n",
" -t: Terse mode - print only successfully written value, without name\n",
" -l: Long mode \"name timestamp value stat sevr\" (read PVs as DBR_TIME_xxx)\n",
" -S: Put string as an array of char (long string)\n",
"Enum format:\n",

View File

@@ -202,7 +202,7 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
pvs[n].reqElems,
pvs[n].chid,
event_handler,
(void*)&pvs[n]);
&pvs[n]);
} else {
/* We allocate value structure and set nElems */
pvs[n].nElems = reqElems && reqElems < nElems ? reqElems : nElems;

View File

@@ -14,7 +14,7 @@ to stdout.
The {option}`-s` option allows to specify an interest level for calling Channel
Access' internal report function `ca_client_status()`, that prints lots
of internal informations on stdout, including environment settings, used
of internal information on stdout, including environment settings, used
CA ports etc.
## Options

View File

@@ -176,7 +176,7 @@ static void connection_handler ( struct connection_handler_args args )
ppv->chid,
eventMask,
event_handler,
(void*)ppv,
ppv,
&ppv->evid);
}
}

View File

@@ -68,7 +68,7 @@ void usage (void)
" -c: Asynchronous put (use ca_put_callback and wait for completion)\n"
" -p <prio>: CA priority (0-%u, default 0=lowest)\n"
"Format options:\n"
" -t: Terse mode - print only sucessfully written value, without name\n"
" -t: Terse mode - print only successfully written value, without name\n"
" -l: Long mode \"name timestamp value stat sevr\" (read PVs as DBR_TIME_xxx)\n"
"Enum format:\n"
" Default: Auto - try value as ENUM string, then as index number\n"
@@ -544,7 +544,7 @@ int main (int argc, char *argv[])
/* Use callback version of put */
pvs[0].status = ECA_NORMAL; /* All ok at the moment */
result = ca_array_put_callback (
dbrType, count, pvs[0].chid, pbuf, put_event_handler, (void *) pvs);
dbrType, count, pvs[0].chid, pbuf, put_event_handler, pvs);
} else {
/* Use standard put with defined timeout */
result = ca_array_put (dbrType, count, pvs[0].chid, pbuf);
@@ -571,7 +571,7 @@ int main (int argc, char *argv[])
}
if (result != ECA_NORMAL) {
fprintf(stderr, ERL_ERROR " occured writing data: %s\n", ca_message(result));
fprintf(stderr, ERL_ERROR " occurred writing data: %s\n", ca_message(result));
free(sbuf); free(dbuf); free(ebuf);
return 1;
}

View File

@@ -90,7 +90,7 @@ int asSetFilename(const char *acf)
int asSetSubstitutions(const char *substitutions)
{
if(psubstitutions) free ((void *)psubstitutions);
if(psubstitutions) free (psubstitutions);
if(substitutions) {
psubstitutions = calloc(1,strlen(substitutions)+1);
if(!psubstitutions) {
@@ -123,7 +123,7 @@ static long asInitCommon(void)
static epicsThreadOnceId asInitCommonOnceFlag = EPICS_THREAD_ONCE_INIT;
epicsThreadOnce(&asInitCommonOnceFlag,asInitCommonOnce,(void *)&firstTime);
epicsThreadOnce(&asInitCommonOnceFlag, asInitCommonOnce, &firstTime);
if(wasFirstTime) {
if(!pacf) return(0); /*access security will NEVER be turned on*/
} else {
@@ -174,7 +174,7 @@ static void asInitTask(ASDBCALLBACK *pcallback)
{
long status;
taskwdInsert(epicsThreadGetIdSelf(), wdCallback, (void *)pcallback);
taskwdInsert(epicsThreadGetIdSelf(), wdCallback, pcallback);
status = asInitCommon();
taskwdRemove(epicsThreadGetIdSelf());
asInitTheadId = 0;
@@ -198,7 +198,7 @@ int asInitAsyn(ASDBCALLBACK *pcallback)
asInitTheadId = epicsThreadCreate("asInitTask",
(epicsThreadPriorityCAServerHigh + 1),
epicsThreadGetStackSize(epicsThreadStackBig),
(EPICSTHREADFUNC)asInitTask,(void *)pcallback);
(EPICSTHREADFUNC)asInitTask, pcallback);
if(asInitTheadId==0) {
errMessage(0,"asInit: epicsThreadCreate Error");
if(pcallback) {
@@ -264,7 +264,7 @@ int astac(const char *pname,const char *user,const char *location)
errMessage(status,"asAddClient error");
return(1);
} else {
asPutClientPvt(*pasclientpvt,(void *)precord->name);
asPutClientPvt(*pasclientpvt, precord->name);
asRegisterClientCallback(*pasclientpvt,astacCallback);
}
return(0);

View File

@@ -33,7 +33,7 @@ static const iocshArg asSetSubstitutionsArg0 = { "substitutions",iocshArgString}
static const iocshArg * const asSetSubstitutionsArgs[] = {&asSetSubstitutionsArg0};
static const iocshFuncDef asSetSubstitutionsFuncDef =
{"asSetSubstitutions",1,asSetSubstitutionsArgs,
"Set subtitutions used when reading ACF file.\n"
"Set substitutions used when reading ACF file.\n"
"No immediate effect. Run asInit to (re)load.\n"
"Example: asSetSubstitutions var1=5,var2=hello\n"};
static void asSetSubstitutionsCallFunc(const iocshArgBuf *args)

View File

@@ -53,5 +53,6 @@ int main(int argc,char **argv)
status = -1;
}
errlogFlush();
asFreeAll((ASBASE*)pasbase);
return status;
}

View File

@@ -212,7 +212,7 @@ got_header:
pdata[n] = pnext->value;
pdataList = pnext;
pnext = pnext->next;
free((void *)pdataList);
free(pdataList);
}
brkCreateInfo.pTable = pdata;
if(create_break(&brkCreateInfo,&brkint[0],MAX_BREAKS,&nBreak))
@@ -360,7 +360,7 @@ static int create_break( struct brkCreateInfo *pbci, brkInt *pabrkInt,
if (inc < 1)
inc = 1;
valid = TRUE;
/* keep trying intervals until cant do better */
/* keep trying intervals until can't do better */
expanding = TRUE; /* originally we are trying larger and larger
* intervals */
while (valid) {

View File

@@ -100,6 +100,10 @@ static int priorityValue[NUM_CALLBACK_PRIORITIES] = {0, 1, 2};
int callbackSetQueueSize(int size)
{
if (size<=0) {
fprintf(stderr, "Queue size must be positive\n");
return -1;
}
if (epicsAtomicGetIntT(&cbState)!=cbInit) {
fprintf(stderr, "Callback system already initialized\n");
return -1;

View File

@@ -20,6 +20,10 @@
#include "dbCoreAPI.h"
/** @file callback.h
* @brief Process database deferred execution utility
*/
#ifdef __cplusplus
extern "C" {
#endif
@@ -38,53 +42,176 @@ extern "C" {
#define priorityMedium 1
#define priorityHigh 2
/** Handle for delayed work.
*
* @pre Must be zero initialized prior to first use.
*
* @since 3.15.6 epicsCallback typedef added. CALLBACK typedef deprecated.
*/
typedef struct callbackPvt {
/** Callback function */
void (*callback)(struct callbackPvt*);
/** One of priorityLow, priorityMedium, or priorityHigh */
int priority;
void *user; /*for use by callback user*/
void *timer; /*for use by callback itself*/
/** for use by callback API user*/
void *user;
/** Must be zero initialized. Used by callback internals. */
void *timer;
}epicsCallback;
#if !defined(EPICS_NO_CALLBACK)
/** Deprecated alias for epicsCallback
*
* Name conflicts with definition from windows.h.
* Portable applications should prefer epicsCallback
* and define the EPICS_NO_CALLBACK pre-processor macro to hide this typedef.
*
* @since 3.15.6 Deprecated in favor of epicsCallback typedef
*/
typedef epicsCallback CALLBACK;
#endif
typedef void (*CALLBACKFUNC)(struct callbackPvt*);
/** See callbackQueueStatus() */
typedef struct callbackQueueStats {
/** Maxiumum depth of queues */
int size;
/** Current number of elements on each queue */
int numUsed[NUM_CALLBACK_PRIORITIES];
/** Maximum numUsed seen so far (from init or reset) */
int maxUsed[NUM_CALLBACK_PRIORITIES];
/** Number of overflow events */
int numOverflow[NUM_CALLBACK_PRIORITIES];
} callbackQueueStats;
/** Assigns callbackPvt::callback */
#define callbackSetCallback(PFUN, PCALLBACK) \
( (PCALLBACK)->callback = (PFUN) )
/** Assigns callbackPvt::priority */
#define callbackSetPriority(PRIORITY, PCALLBACK) \
( (PCALLBACK)->priority = (PRIORITY) )
/** Assigns callbackPvt::priority */
#define callbackGetPriority(PRIORITY, PCALLBACK) \
( (PRIORITY) = (PCALLBACK)->priority )
/** Assigns callbackPvt::user */
#define callbackSetUser(USER, PCALLBACK) \
( (PCALLBACK)->user = (void *) (USER) )
( (PCALLBACK)->user = (USER) )
/** Read and return callbackPvt::user */
#define callbackGetUser(USER, PCALLBACK) \
( (USER) = (PCALLBACK)->user )
DBCORE_API void callbackInit(void);
DBCORE_API void callbackStop(void);
DBCORE_API void callbackCleanup(void);
/** Queue immediate callback request.
*
* Each epicsCallback may be queued multiple times.
* epicsCallback object must not be modified while queued,
* and must remain valid while queued or executing.
*
* @param pCallback Caller expected to initialize or zero all members before first call.
* @return Zero on success.
* Errors if callback members not initialized correctly, or if queue is full.
*/
DBCORE_API int callbackRequest(epicsCallback *pCallback);
/** Setup callback to process a record
* @pre Callback must be zero initialized.
*
* @param pcallback Callback to initialize.
* @param Priority priorityLow, priorityMedium, or priorityHigh
* @param pRec A record pointer (dbCommon or specific recordType)
*/
DBCORE_API void callbackSetProcess(
epicsCallback *pcallback, int Priority, void *pRec);
/** (Re)Initialize callback object and queue
*
* Shorthand for callbackSetProcess() followed by callbackRequest()
*
* @pre Callback object must be zero initialized before first call.
*/
DBCORE_API int callbackRequestProcessCallback(
epicsCallback *pCallback,int Priority, void *pRec);
/** Queue delayed callback request
*
* Each epicsCallback has a single timer.
* Repeated calls before expiration will cancel and reschedule timer.
* epicsCallback object must not be modified while queued,
* and must remain valid while queued or executing.
*
* epicsCallback::timer must be zeroed before the first call,
* and left unmodified for subsequent calls.
* Each epicsCallback is allocated a timer on first call.
* There is no way to free this allocation.
* Reuse of epicsCallback is strongly recommended.
*
* @param pCallback Callback object.
* Caller expected to initialize or zero all members prior to first call.
* @param seconds Relative to call time. Expected to be >= 0.
* @return Zero on success.
* Errors if callback members not initialized correctly, or if queue is full.
*/
DBCORE_API void callbackRequestDelayed(
epicsCallback *pCallback,double seconds);
/** Cancel delayed callback.
*
* Usage not recommended. Caller can not distinguish between successful
* cancellation, or expiration. In the later case the callback may still be
* queued or executing.
*
* @param pcallback Callback object previously passed to callbackRequestDelayed()
*
* @post Timer is cancelled. However, callback may be queued or executing.
*/
DBCORE_API void callbackCancelDelayed(epicsCallback *pcallback);
/** (Re)Initialize callback object and queue
*
* Shorthand for callbackSetProcess() followed by callbackRequestDelayed()
*
* @pre Callback object must be zero initialized before first call.
*/
DBCORE_API void callbackRequestProcessCallbackDelayed(
epicsCallback *pCallback, int Priority, void *pRec, double seconds);
/** Set callback queue depth
*
* @param size A positive integer
* @return -1 if too late to change depth
*
* @pre Must be called before iocInit()
*/
DBCORE_API int callbackSetQueueSize(int size);
/** Query configuration and statistics from callback system
* @param reset If non-zero, reset maxUsed after reading.
* @param result NULL, or location for results
* @return -2 if result is NULL. reset happens anyway.
*
* @since 7.0.2. Also present in 3.16.2
*/
DBCORE_API int callbackQueueStatus(const int reset, callbackQueueStats *result);
DBCORE_API void callbackQueueShow(const int reset);
/** Setup multiple worker threads for specified priority
*
* By default, only one thread is run for each priority (3 in total).
*
* Calling with count==0 will take the count from the callbackParallelThreadsDefault
* global variable (default default is 2).
* Calling with count>0 sets the number of worker threads directly.
* Calling with count<0 computes the count based on the number of CPU cores on the host.
* eg. Passing -2 on an 8 core system will start 6 worker threads.
* In all cases, at least one worker thread will always run.
*
* A special prio name of "*" will modify all priorities.
* Otherwise, only the named priority is modified.
*
* @param count If zero, reset to default (callbackParallelThreadsDefault global/iocsh variable).
* If positive, exact number of worker threads to create.
* If negative, number of worker threads less than core count.
* @param prio Priority name. eg. "*", "LOW", "MEDIUM" or "HIGH".
* @return zero on success, non-zero if called after iocInit() or with invalid arguments.
*
* @pre Must be called before iocInit()
*
* @since 3.15.0.2
*/
DBCORE_API int callbackParallelThreads(int count, const char *prio);
#ifdef __cplusplus

View File

@@ -339,7 +339,7 @@ static parse_result parse_start(chFilter *filter)
}
}
filter->puser = (void*) f;
filter->puser = f;
return parse_continue;

View File

@@ -58,7 +58,7 @@ long cvtRawToEngBpt(double *pval, short linr, short init,
if (!pbrkTable)
return S_dbLib_badField;
*ppbrk = (void *)pbrkTable;
*ppbrk = pbrkTable;
*plbrk = 0;
} else
pbrkTable = (brkTable *)*ppbrk;
@@ -138,7 +138,7 @@ long cvtEngToRawBpt(double *pval, short linr, short init,
if (!pbrkTable)
return S_dbLib_badField;
*ppbrk = (void *)pbrkTable;
*ppbrk = pbrkTable;
/* start at the beginning */
*plbrk = 0;
} else

View File

@@ -183,7 +183,7 @@ static void get_enum_strs(DBADDR *paddr, char **ppbuffer,
}
if(nchoices > NELEMENTS(penum->strs))
nchoices = NELEMENTS(penum->strs); /* availible > capacity, truncated list */
nchoices = NELEMENTS(penum->strs); /* available > capacity, truncated list */
penum->no_str = nchoices;
@@ -550,7 +550,7 @@ long dbProcess(dbCommon *precord)
monitor_mask |= DBE_VALUE|DBE_LOG;
pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->indvalFlddes];
db_post_events(precord,
(void *)(((char *)precord) + pdbFldDes->offset),
((char *)precord) + pdbFldDes->offset,
monitor_mask);
goto all_done;
}
@@ -587,7 +587,7 @@ long dbProcess(dbCommon *precord)
db_post_events(precord, &precord->sevr, DBE_VALUE);
pdbFldDes = pdbRecordType->papFldDes[pdbRecordType->indvalFlddes];
db_post_events(precord,
(void *)(((char *)precord) + pdbFldDes->offset),
((char *)precord) + pdbFldDes->offset,
DBE_VALUE|DBE_ALARM);
goto all_done;
}
@@ -597,7 +597,7 @@ long dbProcess(dbCommon *precord)
if (!prset || !prset->process) {
callNotifyCompletion = TRUE;
precord->pact = 1;/*set pact so error is issued only once*/
recGblRecordError(S_db_noRSET, (void *)precord, "dbProcess");
recGblRecordError(S_db_noRSET, precord, "dbProcess");
status = S_db_noRSET;
if (*ptrace)
printf("%s: No RSET for %s\n", context, precord->name);
@@ -709,7 +709,7 @@ void dbInitEntryFromAddr(struct dbAddr *paddr, DBENTRY *pdbentry)
struct dbCommon *prec = paddr->precord;
dbCommonPvt *ppvt = dbRec2Pvt(prec);
memset((char *)pdbentry,'\0',sizeof(DBENTRY));
memset(pdbentry, '\0', sizeof(DBENTRY));
pdbentry->pdbbase = pdbbase;
pdbentry->precordType = prec->rdes;
@@ -723,7 +723,7 @@ void dbInitEntryFromRecord(struct dbCommon *prec, DBENTRY *pdbentry)
{
dbCommonPvt *ppvt = dbRec2Pvt(prec);
memset((char *)pdbentry,'\0',sizeof(DBENTRY));
memset(pdbentry, '\0', sizeof(DBENTRY));
pdbentry->pdbbase = pdbbase;
pdbentry->precordType = prec->rdes;
@@ -805,7 +805,7 @@ int dbLoadRecords(const char* file, const char* subs)
if(dbLoadRecordsHook)
dbLoadRecordsHook(file, subs);
} else {
fprintf(stderr, ERL_ERROR " failed to load '%s'\n", file);
fprintf(stderr, ERL_ERROR ": Failed to load '%s'\n", file);
if(status==-2)
fprintf(stderr, " Records cannot be loaded after iocInit!\n");
}
@@ -1070,7 +1070,7 @@ static long dbPutFieldLink(DBADDR *paddr,
dbFldDes *pfldDes = paddr->pfldDes;
long special = paddr->special;
struct link *plink = (struct link *)paddr->pfield;
const char *pstring = (const char *)pbuffer;
const char *pstring = pbuffer;
struct dsxt *old_dsxt = NULL;
dset *new_dset = NULL;
struct dsxt *new_dsxt = NULL;
@@ -1095,7 +1095,7 @@ static long dbPutFieldLink(DBADDR *paddr,
return S_db_badDbrtype;
}
status = dbParseLink(pstring, pfldDes->field_type, &link_info);
status = dbParseLink(pstring, pfldDes->field_type, &link_info, precord->name, pfldDes->name);
if (status)
return status;
@@ -1130,7 +1130,7 @@ static long dbPutFieldLink(DBADDR *paddr,
}
if (dbCanSetLink(plink, &link_info, new_devsup)) {
/* link type mis-match prevents assignment */
/* link type mismatch prevents assignment */
status = S_dbLib_badField;
goto unlock;
}

View File

@@ -207,6 +207,7 @@ private:
cacChannel::priLev );
void flush (
epicsGuard < epicsMutex > & );
void sync ();
unsigned circuitCount (
epicsGuard < epicsMutex > & ) const;
void selfTest (

Some files were not shown because too many files have changed in this diff Show More