Compare commits
84 Commits
PSI-7.0.9.
...
PSI-7.0
| Author | SHA1 | Date | |
|---|---|---|---|
| fdb0912b1e | |||
| b5f73d8200 | |||
| 1d835c0922 | |||
|
|
d3e414cbec | ||
|
|
84d4627987 | ||
|
|
839e7f4959 | ||
|
|
d724461f1c | ||
|
|
c52800fd4a | ||
|
|
782d6bb441 | ||
| 5f3a4a01cc | |||
| e84a3c203a | |||
| e4c06e9b93 | |||
| 76a89b8cee | |||
| 9748cbd394 | |||
| 422182d672 | |||
| 030973c6e4 | |||
| f08fcfdb39 | |||
|
|
59b595f8cf | ||
| 80c708fdeb | |||
|
|
b2ed8bb98d | ||
| 3d95dece6b | |||
| 7fa82f103b | |||
| 6cd4b24e8a | |||
| f572a0f068 | |||
| 1ebf9ad567 | |||
| 4a5d3ddf85 | |||
| 3a8f5fa9b1 | |||
|
|
71e4635d34 | ||
|
|
bbc4c6358e | ||
| 12c56ffc95 | |||
| 2bd148ab37 | |||
| 209e1f9587 | |||
| 6d85a36397 | |||
| 85347172c6 | |||
| ef2260f433 | |||
| 22347af170 | |||
| c811ce218e | |||
|
|
623409466d | ||
|
|
d31568fe9a | ||
|
|
bf11a0c31c | ||
|
|
24d422e6c3 | ||
|
|
a49df15d0b | ||
|
|
3f24e1800e | ||
|
|
93d6137d23 | ||
|
|
cabbc44bf9 | ||
|
|
7d6ef32502 | ||
|
|
644bf7dfef | ||
|
|
87f5e4b699 | ||
|
|
2e3938da6f | ||
|
|
4b6a6ddc7a | ||
|
|
c2140ad0f3 | ||
|
|
186106cd33 | ||
|
|
baa4cb5495 | ||
|
|
7ae3e4c2df | ||
|
|
01360b2a69 | ||
|
|
491d532170 | ||
|
|
cc98ef8696 | ||
|
|
1910478297 | ||
|
|
214b5d935b | ||
| 90a727c901 | |||
|
|
4f547230c4 | ||
|
|
e5618326c9 | ||
|
|
45e3e58a1f | ||
|
|
1f4b39cd08 | ||
|
|
9b532540bf | ||
|
|
46ecf5d25c | ||
|
|
b893ae080e | ||
|
|
84b4a5f63c | ||
|
|
4acae4c602 | ||
|
|
0916cf985c | ||
|
|
862272d666 | ||
|
|
b308be3273 | ||
| 6c2cbe0101 | |||
| bef86189d5 | |||
| 88bfd6f378 | |||
|
|
e08d7310b9 | ||
|
|
d58d1420b8 | ||
|
|
e12269c302 | ||
|
|
8311a5b360 | ||
|
|
6e6cac09e1 | ||
|
|
3f382f6b68 | ||
|
|
a46bd5ae88 | ||
|
|
098b3968d6 | ||
|
|
0ab956b123 |
@@ -82,8 +82,9 @@ matrix:
|
||||
#---------------------------------#
|
||||
|
||||
install:
|
||||
- cmd: set PATH=C:\Python38-x64;%PATH%
|
||||
- cmd: git submodule update --init --recursive
|
||||
- cmd: pip install git+https://github.com/mdavidsaver/ci-core-dumper#egg=ci-core-dumper
|
||||
- cmd: python -m pip install git+https://github.com/mdavidsaver/ci-core-dumper#egg=ci-core-dumper
|
||||
- cmd: python .ci/cue.py prepare
|
||||
|
||||
build_script:
|
||||
@@ -121,10 +122,4 @@ on_failure:
|
||||
#---------------------------------#
|
||||
|
||||
notifications:
|
||||
|
||||
- provider: Email
|
||||
to:
|
||||
- core-talk@aps.anl.gov
|
||||
on_build_success: false
|
||||
|
||||
- provider: GitHubPullRequest
|
||||
|
||||
@@ -89,8 +89,9 @@ matrix:
|
||||
#---------------------------------#
|
||||
|
||||
install:
|
||||
- cmd: set PATH=C:\Python38-x64;%PATH%
|
||||
- cmd: git submodule update --init --recursive
|
||||
- cmd: pip install git+https://github.com/mdavidsaver/ci-core-dumper#egg=ci-core-dumper
|
||||
- cmd: python -m pip install git+https://github.com/mdavidsaver/ci-core-dumper#egg=ci-core-dumper
|
||||
- cmd: python .ci/cue.py prepare
|
||||
|
||||
build_script:
|
||||
@@ -128,10 +129,4 @@ on_failure:
|
||||
#---------------------------------#
|
||||
|
||||
notifications:
|
||||
|
||||
- provider: Email
|
||||
to:
|
||||
- core-talk@aps.anl.gov
|
||||
on_build_success: false
|
||||
|
||||
- provider: GitHubPullRequest
|
||||
|
||||
2
.ci
2
.ci
Submodule .ci updated: 0e93b70855...261f218e09
176
.github/workflows/ci-scripts-build.yml
vendored
176
.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,139 +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=-analyze"
|
||||
|
||||
- os: windows-2022
|
||||
cmp: vs2022
|
||||
configuration: debug
|
||||
name: "Win-22 MSC-22 c++14"
|
||||
extra: "CMD_CXXFLAGS='-analyze -Zc:__cplusplus -std:c++17'"
|
||||
|
||||
- os: windows-2022
|
||||
cmp: vs2022
|
||||
configuration: debug
|
||||
name: "Win-22 MSC-22 c++17"
|
||||
extra: "CMD_CXXFLAGS='-analyze -Zc:__cplusplus -std:c++17'"
|
||||
|
||||
- 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=-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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# Include definitions common to linux pentium targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86_64
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
TOOLSET_LOCATION = /opt/rh
|
||||
TOOLSET = devtoolset-12
|
||||
STD_CXXFLAGS = -std=c++20
|
||||
@@ -1,3 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-clang
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
@@ -1,8 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 5.5.1
|
||||
WIND_BASE = /opt/VxWorks/Tornado2.2.1
|
||||
|
||||
#there is a problem with our ccppc and optimization
|
||||
# -O0 works, -O and -O1 and higher are buggy
|
||||
OPT_CFLAGS_YES = -O0
|
||||
OPT_CXXFLAGS_YES = -O0
|
||||
@@ -1,2 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 6.2
|
||||
@@ -1,5 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc603_long
|
||||
VXWORKS_VERSION = 6.3
|
||||
|
||||
# Buggy "uninitialized variable" warning produces many false positives
|
||||
ARCH_DEP_CXXFLAGS += -Wno-uninitialized
|
||||
@@ -1,5 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 6.3
|
||||
|
||||
# Buggy "uninitialized variable" warning produces many false positives
|
||||
ARCH_DEP_CXXFLAGS += -Wno-uninitialized
|
||||
@@ -1,5 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 6.4
|
||||
|
||||
# Buggy "uninitialized variable" warning produces many false positives
|
||||
ARCH_DEP_CXXFLAGS += -Wno-uninitialized
|
||||
@@ -1,2 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc603_long
|
||||
VXWORKS_VERSION = 6.6
|
||||
@@ -1,2 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 6.6
|
||||
@@ -1,8 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
|
||||
VXWORKS_VERSION = 6.7
|
||||
|
||||
# needed when including memPartLib.h, e.g. through moduleLib.h or loadLib.h
|
||||
ARCH_DEP_CFLAGS += -D_VSB_CONFIG_FILE='<../lib/h/config/vsbConfig.h>'
|
||||
|
||||
# compiler tries to access license server (even though no license isneeded)
|
||||
export LM_LICENSE_FILE=37000@lic-windriver.psi.ch
|
||||
@@ -1,3 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc32
|
||||
VXWORKS_VERSION = 6.9
|
||||
#export LD_LIBRARY_PATH=$(LD_LIBRARY_PATH:%=%:)$(WIND_BASE)/lmapi-5.0/$(WIND_HOST_TYPE)/lib
|
||||
@@ -11,13 +11,6 @@ ELDK=/opt/eldk-4.2
|
||||
GNU_TARGET=ppc_4xxFP
|
||||
GNU_DIR=$(ELDK)/usr
|
||||
|
||||
# This cross tool chain is installed in a somehow weired way
|
||||
# Without the following lines it does not work on RHEL7
|
||||
# but it worked on SL6
|
||||
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2
|
||||
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2/powerpc-linux
|
||||
ARCH_DEP_CXXFLAGS += -I $(ELDK)/$(GNU_TARGET)/usr/include/c++/4.2.2/backward
|
||||
|
||||
ARCH_DEP_LDFLAGS += -Wl,-rpath-link,$(ELDK)/$(GNU_TARGET)/lib
|
||||
ARCH_DEP_LDFLAGS += -Wl,-rpath-link,$(ELDK)/$(GNU_TARGET)/usr/lib
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
# IOxOS IFC1211 with Freescale QorIQ 2.0 toolchain
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
|
||||
ARCH_CLASS = ppc
|
||||
|
||||
SDK = fslsdk
|
||||
SDK_DIR = /opt/fsl-qoriq/2.0
|
||||
SDK_HOST_ARCH = $(GNU_HOST_ARCH_64)-$(SDK)-$(GNU_HOST_OS)
|
||||
SDK_TARGET = ppc64e6500-fsl-linux
|
||||
GNU_TARGET = powerpc64-fsl-linux
|
||||
SYSROOT = $(SDK_DIR)/sysroots/$(SDK_TARGET)
|
||||
GNU_DIR = $(SDK_DIR)/sysroots/$(SDK_HOST_ARCH)/usr
|
||||
GNU_BIN = $(GNU_DIR)/bin/$(GNU_TARGET)
|
||||
|
||||
ARCH_DEP_CFLAGS = -mcpu=e6500 -m64 -mhard-float
|
||||
@@ -91,11 +91,6 @@ vpath %.m $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
%.o: %.m
|
||||
$(COMPILE.c) -c $<
|
||||
|
||||
#--------------------------------------------------
|
||||
# Header dependency file generation
|
||||
#
|
||||
HDEPENDS_METHOD = MKMF
|
||||
|
||||
#--------------------------------------------------
|
||||
# Allow site overrides
|
||||
-include $(CONFIG)/os/CONFIG_SITE.Common.iosCommon
|
||||
|
||||
@@ -11,6 +11,9 @@ GNU_DIR=/opt/moxa/xscale_be/armv5teb-montavista-linuxeabi
|
||||
|
||||
ARCH_DEP_CFLAGS += -funwind-tables
|
||||
|
||||
# suppress strict alias warnings
|
||||
CODE_CPPFLAGS += -fno-strict-aliasing
|
||||
|
||||
# have no C++11
|
||||
STD_CXXFLAGS =
|
||||
|
||||
|
||||
@@ -9,10 +9,10 @@ ARCH_CLASS = arm
|
||||
GNU_TARGET = arm-linux-gnu
|
||||
|
||||
SYSROOT = /opt/LabVIEW-RT-19.5.1/arm/sysroots/armv7a-vfp-neon-nilrt-linux-gnueabi
|
||||
GNU_BIN = /opt/RHEL7/bin
|
||||
GNU_DIR = /opt/RHEL7
|
||||
|
||||
# Needed on RHEL9:
|
||||
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH:%=%:)/usr/$$LIB:/opt/RHEL7/$$LIB
|
||||
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH:%=%:)/usr/$$LIB:$(GNU_DIR)/$$LIB
|
||||
|
||||
ARCH_DEP_CPPFLAGS += -march=armv7-a -mthumb-interwork -mfloat-abi=softfp -mfpu=neon
|
||||
ARCH_DEP_CXXFLAGS += -I=/usr/include/c++/4.7.2/arm-nilrt-linux-gnueabi
|
||||
|
||||
@@ -145,12 +145,6 @@ CODE_CXXFLAGS = $(CODE_CXXFLAGS_$(VXWORKS_MAJOR_VERSION))
|
||||
SHRLIB_CFLAGS =
|
||||
SHRLIB_LDFLAGS =
|
||||
|
||||
#--------------------------------------------------
|
||||
# Don't use gcc 2.x for dependency generation
|
||||
|
||||
HDEPENDS_METHOD_2 = MKMF
|
||||
HDEPENDS_METHOD = $(firstword $(HDEPENDS_METHOD_$(VX_GNU_MAJOR_VERSION)) COMP)
|
||||
|
||||
#--------------------------------------------------
|
||||
# osithead use default stack, YES or NO override
|
||||
OSITHREAD_USE_DEFAULT_STACK = NO
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
# XILINX Zynq with Yocto 2.1 / Petalinux toolchain
|
||||
|
||||
# Include definitions common to all Linux targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linuxCommon
|
||||
|
||||
ARCH_CLASS = arm64
|
||||
|
||||
SDK = petalinux
|
||||
SDK_DIR = /opt/petalinux-gfa/2018.1
|
||||
SDK_HOST_ARCH = $(GNU_HOST_ARCH_64)-$(SDK)-$(GNU_HOST_OS)
|
||||
SDK_TARGET = aarch64-xilinx-linux
|
||||
GNU_TARGET = $(SDK_TARGET)
|
||||
SYSROOT = $(SDK_DIR)/sysroots/$(SDK_TARGET)
|
||||
GNU_DIR = $(SDK_DIR)/sysroots/$(SDK_HOST_ARCH)/usr
|
||||
GNU_BIN = $(GNU_DIR)/bin/$(GNU_TARGET)
|
||||
@@ -1,3 +0,0 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
@@ -1,2 +0,0 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
@@ -1,3 +0,0 @@
|
||||
# MSVC_VERSION 2019 in wine 4 for on RHEL7 would require winetricks
|
||||
MSVC_VERSION = 2017
|
||||
include $(CONFIG)/os/CONFIG.Linux.windows-x64
|
||||
@@ -1,28 +0,0 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
|
||||
# "Cross compile" for RHEL7-x86_64
|
||||
# Expects RHEL7 RPMs c++ and readline-devel installed
|
||||
# in $(SYSROOT)
|
||||
# This can be installed on RHEL7 with:
|
||||
# yum install --installroot=$(SYSROOT) <packages>
|
||||
# (Assuming $(SYSROOT) is on a shared network volume.)
|
||||
# Optionally use a newer TOOLSET (installed on $(SYSROOT)).
|
||||
|
||||
SYSROOT = /opt/RHEL7
|
||||
|
||||
# "Cross" TOOLSET progs need to find their libraries
|
||||
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH:%=%:)$(TOOLSET_DIR:%=$(SYSROOT)%/usr/$$LIB)
|
||||
|
||||
# The linker has problems to find indirectly referenced libraries
|
||||
ARCH_DEP_LDFLAGS+=-Wl,-rpath-link,$(INSTALL_LIB)
|
||||
|
||||
# These programs have library problems when using them
|
||||
# from SYSROOT but without TOOLSET.
|
||||
# But provinding LD_LIBRARY PATH crashes other progams.
|
||||
# Our host versions work just fine.
|
||||
AR = ar -rc
|
||||
RANLIB = ranlib
|
||||
|
||||
# Allow to run cross-tests which expect different lib versions
|
||||
export LD_PRELOAD=$(SYSROOT)/lib64/libreadline.so
|
||||
@@ -1 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.win32-x86-mingw
|
||||
@@ -1,9 +1,3 @@
|
||||
#CONFIG.$(EPICS_HOST_ARCH).Common is required by build system
|
||||
#Include definitions common to linux hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.Common
|
||||
|
||||
# Windows 32 bit cross builds using mingw
|
||||
# (broken on RHEL8)
|
||||
|
||||
CROSS_COMPILER_TARGET_ARCHS += win32-x86-mingw
|
||||
CROSS_COMPILER_RUNTEST_ARHCS += win32-x86-mingw
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
# Include common linux definitions
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
|
||||
# "Cross compile" for RHEL7-x86_64
|
||||
# Expects RHEL7 RPMs c++ and readline-devel installed
|
||||
# in $(SYSROOT)
|
||||
# This can be installed on RHEL7 with:
|
||||
# yum install --installroot=$(SYSROOT) <packages>
|
||||
# (Assuming $(SYSROOT) is on a shared network volume.)
|
||||
# Optionally use a newer TOOLSET (installed on $(SYSROOT)).
|
||||
|
||||
SYSROOT = /opt/RHEL7
|
||||
|
||||
# "Cross" TOOLSET progs need to find their libraries
|
||||
export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH:%=%:)$(TOOLSET_DIR:%=$(SYSROOT)%/usr/$$LIB:)/usr/$$LIB:$(SYSROOT)/usr/$$LIB
|
||||
|
||||
# The linker has problems to find indirectly referenced libraries
|
||||
PROD_LDLIBS += $(LDLIBS)
|
||||
|
||||
# Allow to run cross-tests which expect different lib versions
|
||||
export LD_PRELOAD=$(SYSROOT)/lib64/libreadline.so
|
||||
@@ -1 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG.linux-x86_64.win32-x86-mingw
|
||||
@@ -82,11 +82,6 @@ vpath %.m $(USR_VPATH) $(ALL_SRC_DIRS)
|
||||
%.o: %.m
|
||||
$(COMPILE.c) -c $<
|
||||
|
||||
#
|
||||
# Header dependency file generation
|
||||
#
|
||||
HDEPENDS_METHOD = MKMF
|
||||
|
||||
#--------------------------------------------------
|
||||
# Allow site overrides
|
||||
-include $(CONFIG)/os/CONFIG_SITE.darwinCommon.darwinCommon
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.Common
|
||||
|
||||
# Improved error checking with clang
|
||||
CROSS_COMPILER_TARGET_ARCHS += RHEL7-x86_64-clang
|
||||
CROSS_COMPILER_RUNTEST_ARCHS += RHEL7-x86_64-clang
|
||||
@@ -3,7 +3,3 @@ include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.Common
|
||||
# Improved error checking with clang
|
||||
CROSS_COMPILER_TARGET_ARCHS += RHEL8-x86_64-clang
|
||||
CROSS_COMPILER_RUNTEST_ARCHS += RHEL8-x86_64-clang
|
||||
|
||||
# Build for old RHEL7 64 bit
|
||||
#CROSS_COMPILER_TARGET_ARCHS += RHEL7-x86_64
|
||||
#CROSS_COMPILER_RUNTEST_ARCHS += RHEL7-x86_64
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.win32-x86-mingw
|
||||
@@ -7,7 +7,3 @@ CROSS_COMPILER_RUNTEST_ARCHS += RHEL9-x86_64-clang
|
||||
# Build for old RHEL8 64 bit
|
||||
CROSS_COMPILER_TARGET_ARCHS += RHEL8-x86_64
|
||||
CROSS_COMPILER_RUNTEST_ARCHS += RHEL8-x86_64
|
||||
|
||||
# Build for even older RHEL7 64 bit
|
||||
#CROSS_COMPILER_TARGET_ARCHS += RHEL7-x86_64
|
||||
#CROSS_COMPILER_RUNTEST_ARCHS += RHEL7-x86_64
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.win32-x86-mingw
|
||||
@@ -12,13 +12,7 @@ GNU_HOST_ARCH=i686
|
||||
GNU_HOST_OS=linux
|
||||
|
||||
# vxWorks for MVxxxx boards
|
||||
#CROSS_COMPILER_TARGET_ARCHS += T2-ppc604
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V67-ppc604
|
||||
CROSS_COMPILER_TARGET_ARCHS += V69-ppc604
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V69-ppc32
|
||||
|
||||
# NI compact RIO
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V63-ppc603
|
||||
|
||||
# MOXA montavista linux (No PVA because of missing boost support)
|
||||
CROSS_COMPILER_TARGET_ARCHS += mvl40-xscale_be
|
||||
@@ -36,14 +30,6 @@ CROSS_COMPILER_TARGET_ARCHS += eldk52-e500v2
|
||||
CROSS_COMPILER_TARGET_ARCHS += eldk42-ppc4xxFP
|
||||
CROSS_COMPILER_TARGET_ARCHS += eldk53-ppc4xxFP
|
||||
|
||||
# Test other vxWorks versions
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V66-ppc603
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V66-ppc604
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V63-ppc604
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V64-ppc604
|
||||
# (No PVA because of old compiler)
|
||||
#CROSS_COMPILER_TARGET_ARCHS += V62-ppc604
|
||||
|
||||
# RTEMS (Can only have 1 RTEMS major version in 1 EPICS installation
|
||||
# because they overwrite their header files.)
|
||||
#CROSS_COMPILER_TARGET_ARCHS += RTEMS49-pc386
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#GNU_DIR = /usr/local
|
||||
|
||||
# Different distribution cross-build packages use different prefixes:
|
||||
# Ubuntu, RHEL7:
|
||||
# Ubuntu, RHEL:
|
||||
CMPLR_PREFIX = i686-w64-mingw32-
|
||||
# RHEL6:
|
||||
#CMPLR_PREFIX = i686-pc-mingw32-
|
||||
|
||||
@@ -19,11 +19,7 @@ CROSS_COMPILER_RUNTEST_ARCHS += windows-x64
|
||||
CROSS_COMPILER_TARGET_ARCHS += windows-x64-mingw
|
||||
CROSS_COMPILER_RUNTEST_ARCHS += windows-x64-mingw
|
||||
|
||||
# IOxOS IFC1211
|
||||
#CROSS_COMPILER_TARGET_ARCHS += fslqoriq20-e6500_64
|
||||
|
||||
# Zynq
|
||||
#CROSS_COMPILER_TARGET_ARCHS += yocto21-aarch64
|
||||
CROSS_COMPILER_TARGET_ARCHS += yocto40-aarch64
|
||||
|
||||
# Debian
|
||||
|
||||
@@ -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,10 +64,12 @@ ca_HEADERS += caerr
|
||||
ca_HEADERS += caeventmask
|
||||
ca_HEADERS += db_access
|
||||
|
||||
database_HEADERS += callback
|
||||
database_HEADERS += chfPlugin
|
||||
database_HEADERS += dbChannel
|
||||
database_HEADERS += dbCommon
|
||||
database_HEADERS += dbDefs
|
||||
database_HEADERS += dbEvent
|
||||
database_HEADERS += dbExtractArray
|
||||
database_HEADERS += dbLink
|
||||
database_HEADERS += dbServer
|
||||
|
||||
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.
|
||||
|
||||
|
||||
@@ -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 relevant 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 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"`
|
||||
@@ -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 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.
|
||||
@@ -1,12 +0,0 @@
|
||||
### Documentation Updates
|
||||
|
||||
The reference documentation for the [event](eventRecord.html) 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.html) header in libCom, but both the
|
||||
[calc](calcRecord.html) and [calcout](calcoutRecord.html) record reference
|
||||
pages also cover the infix expressions supported.
|
||||
@@ -1,7 +1,7 @@
|
||||
### 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 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.
|
||||
The size of CALC and OCAL fields have been doubled to 160 chars.
|
||||
|
||||
@@ -9,4 +9,5 @@ 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`.
|
||||
`EPICS_DB_CONVERT_DECIMAL_ONLY` to anything except the empty string or
|
||||
strings starting with `n`, `N`, `f`, `F` or `0` before `iocInit`.
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
### `dfanout` improvements
|
||||
|
||||
The dfanout record now has invalid output handling with the usual fields
|
||||
`IVOA` and `IVOV` just like other output records.
|
||||
|
||||
The number of output links has been increased from 8 to 16.
|
||||
@@ -1,5 +0,0 @@
|
||||
### 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.
|
||||
@@ -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
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# Always make sure EpicsVersion.Version-Release matches the git tag!
|
||||
|
||||
%define EpicsVersion 7.0.9
|
||||
%define EpicsVersion 7.0.10
|
||||
|
||||
Name: epics-base-%{EpicsVersion}
|
||||
Summary: EPICS Base %{EpicsVersion}
|
||||
Version: 1
|
||||
Release: 5%{?dist}
|
||||
Release: 1%{?dist}
|
||||
License: EPICS Open License
|
||||
Group: Development/Languages
|
||||
URL: https://git.psi.ch/epics_base/base-7.0
|
||||
@@ -43,12 +43,6 @@ This RPM is a binary-only package.
|
||||
%package host-devel
|
||||
Requires: make >= 3.80
|
||||
BuildRequires: make >= 3.80
|
||||
BuildRequires: gfa-cross-compiler-links
|
||||
%if %{?rhel} >= 9
|
||||
BuildRequires: gfa-wine
|
||||
%else
|
||||
BuildRequires: wine
|
||||
%endif
|
||||
|
||||
Summary: Minimal stuff needed to build EPICS host apps
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
@@ -84,7 +78,7 @@ Contains headers etc to build EPICS host applications.
|
||||
|
||||
###########################################
|
||||
|
||||
%if %{?rhel} > 8
|
||||
%if 0%{?rhel} > 8
|
||||
%package compat
|
||||
Summary: EPICS base %{EpicsVersion} for older RHEL versions
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
@@ -99,7 +93,7 @@ Contains EPICS binaries that run on older RHEL versions.
|
||||
%package wine
|
||||
Summary: EPICS base %{EpicsVersion} for wine
|
||||
Requires: %{name} = %{version}-%{release}
|
||||
%if %{?rhel} >= 9
|
||||
%if 0%{?rhel} >= 9
|
||||
Requires: gfa-wine
|
||||
%else
|
||||
Requires: wine
|
||||
@@ -133,6 +127,20 @@ BuildRequires: mingw64-gcc-c++
|
||||
BuildArch: noarch
|
||||
AutoReqProv: no
|
||||
|
||||
# For Windows cross build with wine:
|
||||
BuildRequires: gfa-cross-compiler-links
|
||||
%if 0%{?rhel} >= 9
|
||||
BuildRequires: gfa-wine
|
||||
Requires: gfa-wine
|
||||
%else
|
||||
BuildRequires: wine
|
||||
Requires: wine
|
||||
%endif
|
||||
|
||||
# For some 32 bit cross compilers
|
||||
BuildRequires: /lib/libc.so.6
|
||||
Requires: /lib/libc.so.6
|
||||
|
||||
%description devel
|
||||
All what is needed to develop EPICS for different target architectures.
|
||||
|
||||
@@ -206,7 +214,7 @@ shopt -s extglob
|
||||
/bin/sed 's!\$EPICS_BASE!%{prog_folder}!' epics-base.sh > %{buildroot}%{prog_folder}/bin/epics-base.sh
|
||||
|
||||
# copy over old libraries for compatibility
|
||||
%if %{?rhel} > 8
|
||||
%if 0%{?rhel} > 8
|
||||
%{__cp} /opt/RHEL8/lib64/libreadline.so.7 %{buildroot}%{prog_folder}/lib/RHEL8-x86_64
|
||||
%endif
|
||||
|
||||
@@ -294,7 +302,7 @@ fi
|
||||
|
||||
###########################################
|
||||
|
||||
%if %{?rhel} > 8
|
||||
%if 0%{?rhel} > 8
|
||||
|
||||
%files compat
|
||||
%dir %{prog_folder}/bin/RHEL8*
|
||||
@@ -304,7 +312,7 @@ fi
|
||||
%dir %{prog_folder}/lib/RHEL8*
|
||||
%{prog_folder}/lib/RHEL8*/*.so*
|
||||
|
||||
%if %{?rhel} > 9
|
||||
%if 0%{?rhel} > 9
|
||||
%dir %{prog_folder}/bin/RHEL9*
|
||||
%{prog_folder}/bin/RHEL9*/[Scips]*[^.]??
|
||||
%{prog_folder}/bin/RHEL9*/p2p
|
||||
|
||||
@@ -17,7 +17,7 @@ database_DEPEND_DIRS = ca
|
||||
|
||||
# Submodules for bundle build
|
||||
SUBMODULES += pvData
|
||||
pvData_DEPEND_DIRS = libcom
|
||||
pvData_DEPEND_DIRS = libcom database
|
||||
|
||||
SUBMODULES += pvAccess
|
||||
pvAccess_DEPEND_DIRS = pvData database
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
SUBMODULES += pcas
|
||||
pcas_DEPEND_DIRS = ca
|
||||
pcas_DEPEND_DIRS = libcom ca
|
||||
|
||||
@@ -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 ()
|
||||
*
|
||||
|
||||
@@ -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 )
|
||||
{
|
||||
|
||||
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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 & );
|
||||
|
||||
@@ -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 ()
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -53,5 +53,6 @@ int main(int argc,char **argv)
|
||||
status = -1;
|
||||
}
|
||||
errlogFlush();
|
||||
asFreeAll((ASBASE*)pasbase);
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -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 = (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
|
||||
|
||||
@@ -207,6 +207,7 @@ private:
|
||||
cacChannel::priLev );
|
||||
void flush (
|
||||
epicsGuard < epicsMutex > & );
|
||||
void sync ();
|
||||
unsigned circuitCount (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
void selfTest (
|
||||
|
||||
@@ -209,9 +209,9 @@ void testdbCaWaitForEventCB(void *raw)
|
||||
{
|
||||
struct waitPvt *pvt = raw;
|
||||
|
||||
epicsMutexMustLock(pvt->pca->lock);
|
||||
epicsMutexMustLock(workListLock);
|
||||
epicsEventMustTrigger(pvt->evt);
|
||||
epicsMutexUnlock(pvt->pca->lock);
|
||||
epicsMutexUnlock(workListLock);
|
||||
}
|
||||
|
||||
static
|
||||
@@ -239,8 +239,6 @@ void testdbCaWaitForEvent(DBLINK *plink, unsigned long cnt, enum testEvent event
|
||||
dbScanUnlock(plink->precord);
|
||||
|
||||
epicsEventMustWait(evt);
|
||||
/* ensure worker has finished executing */
|
||||
dbCaSync();
|
||||
|
||||
dbScanLock(plink->precord);
|
||||
epicsMutexMustLock(pca->lock);
|
||||
@@ -250,8 +248,15 @@ void testdbCaWaitForEvent(DBLINK *plink, unsigned long cnt, enum testEvent event
|
||||
pca->userPvt = NULL;
|
||||
}
|
||||
|
||||
epicsEventDestroy(evt);
|
||||
epicsMutexUnlock(pca->lock);
|
||||
|
||||
/* ensure worker has finished executing */
|
||||
dbCaSync();
|
||||
|
||||
epicsMutexMustLock(workListLock); /* lock to ensure that epicsEventMustTrigger() has returned */
|
||||
epicsEventDestroy(evt);
|
||||
epicsMutexUnlock(workListLock);
|
||||
|
||||
caLinkDec(pca);
|
||||
dbScanUnlock(plink->precord);
|
||||
}
|
||||
@@ -266,6 +271,10 @@ void testdbCaWaitForUpdateCount(DBLINK *plink, unsigned long cnt)
|
||||
testdbCaWaitForEvent(plink, cnt, testEventCount);
|
||||
}
|
||||
|
||||
// private access to access.cpp
|
||||
LIBCA_API
|
||||
void dbCaSyncLocal(void);
|
||||
|
||||
/* Block until worker thread has processed all previously queued actions.
|
||||
* Does not prevent additional actions from being queued.
|
||||
*/
|
||||
@@ -274,6 +283,8 @@ void dbCaSync(void)
|
||||
epicsEventId wake;
|
||||
caLink templink;
|
||||
|
||||
dbCaSyncLocal();
|
||||
|
||||
/* we only partially initialize templink.
|
||||
* It has no link field and no subscription
|
||||
* so the worker must handle it early
|
||||
|
||||
@@ -512,7 +512,7 @@ DBCORE_API long dbChannelGet(dbChannel *chan, short type,
|
||||
* \param[in] pfl Pointer to a db_field_log or NULL.
|
||||
* \returns 0, or an error status value.
|
||||
*
|
||||
* \since UNRELEASED If pfl is NULL and chan has filters, db_create_read_log() will be called
|
||||
* \since 7.0.10 If pfl is NULL and chan has filters, db_create_read_log() will be called
|
||||
* internally to create a temporary db_field_log which is passed to dbChannelGet()
|
||||
* then deallocated.
|
||||
*/
|
||||
|
||||
@@ -399,6 +399,23 @@ void dbContext::flush (
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void dbContextDummyExtraLabor(void *) {}
|
||||
|
||||
void dbContext::sync()
|
||||
{
|
||||
// ctx created lazily on first subscription
|
||||
{
|
||||
epicsGuard<epicsMutex> G(mutex);
|
||||
if(!ctx)
|
||||
return;
|
||||
}
|
||||
// assumes dbContext makes no other use of extra labor
|
||||
db_add_extra_labor_event(ctx, dbContextDummyExtraLabor, NULL);
|
||||
db_post_extra_labor(ctx);
|
||||
db_flush_extra_labor_event(ctx);
|
||||
}
|
||||
|
||||
unsigned dbContext::circuitCount (
|
||||
epicsGuard < epicsMutex > & guard ) const
|
||||
{
|
||||
|
||||
@@ -49,17 +49,84 @@ DBCORE_API int db_post_events (
|
||||
void *pRecord, void *pField, unsigned caEventMask );
|
||||
|
||||
typedef void EXTRALABORFUNC (void *extralabor_arg);
|
||||
/** @brief Allocate event reception context
|
||||
* @return NULL on error
|
||||
*
|
||||
* On success, call db_start_events(), and then eventually db_close_events().
|
||||
*
|
||||
* @pre Call after initHookAfterInitDatabase and before initHookBeforeFree.
|
||||
*/
|
||||
DBCORE_API dbEventCtx db_init_events (void);
|
||||
/** @brief Start listener thread
|
||||
* @param ctx Context
|
||||
* @param taskname Thread name
|
||||
* @param init_func If not NULL, call from the newly created listener thread
|
||||
* @param init_func_arg Argument to init_func
|
||||
* @param osiPriority Thread priority. See epicsThreadOpts::priority
|
||||
* @return DB_EVENT_OK Success. DB_EVENT_ERROR, failed to create new thread.
|
||||
*
|
||||
* Basic lifecycle:
|
||||
*
|
||||
* @code{.cpp}
|
||||
* dbEventCtx ctxt = db_init_events();
|
||||
* assert(ctxt);
|
||||
* int ret = db_start_events(ctxt, "mymodule", NULL, NULL, 0);
|
||||
* assert(ret==DB_EVENT_OK);
|
||||
* ... create and close subscriptions
|
||||
* db_close_events(ctxt);
|
||||
* @endcode
|
||||
*
|
||||
* Flow control initially disabled, so events can be delivered.
|
||||
*/
|
||||
DBCORE_API int db_start_events (
|
||||
dbEventCtx ctx, const char *taskname, void (*init_func)(void *),
|
||||
void *init_func_arg, unsigned osiPriority );
|
||||
/** @brief Stop and deallocate event reception context
|
||||
* @param ctx Context
|
||||
*
|
||||
* @pre Call after initHookAfterInitDatabase and before initHookBeforeFree.
|
||||
* @pre All dbEventSubscription must first be deallocated by db_cancel_event().
|
||||
* @post Joins event listener thread.
|
||||
*/
|
||||
DBCORE_API void db_close_events (dbEventCtx ctx);
|
||||
/** @brief Enable flow control, pause event delivery
|
||||
* @param ctx Context
|
||||
*/
|
||||
DBCORE_API void db_event_flow_ctrl_mode_on (dbEventCtx ctx);
|
||||
/** @brief Disable flow control, resume event delivery
|
||||
* @param ctx Context
|
||||
*/
|
||||
DBCORE_API void db_event_flow_ctrl_mode_off (dbEventCtx ctx);
|
||||
/** @brief Setup/Clear extra labor callback
|
||||
* @param ctx Context
|
||||
* @param func Extra labor callback, may be NULL to clear previously set callback.
|
||||
* @param arg Argument to func
|
||||
* @return DB_EVENT_OK, always succeeds.
|
||||
*
|
||||
* Does not queue callback. See db_post_extra_labor().
|
||||
*/
|
||||
DBCORE_API int db_add_extra_labor_event (
|
||||
dbEventCtx ctx, EXTRALABORFUNC *func, void *arg);
|
||||
/** @brief Wait for extra labor callback.
|
||||
*
|
||||
* @pre Do not call from event listener thread.
|
||||
* @post extra labor queued flag is unchanged
|
||||
*
|
||||
* To ensure completion, call should arrange that db_post_extra_labor() will
|
||||
* not be called again.
|
||||
*/
|
||||
DBCORE_API void db_flush_extra_labor_event (dbEventCtx);
|
||||
/** @brief Queue extra labor callback event
|
||||
* @param ctx Context
|
||||
* @return DB_EVENT_OK, always succeeds.
|
||||
*
|
||||
* Sets an internal queued flag, which still be set from a previous call.
|
||||
*/
|
||||
DBCORE_API int db_post_extra_labor (dbEventCtx ctx);
|
||||
/** @brief Change event listener thread priority
|
||||
* @param ctx Context
|
||||
* @param epicsPriority Thread priority. See epicsThreadOpts::priority
|
||||
*/
|
||||
DBCORE_API void db_event_change_priority ( dbEventCtx ctx, unsigned epicsPriority );
|
||||
|
||||
#ifdef EPICS_PRIVATE_API
|
||||
@@ -67,19 +134,106 @@ DBCORE_API void db_cleanup_events(void);
|
||||
DBCORE_API void db_init_event_freelists (void);
|
||||
#endif
|
||||
|
||||
/** @brief Subscription event callback
|
||||
* @param user_arg private argument passed to db_add_event()
|
||||
* @param chan dbChannel passed to db_add_event()
|
||||
* @param eventsRemaining Approximate number of events remaining in queued.
|
||||
* Not exact. Use is discouraged.
|
||||
* @param pfl db_field_log of this event.
|
||||
*
|
||||
* An event callback is expected to call dbChannelGetField() or take equivalent action.
|
||||
* eg. explicitly lock the record and call dbChannelGet().
|
||||
*
|
||||
* Callee must _not_ delete the db_field_log.
|
||||
*
|
||||
* @since 7.0.5, @code pfl->mask @endcode may be used to detect which condition(s)
|
||||
* triggered this event.
|
||||
*/
|
||||
typedef void EVENTFUNC (void *user_arg, struct dbChannel *chan,
|
||||
int eventsRemaining, struct db_field_log *pfl);
|
||||
|
||||
/** @brief Create subscription to channel
|
||||
* @param ctx Context
|
||||
* @param chan Channel
|
||||
* @param user_sub Event callback
|
||||
* @param user_arg Private argument
|
||||
* @param select Bit mask of DBE_VALUE and others. See caeventmask.h
|
||||
* @return NULL on error. On success, later call db_cancel_event()
|
||||
*
|
||||
* Creates a new subscription to the specified dbChannel.
|
||||
* Callbacks will be delivered on the listener thread of the provided Context.
|
||||
*
|
||||
* Creation does not queue any events.
|
||||
* Follow with a call to db_post_single_event() to queue an initial event.
|
||||
*
|
||||
* Subscription is initially disabled. Call db_event_enable();
|
||||
*
|
||||
* Basic lifecycle:
|
||||
*
|
||||
* @code{.cpp}
|
||||
* static
|
||||
* void mycb(void *priv, struct dbChannel *chan, int eventsRemaining, struct db_field_log *pfl) {
|
||||
* (void)eventsRemaining; // use not recommended
|
||||
*
|
||||
* // dbChannelGetField() locks record.
|
||||
* // May read value and meta-data from event (db_field_log).
|
||||
* long ret = dbChannelGetField(chan, ..., pfl);
|
||||
* }
|
||||
* void someaction() {
|
||||
* dbEventCtx ctx = ...; // previously created
|
||||
* dbChannel *chan = ...;
|
||||
* void *priv = ...;
|
||||
*
|
||||
* dbEventSubscription sub = db_add_event(ctx, chan, mycb, priv, DBE_VALUE|DBE_ALARM);
|
||||
* assert(sub);
|
||||
* db_cancel_event(sub);
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
DBCORE_API dbEventSubscription db_add_event (
|
||||
dbEventCtx ctx, struct dbChannel *chan,
|
||||
EVENTFUNC *user_sub, void *user_arg, unsigned select);
|
||||
/** @brief Deallocate subscription
|
||||
* @param es Subscription. Must not be NULL.
|
||||
*
|
||||
* Synchronizes with Event Context worker thread to wait for a concurrent callback
|
||||
* to complete.
|
||||
*/
|
||||
DBCORE_API void db_cancel_event (dbEventSubscription es);
|
||||
/** @brief Immediately attempt to queue an event with the present value
|
||||
* @param es Subscription
|
||||
*
|
||||
* Locks record and runs pre-chain of any server-side filters.
|
||||
* Such a filter may drop the new event (a well designed filter should not drop the first event).
|
||||
*/
|
||||
DBCORE_API void db_post_single_event (dbEventSubscription es);
|
||||
/** @brief Enable subscription callback delivery
|
||||
* @param es Subscription
|
||||
*/
|
||||
DBCORE_API void db_event_enable (dbEventSubscription es);
|
||||
/** @brief Disable subscription callback delivery
|
||||
* @param es Subscription
|
||||
*
|
||||
* Does __not__ synchronize with listener thread, pending callbacks may be delivered.
|
||||
* Use extra-labor mechanism and db_flush_extra_labor_event() to synchronize.
|
||||
*/
|
||||
DBCORE_API void db_event_disable (dbEventSubscription es);
|
||||
|
||||
/** @brief Allocate subscription update event.
|
||||
* @param pevent Subscription
|
||||
* @return NULL on allocation failure.
|
||||
*/
|
||||
DBCORE_API struct db_field_log* db_create_event_log (struct evSubscrip *pevent);
|
||||
/** @brief Allocate "read" event.
|
||||
* @param pevent Subscription
|
||||
* @return NULL on allocation failure.
|
||||
*
|
||||
* Used by PVA or CA "GET" operations when polling the current value of a Channel.
|
||||
*/
|
||||
DBCORE_API struct db_field_log* db_create_read_log (struct dbChannel *chan);
|
||||
/** @brief db_delete_field_log
|
||||
* @param pfl event structure. May be NULL (no-op).
|
||||
*/
|
||||
DBCORE_API void db_delete_field_log (struct db_field_log *pfl);
|
||||
DBCORE_API int db_available_logs(void);
|
||||
|
||||
@@ -90,4 +244,40 @@ DBCORE_API int db_available_logs(void);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @file dbEvent.h
|
||||
*
|
||||
* Internal publish/subscribe mechanism of process database.
|
||||
* Direct usage is discouraged in favor of derived interfaces,
|
||||
* principally local and remote PVA/CA.
|
||||
*
|
||||
* @since 7.0.8.1 New usage is recommended to define the USE_TYPED_DBEVENT C macro to select
|
||||
* typed arguments of some calls as opposed to void pointers.
|
||||
*
|
||||
* @section dbeventobjects Objects
|
||||
*
|
||||
* - Event context (dbEventCtx)
|
||||
* - Event subscription (dbEventSubscription)
|
||||
* - Channel (dbChannel)
|
||||
* - Event / field log (db_field_log)
|
||||
*
|
||||
* @section dbeventlifecycle Lifecycle
|
||||
*
|
||||
* Usage is tied to the lifetime of the process database.
|
||||
* Either through @ref inithooks or @ref dbunittest .
|
||||
* db_init_events() must not be called before initHookAfterInitDatabase or testIocInitOk().
|
||||
* db_close_events() must be called after initHookBeforeFree or testIocShutdownOk().
|
||||
*
|
||||
* @note testMonitorCreate() and friends are provided to easy handling of
|
||||
* subscriptions in unit tests.
|
||||
*
|
||||
* Subscriptions associated with an Event Context must be deallocated before
|
||||
* that Context is deallocated.
|
||||
*
|
||||
* @section dbeventthread Concurrency
|
||||
*
|
||||
* Each Event Context has an associated worker thread on which subscription callbacks are invoked.
|
||||
* Some API functions implicitly synchronize with that worker thread as noted.
|
||||
* The "extra labor" functions may be used to explicitly synchronize with this thread.
|
||||
*/
|
||||
|
||||
#endif /*INCLdbEventh*/
|
||||
|
||||
@@ -143,7 +143,7 @@ DBCORE_API void dbsr(unsigned level);
|
||||
DBCORE_API int dbServerClient(char *pBuf, size_t bufSize);
|
||||
|
||||
/** @brief CPP Macro indicating the dbServerStats() routine exists.
|
||||
* @since UNRELEASED
|
||||
* @since 7.0.10
|
||||
*/
|
||||
#define HAS_DBSERVER_STATS
|
||||
|
||||
@@ -161,7 +161,7 @@ DBCORE_API int dbServerClient(char *pBuf, size_t bufSize);
|
||||
* variables and returns the number of dbServer::stats() methods called,
|
||||
* 0 if a named server wasn't found or doesn't have a stats() method.
|
||||
*
|
||||
* @since UNRELEASED
|
||||
* @since 7.0.10
|
||||
*/
|
||||
DBCORE_API int dbServerStats(const char *name, unsigned *channels,
|
||||
unsigned *clients);
|
||||
|
||||
@@ -6,13 +6,6 @@
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/** @file dbUnitTest.h
|
||||
* @brief Helpers for unittests of process database
|
||||
* @author Michael Davidsaver, Ralph Lange
|
||||
*
|
||||
* @see @ref dbunittest
|
||||
*/
|
||||
|
||||
#ifndef EPICSUNITTESTDB_H
|
||||
#define EPICSUNITTESTDB_H
|
||||
|
||||
@@ -167,7 +160,7 @@ DBCORE_API void testMonitorWait(testMonitor*);
|
||||
*
|
||||
* On return, any updates previously posted for this subscriptions have been delivered.
|
||||
*
|
||||
* @since UNRELEASED
|
||||
* @since 7.0.10
|
||||
*/
|
||||
DBCORE_API void testMonitorSync(testMonitor*);
|
||||
/** Return the number of monitor events which have occurred since create,
|
||||
@@ -204,15 +197,19 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
}
|
||||
#endif
|
||||
|
||||
/** @page dbunittest Unit testing of record processing
|
||||
/** @file dbUnitTest.h
|
||||
* @brief Helpers for unittests of process database
|
||||
* @author Michael Davidsaver, Ralph Lange
|
||||
*
|
||||
* @see @ref epicsUnitTest.h
|
||||
* @section dbunittest Unit testing of record processing
|
||||
*
|
||||
* @see @ref unittest
|
||||
*
|
||||
* @section dbtestskel Test skeleton
|
||||
*
|
||||
* For the impatient, the skeleton of a test:
|
||||
*
|
||||
* @code
|
||||
* @code{.c}
|
||||
* #include <dbUnitTest.h>
|
||||
* #include <testMain.h>
|
||||
*
|
||||
@@ -236,7 +233,7 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* @code
|
||||
* @code{make}
|
||||
* TOP = ..
|
||||
* include $(TOP)/configure/CONFIG
|
||||
*
|
||||
@@ -254,6 +251,27 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
* include $(TOP)/configure/RULES
|
||||
* @endcode
|
||||
*
|
||||
* Discussion:
|
||||
*
|
||||
* Some tests require the context of an IOC to be run. This conflicts with the
|
||||
* idea of running multiple tests within a test harness, as iocInit() is only
|
||||
* allowed to be called once, and some parts of the full IOC (e.g. the rsrv CA
|
||||
* server) can not be shut down cleanly. The function iocBuildIsolated() allows
|
||||
* to start an IOC without its Channel Access parts, so that it can be shutdown
|
||||
* quite cleanly using iocShutdown(). This feature is only intended to be used
|
||||
* from test programs, do not use it on production IOCs. After building the
|
||||
* IOC using iocBuildIsolated() or iocBuild(), it has to be started by calling
|
||||
* iocRun().
|
||||
*
|
||||
* The part from iocBuildIsolated() to iocShutdown() can be repeated to
|
||||
* execute multiple tests within one executable or harness.
|
||||
*
|
||||
* To make it easier to create a single test program that can be built for
|
||||
* both the embedded and workstation operating system harnesses, the header file
|
||||
* testMain.h provides a convenience macro MAIN() that adjusts the name of the
|
||||
* test program according to the platform it is running on: main() on
|
||||
* workstations and a regular function name on embedded systems.
|
||||
*
|
||||
* @section dbtestactions Actions
|
||||
*
|
||||
* Several helper functions are provided to interact with a running database.
|
||||
@@ -276,7 +294,7 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
*
|
||||
* @see enum dbfType in dbFldTypes.h
|
||||
*
|
||||
* @code
|
||||
* @code{.c}
|
||||
* testdbPutFieldOk("pvname", DBF_ULONG, (unsigned int)5);
|
||||
* testdbPutFieldOk("pvname", DBF_FLOAT, (double)4.1);
|
||||
* testdbPutFieldOk("pvname", DBF_STRING, "hello world");
|
||||
@@ -324,7 +342,7 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
* When possible, the best way to avoid this race would be to join the worker
|
||||
* before destroying the event.
|
||||
*
|
||||
* @code
|
||||
* @code{.c}
|
||||
* epicsEventId evt;
|
||||
* void thread1() {
|
||||
* epicsThreadOpts opts = EPICS_THREAD_OPTS_INIT;
|
||||
@@ -346,7 +364,7 @@ DBCORE_API void testGlobalUnlock(void);
|
||||
* that epicsEventMustSignal() has returned before destroying the event.
|
||||
* testGlobalLock() and testGlobalUnlock() provide access to such a mutex.
|
||||
*
|
||||
* @code
|
||||
* @code{.c}
|
||||
* epicsEventId evt;
|
||||
* void thread1() {
|
||||
* evt = epicsEventMustCreate(...);
|
||||
|
||||
@@ -86,7 +86,7 @@ input links, and returns a double-precision floating-point result. The
|
||||
expression is evaluated by the EPICS Calc engine, and the result is returned as
|
||||
the value of the link.
|
||||
|
||||
Since UNRELEASED the number of inputs has been increased from 12 to 21.
|
||||
Since 7.0.10 the number of inputs has been increased from 12 to 21.
|
||||
|
||||
Two additional expressions may also be provided and are evaluated to determine
|
||||
whether the record owning the link should be placed in alarm state. In both
|
||||
@@ -130,7 +130,9 @@ An optional expression that returns non-zero to raise a minor alarm.
|
||||
|
||||
A JSON list of up to 24 input arguments for the expression, which are assigned
|
||||
to the inputs C<A>, C<B>, C<C>, ... C<U>. Each input argument may be either a
|
||||
numeric literal or an embedded JSON link inside C<{}> braces. The same input
|
||||
numeric literal or an embedded JSON link inside C<{}> braces. A C<pva> link
|
||||
could provide values from another record in this or other IOCs if built in, but
|
||||
the built-in non-JSON CA or DB link types are not supported. The same input
|
||||
values are provided to the two alarm expressions as to the primary expression.
|
||||
|
||||
=item out
|
||||
|
||||
@@ -14,7 +14,7 @@ and logical operations on values retrieved from other records. The result
|
||||
of its operations can then be accessed by another record so that it can
|
||||
then be used.
|
||||
|
||||
Since UNRELEASED the number of inputs has been increased from 12 to 21.
|
||||
Since 7.0.10 the number of inputs has been increased from 12 to 21.
|
||||
|
||||
=head2 Parameter Fields
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ rather than the DBF_STRING fields used in the Wait record. For new
|
||||
databases, it is recommended that the Calcout record be used instead of the
|
||||
Wait record.
|
||||
|
||||
Since UNRELEASED the number of inputs has been increased from 12 to 21.
|
||||
Since 7.0.10 the number of inputs has been increased from 12 to 21.
|
||||
|
||||
=head2 Parameter Fields
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ The Data Fanout or "dfanout" record is used to forward data to up to
|
||||
capability to forward data has been added to it. It has no associated
|
||||
device support.
|
||||
|
||||
Since UNRELEASED the number of output links has been increased
|
||||
Since 7.0.10 the number of output links has been increased
|
||||
from 8 to 16 and IVOA and IVOV fields have been added.
|
||||
|
||||
=head2 Parameter Fields
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user