Merge 7.0.10 into PSI-7.0
This commit is contained in:
2
.ci
2
.ci
Submodule .ci updated: 0e93b70855...261f218e09
168
.github/workflows/ci-scripts-build.yml
vendored
168
.github/workflows/ci-scripts-build.yml
vendored
@@ -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
13
.gitignore
vendored
@@ -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
10
README
@@ -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
64
README.md
Normal 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.
|
||||
@@ -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 $@
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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/
|
||||
|
||||
|
||||
|
||||
16
configure/os/CONFIG.Common.RTEMS-xilinx_zynq_microzed
Normal file
16
configure/os/CONFIG.Common.RTEMS-xilinx_zynq_microzed
Normal 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
|
||||
@@ -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/
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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:../%=%)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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!
|
||||
|
||||
431
documentation/RELEASE-7.0.10.md
Normal file
431
documentation/RELEASE-7.0.10.md
Normal 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.
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 & 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 & 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> </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> </td>
|
||||
<td>All developers</td>
|
||||
<td>Check the bug tracker for any outstanding items and handle
|
||||
appropriately.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </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> </td>
|
||||
<td>Release Manager<br>
|
||||
& 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> </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> </td>
|
||||
<td>Platform Developers</td>
|
||||
<td>Run the internal test programs on all appropriate platforms.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </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> </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/<module>; git grep UNRELEASED</tt>
|
||||
and insert the submodule's version number into any doxygen
|
||||
annotations that have a <tt>@since 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 <submodule-version>'
|
||||
</tt></blockquote>
|
||||
</li>
|
||||
|
||||
<li>Tag the submodule:
|
||||
<blockquote><tt>
|
||||
git tag -m 'ANJ: Tag for EPICS 7.0.9.1' <submodule-version>
|
||||
</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/<module>/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 <module><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/<module><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 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>
|
||||
390
documentation/ReleaseChecklist.md
Normal file
390
documentation/ReleaseChecklist.md
Normal 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 />
|
||||
& 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/<module>; git grep UNRELEASED</code>
|
||||
and insert the submodule's version number into any doxygen annotations
|
||||
that have a <code>@since 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 <submodule-version>' </code>
|
||||
</blockquote></li>
|
||||
<li><p>Tag the submodule:</p>
|
||||
<blockquote>
|
||||
<code> git tag -m 'ANJ: Tag for EPICS 7.0.10' <submodule-version> </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/<module>/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 <module></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/<module></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 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>
|
||||
@@ -13,6 +13,7 @@ EPICS Base Documentation
|
||||
|
||||
README
|
||||
RELEASE_NOTES
|
||||
ACF-Language
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
@@ -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`.
|
||||
@@ -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"`
|
||||
@@ -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).
|
||||
@@ -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.
|
||||
@@ -1,4 +0,0 @@
|
||||
### epicsExport simplifications
|
||||
|
||||
`epicsExportAddress()`, `epicsExportRegistrar()` and `epicsRegisterFunction()`
|
||||
no longer require to be wrapped in `extern "C" { }` in C++ code.
|
||||
@@ -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.
|
||||
@@ -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"`
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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`.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ()
|
||||
*
|
||||
|
||||
@@ -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 ) {
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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"
|
||||
*/
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -398,6 +398,8 @@ void cac::flush ( epicsGuard < epicsMutex > & guard )
|
||||
}
|
||||
}
|
||||
|
||||
void cac::sync() {}
|
||||
|
||||
unsigned cac::circuitCount (
|
||||
epicsGuard < epicsMutex > & guard ) const
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ()
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
/****************************************************************************
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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 ()
|
||||
*/
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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") );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -176,7 +176,7 @@ static void connection_handler ( struct connection_handler_args args )
|
||||
ppv->chid,
|
||||
eventMask,
|
||||
event_handler,
|
||||
(void*)ppv,
|
||||
ppv,
|
||||
&ppv->evid);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -53,5 +53,6 @@ int main(int argc,char **argv)
|
||||
status = -1;
|
||||
}
|
||||
errlogFlush();
|
||||
asFreeAll((ASBASE*)pasbase);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -339,7 +339,7 @@ static parse_result parse_start(chFilter *filter)
|
||||
}
|
||||
}
|
||||
|
||||
filter->puser = (void*) f;
|
||||
filter->puser = f;
|
||||
|
||||
return parse_continue;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user