Compare commits

..

84 Commits

Author SHA1 Message Date
fdb0912b1e fix rpm dependencies 2026-01-27 15:17:13 +01:00
b5f73d8200 Merge branch '7.0' into PSI-7.0 2026-01-27 15:17:04 +01:00
1d835c0922 secure for non-rhel builds 2026-01-22 09:28:31 +01:00
Heinz Junkes
d3e414cbec udp socket functions with timeout 2026-01-21 10:04:48 -06:00
Michael Davidsaver
84d4627987 more doc dbEvent.h 2026-01-21 09:55:13 -06:00
Michael Davidsaver
839e7f4959 move dbUnitTest discussion to dbUnitTest.h 2026-01-21 09:55:13 -06:00
Michael Davidsaver
d724461f1c doc: remove @page directions
readthedocs build does not include these.
2026-01-21 09:55:13 -06:00
Michael Davidsaver
c52800fd4a appveyor: remove global email notification 2026-01-16 10:06:08 -06:00
Andrew Johnson
782d6bb441 Use compiler for dependencies, mkmf.pl is the last resort 2026-01-12 16:50:47 -06:00
5f3a4a01cc bump rpm version to 7.0.10.1-0 2026-01-12 15:41:20 +01:00
e84a3c203a put back strict-aliasing suppression 2026-01-12 15:41:20 +01:00
e4c06e9b93 drop 32 bit mingw 2026-01-12 10:43:43 +01:00
76a89b8cee add function attributes __malloc__ and __alloc_size__ for gcc and clang 2026-01-09 12:05:08 +01:00
9748cbd394 Fix gcc warning 'stringop-truncation' 2026-01-09 12:05:07 +01:00
422182d672 allow testing deprecating functions without warnings 2026-01-09 12:05:07 +01:00
030973c6e4 Update the __cplusplus macro to the correct value on Windows 2026-01-09 12:05:07 +01:00
f08fcfdb39 fix dir dependencies 2026-01-09 12:04:49 +01:00
Michael Davidsaver
59b595f8cf appveyor use python3.8 2026-01-08 08:46:43 -08:00
80c708fdeb add function attributes __malloc__ and __alloc_size__ for gcc and clang 2026-01-07 09:59:31 -06:00
Michael Davidsaver
b2ed8bb98d doc dbEvent.h 2026-01-07 09:54:41 -06:00
3d95dece6b Merge 7.0.10 into PSI-7.0 2026-01-06 14:57:16 +01:00
7fa82f103b upgrade to gcc 15 2026-01-06 13:57:39 +01:00
6cd4b24e8a add missing dependencies 2026-01-06 13:57:27 +01:00
f572a0f068 silent build 2026-01-06 13:56:37 +01:00
1ebf9ad567 don't build tests for rpm 2026-01-06 13:56:23 +01:00
4a5d3ddf85 fix parallel builds 2026-01-06 13:56:15 +01:00
3a8f5fa9b1 removed config files for no longer used architectures 2026-01-06 13:55:35 +01:00
Michael Davidsaver
71e4635d34 fix testdbCaWaitForEvent()
sync with CA context thread(s) as well as dbCa worker.
2026-01-01 19:07:10 -08:00
Andrew Johnson
bbc4c6358e Update modules/* submodules to HEAD 2026-01-01 15:24:23 -06:00
12c56ffc95 upcast int to size_t to prevent overflow 2025-12-17 16:34:58 -08:00
2bd148ab37 add comment why cast is needed 2025-12-17 16:34:58 -08:00
209e1f9587 remove some unnecessary casts to (const char*) too 2025-12-17 16:34:58 -08:00
6d85a36397 remove needless pointer casts 2025-12-17 16:34:58 -08:00
85347172c6 fix clang warning missing-braces
../fdManagerTest.cpp:76:29: warning: suggest braces around initialization of subobject [-Wmissing-braces]
   76 |         osiSockAddr addr = {0};
      |                             ^
      |                             {}
2025-12-15 16:17:56 -08:00
ef2260f433 gcc < 5 does not know #pragma GCC diagnostic push
But it also does not know warning -Wformat-security.
2025-12-15 16:16:53 -08:00
22347af170 use c++ style output to avoid porability problems with printf format 2025-12-15 16:15:15 -08:00
c811ce218e fix format warning on mingw
Since we use gnu_printf format on mingw, the windows "I" modifier
is no longer recognized by the format checker. Use "ll" instead.
Meanwhile, MSVC understands that as well.
2025-12-15 16:15:15 -08:00
Andrew Johnson
623409466d Updates to the Release Checklist 2025-12-15 17:17:57 -06:00
Andrew Johnson
d31568fe9a Update core version numbers after tagging 2025-12-15 17:15:40 -06:00
Andrew Johnson
bf11a0c31c Generate RELEASE-7.0.10.md notes file 2025-12-15 17:11:22 -06:00
Andrew Johnson
24d422e6c3 Set core version numbers for release 2025-12-15 17:04:57 -06:00
Andrew Johnson
a49df15d0b Another PR release note 2025-12-15 17:03:03 -06:00
Andrew Johnson
3f24e1800e Replace UNRELEASED => 7.0.10 2025-12-15 16:39:00 -06:00
Andrew Johnson
93d6137d23 Add submodule release note entries 2025-12-15 15:53:01 -06:00
Andrew Johnson
cabbc44bf9 Update git submodules for release 2025-12-15 15:46:04 -06:00
Edmund Blomley
7d6ef32502 Docs: Mention that pva is supported for JSON links 2025-12-12 18:05:08 -06:00
Andrew Johnson
644bf7dfef Convert Release Checklist to Markdown 2025-12-12 15:27:27 -06:00
Andrew Johnson
87f5e4b699 Various fixes to the new-notes files 2025-12-12 12:41:41 -06:00
Andrew Johnson
2e3938da6f Split PR-624 release notes
This removes the language specification and BNF descriptions from the
PR release notes (they're too long for that) to a separate document
in the libcom/src/as area. That should be combined into the chapter
on Access Security from the AppDevGuide someday.
2025-12-12 10:59:23 -06:00
Minijackson
4b6a6ddc7a iocsh.h: import documentation from AppDevGuide, minor tweaks
This imports the function-specifics that were documented in the
Application Developer's Guide, section "IOC Shell".

Other changes include:

- Removing unneeded "@typedef" and "@enum"
- Adding "()" and "@ref" for interlinking
- Removing duplicated documentation between
  iocsh & iocshLoad, and iocshCmd & iocshRun

Supports the PR:

https://github.com/epics-docs/epics-docs/pull/141
2025-12-08 12:14:56 -06:00
Michael Davidsaver
c2140ad0f3 doc clarify callbackRequestDelayed() timer allocation 2025-12-03 18:09:10 -08:00
Michael Davidsaver
186106cd33 process doc comments in callback.h
Also change doxygen annotation style from '\' to '@'
2025-12-03 17:23:11 -08:00
Michael Davidsaver
baa4cb5495 doc and callbackSetQueueSize sanity check 2025-12-03 17:14:10 -08:00
Michael Davidsaver
7ae3e4c2df epicsTimerTest: assert timers not expiring early 2025-12-03 17:08:48 -08:00
Michael Davidsaver
01360b2a69 Avoid early expiration of timers on !RTOS 2025-12-03 17:08:48 -08:00
Michael Davidsaver
491d532170 doc epicsSnprintf()
Document that epicsSnprintf() adds a nil on success,
capacity permitting.

Note OS specific ambiguity on error.  Linux and MSVC
inject nil for most failures (bad format).
Not clear if vxworks/fioFormatV() does.

Not clear if long description of non-compliant
return value is still accurate.
2025-12-03 10:04:33 -06:00
Michael Davidsaver
cc98ef8696 doc: epicsThread.h
Describe lifetime of epicsThreadId for a newly created thread.
2025-12-03 09:46:39 -06:00
Michael Davidsaver
1910478297 Ensure pthreadInfo->tid initialized for both creator and new thread 2025-12-03 09:46:39 -06:00
Michael Davidsaver
214b5d935b posix: correct race and mis-count in epicsThreadCreateOpt()
Corrects two issues.  012139638d
added a dec-ref in the status==EPERM path, but neglected to
add a matching inc-ref.  So if a joinable pthread_create()
actually errored with EPERM, then no reference is left for the
joiner.

Secondly, and far more suble, is a data race if pthread_create()
succeeds in starting a new thread, which ends and free()'s
pthreadInfo before pthread_create() writes pthreadInfo->tid .
2025-12-03 09:46:39 -06:00
90a727c901 Fix spelling errors
Most errors found with:

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

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

c++20: Do not use apostrophe (e.g. can't) in unquoted #error message
2025-12-01 19:00:04 -08:00
Andrew Johnson
4f547230c4 CI - GHA Job fixes, standardize config
- Fix MSC-22 c++14 job to actually set -std:c++14
- Move job names to the first line of the job settings
- Group & reorder jobs
2025-12-01 15:45:15 -06:00
george-mcintyre
e5618326c9 Add detailed ACF forward compatibility documentation. 2025-11-23 14:03:47 -08:00
Michael Davidsaver
45e3e58a1f asLib: fix generic lexer/parser 2025-11-23 14:03:47 -08:00
Michael Davidsaver
1f4b39cd08 ascheck cleanup 2025-11-23 14:03:47 -08:00
george-mcintyre
9b532540bf Introduce Future Proofing to ACF parsing.
- Allow ACF files to contain sections that are unsupported
- introduce a pragma disable-strict-parsing to disable strict parsing and allow files to be accepted

Add tests for future proof parser functionaluty

Expanded tests for Access Security configurations to validate parsing behaviors for unsupported elements. Added detailed cases covering invalid formats, unsupported modifications, and acceptable configurations while maintaining future-proofing and backward compatibility assurances.

Refactor parser to handle generic items and floating-point tokens

Replaced "unsupported elements" with a more flexible "generic items" mechanism to enhance parser extensibility. Added support for floating-point numbers in parsing rules. Updated tests and rules to reflect these changes, ensuring better handling of nested and unknown configurations.

Add warnings for unsupported ACF elements and update tests

Introduced `yywarn` to log warnings for unsupported ACF elements, rule permissions, and conditions in `asLib.y`. Updated test configuration to replace generic placeholders with more descriptive names. Adjusted test cases and reduced the test plan count to reflect the changes.

Remove unused strictParsing logic and improve error handling.

Removed strictParsing variable and related code as it was no longer in use. Enhanced error messaging and parsing logic for handling unsupported elements. Updated test cases for better clarity and expanded coverage of edge cases.

Enhance ASLib parsing with Int64/Float64 support.

Updated ASLib to utilize 64-bit integers and floats for improved parsing precision. Replaced legacy parsing methods with epics-friendly functions, improved error handling, and adjusted tests and grammar accordingly.

Refactor AS parser to separate non-rule keywords

Introduced a new `non_rule_keyword` type and moved `tokenASG` and `tokenRULE` under it for better logical grouping. This improves parser clarity and maintains a clean separation of keyword types.

Add rule-specific parsing for generic block elements

Introduce new rules for parsing rule-specific generic block elements and their names. This enhances the grammar to handle additional cases while maintaining memory management and error handling. Adjust references to use the new rule where applicable.

Refactor grammar rules in asLib.y to remove remaining shift/reduce conflict

Reorganize and refine grammar rules for handling generic elements, blocks, and lists. Simplifies the structure while introducing clearer distinctions between different constructs. This enhances maintainability and removes ambiguities in parsing.
2025-11-23 14:03:47 -08:00
Michael Davidsaver
46ecf5d25c Revert "Fetch the custom cfg/CONFIG_* files early"
This reverts commit e4fbd83c93.
2025-11-20 14:50:16 -08:00
Michael Davidsaver
b893ae080e update GHA 2025-11-20 14:50:16 -08:00
Jerzy Jamroz
84b4a5f63c Doc: Fix array field descriptions
* fix(aao, aai): change VAL field type from DOUBLE[] to FTVL[]

* fix(aSub): change 'Input Value Fields' type from FT[A–U] to FT[A–U][NOA–NOU]

* fix(aSub): change 'Output Value Fields' type from FTV[A–U] to FTV[A–U][NOVA–NOVU]

* fix(waveform): change VAL field type from FTVL to FTVL[NELM]

* fix(aai): remove 'analog' from the record name

* fix(aao): remove 'analog' from the record name

* fix(aai,aao): remove 'Analog' from the record names
2025-11-19 10:47:23 -06:00
Ralph Lange
4acae4c602 PR #737: add Release Note snippet 2025-11-19 10:25:42 -06:00
Ralph Lange
0916cf985c libCom/posix: don't memlock() if opted out of FIFO scheduling 2025-11-19 10:25:42 -06:00
Ralph Lange
862272d666 libCom/posix: add env var to opt out of FIFO scheduling
- add EPICS_ALLOW_POSIX_THREAD_PRIORITY_SCHEDULING
  (default: YES)
- start EPICS threads with default policy
  when set to NO
2025-11-19 10:25:42 -06:00
Chris Johns
b308be3273 rtems: Add arm/xilinx-microzed configuration
- This BSP works with SMP enabled and with LibBSD.
2025-11-06 01:10:50 -06:00
6c2cbe0101 Update normativeTypes to fix NTNDArray::getValueSize (#732)
* Update normativeTypes to fix NTNDArray::getValueSize

* Update normativeTypes for Release Notes

---------

Co-authored-by: Andrew Johnson <anj@anl.gov>
2025-11-05 14:17:31 -06:00
bef86189d5 CI fix windows cplusplus
* fix misspelled MSVC command line flag

* add windows builds with updated __cplusplus macro
2025-11-05 10:13:18 -06:00
88bfd6f378 Allow hex and octal strings in dbPut and dbGet
Setting EPICS_DB_CONVERT_DECIMAL_ONLY to YES/yes change the dbPut() and dbGet()
string to integer conversions to the original decimal only policy.
2025-11-05 10:11:06 -06:00
Michael Davidsaver
e08d7310b9 posix: epicsThreadShowAll include OSD priority range and mlockall state 2025-11-05 09:59:50 -06:00
Jerzy Jamroz
d58d1420b8 docs: clarify Drive Limits behavior in aoRecord 2025-11-05 09:36:49 -06:00
Andrew Johnson
e12269c302 Include readline.h before EPICS headers 2025-10-24 13:13:03 -05:00
Andrew Johnson
8311a5b360 Disable epicsStdio.h redefinitions
readline.h uses printf in an attribute
2025-10-24 12:22:54 -05:00
Andrew Johnson
6e6cac09e1 Add module version numbers to Perl modules that might need them 2025-10-19 16:25:36 -04:00
Michael Davidsaver
3f382f6b68 Revert "dbCa: iocInit wait for local CA links to connect"
This reverts commit a46bd5ae88.
2025-10-17 14:51:46 -07:00
Michael Davidsaver
a46bd5ae88 dbCa: iocInit wait for local CA links to connect 2025-10-14 19:45:15 -07:00
Michael Davidsaver
098b3968d6 doc 2025-10-14 19:44:53 -07:00
Gustavo de Souza dos Reis
0ab956b123 Fix doc. comments in epicsEvent.h
* Fix typo in epicsEventWaitWithTimeout.

* Reword epicsEvent timeout documentation to reflect the actual behavior.

Negative values of timeout are handled the same way as zero values.
Change the documentation to reflect this behavior.
2025-10-14 08:47:59 -07:00
133 changed files with 3258 additions and 1368 deletions

View File

@@ -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

View File

@@ -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

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

View File

@@ -50,9 +50,9 @@ jobs:
matrix:
# Job names also name artifacts, character limitations apply
include:
- os: ubuntu-24.04
- name: "Ub-24 gcc c++20 Werror"
os: ubuntu-24.04
cmp: gcc
name: "Ub-24 gcc-13 c++20 Werror"
# Turn all warnings into errors,
# except for those we could not fix (yet).
# Remove respective -Wno-error=... flag once it is fixed.
@@ -73,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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -1,3 +0,0 @@
include $(CONFIG)/os/CONFIG.Common.linux-clang
BUILD_CLASS = HOST

View File

@@ -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

View File

@@ -1,2 +0,0 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.2

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,2 +0,0 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc603_long
VXWORKS_VERSION = 6.6

View File

@@ -1,2 +0,0 @@
include $(CONFIG)/os/CONFIG.Common.vxWorks-ppc604_long
VXWORKS_VERSION = 6.6

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 =

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -1,2 +0,0 @@
# Include common linux definitions
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86

View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
include $(CONFIG)/os/CONFIG.linux-x86_64.win32-x86-mingw

View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
include $(CONFIG)/os/CONFIG.linux-x86_64.win32-x86-mingw

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1 +0,0 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.win32-x86-mingw

View File

@@ -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

View File

@@ -1 +0,0 @@
include $(CONFIG)/os/CONFIG_SITE.linux-x86_64.win32-x86-mingw

View File

@@ -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

View File

@@ -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-

View File

@@ -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

View File

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

View File

@@ -64,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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,23 +0,0 @@
### New `afterIocRunning` IOC Shell Command Added
This release incorporates [PR #558](https://github.com/epics-base/epics-base/pull/558) which added a new IOC shell command `afterIocRunning`. This command allows startup scripts to schedule arbitrary commands to be executed automatically after the IOC initialization phase (`iocInit`).
`afterIocRunning` allows you to write better-structured IOC shell files to include in your startup scripts without tracking where `iocInit` is located (and how IOC is deployed) e.g.:
- to achieve the best maintainability (e.g. encapsulation of the context into one file),
- to improve writing boot sequences,
- to improve IOC startup flexibility and scripting capabilities,
- it replaces the community [`afterInit`](https://github.com/paulscherrerinstitute/iocsh_utilities/blob/master/afterInit.c) and [`doAfterIocInit`](https://github.com/epics-modules/std/blob/master/stdApp/src/delayCmd.cpp) IOC shell commands,
- community usage examples:
- [`pf4filters.iocsh`](https://github.com/epics-modules/optics/blob/master/opticsApp/iocsh/pf4filters.iocsh) - enable/disable with a single comment ([full description](https://github.com/epics-base/epics-base/pull/558#issuecomment-2430057167))
- [ALS-U autosave 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"`

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,32 +0,0 @@
### Expand the use of colour in the IOCs output
This release includes various changes to iocsh.cpp and elsewhere to add and
expand the use of color:
- When loading a startup script, the IOC Shell now displays comment lines in
blue, and uses bold to make command lines stand out from other text.
- The `softIoc -v` output also uses the above color scheme for the commands it
prints.
- The default IOC Shell prompt is now displayed in green; this color can be
modified in the `configure/CONFIG_SITE_ENV` file for all targets, or set for
a specific target by adding a `configure/os/CONFIG_SITE_ENV.<arch>` file.
The value of the `IOCSH_PS1` environment 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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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`.

View File

@@ -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.

View File

@@ -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.

View File

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

View File

@@ -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

View File

@@ -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

View File

@@ -1,2 +1,2 @@
SUBMODULES += pcas
pcas_DEPEND_DIRS = ca
pcas_DEPEND_DIRS = libcom ca

View File

@@ -717,6 +717,18 @@ int epicsStdCall ca_context_status ( ca_client_context * pcac, unsigned level )
return ECA_NORMAL;
}
extern "C"
LIBCA_API
void dbCaSyncLocal(void);
void dbCaSyncLocal(void)
{
if(struct ca_client_context * ctxt = ca_current_context()) {
// bounce for access to private data member
ctxt->sync();
}
}
/*
* ca_current_context ()
*

View File

@@ -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 )
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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
{

View File

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

View File

@@ -116,6 +116,12 @@ const char * netiiu::pHostName (
return pHostNameNetIIU;
}
unsigned netiiu::getHostMinorProtocol (
epicsGuard < epicsMutex > & ) const throw ()
{
return CA_UKN_MINOR_VERSION;
}
osiSockAddr netiiu::getNetworkAddress (
epicsGuard < epicsMutex > & ) const
{

View File

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

View File

@@ -64,6 +64,8 @@ public:
chid pChan, char * pBuf, unsigned bufLength );
friend const char * epicsStdCall ca_host_name (
chid pChan );
friend unsigned epicsStdCall ca_host_minor_protocol (
chid pChan );
friend const char * epicsStdCall ca_name (
chid pChan );
friend void epicsStdCall ca_set_puser (
@@ -347,6 +349,7 @@ public:
void destroyPutCallback ( epicsGuard < epicsMutex > &, putCallback & );
void destroySubscription ( epicsGuard < epicsMutex > &, oldSubscription & );
epicsMutex & mutexRef () const;
void sync();
template < class T >
void whenThereIsAnExceptionDestroySyncGroupIO ( epicsGuard < epicsMutex > &, T & );

View File

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

View File

@@ -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,

View File

@@ -1342,6 +1342,12 @@ const char * udpiiu::pHostName (
return netiiu::pHostName ( cacGuard );
}
unsigned udpiiu::getHostMinorProtocol (
epicsGuard < epicsMutex > & cacGuard ) const throw ()
{
return netiiu::getHostMinorProtocol ( cacGuard );
}
bool udpiiu::ca_v42_ok (
epicsGuard < epicsMutex > & cacGuard ) const
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -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.
*/

View File

@@ -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
{

View File

@@ -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*/

View File

@@ -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);

View File

@@ -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(...);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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