Compare commits

...

64 Commits

Author SHA1 Message Date
Andrew Johnson
abfe30ef13 Set version numbers for release
Some checks failed
Base / CentOS-7 (push) Failing after 1s
Base / CentOS-8 (push) Failing after 2s
Base / Fedora-33 (push) Failing after 1s
Base / Fedora-latest (push) Failing after 2s
Base / Win2019 MSC-19, static (push) Has been cancelled
Base / Ub-20 clang-10 C++11 (push) Has been cancelled
Base / MacOS clang-12 (push) Has been cancelled
Base / Ub-20 clang-10 (push) Has been cancelled
Base / Ub-20 gcc-9 + MinGW (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-4.10 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-4.9 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 beatnik (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 pc686 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 uC5282 (push) Has been cancelled
Base / Ub-20 gcc-9 + RT-5.1 xilinx_zynq_a9_qemu (push) Has been cancelled
Base / Win2019 mingw (push) Has been cancelled
Base / Ub-20 gcc-9 C++11, static (push) Has been cancelled
Base / Ub-20 gcc-9 + MinGW, static (push) Has been cancelled
Base / Win2019 MSC-19, debug (push) Has been cancelled
Base / Win2019 MSC-19 (push) Has been cancelled
2021-10-06 20:11:17 -05:00
Andrew Johnson
9895ee8b53 Release notes 2021-10-06 20:06:22 -05:00
Andrew Johnson
78b7441383 Checkout submodules for release 2021-10-06 17:23:31 -05:00
Andrew Johnson
48d070d29d UNRELEASED => EPICS 7.0.6.1 for Release 2021-10-06 15:28:20 -05:00
Andrew Johnson
a5864e152b Adjust Doxygen annotation comments 2021-10-06 15:21:36 -05:00
Andrew Johnson
b6da758275 Merge the mbboDirect-bit-fields branch into 7.0
Fixes: lp: #1939568
2021-10-05 17:21:18 -05:00
Andrew Johnson
59ee7b32bc "Desired Output": change "Loc" to "Link" in prompt string 2021-10-05 00:19:50 -05:00
Andrew Johnson
3f43b0bb8a Record POD updates
Mostly fixing links and adding some field tables.
Some rewriting of descriptions.
2021-10-04 23:57:01 -05:00
Andrew Johnson
e867b0a095 mbboDirect: Document the behavior changes
Wording assumes this will go into the EPICS 7.0.6.1 release.
2021-10-04 23:36:01 -05:00
Andrew Johnson
dabcf893f7 mbboDirect: Fix initialization from VAL vs. B* 2021-10-03 00:53:35 -05:00
Andrew Johnson
bf2cdc9f61 mbboDirect: Remove debugging db_post_events() calls 2021-10-02 19:52:11 -05:00
Andrew Johnson
2ce583ffff Apply suggested changes to DEBUG fixes 2021-10-01 14:53:55 -05:00
Andrew Johnson
98aac49a8b Merge Torsten's FixCompilationErrorsForDEBUG branch 2021-10-01 14:44:38 -05:00
Andrew Johnson
66ff5a7bb6 Update pvAccess submodule 2021-09-25 22:55:14 -05:00
Andrew Johnson
23e55bf247 Makefile tweak 2021-09-25 22:52:57 -05:00
Andrew Johnson
687dad47da aSub POD: Note about accessing the NOT field 2021-09-25 22:45:37 -05:00
Andrew Johnson
7d2ca62a78 Misc doxygen fixes and updates 2021-09-25 22:34:05 -05:00
Andrew Johnson
3d09106b51 Merge 3.15 branch into 7.0 2021-09-17 11:44:04 -05:00
Andrew Johnson
5cddcea829 Change the epicsTimerTest delayVerify failure condition
This test verifies timer delays between 1.0 and 3.4 seconds.
A test failure now means the measured delay was more than
0.25 seconds different than the request, instead of being
5% of the request. This should now pass on GHA macOS.

On the 7.0 branch it should call testImpreciseTiming() and
use a smaller absolute delay threshold for better targets.
2021-09-17 11:16:00 -05:00
Andrew Johnson
9b69e63a69 Update GHA config, drop Ubuntu-16.04 builds 2021-09-17 10:06:10 -05:00
Andrew Johnson
422513990e Release notes for Win32 timer fix. 2021-09-16 14:54:31 -05:00
Andrew Johnson
3313860691 Win32 osdThread.c polishing
A little optimization of Freddie's code
Rename the new non-public routine
2021-09-16 14:45:25 -05:00
Andrew Johnson
2b8eb97b79 Merge Freddie's refactor_get_param_win32 branch 2021-09-16 13:28:42 -05:00
Andrew Johnson
9842bd1b20 Prefer to install %.html files from O.Common 2021-09-16 13:21:59 -05:00
Andrew Johnson
e7ea81c7a2 Reference doc tweaks to the dfanout record 2021-09-14 18:26:32 -05:00
Andrew Johnson
c528948f45 Adjust build rules for POD to HTML conversion 2021-09-14 18:25:30 -05:00
Freddie Akeroyd
00e9ecf7b5 Fix typo in osdThreadGetTimer 2021-09-11 22:19:40 +01:00
Freddie Akeroyd
65b34874bd Check for NULL in osdThreadGetTimer 2021-09-11 22:17:09 +01:00
Freddie Akeroyd
939d84f31a Refactor to use common epicsThreadGetParamWIN32() function 2021-09-11 22:10:10 +01:00
Andrew Johnson
fe4050b8c9 Workaround for RTEMS-mv2[17]00 parallel builds 2021-09-03 17:27:17 -05:00
Andrew Johnson
1fd7190cf5 Fix RTEMS-4 uC5282 build and atomic typos 2021-09-03 17:25:45 -05:00
Andrew Johnson
8e2f78caf5 dbStatic: Better error reports for bad JSON string chars 2021-09-03 14:16:37 -05:00
Andrew Johnson
33ffabaa93 Minimum Perl version is 5.10.1 2021-09-03 14:13:45 -05:00
Michael Davidsaver
9c1340d7d5 cleanup mbboDirect bit field handling
B0 -> BF shall always follow the corresponding bit in VAL.

Remove special handling for OMSL.
2021-09-01 12:15:35 -07:00
Torsten Bögershausen
420fb45fbc Fix several compilation errors for -DDEBUG
After Adding "-DDEBUG" to the compiler options some files don't
compile any more.
Fix the compilation errors.
2021-09-01 11:13:40 +02:00
Michael Davidsaver
7ce69155a9 test regressLinkSevr 2021-08-29 07:34:53 -07:00
Michael Davidsaver
f6e8a75026 Fix DB link to DBF_MENU as DBF_STRING 2021-08-29 07:32:36 -07:00
Michael Davidsaver
88079c9107 long CALC$ regressTest 2021-08-29 07:31:11 -07:00
Michael Davidsaver
82ec539e49 Fix long string handling for CALC$ 2021-08-29 07:30:20 -07:00
Michael Davidsaver
e34b6c5c0c Fix spelling in comments
Should be non-functional, except for some error message strings.
2021-08-29 07:27:50 -07:00
42d06d6a38 Fix bugs in dbRecordNameValidate() 2021-08-29 07:25:14 -07:00
Michael Davidsaver
21e7e4ddfb cleanup regressTest 2021-08-15 10:27:37 -07:00
Andrew Johnson
4efa937429 Merge Lewis' calcout-doc-fix branch into 7.0 2021-08-10 20:59:59 -05:00
Andrew Johnson
a0ab5aa4a3 Merge Kay's int64in_monitor branch into 7.0 2021-08-10 20:58:26 -05:00
Andrew Johnson
7c6d049698 Merge branch 'gcc-atomic-cleanup' into 7.0 2021-08-10 20:54:39 -05:00
Andrew Johnson
8175cc8e64 POD text updates to dbCommon and various record types 2021-08-10 20:35:19 -05:00
Andrew Johnson
72626cd5dd Add newlines to a couple iocsh usage strings 2021-08-10 20:31:16 -05:00
Andrew Johnson
8beb7bd2c8 Restore the -p flag to MKDIR which RTEMS host.cfg removes 2021-08-10 20:29:32 -05:00
Michael Davidsaver
cb8c7998b6 epicsTime: rework
Re-implement around epicsTimeStamp (C API)
with class epicsTime becoming a wrapper.

Prefer epicsInt64 arithmetic.

Remove opaque struct l_fp (NTP time conversion)
2021-08-05 08:30:53 -07:00
JJL772
7c991f3f2a Fix segfault in dbtpn when value parameter is nullptr
Running 'dbtpn Record' in iocsh would result in a segfault.
2021-08-05 08:30:53 -07:00
JJL772
32d76623f2 Fix potential memory leak on error
In osdThread.c for POSIX if pthread_create_key fails
In iocLogServer.c if fdmgr_init returns NULL
In dbBkpt.c if semaphore creation fails while adding a bp to a lockset
In devSiSoftCallback.c if linked record is not found
2021-08-05 08:30:23 -07:00
Andrew Johnson
540a5c87d9 Adjust wording of classification descriptions 2021-08-02 18:26:44 -05:00
Andrew Johnson
a667cc7aa4 Move GCC+Clang common headers to a new file 2021-08-02 18:26:02 -05:00
Michael Davidsaver
78d2f20fa8 Com: Adjust epicsAtomic conditionals for GCC
cf. https://bugs.launchpad.net/epics-base/+bug/1932118
2021-08-02 18:13:40 -05:00
Kay Kasemir
3091f7c56f int64in: Fix monitor delta test
Only the lower 32 bit used to be compared.
https://bugs.launchpad.net/epics-base/+bug/1938459
2021-07-29 14:38:16 -04:00
Andrew Johnson
ec87b2a867 recGbl: Update to using dbGetTimeStampTag() 2021-07-21 11:08:06 -05:00
Andrew Johnson
7a6aa3edd1 waveform: Update POD, describe BUSY field 2021-07-21 11:06:34 -05:00
Andrew Johnson
16c3202992 waveform: Add back lost PACT = TRUE
Fixes GitHub Issue #187
2021-07-21 11:05:41 -05:00
8e11406fc6 Fix calcout rec doc typo: s/If it met/If met/ 2021-07-21 09:53:11 -05:00
Michael Davidsaver
967846b950 tap files are PRECIOUS 2021-07-18 08:21:46 -07:00
Michael Davidsaver
e5aece682e ci: replace GHA deprecated ubuntu-16.04 with CentOS/Fedora builds
Maintain coverage of older GCC on Linux
2021-07-15 13:46:14 -07:00
Andrew Johnson
f801ca0501 Drop version number from README 2021-07-03 21:26:18 -05:00
Andrew Johnson
9363052956 Update submodules after release 2021-07-03 20:56:53 -05:00
Andrew Johnson
f5cb3cf8f6 Update version numbers after tagging 2021-07-03 20:56:32 -05:00
247 changed files with 2247 additions and 2573 deletions

2
.ci

Submodule .ci updated: d675de24e6...75bae77c1d

View File

@@ -34,7 +34,7 @@ env:
EPICS_TEST_IMPRECISE_TIMING: YES
jobs:
build-base:
native:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
# Set environment variables from matrix parameters
@@ -69,10 +69,10 @@ jobs:
extra: "CMD_CXXFLAGS=-std=c++11"
name: "Ub-20 gcc-9 C++11, static"
- os: ubuntu-16.04
- os: ubuntu-20.04
cmp: clang
configuration: default
name: "Ub-16 clang-9"
name: "Ub-20 clang-10"
- os: ubuntu-20.04
cmp: clang
@@ -145,35 +145,6 @@ jobs:
name: "Ub-20 gcc-9 + RT-4.9"
rtems_target: RTEMS-pc386-qemu
- os: ubuntu-16.04
cmp: gcc-4.8
utoolchain: "4.8"
configuration: default
name: "Ub-16 gcc-4.8"
- os: ubuntu-16.04
cmp: gcc-4.9
utoolchain: "4.9"
configuration: default
name: "Ub-16 gcc-4.9"
- os: ubuntu-20.04
cmp: gcc-8
utoolchain: "8"
configuration: default
name: "Ub-20 gcc-8"
- os: ubuntu-20.04
cmp: gcc-9
utoolchain: "9"
configuration: default
name: "Ub-20 gcc-9"
- os: ubuntu-20.04
cmp: clang
configuration: default
name: "Ub-20 clang-10"
- os: macos-latest
cmp: clang
configuration: default
@@ -210,14 +181,91 @@ jobs:
sudo apt-get update
sudo apt-get -y install qemu-system-x86 g++-mingw-w64-x86-64 gdb
if: runner.os == 'Linux'
- name: "apt-get install ${{ matrix.cmp }}"
run: |
sudo apt-get update
sudo apt-get -y install software-properties-common
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y install g++-${{ matrix.utoolchain }}
if: matrix.utoolchain
- name: Prepare and compile dependencies
run: python .ci/cue.py prepare
- name: Build main module
run: python .ci/cue.py build
- name: Run main module tests
run: python .ci/cue.py -T 20M test
- name: Upload tapfiles Artifact
if: ${{ always() }}
uses: actions/upload-artifact@v2
with:
name: tapfiles ${{ matrix.name }}
path: '**/O.*/*.tap'
if-no-files-found: ignore
- name: Collect and show test results
if: ${{ always() }}
run: python .ci/cue.py -T 5M test-results
docker:
name: ${{ matrix.name }}
runs-on: ubuntu-latest
container:
image: ${{ matrix.image }}
# Set environment variables from matrix parameters
env:
CMP: ${{ matrix.cmp }}
BCFG: ${{ matrix.configuration }}
EXTRA: ${{ matrix.extra }}
TEST: ${{ matrix.test }}
strategy:
fail-fast: false
matrix:
# Job names also name artifacts, character limitations apply
include:
- name: "CentOS-7"
image: centos:7
cmp: gcc
configuration: default
- name: "CentOS-8"
image: centos:8
cmp: gcc
configuration: default
- name: "Fedora-33"
image: fedora:33
cmp: gcc
configuration: default
- name: "Fedora-latest"
image: fedora:latest
cmp: gcc
configuration: default
steps:
- name: "Build newer Git"
# actions/checkout@v2 wants git >=2.18
# centos:7 has 1.8
if: matrix.image=='centos:7'
run: |
yum -y install curl make gcc curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
curl https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.29.0.tar.gz | tar -xz
cd git-*
make -j2 prefix=/usr/local all
make prefix=/usr/local install
cd ..
rm -rf git-*
type -a git
git --version
- name: "Redhat setup"
run: |
dnfyum() {
dnf -y "$@" || yum -y "$@"
return $?
}
dnfyum install python3 gdb make perl gcc-c++ glibc-devel readline-devel ncurses-devel perl-devel perl-Test-Simple
git --version || dnfyum install git
# rather than just bite the bullet and link python3 -> python,
# people would rather just break all existing scripts...
[ -e /usr/bin/python ] || ln -sf python3 /usr/bin/python
python --version
- uses: actions/checkout@v2
with:
submodules: true
- name: Automatic core dumper analysis
uses: mdavidsaver/ci-core-dumper@master
- name: Prepare and compile dependencies
run: python .ci/cue.py prepare
- name: Build main module

View File

@@ -52,7 +52,7 @@ EPICS_MODIFICATION = 6
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
# Not included in the official EPICS version number if zero
EPICS_PATCH_LEVEL = 0
EPICS_PATCH_LEVEL = 1
# Immediately after an official release the EPICS_PATCH_LEVEL is incremented
# and the -DEV suffix is added (similar to the Maven -SNAPSHOT versions)

View File

@@ -2,7 +2,7 @@
EPICS_CA_MAJOR_VERSION = 4
EPICS_CA_MINOR_VERSION = 14
EPICS_CA_MAINTENANCE_VERSION = 0
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 = 20
EPICS_DATABASE_MINOR_VERSION = 21
EPICS_DATABASE_MAINTENANCE_VERSION = 0
# 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 = 20
EPICS_LIBCOM_MINOR_VERSION = 21
EPICS_LIBCOM_MAINTENANCE_VERSION = 0
# Development flag, set to zero for release versions

View File

@@ -455,7 +455,7 @@ $(COMMON_DIR)/%.html: ../%.pl
$(PODTOHTML) -s -o $(notdir $@) $<
@$(MV) $(notdir $@) $@
.PRECIOUS: $(COMMON_DIR)/%.html %.html
.PRECIOUS: $(COMMON_DIR)/%.html
#---------------------------------------------------------------
# DB files

View File

@@ -383,6 +383,8 @@ endif
tapfiles: $(TAPFILES)
junitfiles: $(JUNITFILES)
# prevent deletion of partial output from failing tests
.PRECIOUS: $(TAPFILES) $(JUNITFILES)
test-results: tap-results
tap-results: $(TAPFILES)
@@ -561,6 +563,10 @@ $(INSTALL_DOC)/%: ../%
$(ECHO) "Installing doc $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(INSTALL_DOC)
$(INSTALL_HTML)/$(HTMLS_DIR)/%: $(COMMON_DIR)/%
$(ECHO) "Installing generated html $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
$(INSTALL_HTML)/$(HTMLS_DIR)/%: %
$(ECHO) "Installing html $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
@@ -569,10 +575,6 @@ $(INSTALL_HTML)/$(HTMLS_DIR)/%: ../%
$(ECHO) "Installing html $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
$(INSTALL_HTML)/$(HTMLS_DIR)/%: $(COMMON_DIR)/%
$(ECHO) "Installing generated html $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)
$(INSTALL_TEMPLATES_SUBDIR)/%: ../%
$(ECHO) "Installing $@"
@$(INSTALL) -d -m $(INSTALL_PERMISSIONS) $< $(@D)

View File

@@ -79,6 +79,9 @@ CPPFLAGS += $($(BUILD_CLASS)_CPPFLAGS) $(POSIX_CPPFLAGS) $(OPT_CPPFLAGS)\
ECHO = @$(if $(filter -s,$(MFLAGS)),$(NOP),echo)
# Originally set in os/CONFIG.UnixCommon.Common
MKDIR = mkdir -p
#--------------------------------------------------
# Although RTEMS uses gcc, it wants to use gcc its own way
CROSS_CPPFLAGS =

View File

@@ -2300,7 +2300,7 @@ PLANTUML_JAR_PATH =
# Minimum value: 0, maximum value: 10000, default value: 50.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_GRAPH_MAX_NODES = 50
DOT_GRAPH_MAX_NODES = 100
# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
# generated by dot. A depth value of 3 means that only nodes reachable from the

View File

@@ -1,6 +1,6 @@
# Installation Instructions {#install}
## EPICS Base Release 7.0.5
## EPICS Base Release 7.0.x
-----
@@ -74,7 +74,7 @@ is older but does still work.
#### Perl
You must have Perl version 5.10 or later installed. The EPICS
You must have Perl version 5.10.1 or later installed. The EPICS
configuration files do not specify the perl full pathname, so the perl
executable must be found through your normal search path.

View File

@@ -10,6 +10,71 @@ everything that has changed in each release.
The PVA submodules each have their own individual sets of release notes which
should also be read to understand what has changed since earlier releases.
## EPICS Release 7.0.6.1
### `mbboDirectRecord` enhancements
The bit fields `B0` - `B1F` of this record are now always updated and have a
monitor posted when the `VAL` field is set and the record processed. It is now
possible to initialize the record's value by setting the bit fields inside a
database file as long as no other method was used to initialize it (suc as
setting `VAL` directly, using `DOL`, or by an initial readback from device
support). A new internal field `OBIT` was added to store information about
monitors posted on the bit fields.
### Minimum Perl Version is now 5.10.1
Some scripts now make use of features that were introduced to this Perl version
that was released in 2009.
### DB Links to DBF_MENU fields fixed
[GH:183](https://github.com/epics-base/epics-base/issues/183)
These were broken in a previous release, but now work again.
### Long String access to CALC fields fixed
[GH:194](https://github.com/epics-base/epics-base/issues/194)
This was broken in a previous release, but now works again.
### Minor Changes
+ Many code comments have been spell-checked and corrected.
+ Passing a `-DDEBUG` compiler flag no longer breaks the build.
+ Parallel builds of RTEMS-mvme2100 and RTEMS-mvme2700 targets now work.
+ Illegal characters seen in JSON strings in a database file should now get a
better error message.
### Other Launchpad Bugs and GitHub Issues Fixed
+ [lp:1938459](https://bugs.launchpad.net/epics-base/+bug/1938459)
[GH:191](https://github.com/epics-base/epics-base/pull/191) int64in only
checks lower 32 bits for change
+ [lp:1941875](https://bugs.launchpad.net/epics-base/+bug/1941875) Buggy
warning message "Record/Alias name '...' should not contain non-printable ...
+ [GH:187](https://github.com/epics-base/epics-base/issues/187) waveformRecord
missing PACT=true?
+ [GH:189](https://github.com/epics-base/epics-base/pull/189) Fix a couple
memory leaks and a segfault
+ [GH:200](https://github.com/epics-base/epics-base/pull/200) and
[GH:201](https://github.com/epics-base/epics-base/pull/201) Fix timers on MS
Windows for non-EPICS threads
### Compiler interface for epicsAtomic tidied up
[GH:192](https://github.com/epics-base/epics-base/pull/192)
Both GCC and CLANG compiler intrisics used for the epicsAtomic APIs have been revised; implementations using CLANG should now run faster as they now use the compiler's built-in atomic functions instead of taking a mutex.
### The epicsTime code has been reimplemented
[GH:185](https://github.com/epics-base/epics-base/pull/185)
This was done to simplify the code and may have improved performance slightly for some uses. Support for the old NTP-specific `struct l_fp` has been dropped but all other routines and methods of the `class epicsTime` function as before.
### Updates to Record Reference documentation
Many of the built-in record types have had improvements to their documentation with additional fields added to the tables, rewrites of descriptions and links to other documents added or fixed.
-----
## EPICS Release 7.0.6
@@ -1921,6 +1986,13 @@ header and removed the need for dbScan.c to reach into the internals of its
## Changes from the 3.15 branch since 3.15.9
### Fix timers on MS Windows for non-EPICS threads
The waitable timer changes in 3.15.9 broke calls to `epicsThreadSleep()` and
similar routines that used timers (including `ca_pend_event()`) when made from
threads that were not started using the epicsThread APIs.
[This problem](https://github.com/epics-base/epics-base/pull/200)
[has now been fixed](https://github.com/epics-base/epics-base/pull/201).
## Changes made between 3.15.8 and 3.15.9

View File

@@ -37,26 +37,11 @@ that should be performed when creating production releases of EPICS Base.</p>
<h3>The Release Process</h3>
<h4>Full Process</h4>
<p>The version released on the Feature Freeze date is designated the first
pre-release, <tt>-pre1</tt>. The first release candidate <tt>-rc1</tt> is the
first version that has undergone testing by the developers and has shown no
problems that must be fixed before release. New versions should be made at about
2-weekly intervals after the <tt>-pre1</tt> release, and designated as either
pre-release or release candidate versions by the Release Manager. Release
candidates are announced to the whole community via the tech-talk mailing list,
pre-releases are announced to to the developers via the core-talk list. After a
release candidate has been available for 2 weeks without any new problems being
reported or major changes having to be committed, the final release can be
made.</p>
<h4>Short Process for Patch Releases</h4>
<p>The Patch Release date and its scope are agreed upon a few weeks ahead of the
release. If no blocking issues are raised, the release is made by the Release
Manager on or as soon as possible after that date, following the steps below
starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<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>
@@ -65,11 +50,11 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<dl>
<dt><strong>Release Manager</strong> ()</dt>
<dd>Responsible for managing and tagging the release</dd>
<dt><strong>Platform Developers</strong> (optional)</dt>
<dt><strong>Platform Developers</strong> (informal)</dt>
<dd>Responsible for individual operating system platforms</dd>
<dt><strong>Application Developers</strong></dt>
<dd>Responsible for support modules that depend on EPICS Base.</dd>
<dt><strong>Website Manager</strong> (Andrew Johnson)</dt>
<dt><strong>Website Editor</strong> (Andrew Johnson)</dt>
<dd>Responsible for the EPICS website</dd>
</dl>
@@ -111,9 +96,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
&amp; all developers</td>
<td>Ensure that documentation will be updated before the release date:
<ul>
<li>Application Developers Guide</li>
<li>Release Notes</li>
<li>Known Problems</li>
<li>Other documents</li>
</ul>
</td>
@@ -125,87 +108,9 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
</tr>
<tr>
<td>&nbsp;</td>
<td>Website Manager</td>
<td>Release Manager</td>
<td>Create a release milestone on Launchpad. If a target release date is
known set "Date Targeted" to the expected release date. Note that
pre-release and release-candidate versions should not get Launchpad
milestones, only the final release.</td>
</tr>
<tr>
<th colspan="3">Creating pre-release and release-candidate versions</th>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<!-- Submodules... -->
<td>Edit and commit changes to the EPICS version number file
configure/CONFIG_BASE_VERSION.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Tag the module in Git, using these tag conventions:
<ul>
<li>
<tt>R7.0.5-pre<i>n</i></tt>
&mdash; pre-release tag
</li>
<li>
<tt>R7.0.5-rc<i>n</i></tt>
&mdash; release candidate tag
</li>
</ul>
<blockquote><tt>
cd base-7.0<br />
git tag -m 'ANJ: Tagged for 7.0.5-rc1' R7.0.5-rc1
</tt></blockquote>
Note that submodules must <em>not</em> be tagged with the version used
for the top-level, they each have their own separate version numbers
that are only tagged at the final release.</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.5-rc1 base-7.0.5-rc1.tar.gz base-7.0.5-rc1/
</tt></blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote><tt>
gpg --armor --sign --detach-sig base-7.0.5-rc1.tar.gz
</tt></blockquote>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Test the tarfile by extracting its contents and building it on at
least one supported platform.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Copy the tarfile and its signature to the Base download area of the
website and add the new files to the website Base download index
page.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Create or update a website subdirectory to hold the release
documentation, and copy in selected files from the base/documentation
and base/html directories of the tarfile.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Create or modify the webpage for the new release with links to the
release documents and tar file. Pre-release and release-candidate
versions should use the page and URL for the final release version
number.</td>
known set "Date Targeted" to the expected release date.</td>
</tr>
<tr>
<th colspan="3">Testing</th>
@@ -250,11 +155,8 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Release Manager</td>
<td>Check that documentation has been updated:
<ul>
<li><a href="https://launchpad.net/epics-appdev">Application
Developers Guide</a></li>
<li>Release Notes</li>
<li>Known Problems (hopefully empty)</li>
<li>Other documents (converting...)</li>
<li>Other documents</li>
</ul>
</td>
</tr>
@@ -266,9 +168,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Obtain a positive <q>Ok to release</q> from all platform developers
once a release candidate version has gone for 2 weeks without any major
new issues being reported.</td>
<td>Obtain a positive <q>Ok to release</q> from developers.</td>
</tr>
<tr>
<th colspan="3">Creating the final release version</th>
@@ -277,8 +177,8 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>
<p>For each external submodule in turn (assuming it has not been tagged
yet):</p>
<p><b>For each external submodule</b> in turn (assuming it has not been
tagged yet):</p>
<ol>
<li>Check that the module's Release Notes have been updated to cover
all changes; add items as necessary, and set the module version
@@ -298,7 +198,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<li>Tag the module:
<blockquote><tt>
git tag -m 'ANJ: Tag for EPICS 7.0.5' &lt;module-version&gt;
git tag -m 'ANJ: Tag for EPICS 7.0.6.1' &lt;module-version&gt;
</tt></blockquote>
</li>
@@ -326,15 +226,24 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
</li>
</ol>
<p>Commit all the submodule updates to the 7.0 branch.</p>
<p><b>After all submodules complete</b> commit the submodule updates
which were added for each submodule in step 4 above to the 7.0 branch
(don't push). After committing, 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</t>-g<i>xxxxxxx</i></tt> suffix.</p>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</td>
<td>Edit the main EPICS Base version file and the built-in module version
files:
<td>
<p><tt>git grep UNRELEASED</tt> and insert the release version to any
doxygen annotations that have a <tt>@since UNRELEASED</tt> comment.
Commit (don't push).</p>
<p>Edit the main EPICS Base version file and the built-in module version
files:</p>
<ul>
<li><tt>configure/CONFIG_BASE_VERSION</tt></li>
<li><tt>configure/CONFIG_LIBCOM_VERSION</tt></li>
@@ -346,6 +255,9 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<tt>PATCH_LEVEL</tt> value should have been incremented after the
previous release tag was applied. Set all <tt>DEVELOPMENT_FLAG</tt>
values to 0 and <tt>EPICS_DEV_SNAPSHOT</tt> to the empty string.</p>
<p>Edit the headings in the Release Notes to show the appropriate
version number and remove the warning about this being an unreleased
version of EPICS.</p>
<p>Commit these changes (don't push).</p>
</td>
</tr>
@@ -355,9 +267,9 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Tag the epics-base module in Git:
<blockquote><tt>
cd base-7.0<br />
git tag -m 'ANJ: Tagged for release' R7.0.5
git tag -m 'ANJ: Tagged for release' R7.0.6.1
</tt></blockquote>
<p>Don't push these commits or the new tag to the Launchpad repository
<p>Don't push anything to the Launchpad repository
yet.</p>
</td>
</tr>
@@ -376,6 +288,9 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
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>
@@ -387,12 +302,12 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
files and directories that are only used for continuous integration:
<blockquote><tt>
cd base-7.0<br />
./.tools/make-tar.sh R7.0.5 ../base-7.0.5.tar.gz base-7.0.5/
./.tools/make-tar.sh R7.0.6.1 ../base-7.0.6.1.tar.gz base-7.0.6.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.5.tar.gz
gpg --armor --sign --detach-sig base-7.0.6.1.tar.gz
</tt></blockquote>
</td>
</tr>
@@ -412,38 +327,38 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Release Manager</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 Manager</td>
<td>Website Editor</td>
<td>Update the website subdirectory that holds the release
documentation, and copy in the files from the base/documentation
directory of the tarfile.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</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 Manager</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 Manager</td>
<td>Website Editor</td>
<td>Link to the release webpage from other relevent areas of the
website - update front page and sidebars.</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Website Editor</td>
<td>Add an entry to the website News page, linking to the new version
webpage.</td>
</tr>
@@ -453,17 +368,17 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</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.5.tar.gz base-7.0.5.tar.gz.asc epics-controls:download/base<br />
scp base-7.0.6.1.tar.gz base-7.0.6.1.tar.gz.asc epics-controls:download/base<br />
</tt></blockquote>
</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Website Editor</td>
<td>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
@@ -478,7 +393,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Website Manager</td>
<td>Release Manager</td>
<td>Go to the Launchpad milestone for this release. Click the Create
release button and add the release date. Put a URL for the release page
in the Release notes box, and click the Create release button. Upload

View File

@@ -88,7 +88,7 @@ const char * ca_message_text []
"Bad event subscription (monitor) identifier",
"Remote channel has new network address",
"New or resumed network connection",
"Specified task isnt a member of a CA context",
"Specified task isn't a member of a CA context",
"Attempt to use defunct CA feature failed",
"The supplied string is empty",
@@ -324,7 +324,7 @@ int epicsStdCall ca_create_channel (
*chanptr = pChanNotify;
pChanNotify->initiateConnect ( guard );
// no need to worry about a connect preempting here because
// the connect sequence will not start untill initiateConnect()
// the connect sequence will not start until initiateConnect()
// is called
}
catch ( cacChannel::badString & ) {
@@ -384,9 +384,9 @@ int epicsStdCall ca_clear_channel ( chid pChan )
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( cac.cbMutex );
epicsGuard < epicsMutex > guard ( cac.mutex );
@@ -720,7 +720,7 @@ int epicsStdCall ca_context_status ( ca_client_context * pcac, unsigned level )
/*
* ca_current_context ()
*
* used when an auxillary thread needs to join a CA client context started
* used when an auxiliary thread needs to join a CA client context started
* by another thread
*/
// extern "C"
@@ -740,7 +740,7 @@ struct ca_client_context * epicsStdCall ca_current_context ()
/*
* ca_attach_context ()
*
* used when an auxillary thread needs to join a CA client context started
* used when an auxiliary thread needs to join a CA client context started
* by another thread
*/
// extern "C"

View File

@@ -494,7 +494,7 @@ void verifyConnectionHandlerConnect ( appChan *pChans, unsigned chanCount,
/*
* verifyBlockingConnect ()
*
* 1) verify that we dont print a disconnect message when
* 1) verify that we don't print a disconnect message when
* we delete the last channel
*
* 2) verify that we delete the connection to the IOC
@@ -645,7 +645,7 @@ void verifyBlockingConnect ( appChan *pChans, unsigned chanCount,
status = ca_pend_io ( 1e-16 );
if ( status == ECA_TIMEOUT ) {
/*
* we end up here if the channel isnt on the same host
* we end up here if the channel isn't on the same host
*/
epicsThreadSleep ( 0.1 );
ca_poll ();
@@ -1112,7 +1112,7 @@ void verifyHighThroughputRead ( chid chan, unsigned interestLevel )
unsigned i;
/*
* verify we dont jam up on many uninterrupted
* verify we don't jam up on many uninterrupted
* solicitations
*/
if ( ca_read_access (chan) ) {
@@ -1152,7 +1152,7 @@ void verifyHighThroughputWrite ( chid chan, unsigned interestLevel )
}
/*
* verify we dont jam up on many uninterrupted
* verify we don't jam up on many uninterrupted
* get callback requests
*/
void verifyHighThroughputReadCallback ( chid chan, unsigned interestLevel )
@@ -1181,7 +1181,7 @@ void verifyHighThroughputReadCallback ( chid chan, unsigned interestLevel )
}
/*
* verify we dont jam up on many uninterrupted
* verify we don't jam up on many uninterrupted
* put callback request
*/
void verifyHighThroughputWriteCallback ( chid chan, unsigned interestLevel )
@@ -1239,7 +1239,7 @@ void verifyBadString ( chid chan, unsigned interestLevel )
verify ( status == ECA_NORMAL );
if ( strcmp ( stimStr, respStr ) ) {
printf (
"Test fails if stim \"%s\" isnt roughly equiv to resp \"%s\"\n",
"Test fails if stim \"%s\" isn't roughly equiv to resp \"%s\"\n",
stimStr, respStr);
}
showProgressEnd ( interestLevel );
@@ -1395,7 +1395,7 @@ static void multiSubscrDestroyNoLateCallbackThread ( void * pParm )
/*
* raise the priority of the current thread hoping to improve our
* likelyhood of detecting a bug
* likelihood of detecting a bug
*/
priorityOfTestThread = epicsThreadGetPrioritySelf ();
epicsThreadSetPriority ( epicsThreadGetIdSelf(), epicsThreadPriorityHigh );
@@ -1445,7 +1445,7 @@ static void multiSubscrDestroyNoLateCallbackThread ( void * pParm )
}
/*
* verify that, in a preemtive callback mode client, a subscription callback never
* verify that, in a preemptive callback mode client, a subscription callback never
* comes after the subscription is destroyed
*/
static void multiSubscrDestroyNoLateCallbackTest ( const char *pName, unsigned interestLevel )
@@ -1563,7 +1563,7 @@ void multiSubscriptionDeleteTest ( chid chan, unsigned interestLevel )
/*
* singleSubscriptionDeleteTest
*
* verify that we dont fail when we repeatedly create
* verify that we don't fail when we repeatedly create
* and delete only one subscription with a high level of
* traffic on it
*/
@@ -1617,7 +1617,7 @@ void singleSubscriptionDeleteTest ( chid chan, unsigned interestLevel )
/*
* channelClearWithEventTrafficTest
*
* verify that we can delete a channel that has subcriptions
* verify that we can delete a channel that has subscriptions
* attached with heavy update traffic
*/
void channelClearWithEventTrafficTest ( const char *pName, unsigned interestLevel )
@@ -2481,7 +2481,7 @@ void monitorUpdateTest ( chid chan, unsigned interestLevel )
showProgress ( interestLevel );
/*
* attempt to uncover problems where the last event isnt sent
* attempt to uncover problems where the last event isn't sent
* and hopefully get into a flow control situation
*/
prevPassCount = 0u;
@@ -2522,7 +2522,7 @@ void monitorUpdateTest ( chid chan, unsigned interestLevel )
ca_poll (); /* emulate typical GUI */
for ( j = 0; j < NELEMENTS ( test ); j++ ) {
/*
* we shouldnt see old monitors because
* we shouldn't see old monitors because
* we resubscribed
*/
verify ( test[j].count <= i + 2 );
@@ -3016,7 +3016,7 @@ void testMultithreadSubscr ( void * pParm )
}
/*
* test installation of subscriptions similar to usage paterns
* test installation of subscriptions similar to usage patterns
* employed by modern versions of the sequencer
*/
void verifyMultithreadSubscr ( const char * pName, unsigned interestLevel )
@@ -3111,7 +3111,7 @@ void fdManagerVerify ( const char * pName, unsigned interestLevel )
status = ca_flush_io ();
verify ( status == ECA_NORMAL );
/* look for infinite loop in fd manager schedualing */
/* look for infinite loop in fd manager scheduling */
epicsTimeGetCurrent ( & begin );
eventCount = 0u;
while ( 1 ) {
@@ -3175,7 +3175,7 @@ void verifyConnectWithDisconnectedChannels (
* we should be able to connect to a valid
* channel within a reasonable delay even
* though there is one permanently
* diasconnected channel
* disconnected channel
*/
status = ca_pend_io ( timeoutToPendIO );
verify ( status == ECA_NORMAL );
@@ -3491,7 +3491,7 @@ int acctst ( const char * pName, unsigned interestLevel, unsigned channelCount,
/*
* CA pend event delay accuracy test
* (CA asssumes that search requests can be sent
* (CA assumes that search requests can be sent
* at least every 25 mS on all supported os)
*/
printf ( "\n" );

View File

@@ -130,8 +130,8 @@ bool bhe::updatePeriod (
guard.assertIdenticalMutex ( this->mutex );
//
// this block is enetered if the beacon was created as a side effect of
// creating a connection and so we dont yet know the first beacon time
// this block is entered if the beacon was created as a side effect of
// creating a connection and so we don't yet know the first beacon time
// and sequence number
//
if ( this->timeStamp == epicsTime () ) {
@@ -154,7 +154,7 @@ bool bhe::updatePeriod (
return false;
}
// 1) detect beacon duplications due to redundant routes
// 1) detect beacon duplication due to redundant routes
// 2) detect lost beacons due to input queue overrun or damage
if ( CA_V410 ( protocolRevision ) ) {
unsigned beaconSeqAdvance;
@@ -175,7 +175,7 @@ bool bhe::updatePeriod (
// throw out sequence numbers that jump forward by only a few numbers
// (this situation is probably caused by a duplicate route
// or a beacon due to input queue overun)
// or a beacon due to input queue overrun)
if ( beaconSeqAdvance > 1 && beaconSeqAdvance < 4 ) {
logBeaconDiscard ( beaconSeqAdvance, currentTime );
return false;
@@ -244,8 +244,8 @@ bool bhe::updatePeriod (
/*
* Is this an IOC seen because of an IOC reboot
* (beacon come at a higher rate just after the
* IOC reboots). Lower tolarance here because we
* dont have to worry about lost beacons.
* IOC reboots). Lower tolerance here because we
* don't have to worry about lost beacons.
*
* It may be possible to get false triggers here
* if the client is busy, but this does not cause

View File

@@ -58,8 +58,8 @@
#define CA_REPEATER_PORT (CA_PORT_BASE+CA_MAJOR_PROTOCOL_REVISION*2u+1u)
/*
* 1500 (max of ethernet and 802.{2,3} MTU) - 20(IP) - 8(UDP)
* (the MTU of Ethernet is currently independent of its speed varient)
* 1500 (max of Ethernet and 802.{2,3} MTU) - 20(IP) - 8(UDP)
* (the MTU of Ethernet is currently independent of its speed variant)
*/
#define ETHERNET_MAX_UDP ( 1500u - 20u - 8u )
#define MAX_UDP_RECV ( 0xffff + 16u ) /* allow large frames to be received in the future */
@@ -117,7 +117,7 @@ typedef ca_uint32_t caResId;
/*
* for use with search and not_found (if search fails and
* its not a broadcast tell the client to look elesewhere)
* its not a broadcast tell the client to look elsewhere)
*/
#define DOREPLY 10u
#define DONTREPLY 5u
@@ -176,7 +176,7 @@ typedef struct ca_hdr {
struct mon_info {
ca_float32_t m_lval; /* low delta */
ca_float32_t m_hval; /* high delta */
ca_float32_t m_toval; /* period btween samples */
ca_float32_t m_toval; /* period between samples */
ca_uint16_t m_mask; /* event select mask */
ca_uint16_t m_pad; /* extend to 32 bits */
};

View File

@@ -224,7 +224,7 @@ void ca_client_context::changeExceptionEvent (
epicsGuard < epicsMutex > guard ( this->mutex );
this->ca_exception_func = pfunc;
this->ca_exception_arg = arg;
// should block here until releated callback in progress completes
// should block here until related callback in progress completes
}
void ca_client_context::replaceErrLogHandler (
@@ -237,7 +237,7 @@ void ca_client_context::replaceErrLogHandler (
else {
this->pVPrintfFunc = epicsVprintf;
}
// should block here until releated callback in progress completes
// should block here until related callback in progress completes
}
void ca_client_context::registerForFileDescriptorCallBack (
@@ -252,7 +252,7 @@ void ca_client_context::registerForFileDescriptorCallBack (
// w/o having sent the wakeup message
this->_sendWakeupMsg ();
}
// should block here until releated callback in progress completes
// should block here until related callback in progress completes
}
int ca_client_context :: printFormated (
@@ -768,9 +768,9 @@ LIBCA_API int epicsStdCall ca_clear_subscription ( evid pMon )
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( cac.cbMutex );
epicsGuard < epicsMutex > guard ( cac.mutex );

View File

@@ -285,7 +285,7 @@ cac::~cac ()
// this blocks until the UDP thread exits so that
// it will not sneak in any new clients
//
// lock intentionally not held here so that we dont deadlock
// lock intentionally not held here so that we don't deadlock
// waiting for the UDP thread to exit while it is waiting to
// get the lock.
{
@@ -312,7 +312,7 @@ cac::~cac ()
//
// wait for all tcp threads to exit
//
// this will block for oustanding sends to go out so dont
// this will block for outstanding sends to go out so don't
// hold a lock while waiting
//
{
@@ -411,7 +411,7 @@ void cac::show (
::printf ( "Channel Access Client Context at %p for user %s\n",
static_cast <const void *> ( this ), this->pUserName );
// this also supresses the "defined, but not used"
// this also suppresses the "defined, but not used"
// warning message
::printf ( "\trevision \"%s\"\n", pVersionCAC );

View File

@@ -129,7 +129,7 @@ typedef unsigned CA_SYNC_GID;
#define CA_OP_CONN_UP 6
#define CA_OP_CONN_DOWN 7
/* depricated */
/* deprecated */
#define CA_OP_SEARCH 2
/*
@@ -464,7 +464,7 @@ LIBCA_API int epicsStdCall ca_array_get_callback
/* Specify a function to be executed whenever significant changes */
/* occur to a channel. */
/* NOTES: */
/* 1) Evid may be omited by passing a NULL pointer */
/* 1) Evid may be omitted by passing a NULL pointer */
/* */
/* 2) An array count of zero specifies the native db count */
/* */
@@ -837,7 +837,7 @@ LIBCA_API double epicsStdCall ca_beacon_period (chid chan);
LIBCA_API double epicsStdCall ca_receive_watchdog_delay (chid chan);
/*
* used when an auxillary thread needs to join a CA client context started
* used when an auxiliary thread needs to join a CA client context started
* by another thread
*/
LIBCA_API struct ca_client_context * epicsStdCall ca_current_context ();

View File

@@ -224,7 +224,7 @@ int main ( int argc, char ** argv )
* always set this field to INADDR_ANY
*
* clients always assume that if this
* field is set to something that isnt INADDR_ANY
* field is set to something that isn't INADDR_ANY
* then it is the overriding IP address of the server.
*/
ina.sin_family = AF_INET;
@@ -235,7 +235,7 @@ int main ( int argc, char ** argv )
}
else {
/*
* old servers dont supply this and the
* old servers don't supply this and the
* default port must be assumed
*/
ina.sin_port = htons ( serverPort );

View File

@@ -45,7 +45,7 @@ bool comBuf::flushToWire ( wireSendAdapter & wire, const epicsTime & currentTime
return true;
}
// throwing the exception from a function that isnt inline
// throwing the exception from a function that isn't inline
// shrinks the GNU compiled object code
void comBuf::throwInsufficentBytesException ()
{

View File

@@ -196,7 +196,7 @@ epicsUInt16 comQueRecv::popUInt16 ()
if ( ! pComBuf ) {
comBuf::throwInsufficentBytesException ();
}
// try first for all in one buffer efficent version
// try first for all in one buffer efficient version
epicsUInt16 tmp = 0;
comBuf::popStatus status = pComBuf->pop ( tmp );
if ( status.success ) {
@@ -215,7 +215,7 @@ epicsUInt32 comQueRecv::popUInt32 ()
if ( ! pComBuf ) {
comBuf::throwInsufficentBytesException ();
}
// try first for all in one buffer efficent version
// try first for all in one buffer efficient version
epicsUInt32 tmp = 0;
comBuf::popStatus status = pComBuf->pop ( tmp );
if ( status.success ) {
@@ -230,7 +230,7 @@ epicsUInt32 comQueRecv::popUInt32 ()
bool comQueRecv::popOldMsgHeader ( caHdrLargeArray & msg )
{
// try first for all in one buffer efficent version
// try first for all in one buffer efficient version
comBuf * pComBuf = this->bufs.first ();
if ( ! pComBuf ) {
return false;

View File

@@ -27,17 +27,17 @@
// 1) Allow sufficent headroom so that users will be able to perform
// a reasonable amount of IO within CA callbacks without experiencing
// a push/pull deadlock. If a potential push/pull deadlock situation
// occurs then detect and avoid it and provide diagnotic to the user
// occurs then detect and avoid it and provide diagnostic to the user
// via special status.
// 2) Return status to the user when there is insufficent memory to
// 2) Return status to the user when there is insufficient memory to
// queue a complete message.
// 3) return status to the user when a message cant be flushed because
// a connection dropped.
// 4) Do not allocate too much memory in exception situatons (such as
// 4) Do not allocate too much memory in exception situations (such as
// after a circuit disconnect).
// 5) Avoid allocating more memory than is absolutely necessary to meet
// the above requirements.
// 6) Message fragments must never be sent to the IOC when there isnt
// 6) Message fragments must never be sent to the IOC when there isn't
// enough memory to queue part of a message (we also must not force
// a disconnect because the client is starved for memory).
// 7) avoid the need to check status for each byte pushed into the
@@ -45,7 +45,7 @@
//
// Implementation:
// 1) When queuing a complete message, first test to see if a flush is
// required. If it is a receive thread scheduals the flush with the
// required. If it is a receive thread schedules the flush with the
// send thread, and otherwise directly execute the system call. The
// send thread must run at a higher priority than the receive thread
// if we are to minimize memory consumption.
@@ -58,9 +58,9 @@
// a) A user is queuing more requests that demand a response from a
// callback than are removed by the response that initiated the
// callback, and this situation persists for many callbacks until
// all buffering in the system is exausted.
// all buffering in the system is exhausted.
// b) A user is queuing many requests that demand a response from one
// callback until all buffering in the system is exausted.
// callback until all buffering in the system is exhausted.
// c) Some combination of both (a) nad (b).
//
//

View File

@@ -35,7 +35,7 @@
#include "caerr.h"
/*
* NOOP if this isnt required
* NOOP if this isn't required
*/
#ifdef EPICS_CONVERSION_REQUIRED
@@ -326,7 +326,7 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1022,7 +1022,7 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1056,7 +1056,7 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_sts_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1118,7 +1118,7 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_short(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1239,7 +1239,7 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_sts_char(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1274,7 +1274,7 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** converts fields of struct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** format
@@ -1325,7 +1325,7 @@ arrayElementCount num /* number of values */
for(i=0; i<num; i++){
*pDest = dbr_ntohs( *pSrc );
/*
* dont increment these inside the MACRO
* don't increment these inside the MACRO
*/
pDest++;
pSrc++;

View File

@@ -123,7 +123,7 @@ typedef epicsOldString dbr_class_name_t;
LIBCA_API extern const int epicsTypeToDBR_XXXX [lastEpicsType+1];
/*
* The DBR_XXXX types are indicies into this array
* The DBR_XXXX types are indices into this array
*/
LIBCA_API extern const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1];

View File

@@ -53,7 +53,7 @@ void hostNameCache::transactionComplete ( const char * pHostNameIn )
{
epicsGuard < epicsMutex > guard ( this->mutex );
// a few legacy clients have a direct pointer to this buffer so we
// set the entrire string to nill terminators before we start copying
// set the entire string to nill terminators before we start copying
// in the name (this reduces the chance that another thread will see
// garbage characters).
size_t newNameLen = strlen ( pHostNameIn );

View File

@@ -189,7 +189,7 @@ extern "C" void epicsStdCall configureChannelAccessAddressList
int yes;
/*
* dont load the list twice
* don't load the list twice
*/
assert ( ellCount (pList) == 0 );

View File

@@ -56,7 +56,7 @@ static const double CA_CONN_VERIFY_PERIOD = 30.0; /* (sec) how often to request
* monitor flow control
*
* turning this down effects maximum throughput
* because we dont get an optimal number of bytes
* because we don't get an optimal number of bytes
* per network frame
*/
static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u;

View File

@@ -57,7 +57,7 @@ void msgForMultiplyDefinedPV::transactionComplete ( const char * pHostNameRej )
// calls into cac for the notification
// the msg object (= this) is being deleted as part of the notification
this->cb.pvMultiplyDefinedNotify ( *this, this->channel, this->acc, pHostNameRej );
// !! dont touch 'this' pointer after this point because object has been deleted !!
// !! don't touch 'this' pointer after this point because object has been deleted !!
}
void * msgForMultiplyDefinedPV::operator new ( size_t size,

View File

@@ -147,14 +147,14 @@ void nciu::connect ( unsigned nativeType,
guard, this->accessRightState );
}
// channel uninstal routine grabs the callback lock so
// channel uninstall routine grabs the callback lock so
// a channel will not be deleted while a call back is
// in progress
//
// the callback lock is also taken when a channel
// disconnects to prevent a race condition with the
// code below - ie we hold the callback lock here
// so a chanel cant be destroyed out from under us.
// so a channel cant be destroyed out from under us.
this->notify().connectNotify ( guard );
}

View File

@@ -32,7 +32,7 @@
// destructor is virtual (therefore it is protected).
// I assume that SUNPRO will fix this in future versions.
// With other compilers we get warnings (and
// potential problems) if we dont make the baseNMIU
// potential problems) if we don't make the baseNMIU
// destructor virtual.
#if defined ( __SUNPRO_CC ) && ( __SUNPRO_CC <= 0x540 )
# define NETIO_VIRTUAL_DESTRUCTOR

View File

@@ -591,16 +591,16 @@ void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO (
io.destroy ( *this->pCallbackGuard.get(), guard );
}
else {
// dont reverse the lock hierarchy
// don't reverse the lock hierarchy
epicsGuardRelease < epicsMutex > guardRelease ( guard );
{
//
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( this->cbMutex );
epicsGuard < epicsMutex > guard ( this->mutex );

View File

@@ -571,7 +571,7 @@ int epicsStdCall ca_create_subscription (
oldSubscription (
guard, *pChan, pChan->io, tmpType, count, mask,
pCallBack, pCallBackArg, monixptr );
// dont touch object created after above new because
// don't touch object created after above new because
// the first callback might have canceled, and therefore
// destroyed, it
return ECA_NORMAL;

View File

@@ -41,7 +41,7 @@ oldSubscription::oldSubscription (
*pEventId = this;
}
io.subscribe ( guard, type, nElem, mask, *this, &this->id );
// Dont touch this pointer after this point because the
// Don't touch this pointer after this point because the
// 1st update callback might cancel the subscription and
// thereby destroy this object.
}

View File

@@ -79,7 +79,7 @@
/*
* these can be external since there is only one instance
* per machine so we dont care about reentrancy
* per machine so we don't care about reentrancy
*/
static tsDLList < repeaterClient > client_list;
@@ -335,7 +335,7 @@ static void fanOut ( const osiSockAddr & from, const void * pMsg,
while ( ( pclient = client_list.get () ) ) {
theClients.add ( *pclient );
/* Dont reflect back to sender */
/* Don't reflect back to sender */
if ( pclient->identicalAddress ( from ) ) {
continue;
}
@@ -392,7 +392,7 @@ static void register_new_client ( osiSockAddr & from,
* repeater would not always allow the loopback address
* as a local client address so current clients alternate
* between the address of the first non-loopback interface
* found and the loopback addresss when subscribing with
* found and the loopback address when subscribing with
* the CA repeater until all CA repeaters have been updated
* to current code.
*/
@@ -452,7 +452,7 @@ static void register_new_client ( osiSockAddr & from,
}
/*
* send a noop message to all other clients so that we dont
* send a noop message to all other clients so that we don't
* accumulate sockets when there are no beacons
*/
caHdr noop;

View File

@@ -279,8 +279,8 @@ epicsTimerNotify::expireStatus searchTimer::expire (
if ( this->searchAttempts ) {
char buf[64];
currentTime.strftime ( buf, sizeof(buf), "%M:%S.%09f");
debugPrintf ( ("sent %u delay sec=%f Rts=%s\n",
nFrameSent, this->period(), buf ) );
debugPrintf ( ("sent %u delay Rts=%s\n",
nFrameSent, buf ) );
}
# endif
@@ -317,7 +317,7 @@ void searchTimer :: show ( unsigned level ) const
//
// Reset the delay to the next search request if we get
// at least one response. However, dont reset this delay if we
// at least one response. However, don't reset this delay if we
// get a delayed response to an old search request.
//
void searchTimer::uninstallChanDueToSuccessfulSearchResponse (

View File

@@ -82,8 +82,8 @@ private:
double framesPerTry; /* # of UDP frames per search try */
double framesPerTryCongestThresh; /* one half N tries w congest */
unsigned retry;
unsigned searchAttempts; /* num search tries after last timer experation */
unsigned searchResponses; /* num search resp after last timer experation */
unsigned searchAttempts; /* num search tries after last timer expiration */
unsigned searchResponses; /* num search resp after last timer expiration */
const unsigned index;
ca_uint32_t dgSeqNoAtTimerExpireBegin;
ca_uint32_t dgSeqNoAtTimerExpireEnd;

View File

@@ -82,9 +82,9 @@ extern "C" int epicsStdCall ca_sg_delete ( const CA_SYNC_GID gid )
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( pcac->cbMutex );
epicsGuard < epicsMutex > guard ( pcac->mutex );
@@ -106,9 +106,9 @@ void sync_group_reset ( ca_client_context & client, CASG & sg )
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( client.cbMutex );
epicsGuard < epicsMutex > guard ( client.mutex );
@@ -219,9 +219,9 @@ extern "C" int epicsStdCall ca_sg_test ( const CA_SYNC_GID gid )
// we will definately stall out here if all of the
// following are true
//
// o user creates non-preemtive mode client library context
// o user creates non-preemptive mode client library context
// o user doesnt periodically call a ca function
// o user calls this function from an auxiillary thread
// o user calls this function from an auxiliary thread
//
CallbackGuard cbGuard ( pcac->cbMutex );
epicsGuard < epicsMutex > guard ( pcac->mutex );

View File

@@ -176,7 +176,7 @@ void tcpRecvWatchdog::sendBacklogProgressNotify (
{
guard.assertIdenticalMutex ( this->mutex );
// We dont set "beaconAnomaly" to be false here because, after we see a
// We don't set "beaconAnomaly" to be false here because, after we see a
// beacon anomaly (which could be transiently detecting a reboot) we will
// not trust the beacon as an indicator of a healthy server until we
// receive at least one message from the server.

View File

@@ -81,7 +81,7 @@ void tcpSendThread::run ()
while ( true ) {
// dont wait if there is still labor to be done below
// don't wait if there is still labor to be done below
if ( ! laborPending ) {
epicsGuardRelease < epicsMutex > unguard ( guard );
this->iiu.sendThreadFlushEvent.wait ();
@@ -124,7 +124,7 @@ void tcpSendThread::run ()
}
else {
// This wakes up the resp thread so that it can call
// the connect callback. This isnt maximally efficent
// the connect callback. This isn't maximally efficient
// but it has the excellent side effect of not requiring
// that the UDP thread take the callback lock. There are
// almost no V42 servers left at this point.
@@ -204,7 +204,7 @@ void tcpSendThread::run ()
while ( ! this->iiu.recvThread.exitWait ( 30.0 ) ) {
// it is possible to get stuck here if the user calls
// ca_context_destroy() when a circuit isnt known to
// ca_context_destroy() when a circuit isn't known to
// be unresponsive, but is. That situation is probably
// rare, and the IP kernel might have a timeout for
// such situations, nevertheless we will attempt to deal
@@ -322,7 +322,7 @@ void tcpiiu::recvBytes (
return;
}
// if the circuit was locally aborted then supress
// if the circuit was locally aborted then suppress
// warning messages about bad file descriptor etc
if ( this->state != iiucs_connected &&
this->state != iiucs_clean_shutdown ) {
@@ -358,9 +358,9 @@ void tcpiiu::recvBytes (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
// the replacable printf handler isnt called here
// because it reqires a callback lock which probably
// isnt appropriate here
// the replaceable printf handler isn't called here
// because it requires a callback lock which probably
// isn't appropriate here
char name[64];
this->hostNameCacheInstance.getName (
name, sizeof ( name ) );
@@ -535,11 +535,11 @@ void tcpRecvThread::run ()
}
//
// we dont feel comfortable calling this with a lock applied
// we don't feel comfortable calling this with a lock applied
// (it might block for longer than we like)
//
// we would prefer to improve efficency by trying, first, a
// recv with the new MSG_DONTWAIT flag set, but there isnt
// we would prefer to improve efficiency by trying, first, a
// recv with the new MSG_DONTWAIT flag set, but there isn't
// universal support
//
bool bytesArePending = this->iiu.bytesArePendingInOS ();
@@ -1002,7 +1002,7 @@ void tcpiiu::initiateAbortShutdown (
};
//
// wake up the send thread if it isnt blocking in send()
// wake up the send thread if it isn't blocking in send()
//
this->sendThreadFlushEvent.signal ();
this->flushBlockEvent.signal ();
@@ -1580,7 +1580,7 @@ void tcpiiu::subscriptionRequest (
maxBytes = MAX_TCP;
}
unsigned dataType = subscr.getType ( guard );
// data type bounds checked when sunscription created
// data type bounds checked when subscription created
arrayElementCount maxElem = ( maxBytes - dbr_size[dataType] ) / dbr_value_size[dataType];
if ( nElem > maxElem ) {
throw cacChannel::msgBodyCacheTooSmall ();
@@ -1633,7 +1633,7 @@ void tcpiiu::subscriptionUpdateRequest (
throw cacChannel::msgBodyCacheTooSmall ();
}
comQueSendMsgMinder minder ( this->sendQue, guard );
// nElem boounds checked above
// nElem bounds checked above
this->sendQue.insertRequestHeader (
CA_PROTO_READ_NOTIFY, 0u,
static_cast < ca_uint16_t > ( dataType ),
@@ -1712,7 +1712,7 @@ void tcpiiu :: flush ( epicsGuard < epicsMutex > & guard )
this->flushRequest ( guard );
// the process thread is not permitted to flush as this
// can result in a push / pull deadlock on the TCP pipe.
// Instead, the process thread scheduals the flush with the
// Instead, the process thread schedules the flush with the
// send thread which runs at a higher priority than the
// receive thread. The same applies to the UDP thread for
// locking hierarchy reasons.
@@ -1817,7 +1817,7 @@ void tcpiiu::disconnectAllChannels (
}
while ( nciu * pChan = this->createRespPend.get () ) {
// we dont yet know the server's id so we cant
// we don't yet know the server's id so we cant
// send a channel delete request and will instead
// trust that the server can do the proper cleanup
// when the circuit disconnects
@@ -1848,7 +1848,7 @@ void tcpiiu::disconnectAllChannels (
while ( nciu * pChan = this->unrespCircuit.get () ) {
// if we know that the circuit is unresponsive
// then we dont send a channel delete request and
// then we don't send a channel delete request and
// will instead trust that the server can do the
// proper cleanup when the circuit disconnects
pChan->disconnectAllIO ( cbGuard, guard );
@@ -1883,7 +1883,7 @@ void tcpiiu::unlinkAllChannels (
while ( nciu * pChan = this->createRespPend.get () ) {
pChan->channelNode::listMember =
channelNode::cs_none;
// we dont yet know the server's id so we cant
// we don't yet know the server's id so we cant
// send a channel delete request and will instead
// trust that the server can do the proper cleanup
// when the circuit disconnects
@@ -1921,7 +1921,7 @@ void tcpiiu::unlinkAllChannels (
channelNode::cs_none;
pChan->disconnectAllIO ( cbGuard, guard );
// if we know that the circuit is unresponsive
// then we dont send a channel delete request and
// then we don't send a channel delete request and
// will instead trust that the server can do the
// proper cleanup when the circuit disconnects
pChan->serviceShutdownNotify ( cbGuard, guard );
@@ -1951,7 +1951,7 @@ void tcpiiu::installChannel (
this->channelCountTot++;
chan.channelNode::listMember = channelNode::cs_createReqPend;
chan.searchReplySetUp ( *this, sidIn, typeIn, countIn, guard );
// The tcp send thread runs at apriority below the udp thread
// The tcp send thread runs at a priority below the udp thread
// so that this will not send small packets
this->sendThreadFlushEvent.signal ();
}
@@ -2060,7 +2060,7 @@ bool tcpiiu::bytesArePendingInOS () const
}
return false;
#else
osiSockIoctl_t bytesPending = 0; /* shut up purifys yapping */
osiSockIoctl_t bytesPending = 0; /* shut up Purify's yapping */
int status = socket_ioctl ( this->sock,
FIONREAD, & bytesPending );
if ( status >= 0 ) {

View File

@@ -279,7 +279,7 @@ skip_rest:
/*
* wait for the operation to complete
* (outstabnding decrements to zero)
* (outstanding decrements to zero)
*/
while(ntries){
ca_pend_event(1.0);

View File

@@ -536,9 +536,9 @@ void epicsStdCall caRepeaterRegistrationMessage (
if ( status < 0 ) {
int errnoCpy = SOCKERRNO;
/*
* Different OS return different codes when the repeater isnt running.
* Its ok to supress these messages because I print another warning message
* if we time out registerring with the repeater.
* Different OS return different codes when the repeater isn't running.
* Its ok to suppress these messages because I print another warning message
* if we time out registering with the repeater.
*
* Linux returns SOCK_ECONNREFUSED
* Windows 2000 returns SOCK_ECONNRESET
@@ -673,7 +673,7 @@ bool udpiiu :: searchRespAction (
const epicsTime & currentTime )
{
/*
* we dont currently know what to do with channel's
* we don't currently know what to do with channel's
* found to be at non-IP type addresses
*/
if ( addr.sa.sa_family != AF_INET ) {
@@ -762,7 +762,7 @@ bool udpiiu::beaconAction (
* always set this field to INADDR_ANY
*
* clients always assume that if this
* field is set to something that isnt INADDR_ANY
* field is set to something that isn't INADDR_ANY
* then it is the overriding IP address of the server.
*/
ina.sin_family = AF_INET;
@@ -772,7 +772,7 @@ bool udpiiu::beaconAction (
}
else {
/*
* old servers dont supply this and the
* old servers don't supply this and the
* default port must be assumed
*/
ina.sin_port = htons ( this->serverPort );
@@ -874,7 +874,7 @@ void udpiiu::postMsg (
size = pCurMsg->m_postsize + sizeof ( *pCurMsg );
/*
* dont allow msg body extending beyond frame boundary
* don't allow msg body extending beyond frame boundary
*/
if ( size > blockSize ) {
char buf[64];
@@ -1044,7 +1044,7 @@ void udpiiu :: SearchRespCallback :: notify (
const osiSockAddr & addr, const epicsTime & currentTime )
{
/*
* we dont currently know what to do with channel's
* we don't currently know what to do with channel's
* found to be at non-IP type addresses
*/
if ( addr.sa.sa_family != AF_INET ) {
@@ -1119,7 +1119,7 @@ bool udpiiu :: datagramFlush (
{
guard.assertIdenticalMutex ( cacMutex );
// dont send the version header by itself
// don't send the version header by itself
if ( this->nBytesInXmitBuf <= sizeof ( caHdr ) ) {
return false;
}

View File

@@ -256,7 +256,7 @@ static int caget (pv *pvs, int nPvs, RequestT request, OutputT format,
for (n = 0; n < nPvs; n++) {
switch (format) {
case plain: /* Emulate old caget behaviour */
case plain: /* Emulate old caget behavior */
if (pvs[n].nElems <= 1 && fieldSeparator == ' ') printf("%-30s", pvs[n].name);
else printf("%s", pvs[n].name);
printf("%c", fieldSeparator);

View File

@@ -192,7 +192,7 @@ int caget (pv *pvs, int nPvs, OutputT format,
for (n = 0; n < nPvs; n++) {
switch (format) {
case plain: /* Emulate old caput behaviour */
case plain: /* Emulate old caput behavior */
if (pvs[n].reqElems <= 1 && fieldSeparator == ' ') printf("%-30s", pvs[n].name);
else printf("%s", pvs[n].name);
printf("%c", fieldSeparator);

View File

@@ -529,7 +529,7 @@ long dbProcess(dbCommon *precord)
}
}
/* If already active dont process */
/* If already active don't process */
if (precord->pact) {
unsigned short monitor_mask;
@@ -931,7 +931,7 @@ long dbGet(DBADDR *paddr, short dbrType,
no_elements = capacity = pfl->no_elements;
}
/* Update field info from record (if neccessary);
/* Update field info from record (if necessary);
* may modify paddr->pfield.
*/
if (!dbfl_has_copy(pfl) &&
@@ -1325,7 +1325,6 @@ long dbPut(DBADDR *paddr, short dbrType,
void *pfieldsave = paddr->pfield;
rset *prset = dbGetRset(paddr);
long status = 0;
long offset;
dbFldDes *pfldDes;
int isValueField;
@@ -1349,20 +1348,25 @@ long dbPut(DBADDR *paddr, short dbrType,
if (status) return status;
}
if (paddr->pfldDes->special == SPC_DBADDR &&
prset && prset->get_array_info) {
long dummy;
if (nRequest>1 || paddr->pfldDes->special == SPC_DBADDR) {
long offset = 0;
if (paddr->pfldDes->special == SPC_DBADDR &&
prset && prset->get_array_info) {
long dummy;
status = prset->get_array_info(paddr, &dummy, &offset);
/* paddr->pfield may be modified */
if (status) goto done;
status = prset->get_array_info(paddr, &dummy, &offset);
/* paddr->pfield may be modified */
if (status) goto done;
}
if (no_elements < nRequest)
nRequest = no_elements;
status = dbPutConvertRoutine[dbrType][field_type](paddr, pbuffer,
nRequest, no_elements, offset);
/* update array info */
if (!status && prset->put_array_info)
if (!status && paddr->pfldDes->special == SPC_DBADDR &&
prset && prset->put_array_info) {
status = prset->put_array_info(paddr, nRequest);
}
} else {
if (nRequest < 1) {
recGblSetSevr(precord, LINK_ALARM, INVALID_ALARM);

View File

@@ -73,7 +73,7 @@ DBCORE_API extern int dbAccessDebugPUTF;
* options has a bit set for each option that was accepted
* number_elements is actual number of elements obtained
*
* The individual items can be refered to by the expressions::
* The individual items can be referred to by the expressions::
*
* buffer.status
* buffer.severity

View File

@@ -97,7 +97,7 @@ static long FIND_CONT_NODE(
* processing in that lockset to this task. The separate task is
* used so that locksets that do not have breakpoints are isolated
* from locksets that do. This allows the processing of other
* locksets to continue uninterupted, even if they exist on the same
* locksets to continue uninterrupted, even if they exist on the same
* scan list as a lockset containing a breakpoint.
*
* An entrypoint is the first record that gets processed in a lockset.
@@ -250,7 +250,7 @@ static long FIND_CONT_NODE(
}
/*
* Initialise the breakpoint stack
* Initialize the breakpoint stack
*/
void dbBkptInit(void)
{
@@ -331,6 +331,7 @@ long dbb(const char *record_name)
if (pnode->ex_sem == NULL) {
printf(" BKPT> Out of memory\n");
dbScanUnlock(precord);
free(pnode);
epicsMutexUnlock(bkpt_stack_sem);
return(1);
}

View File

@@ -77,12 +77,12 @@ A set of periodic scan intervals
=back
Additional periodic scan rates may be defined for individual IOCs by making a
local copy of menuScan.dbd and adding more choices as required. Scan rates
should normally be defined in order, with the fastest rates appearing first.
Scan periods may now be specified in seconds, minutes, hours or Hertz/Hz, and
plural time units will also be accepted (seconds are used if no unit is
mentioned in the choice string). For example the rates given below are all
valid:
local copy of menuScan.dbd and adding more choices as required. Periodic scan
rates should normally be defined in order following the other scan types, with
the longest periods appearing first. Scan periods can be specified with a unit
string of C<second>/C<seconds>, C<minute>/C<minutes>, C<hour>/C<hours> or
C<Hertz>/C<Hz>. Seconds are used if no unit is included in the choice string.
For example these rates are all valid:
1 hour
0.5 hours
@@ -97,7 +97,7 @@ initialization (before the normal scan tasks are started).
The B<PHAS> field orders the records within a specific SCAN group. This is not
meaningful for passive records. All records of a specified phase are processed
before those with higher phase number. Whenever possible it is better to use
before those with higher phase number. It is generally better practice to use
linked passive records to enforce the order of processing rather than a phase
number.
@@ -109,23 +109,23 @@ The call to post_event is: post_event(short event_number).
The B<PRIO> field specifies the scheduling priority for processing records
with SCAN=C<I/O Event> and asynchronous record completion tasks.
The B<DISV> field specifies a "disable value". Record processing is
immediately terminated if the value of this field is equal to the value of the
DISA field, i.e. the record is disabled. Note that field values of a record
can be changed by database put or Channel Access, even if a record is
The B<DISV> field specifies a "disable value". Record processing cannot
begin when the value of this field is equal to the value of the DISA
field, meaning the record is disabled. Note that field values of a record
can be changed by database or Channel Access puts, even if the record is
disabled.
The B<DISA> field contains the value that is compared with DISV to determine
if the record is disabled. The value of the DISA field is obtained via SDIS if
SDIS is a database or channel access link. If SDIS is not a database or
channel access link, then DISA can be set via dbPutField or dbPutLink.
If the B<PROC> field of a record is written to, the record is processed.
The B<DISA> field contains the value that is compared with DISV to determine if
the record is disabled. A value is obtained for the DISA field from the B<SDIS>
link field before the IOC tries to process the record. If SDIS is not set, DISA
may be set by some other method to enable and disable the record.
The B<DISS> field defines the record's "disable severity". If this field is
not NO_ALARM and the record is disabled, the record will be put into alarm
with this severity and a status of DISABLE_ALARM.
If the B<PROC> field of a record is written to, the record is processed.
The B<LSET> field contains the lock set to which this record belongs. All
records linked in any way via input, output, or forward database links belong
to the same lock set. Lock sets are determined at IOC initialization time, and
@@ -135,15 +135,18 @@ The B<LCNT> field counts the number of times dbProcess finds the record active
during successive scans, i.e. PACT is TRUE. If dbProcess finds the record
active MAX_LOCK times (currently set to 10) it raises a SCAN_ALARM.
The B<PACT> field is TRUE while the record is being processed. For
The B<PACT> field is TRUE while the record is active (being processed). For
asynchronous records PACT can be TRUE from the time record processing is
started until the asynchronous completion occurs. As long as PACT is TRUE,
dbProcess will not call the record processing routine. See Application
Developers Guide for details on usage of PACT.
The B<FLNK> field is a database link to another record (the "target" record).
Processing a record with a specified FLNK field will force processing of the
target record, provided the target record's SCAN field is set to C<Passive>.
The B<FLNK> field is a link pointing to another record (the "target" record).
Processing a record with the FLNK field set will trigger processing of the
target record towards the end of processing the first record (but before PACT is
cleared), provided the target record's SCAN field is set to C<Passive>. If the
FLNK field is a Channel Access link it must point to the PROC field of the
target record.
The B<SPVT> field is for internal use by the scanning system.
@@ -236,35 +239,46 @@ The B<SPVT> field is for internal use by the scanning system.
=head3 Alarm Fields
These fields indicate the status and severity of alarms, or else determine the
Alarm fields indicate the status and severity of record alarms, or determine
how and when alarms are triggered. Of course, many records have alarm-related
fields not common to all records. These fields are listed and explained in the
fields not common to all records. Those fields are listed and explained in the
appropriate section on each record.
The B<STAT> field contains the current alarm status.
The B<SEVR> field contains the current alarm severity.
These two fields are seen outside database access. The B<NSTA> and B<NSEV>
fields are used by the database access, record support, and device support
routines to set new alarm status and severity values. Whenever any software
component discovers an alarm condition, it uses the following macro function:
recGblSetSevr(precord,new_status,new_severity) This ensures that the current
alarm severity is set equal to the highest outstanding alarm. The file alarm.h
defines all allowed alarm status and severity values.
The B<AMSG> string field may contain more detailed information about the alarm.
The STAT, SEVR and AMSG fields hold alarm information as seen outside of the
database. The B<NSTA>, B<NSEV> and B<NAMSG> fields are used during record
processing by the database access, record support, and device support routines
to set new alarm status and severity values and message text. Whenever any
software component discovers an alarm condition, it calls one of these routines
to register the alarm:
recGblSetSevr(precord, new_status, new_severity);
recGblSetSevrMsg(precord, new_status, new_severity, "Message", ...);
These check the current alarm severity and update the NSTA, NSEV and NAMSG
fields if appropriate so they always relate to the highest severity alarm seen
so far during record processing. The file alarm.h defines the allowed alarm
status and severity values. Towards the end of record processing these fields
are copied into the STAT, SEVR and AMSG fields and alarm monitors triggered.
The B<ACKS> field contains the highest unacknowledged alarm severity.
The B<ACKT> field specifies if it is necessary to acknowledge transient
The B<ACKT> field specifies whether it is necessary to acknowledge transient
alarms.
The B<UDF> indicates if the record's value is B<U>nB<D>eB<F>ined. Typically
this is caused by a failure in device support, the fact that the record has
never been processed, or that the VAL field currently contains a NaN (not a
number). UDF is initialized to TRUE at IOC initialization. Record and device
support routines which write to the VAL field are responsible for setting UDF.
The B<UDF> indicates if the record's value is B<U>nB<D>eB<F>ined. Typically this
is caused by a failure in device support, the fact that the record has never
been processed, or that the VAL field currently contains a NaN (not a number) or
Inf (Infinite) value. UDF defaults to TRUE but can be set in a database file.
Record and device support routines which write to the VAL field are generally
responsible for setting and clearing UDF.
=fields STAT, SEVR, NSTA, NSEV, ACKS, ACKT, UDF
=fields STAT, SEVR, AMSG, NSTA, NSEV, NAMSG, ACKS, ACKT, UDF
=cut
@@ -422,9 +436,11 @@ The B<DPVT> field is is for private use of the device support modules.
=head3 Debugging Fields
The B<TPRO> field is used for trace processing. If this field is non-zero a
message is printed whenever this record is processed, and when any other
record in the same lock-set is processed by a database link from this record.
The B<TPRO> field can be used to trace record processing. When this field is
non-zero and the record is processed, a trace message will be be printed for
this record and any other record in the same lock-set that is triggered by a
database link from this record. The trace message includes the name of the
thread doing the processing, and the name of the record being processed.
The B<BKPT> field indicates if there is a breakpoint set at this record. This
supports setting a debug breakpoint in the record processing. STEP through
@@ -435,32 +451,26 @@ database processing can be supported using this.
=head3 Miscellaneous Fields
The B<ASG> field contains a character string value defining the access
security group for this record. If left empty, the record is placed in group
DEFAULT.
The B<ASG> string field sets the name of the access security group used for this
record. If left empty, the record is placed in group C<DEFAULT>.
The B<ASP> field is a field for private use of the access security system.
The B<ASP> field is private for use by the access security system.
The B<DISP> field controls dbPutFields to this record which are normally
issued by channel access. If the field is set to TRUE all dbPutFields
directed to this record are ignored except to the field DISP itself.
The B<DISP> field controls whether puts from outside the IOC are allowed to
modify the fields of this record at all. If the field is set to TRUE all puts
directed to this record are ignored, except for puts to the field DISP itself.
The B<DTYP> field specifies the device type for the record. Each record type
has its own set of device support routines which are specified in
devSup.ASCII. If a record type does not have any associated device support,
DTYP and DSET are meaningless.
The B<DTYP> field specifies the device type for the record. Most record types
have their own set of device types which are specified in the IOC's database
definition file. If a record type does not call any device support routines,
the DTYP and DSET fields are not used.
The B<MLOK> field contains the monitor lock. The lock used by the monitor
routines when the monitor list is being used. The list is locked whenever
monitors are being scheduled, invoked, or when monitors are being added to or
removed from the list. This field is accessed only by the dbEvent routines.
The B<MLOK> field contains a mutex which is locked by the monitor routines in
dbEvent.c whenever the monitor list for this record is accessed.
The B<MLIS> field is the head of the list of monitors connected to this
The B<MLIS> field holds a linked list of client monitors connected to this
record. Each record support module is responsible for triggering monitors for
any fields that change as a result of record processing. Monitors are present
if mlis count is greater than zero. The call to trigger monitors is:
db_post_event(precord,&data,mask), where "mask" is some combination of
DBE_ALARM, DBE_VALUE, and DBE_LOG.
any fields that change as a result of record processing.
The B<PPN> field contains the address of a putNotify callback.
@@ -474,23 +484,24 @@ The B<RDES> field contains the address of dbRecordType
The B<RPRO> field specifies a reprocessing of the record when current
processing completes.
The B<TIME> field contains the time when this record was last processed in
standard format.
The B<TIME> field holds the time stamp when this record was last processed.
The B<UTAG> field can be used to hold a site-specific 64-bit User Tag value
that is associated with the record's time stamp.
The B<TSE> field indicates the mechanism to use to get the time stamp. '0' -
call get time as before '-1' - call the time stamp driver and use the best
source available. '-2' - the device support provides the time stamp from the
hardware. Values between 1-255 request the time of the last occurance of a
generalTime event.
source available. '-2' - the device support sets the time stamp and optional
user tag from the hardware. Values between 1-255 request the time of the last
occurance of a generalTime event.
The B<TSEL> field contains an input link for obtaining the time stamp. If this
link references the .TIME field of a record then the time stamp of the
referenced record becomes the time stamp for this record as well. In this
case, an internal flag is set and ".TIME" is then overwritten by ".VAL". If
any other field is referenced, the field value is read and stored in the .TSE
field which is then used to acquire a timestamp.
link points to the TIME field of a record then the time stamp and user tag of
that record are copied directly into this record (Channel Access links can only
copy the time stamp). If the link points to any other field, that field's value
is read and stored in the TSE field which is then used to acquire a time stamp.
=fields ASG, ASP, DISP, DTYP, MLOK, MLIS, PPN, PPNR, PUTF, RDES, RPRO, TIME, TSE, TSEL
=fields ASG, ASP, DISP, DTYP, MLOK, MLIS, PPN, PPNR, PUTF, RDES, RPRO, TIME, UTAG, TSE, TSEL
=cut

View File

@@ -63,7 +63,7 @@ cvt_st_ ## TYPE(const char *from, void *pfield, const dbAddr *paddr) { \
return epicsParse##TYPE(from, to, 0, &end); \
}
/* Instanciate for CHAR, UCHAR, SHORT, USHORT and LONG */
/* Instantiate for CHAR, UCHAR, SHORT, USHORT and LONG */
cvt_st_int(Int8)
cvt_st_int(UInt8)
cvt_st_int(Int16)
@@ -99,7 +99,7 @@ static long cvt_st_UInt32(const char *from, void *pfield, const dbAddr *paddr)
return status;
}
/* Instanciate for INT64 and UINT64 */
/* Instantiate for INT64 and UINT64 */
cvt_st_int(Int64)
cvt_st_int(UInt64)
@@ -117,7 +117,7 @@ cvt_st_ ## TYPE(const char *from, void *pfield, const dbAddr *paddr) { \
return epicsParse##TYPE(from, to, &end); \
}
/* Instanciate for FLOAT32 and FLOAT64 */
/* Instantiate for FLOAT32 and FLOAT64 */
cvt_st_float(Float32)
cvt_st_float(Float64)

View File

@@ -9,7 +9,7 @@
\*************************************************************************/
/*
* Auther Jeff Hill
* Author Jeff Hill
*/
#include <stdlib.h>

View File

@@ -16,7 +16,7 @@
extern "C" {
#endif
/* This name should probably be changed to inclue "array" */
/* This name should probably be changed to include "array" */
DBCORE_API long dbPutConvertJSON(const char *json, short dbrType,
void *pdest, long *psize);
DBCORE_API long dbLSConvertJSON(const char *json, char *pdest,

View File

@@ -188,8 +188,11 @@ static long dbDbGetValue(struct link *plink, short dbrType, void *pbuffer,
&& dbChannelSpecial(chan) != SPC_ATTRIBUTE
&& ellCount(&chan->filters) == 0)
{
/* simple scalar: set up shortcut */
unsigned short dbfType = dbChannelFinalFieldType(chan);
/* Simple scalar w/o filters, so *Final* type has no additional information.
* Needed to correctly handle DBF_MENU fields, which become DBF_ENUM during
* probe of dbChannelOpen().
*/
unsigned short dbfType = dbChannelFieldType(chan);
if (dbrType < 0 || dbrType > DBR_ENUM || dbfType > DBF_DEVICE)
return S_db_badDbrtype;

View File

@@ -90,7 +90,7 @@ struct event_user {
void *extralabor_arg;/* parameter to above */
epicsThreadId taskid; /* event handler task id */
struct evSubscrip *pSuicideEvent; /* event that is deleteing itself */
struct evSubscrip *pSuicideEvent; /* event that is deleting itself */
unsigned queovr; /* event que overflow count */
unsigned char pendexit; /* exit pend task */
unsigned char extra_labor; /* if set call extra labor func */
@@ -102,7 +102,7 @@ struct event_user {
/*
* Reliable intertask communication requires copying the current value of the
* channel for later queing so 3 stepper motor steps of 10 each do not turn
* channel for later queuing so 3 stepper motor steps of 10 each do not turn
* into only 10 or 20 total steps part of the time.
*/
@@ -585,7 +585,7 @@ void db_cancel_event (dbEventSubscription event)
/*
* flag the event as canceled by NULLing out the callback handler
*
* make certain that the event isnt being accessed while
* make certain that the event isn't being accessed while
* its call back changes
*/
LOCKEVQUE (pevent->ev_que);
@@ -811,7 +811,7 @@ static void db_queue_event_log (evSubscrip *pevent, db_field_log *pLog)
pevent->nreplace++;
/*
* the event task has already been notified about
* this so we dont need to post the semaphore
* this so we don't need to post the semaphore
*/
firstEventFlag = 0;
}
@@ -844,7 +844,7 @@ static void db_queue_event_log (evSubscrip *pevent, db_field_log *pLog)
UNLOCKEVQUE (ev_que);
/*
* its more efficent to notify the event handler
* its more efficient to notify the event handler
* only after the event is ready and the lock
* is off in case it runs at a higher priority
* than the caller here.
@@ -974,7 +974,7 @@ static int event_read ( struct event_que *ev_que )
* Next event pointer can be used by event tasks to determine
* if more events are waiting in the queue
*
* Must remove the lock here so that we dont deadlock if
* Must remove the lock here so that we don't deadlock if
* this calls dbGetField() and blocks on the record lock,
* dbPutField() is in progress in another task, it has the
* record lock, and it is calling db_post_events() waiting
@@ -1174,9 +1174,6 @@ void db_event_flow_ctrl_mode_on (dbEventCtx ctx)
* notify the event handler task
*/
epicsEventSignal(evUser->ppendsem);
#ifdef DEBUG
printf("fc on %lu\n", tickGet());
#endif
}
/*
@@ -1193,9 +1190,6 @@ void db_event_flow_ctrl_mode_off (dbEventCtx ctx)
* notify the event handler task
*/
epicsEventSignal (evUser->ppendsem);
#ifdef DEBUG
printf("fc off %lu\n", tickGet());
#endif
}
/*

View File

@@ -234,7 +234,7 @@ static const iocshArg dbtgfArg0 = { "record name",iocshArgString};
static const iocshArg * const dbtgfArgs[1] = {&dbtgfArg0};
static const iocshFuncDef dbtgfFuncDef = {"dbtgf",1,dbtgfArgs,
"Database Test Get Field.\n"
"Get field with different DBR_* types"};
"Get field with different DBR_* types\n"};
static void dbtgfCallFunc(const iocshArgBuf *args) { dbtgf(args[0].sval);}
/* dbtpf */
@@ -283,7 +283,7 @@ static const iocshArg * const dbtpnArgs[2] = {&dbtpnArg0,&dbtpnArg1};
static const iocshFuncDef dbtpnFuncDef = {"dbtpn",2,dbtpnArgs,
"Database Put Notify\n"
"Without value, begin async. processing and get\n"
"With value, begin put, process, and get"};
"With value, begin put, process, and get\n"};
static void dbtpnCallFunc(const iocshArgBuf *args)
{ dbtpn(args[0].sval,args[1].sval);}

View File

@@ -613,8 +613,10 @@ long dbtpn(char *pname, char *pvalue)
ptpnInfo = dbCalloc(1, sizeof(tpnInfo));
ptpnInfo->ppn = ppn;
ptpnInfo->callbackDone = epicsEventCreate(epicsEventEmpty);
strncpy(ptpnInfo->buffer, pvalue, 80);
ptpnInfo->buffer[79] = 0;
if (pvalue) {
strncpy(ptpnInfo->buffer, pvalue, sizeof(ptpnInfo->buffer));
ptpnInfo->buffer[sizeof(ptpnInfo->buffer)-1] = 0;
}
ppn->usrPvt = ptpnInfo;
epicsThreadCreate("dbtpn", epicsThreadPriorityHigh,

View File

@@ -130,7 +130,7 @@ DBCORE_API int dbNotifyDump(void);
* if a process request is issued and also calls the client callbacks.
*
* A process request is issued if any of the following is true.
* 1) The requester has issued a processs request and record is passive.
* 1) The requester has issued a process request and record is passive.
* 2) The requester is doing a put, the record is passive, and either
* a) The field description is process passive.
* b) The field is PROC.
@@ -156,7 +156,7 @@ DBCORE_API int dbNotifyDump(void);
* As soon as a record completes processing the field is set NULL
* ppnr pointer to processNotifyRecord, which is a private structure
* owned by dbNotify.
* dbNotify is reponsible for this structure.
* dbNotify is responsible for this structure.
*
*/
#ifdef __cplusplus

View File

@@ -110,7 +110,7 @@ extern "C" void putNotifyCompletion ( processNotify *ppn )
if ( pNtfy ) {
pBlocker->pNotify = 0;
// Its necessary to signal the initiators now before we call
// the user callback. This is less efficent, and potentially
// the user callback. This is less efficient, and potentially
// causes more thread context switching, but its probably
// unavoidable because its possible that the use callback
// might destroy this object.

View File

@@ -1300,7 +1300,7 @@ static void dbpr_insert_msg(TAB_BUFFER *pMsgBuff,size_t len,int tab_size)
current_len = strlen(pMsgBuff->out_buff);
tot_line = current_len + len;
/* flush buffer if overflow would occor */
/* flush buffer if overflow would occur */
if (tot_line > MAXLINE)
dbpr_msg_flush(pMsgBuff, tab_size);

View File

@@ -7,7 +7,7 @@
\*************************************************************************/
/** @file dbUnitTest.h
* @brief Helpers for unitests of process database
* @brief Helpers for unittests of process database
* @author Michael Davidsaver, Ralph Lange
*
* @see @ref dbunittest
@@ -99,7 +99,7 @@ DBCORE_API void testdbVGetFieldEqual(const char* pv, short dbrType, va_list ap);
/** Assert that a dbPutField() array operation will complete successfully.
*
* @param pv a PV name, possibly including filter expression
* @param a DBF_\* type code (cf. dbfType in dbFldTypes.h)
* @param dbrType a DBF_\* type code (cf. dbfType in dbFldTypes.h)
* @param count Number of elements in pbuf array
* @param pbuf Array of values to write
*
@@ -114,7 +114,7 @@ DBCORE_API void testdbPutArrFieldOk(const char* pv, short dbrType, unsigned long
/**
* @param pv PV name string
* @param dbfType One of the DBF_* macros from dbAccess.h
* @param dbfType One of the DBF_\* macros from dbAccess.h
* @param nRequest Number of elements to request from pv
* @param pbufcnt Number of elements pointed to be pbuf
* @param pbuf Expected value buffer
@@ -149,7 +149,7 @@ DBCORE_API void testMonitorDestroy(testMonitor*);
*/
DBCORE_API void testMonitorWait(testMonitor*);
/** Return the number of monitor events which have occured since create,
* or a pervious reset (called reset=1).
* or a previous reset (called reset=1).
* Calling w/ reset=0 only returns the count.
* Calling w/ reset=1 resets the count to zero and ensures that the next
* wait will block unless subsequent events occur. Returns the previous

View File

@@ -27,7 +27,7 @@ DBCORE_API extern volatile int interruptAccept;
/*
* Adaptors for db_access users
* Adapters for db_access users
*/
DBCORE_API struct dbChannel * dbChannel_create(const char *pname);
DBCORE_API int dbChannel_get(struct dbChannel *chan,

View File

@@ -318,7 +318,7 @@ void recGblGetTimeStampSimm(void *pvoid, const epicsEnum16 simm, struct link *si
} else {
if (simm != menuSimmNO) {
if (siol && !dbLinkIsConstant(siol)) {
if (dbGetTimeStamp(siol, &prec->time))
if (dbGetTimeStampTag(siol, &prec->time, &prec->utag))
errlogPrintf("recGblGetTimeStampSimm: dbGetTimeStamp (sim mode) failed, %s.SIOL = %s\n",
prec->name, siol->value.pv_link.pvname);
return;

View File

@@ -101,10 +101,6 @@ static int yyreset(void)
")" return(yytext[0]);
"," return(yytext[0]);
{doublequote}({stringchar}|{escape})*{newline} { /* bad string */
yyerrorAbort("Newline in string, closing quote missing");
}
<JSON>"null" return jsonNULL;
<JSON>"true" return jsonTRUE;
<JSON>"false" return jsonFALSE;
@@ -130,6 +126,20 @@ static int yyreset(void)
<INITIAL,JSON>{whitespace} ;
/* Error patterns */
{doublequote}({stringchar}|{escape})*{newline} {
yyerrorAbort("Newline in string, closing quote missing");
}
<JSON>{doublequote}({stringchar}|{escape})*{doublequote} {
yyerrorAbort("Bad character in JSON string");
}
<JSON>{singlequote}({stringchar}|{escape})*{singlequote} {
yyerrorAbort("Bad character in JSON string");
}
<INITIAL,JSON>. {
char message[40];
YY_BUFFER_STATE *dummy=0;

View File

@@ -1063,7 +1063,7 @@ int dbRecordNameValidate(const char *name)
}
for(; *pos; i++, pos++) {
char c = *pos;
unsigned char c = *pos;
if(i==0) {
/* first character restrictions */
if(c=='-' || c=='+' || c=='[' || c=='{') {
@@ -1072,8 +1072,8 @@ int dbRecordNameValidate(const char *name)
}
/* any character restrictions */
if(c < ' ') {
errlogPrintf("Warning: Record/Alias name '%s' should not contain non-printable 0x%02u\n",
name, (unsigned)c);
errlogPrintf("Warning: Record/Alias name '%s' should not contain non-printable 0x%02x\n",
name, c);
} else if(c==' ' || c=='\t' || c=='"' || c=='\'' || c=='.' || c=='$') {
epicsPrintf("Error: Bad character '%c' in Record/Alias name \"%s\"\n",

View File

@@ -677,7 +677,7 @@ long dbAddPath(DBBASE *pdbbase,const char *path)
if (!path) return(0); /* Empty path strings are ignored */
/* care is taken to properly deal with white space
* 1) preceding and trailing white space is removed from paths
* 2) white space inbetween path separator counts as an empty name
* 2) white space in between path separator counts as an empty name
* (see below)
*/
expectingPath = FALSE;
@@ -710,8 +710,8 @@ long dbAddPath(DBBASE *pdbbase,const char *path)
/*
* len is always nonzero because we found something that
* 1) isnt white space
* 2) isnt a path separator
* 1) isn't white space
* 2) isn't a path separator
*/
len = (plast - path) + 1;
if (dbAddOnePath (pdbbase, path, (unsigned) len)) return (-1);
@@ -722,7 +722,7 @@ long dbAddPath(DBBASE *pdbbase,const char *path)
}
/*
* an empty name at beginning, middle, or end of a path string that isnt
* an empty name at beginning, middle, or end of a path string that isn't
* empty means current directory
*/
if (expectingPath||sawMissingPath) {
@@ -2274,7 +2274,7 @@ long dbParseLink(const char *str, short ftype, dbLinkInfo *pinfo)
len -= (parm - pstr);
}
/* generalized extraction of ID charactor and integer pairs (eg. "#C15 S14") */
/* generalized extraction of ID character and integer pairs (eg. "#C15 S14") */
ret = sscanf(pinfo->target, "# %c%d %c%d %c%d %c%d %c%d %c",
&pinfo->hwid[0], &pinfo->hwnums[0],
&pinfo->hwid[1], &pinfo->hwnums[1],
@@ -2333,11 +2333,11 @@ long dbParseLink(const char *str, short ftype, dbLinkInfo *pinfo)
}
pinfo->ltype = PV_LINK;
pstr = strchr(pstr, ' '); /* find start of link modifiers (can't be seperated by tabs) */
pstr = strchr(pstr, ' '); /* find start of link modifiers (can't be separated by tabs) */
if (pstr) {
*pstr++ = '\0'; /* isolate modifiers. pinfo->target is PV name only for re-use in struct pv_link */
/* Space seperation of modifiers isn't required, and other chars are ignored.
/* Space separation of modifiers isn't required, and other chars are ignored.
* Order of comparisons resolves ambiguity by checking for
* longer matches first.
* eg. "QQCPPXMSITT" is pvlOptCPP|pvlOptMSI

View File

@@ -374,7 +374,7 @@ static int yyerror(char *str)
else
epicsPrintf("Error");
if (!yyFailed) { /* Only print this stuff once */
epicsPrintf(" at or before \"%s\"", yytext);
epicsPrintf(" at or before '%s'", yytext);
dbIncludePrint();
yyFailed = TRUE;
}

View File

@@ -77,7 +77,7 @@ typedef struct typed_dset {
long (*init_record)(struct dbCommon *prec);
/** Called when SCAN="I/O Intr" on startup, or after SCAN is changed.
*
* Caller must assign the third arguement (IOCSCANPVT*). eg.
* Caller must assign the third argument (IOCSCANPVT*). eg.
@code
struct mpvt {
IOSCANPVT drvlist;
@@ -173,7 +173,7 @@ DBCORE_API void dbInitDevSup(struct devSup *pdevSup, dset *pdset);
#define S_dev_badOutType (M_devSup| 9) /*Bad OUT link type*/
#define S_dev_badInitRet (M_devSup|11) /*Bad init_rec return value */
#define S_dev_badBus (M_devSup|13) /*Illegal bus type*/
#define S_dev_badCard (M_devSup|15) /*Illegal or nonexistant module*/
#define S_dev_badCard (M_devSup|15) /*Illegal or nonexistent module*/
#define S_dev_badSignal (M_devSup|17) /*Illegal signal*/
#define S_dev_NoInit (M_devSup|19) /*No init*/
#define S_dev_Conflict (M_devSup|21) /*Multiple records accessing same signal*/

View File

@@ -180,7 +180,7 @@ union value {
struct vmeio vmeio; /* vme io point */
struct camacio camacio; /* camac io point */
struct rfio rfio; /* CEBAF RF buffer interface */
struct abio abio; /* allen-bradley io point */
struct abio abio; /* Allen-Bradley io point */
struct gpibio gpibio;
struct bitbusio bitbusio;
struct instio instio; /* instrument io link */

View File

@@ -21,14 +21,14 @@
extern "C" {
#endif
/*NOTE Do NOT add aditional definitions with out modifying dbLexRoutines.c */
/*NOTE Do NOT add additional definitions with out modifying dbLexRoutines.c */
/* types 1-99 are global. Record specific must start with 100 */
#define SPC_NOMOD 1 /*Field must not be modified*/
#define SPC_DBADDR 2 /*db_name_to_addr must call cvt_dbaddr*/
#define SPC_SCAN 3 /*A scan related field is being changed*/
#define SPC_ALARMACK 5 /*Special Alarm Acknowledgement*/
#define SPC_AS 6 /* Access Security*/
#define SPC_ATTRIBUTE 7 /* psuedo field, i.e. attribute field*/
#define SPC_ATTRIBUTE 7 /* pseudo field, i.e. attribute field*/
/* useful when record support must be notified of a field changing value*/
#define SPC_MOD 100
/* used by all records that support a reset field*/

View File

@@ -317,7 +317,7 @@ static void makeSubstitutions(inputData * const inputPvt,
pstart = ++p;
/*Look for end quote*/
while (*p && (*p != '"')) {
/*allow escape for embeded quote*/
/*allow escape for embedded quote*/
if ((p[0] == '\\') && p[1] == '"') {
p += 2;
continue;
@@ -1028,7 +1028,7 @@ static tokenType subGetNextToken(subFile *psubFile)
subFileErrPrint(psubFile, "Strings must be on single line\n");
abortExit(1);
}
/*allow escape for embeded quote*/
/*allow escape for embedded quote*/
if ((p[0] == '\\') && p[1] == '"') {
*pto++ = *p++;
*pto++ = *p++;

View File

@@ -97,7 +97,7 @@ typedef struct rsrv_put_notify {
/*
* casCalloc()
*
* (dont drop below some max block threshold)
* (don't drop below some max block threshold)
*/
static void *casCalloc(size_t count, size_t size)
{
@@ -341,7 +341,7 @@ static int bad_tcp_cmd_action ( caHdrLargeArray *mp, void *pPayload,
log_header ( pCtx, client, mp, pPayload, 0 );
/*
* by default, clients dont recover
* by default, clients don't recover
* from this
*/
SEND_LOCK (client);
@@ -503,7 +503,7 @@ static void read_reply ( void *pArg, struct dbChannel *dbch,
cid = ECA_NORMAL;
/* If the client has requested a zero element count we interpret this as a
* request for all avaiable elements. In this case we initialise the
* request for all available elements. In this case we initialize the
* header with the maximum element size specified by the database. */
autosize = pevext->msg.m_count == 0;
item_count =
@@ -870,7 +870,7 @@ static int host_name_action ( caHdrLargeArray *mp, void *pPayload,
}
/*
* user name will not change if there isnt enough memory
* user name will not change if there isn't enough memory
*/
pMalloc = malloc(size);
if(!pMalloc){
@@ -949,7 +949,7 @@ static int client_name_action ( caHdrLargeArray *mp, void *pPayload,
}
/*
* user name will not change if there isnt enough memory
* user name will not change if there isn't enough memory
*/
pMalloc = malloc(size);
if(!pMalloc){
@@ -1016,7 +1016,7 @@ unsigned cid
* NOTE: This detects the case where the PV id wraps
* around and we attempt to have two resources on the same id.
* The lock is applied here because on some architectures the
* ++ operator isnt atomic.
* ++ operator isn't atomic.
*/
LOCK_CLIENTQ;
@@ -1245,8 +1245,8 @@ static int claim_ciu_action ( caHdrLargeArray *mp,
return RSRV_OK;
}
DLOG ( 2, ("CAS: claim_ciu_action found '%s', type %d, count %d\n",
pName, dbChannelCAType(dbch), dbChannelElements(dbch)) );
DLOG ( 2, ("CAS: claim_ciu_action found '%s', type %d, count %ld\n",
pName, dbChannelExportCAType(dbch), dbChannelElements(dbch)) );
pciu = casCreateChannel (
client,
@@ -1436,7 +1436,7 @@ static void write_notify_reply ( struct client * pClient )
msgtmp.m_available, 0 );
if ( localStatus != ECA_NORMAL ) {
/*
* inability to aquire buffer space
* inability to acquire buffer space
* Indicates corruption
*/
errlogPrintf("CA server corrupted - put call back(s) discarded\n");
@@ -1570,7 +1570,7 @@ static int rsrvExpandPutNotify (
if ( sizeNeeded > pNotify->valueSize ) {
/*
* try to use the union embeded in the free list
* try to use the union embedded in the free list
* item, but allocate a random sized block if they
* writing a vector.
*/
@@ -1625,7 +1625,7 @@ void rsrvFreePutNotify ( client *pClient,
epicsMutexUnlock ( pClient->putNotifyLock );
/*
* if any possiblity that the put notify is
* if any possibility that the put notify is
* outstanding then cancel it
*/
if ( busyTmp ) {
@@ -1736,7 +1736,7 @@ static int write_notify_action ( caHdrLargeArray *mp, void *pPayload,
if ( ! pciu->pPutNotify ) {
/*
* send error and go to next request
* if there isnt enough memory left
* if there isn't enough memory left
*/
log_header ( "no memory to initiate put notify",
client, mp, pPayload, 0 );
@@ -1874,7 +1874,7 @@ static int event_add_action (caHdrLargeArray *mp, void *pPayload, struct client
* messages sent by the server).
*/
DLOG ( 3, ("event_add_action: db_post_single_event (0x%X)\n",
DLOG ( 3, ("event_add_action: db_post_single_event (%p)\n",
pevext->pdbev) );
db_post_single_event(pevext->pdbev);
@@ -2144,7 +2144,7 @@ int rsrv_version_reply ( struct client *client )
SEND_LOCK ( client );
/*
* sequence number is specified zero when we copy in the
* header because we dont know it until we receive a datagram
* header because we don't know it until we receive a datagram
* from the client
*/
status = cas_copy_in_header ( client, CA_PROTO_VERSION,
@@ -2191,7 +2191,7 @@ static int search_reply_udp ( caHdrLargeArray *mp, void *pPayload, struct client
/* Exit quickly if channel not on this node */
if (dbChannelTest(pName)) {
DLOG ( 2, ( "CAS: Lookup for channel \"%s\" failed\n", pPayLoad ) );
DLOG ( 2, ( "CAS: Lookup for channel \"%s\" failed\n", pName ) );
return RSRV_OK;
}
@@ -2210,7 +2210,7 @@ static int search_reply_udp ( caHdrLargeArray *mp, void *pPayload, struct client
* starting with V4.4 the count field is used (abused)
* to store the minor version number of the client.
*
* New versions dont alloc the channel in response
* New versions don't alloc the channel in response
* to a search request.
* For these, allocation has been moved to claim_ciu_action().
*
@@ -2278,14 +2278,14 @@ static int search_reply_tcp (
/* Exit quickly if channel not on this node */
if (dbChannelTest(pName)) {
DLOG ( 2, ( "CAS: Lookup for channel \"%s\" failed\n", pPayLoad ) );
DLOG ( 2, ( "CAS: Lookup for channel \"%s\" failed\n", pName ) );
if (mp->m_dataType == DOREPLY)
search_fail_reply ( mp, pPayload, client );
return RSRV_OK;
}
/*
* stop further use of server if memory becomes scarse
* stop further use of server if memory becomes scarce
*/
spaceAvailOnFreeList = freeListItemsAvail ( rsrvChanFreeList ) > 0
&& freeListItemsAvail ( rsrvEventFreeList ) > reasonableMonitorSpace;
@@ -2397,7 +2397,7 @@ int camessage ( struct client *client )
assert(pCaBucket);
/* drain remnents of large messages that will not fit */
/* drain remnants of large messages that will not fit */
if ( client->recvBytesToDrain ) {
if ( client->recvBytesToDrain >= client->recv.cnt ) {
client->recvBytesToDrain -= client->recv.cnt;
@@ -2410,7 +2410,7 @@ int camessage ( struct client *client )
}
}
DLOG ( 2, ( "CAS: Parsing %d(decimal) bytes\n", recv->cnt ) );
DLOG ( 2, ( "CAS: Parsing %d(decimal) bytes\n", client->recv.cnt ) );
while ( 1 )
{
@@ -2472,7 +2472,7 @@ int camessage ( struct client *client )
}
/*
* disconnect clients that dont send 8 byte
* disconnect clients that don't send 8 byte
* aligned payloads
*/
if ( msgsize & 0x7 ) {

View File

@@ -50,7 +50,7 @@ void camsgtask ( void *pParm )
int status;
/*
* allow message to batch up if more are comming
* allow message to batch up if more are coming
*/
status = socket_ioctl (client->sock, FIONREAD, &check_nchars);
if (status < 0) {

View File

@@ -545,7 +545,7 @@ void rsrv_init (void)
beacon_startStopEvent = epicsEventMustCreate(epicsEventEmpty);
castcp_ctl = ctlPause;
/* Thread priorites
/* Thread priorities
* Now starting per interface
* TCP Listener: epicsThreadPriorityCAServerLow-2
* Name receiver: epicsThreadPriorityCAServerLow-4
@@ -1204,7 +1204,7 @@ void destroy_tcp_client ( struct client *client )
assert ( ! status );
/*
* wait for extra labor in progress to comple
* wait for extra labor in progress to complete
*/
db_flush_extra_labor_event ( client->evuser );
}
@@ -1229,7 +1229,7 @@ struct client * create_client ( SOCKET sock, int proto )
size_t spaceNeeded;
/*
* stop further use of server if memory becomes scarse
* stop further use of server if memory becomes scarce
*/
spaceAvailOnFreeList = freeListItemsAvail ( rsrvClientFreeList ) > 0
&& freeListItemsAvail ( rsrvSmallBufFreeListTCP ) > 0;

View File

@@ -16,7 +16,7 @@
* Improvements
* ------------
* .01
* Dont send channel found message unless there is memory, a task slot,
* Don't send channel found message unless there is memory, a task slot,
* and a TCP socket available. Send a diagnostic instead.
* Or ... make the timeout shorter? This is only a problem if
* they persist in trying to make a connection after getting no
@@ -269,9 +269,9 @@ void cast_server(void *pParm)
}
/*
* allow messages to batch up if more are comming
* allow messages to batch up if more are coming
*/
nchars = 0; /* supress purify warning */
nchars = 0; /* suppress purify warning */
status = socket_ioctl(recv_sock, FIONREAD, &nchars);
if (status<0) {
errlogPrintf ("CA cast server: Unable to fetch N characters pending\n");

View File

@@ -239,7 +239,7 @@ void initializePutNotifyFreeList (void);
unsigned rsrvSizeOfPutNotify ( struct rsrv_put_notify *pNotify );
/*
* inclming protocol maintetnance
* incoming protocol maintenance
*/
void casExpandRecvBuffer ( struct client *pClient, ca_uint32_t size );

View File

@@ -43,7 +43,7 @@ static long init_record(dbCommon *pcommon)
{
long status=0;
/* dont convert */
/* don't convert */
status=2;
return status;

View File

@@ -108,6 +108,7 @@ static long add_record(dbCommon *pcommon)
recGblRecordError(status, (void *)prec,
"devSiSoftCallback (add_record) linked record not found");
free(pdevPvt);
return status;
}

View File

@@ -736,6 +736,10 @@ The choices can be found by following the link to the menuFtype definition.
These fields specify how many array elements the input value fields may hold.
Note that access to the C<NOT> field from C code must use the field name in
upper case, e.g. C<< prec->NOT >> since the lower-case C<not> is a reserved
word in C++ and cannot be used as an identifier.
=fields NOA, NOB, NOC, NOD, NOE, NOF, NOG, NOH, NOI, NOJ, NOK, NOL, NOM, NON, NOO, NOP, NOQ, NOR, NOS, NOT, NOU
=cut

View File

@@ -162,7 +162,7 @@ static long process(struct dbCommon *pcommon)
prec->udf = FALSE;
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}
@@ -357,7 +357,7 @@ static long writeValue(aaoRecord *prec)
case menuYesNoYES: {
recGblSetSevr(prec, SIMM_ALARM, prec->sims);
if (prec->pact || (prec->sdly < 0.)) {
/* Device suport is responsible for buffer
/* Device support is responsible for buffer
which might be write-only so we may not be
allowed to call dbPutLink on it.
Maybe also device support has an advanced

View File

@@ -32,9 +32,10 @@ The record-specific fields are described below, grouped by functionality.
=head3 Scan Parameters
The array analog output record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in L<Scan
Fields>. In addition, L<Scanning Specification> explains how these fields are
used. I/O event scanning is only available when supported by device support.
circumstances the record will be processed.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Write Parameters
@@ -43,8 +44,9 @@ writes its data. The OUT field determines where the array analog output writes i
output. It can be a hardware address, a channel access or database link, or a
constant. Only in records that use soft device support can the OUT field be a
channel access link, a database link, or a constant. Otherwise, the OUT field must
be a hardware address. See L<Address Specification> for information on the format
of hardware addresses and database links.
be a hardware address. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of hardware addresses and database links.
=head4 Fields related to array writing

View File

@@ -43,7 +43,7 @@
#undef GEN_SIZE_OFFSET
#include "epicsExport.h"
/* Hysterisis for alarm filtering: 1-1/e */
/* Hysteresis for alarm filtering: 1-1/e */
#define THRESHOLD 0.6321
/* Create RSET - Record Support Entry Table*/

View File

@@ -45,8 +45,9 @@ hardware address information that the device support uses to determine where the
input data should come from.
The format for the INP field value depends on the device support layer that is
selected by the DTYP field.
See L<Address Specification|...> for a description of the various hardware
address formats supported.
See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for a description of the various hardware address formats supported.
=head3 Units Conversion
@@ -157,6 +158,10 @@ They do not affect the functioning of the record at all.
=over
=item *
NAME is the record's name, and can be useful when the PV name that a client
knows is an alias for the record.
=item *
DESC is a string that is usually used to briefly describe the record.
@@ -175,7 +180,10 @@ DOUBLE fields.
=back
=fields DESC, EGU, HOPR, LOPR, PREC
See L<Fields Common to All Record Types|dbCommonRecord/Operator Display
Parameters> for more about the record name (NAME) and description (DESC) fields.
=fields NAME, DESC, EGU, HOPR, LOPR, PREC
=head3 Alarm Limits
@@ -198,6 +206,11 @@ positive number of seconds will delay the record going into or out of a minor
alarm severity or from minor to major severity until the input signal has been
in the alarm range for that number of seconds.
See L<Alarm Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#alarm-specification>
for a complete explanation of record alarms and of the standard fields.
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related
to alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST, AFTC, LALM
=head3 Monitor Parameters

View File

@@ -188,7 +188,7 @@ static long process(struct dbCommon *pcommon)
if(!status) convert(prec, value);
prec->udf = isnan(prec->val);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}

View File

@@ -161,9 +161,9 @@ The analog output record sends its desired output to the address in the
OUT field. For analog outputs that write their values to devices, the
OUT field must specify the address of the I/O card. In addition, the
DTYP field must contain the name of the device support module. Be aware
that the address format differs according to the I/O bus used. See
Address Specification for information on the format of hardware
addresses.
that the address format differs according to the I/O bus used. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of hardware addresses.
For soft records the output link can be a database link, a channel
access link, or a constant value. If the link is a constant, no output
@@ -307,7 +307,7 @@ for more information on simulation mode and its fields.
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
prompt("Desired Output Link")
promptgroup("40 - Input")
interest(1)
}

View File

@@ -37,6 +37,8 @@ The binary input record has the standard fields for specifying under what
circumstances the record will be processed.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Read and Convert Parameters
The read and convert fields determine where the binary input gets its
@@ -44,14 +46,15 @@ input from and how to convert the raw signal to engineering units. The INP
field contains the address from where device support retrieves the value.
If the binary input record gets its value from hardware, the address of the
card must be entered in the INP field, and the name of the device support
module must be entered in the DTYP field. See L<Address Specification> for
information on the format of the hardware address. Be aware that the format
differs between types of cards.
module must be entered in the DTYP field. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of the hardware address.
For records that specify C<Soft Channel> or C<Raw Soft Channel> device
support routines, the INP field can be a channel or a database link, or a
constant. If a constant, VAL can be changed directly by dbPuts. See
L<Address Specification> for information on the format of database and
constant. If a constant, VAL can be changed directly by dbPuts. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of database and
channel access addresses. Also, see L<Device Support for Soft Records> in
this chapter for information on soft device support.
@@ -102,9 +105,10 @@ C<MAJOR>. The ZSV field holds the severity for the zero state; OSV, for
the one state. COSV causes an alarm whenever the state changes between
0 and 1 and the severity is configured as MINOR or MAJOR.
See L<Alarm Specification> for a complete explanation of the discrete alarm
states. L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related to alarms that are
common to all record types.
See L<Alarm Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#alarm-specification>
for a complete explanation of record alarms and of the standard fields.
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related
to alarms that are common to all record types.
=fields ZSV, OSV, COSV

View File

@@ -211,7 +211,7 @@ static long process(struct dbCommon *pcommon)
} else prec->rval = (epicsUInt32)prec->val;
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}

View File

@@ -15,29 +15,6 @@ values into other records via database or channel access links. This record
can implement both latched and momentary binary outputs depending on how
the HIGH field is configured.
=head2 Parameter Fields
The binary output's fields fall into the following categories:
=over 1
=item *
scan parameters
=item *
convert and write parameters
=item *
operator display parameters
=item *
alarm parameters
=item *
run-time parameters
=back
=recordtype bo
=cut
@@ -47,13 +24,10 @@ recordtype(bo) {
=head3 Scan Parameters
The binary output record has the standard fields for specifying under what
circumstances the record will be processed. The fields are listed in
circumstances the record will be processed.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
L<Scan Fields|dbCommonRecord/Scan Fields>. In addition, L<Scanning Specification> explains how these
fields are used. Note that I/O event scanning is only supported for those card
types that interrupt.
=fields SCAN
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Desired Output Parameters
@@ -65,14 +39,14 @@ output mode select (OMSL) field, which can have two possible values:
C<losed_loop> or C<supervisory>. If C<supervisory> is specified, the value
in the VAL field can be set externally via dbPuts at run-time. If
C<closed_loop> is specified, the VAL field's value is obtained from the
address specified in the desired output location (DOL) field which can be a
address specified in the Desired Output Link (DOL) field which can be a
database link or a channel access link, but not a constant. To achieve
continuous control, a database link to a control algorithm record should be
entered in the DOL field.
L<Address Specification> presents more information on database addresses
and links. L<Scanning Specification> explaines the effect of database
linkage on scanning.
See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on hardware addresses and links.
=fields DOL, OMSL
@@ -130,15 +104,17 @@ The OUT field specifies where the binary output record writes its output.
It must specify the address of an I/O card if the record sends its output
to hardware, and the DTYP field must contain the corresponding device
support module. Be aware that the address format differs according to the
I/O bus used. See L<Address Specification> for information on the format of
hardware addresses.
I/O bus used. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of hardware addresses.
Otherwise, if the record is configured to use the soft device support
modules, then it can be either a database link, a channel access link, or a
constant. Be aware that nothing will be written when OUT is a constant. See
L<Address Specification> for information on the format of the database and
channel access addresses. Also, see L<Device Support For Soft Records> in
this chapter for more on output to other records.
Otherwise, if the record is configured to use the soft device support modules,
then it can be either a database link, a channel access link, or a constant. Be
aware that nothing will be written when OUT is a constant. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of the database and channel access addresses.
Also, see L<Device Support For Soft Records> in this chapter for more on output
to other records.
=head3 Operator Display Parameters
@@ -242,7 +218,7 @@ for more information on simulation mode and its fields.
menu(menuOmsl)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
prompt("Desired Output Link")
promptgroup("40 - Input")
interest(1)
}

View File

@@ -37,7 +37,7 @@
#undef GEN_SIZE_OFFSET
#include "epicsExport.h"
/* Hysterisis for alarm filtering: 1-1/e */
/* Hysteresis for alarm filtering: 1-1/e */
#define THRESHOLD 0.6321
/* Create RSET - Record Support Entry Table */

View File

@@ -28,8 +28,9 @@ recordtype(calc) {
The Calc record has the standard fields for specifying under what
circumstances the record will be processed.
These fields are listed in L<Scan Fields|dbCommonRecord/Scan Fields>.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Read Parameters
@@ -40,8 +41,9 @@ channel access link. If they are constants, they will be initialized with
the value they are configured with and can be changed via C<dbPuts>. They
cannot be hardware addresses.
See L<Address Specification> for information on how to specify database
links.
See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on how to specify database links.
=fields INPA, INPB, INPC, INPD, INPE, INPF, INPG, INPH, INPI, INPJ, INPK, INPL
@@ -453,9 +455,12 @@ The following alarm parameters which are configured by the user, define the
limit alarms for the VAL field and the severity corresponding to those
conditions.
The HYST field defines an alarm deadband for each limit. See L<Alarm Specification>
for a complete explanation of alarms of these fields. L<Alarm Fields|dbCommonRecord/Alarm Fields>
lists other fields related to alarms that are common to all record types.
The HYST field defines an alarm deadband for each limit.
See L<Alarm Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#alarm-specification>
for a complete explanation of record alarms and of the standard fields.
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related
to alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST

View File

@@ -245,7 +245,7 @@ static long process(struct dbCommon *pcommon)
if ( !pact ) {
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStamp(prec);
}
/* check for output link execution */

View File

@@ -535,13 +535,13 @@ the user and which describes the values being operated upon. The string is
retrieved whenever the routine C<get_units()> is called. The EGU string is
solely for an operator's sake and does not have to be used.
The HOPR and LOPR fields on;y refer to the limits if the VAL, HIHI, HIGH,
The HOPR and LOPR fields only refer to the limits of the VAL, HIHI, HIGH,
LOW, and LOLO fields. PREC controls the precision of the VAL field.
=head4 Menu calcoutINAV
The INAV-INLV fields indicate the status of the link to the PVs specified
in the INPA-INPL fields, respectfully. These field can have four possible
in the INPA-INPL fields respectively. These fields can have four possible
values:
=menu calcoutINAV
@@ -568,7 +568,7 @@ The OUTV field indicates the status of the OUT link. If has the same
possible values as the INAV-INLV fields.
The CLCV and OLCV fields indicate the validity of the expression in the
CALC and OCAL fields respectfully. If the expression in invalid, the field
CALC and OCAL fields respectively. If the expression in invalid, the field
is set to one.
The DLYA field is set to one during the delay specified in ODLY.
@@ -590,10 +590,12 @@ The following alarm parameters, which are configured by the user, define the
limit alarms for the VAL field and the severity corresponding to those
conditions.
The HYST field defines an alarm deadband for each limit. See
L<Alarm Specification> for a complete explanation of alarms and these
fields. C<Alarm Fields> lists other fields related to alarms that are
common to all record types.
The HYST field defines an alarm deadband for each limit.
See L<Alarm Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#alarm-specification>
for a complete explanation of record alarms and of the standard fields.
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related
to alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST
@@ -1218,7 +1220,7 @@ honors the alarm hysteresis factor (HYST). Thus the value must change by at
least HYST before the alarm status and severity changes.
=item 4.
Determine if the Output Execution Option (OOPT) is met. If it met, either
Determine if the Output Execution Option (OOPT) is met. If met, either
execute the output link (and output event) immediately (if ODLY = 0), or
schedule a callback after the specified interval. See the explanation for
the C<execOutput()> routine below.

View File

@@ -67,11 +67,12 @@ The record-specific fields are described below, grouped by functionality.
=head3 Scanning Parameters
The compression record has the standard fields for specifying under what
circumstances the record will be processed. These fields are listed in
circumstances the record will be processed. Since the compression record
supports no direct interfaces to hardware, its SCAN field cannot be set to C<<<
I/O Intr >>>.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
L<Scan Fields|dbCommonRecord/Scan Fields>. In addition, L<Scanning Specification>
explains how these fields are used. Since the compression record supports no
direct interfaces to hardware, its SCAN field cannot specify C<<< I/O Intr >>>.
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Algorithms and Related Parameters
@@ -88,9 +89,11 @@ The following fields determine what channel to read and how to compress the data
As stated above, the ALG field specifies which algorithm to be performed on the data.
The INP should be a database or channel access link. Though INP can be a constant,
the data compression algorithms are supported only when INP is a database link. See
L<Address Specification> for information on specifying links.
The INP should be a database or channel access link. Though INP can be a
constant, the data compression algorithms are supported only when INP is a
database link. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on specifying links.
IHIL and ILIL can be set to provide an initial value filter on the input array.

View File

@@ -43,7 +43,7 @@ originates, i.e., the data which is to be fowarded to the records in its
output links. The output mode select (OMSL) field determines whether the
output originates from another record or from run-time database access.
When set to C<closed_loop>, the desired output is retrieved from the link
specified in the desired output (DOL) field, which can specify either a
specified in the Desired Output Link (DOL) field, which can specify either a
database or a channel access link, and placed into the VAL field. When set
to C<supervisory>, the desired output can be written to the VAL field via
dbPuts at run-time.
@@ -59,8 +59,9 @@ undergoes no conversions before it is sent out to the output links.
=head3 Write Parameters
The OUTA-OUTH fields specify where VAL is to be sent. Each field that is to
forward data must specify an address to another record. See
L<Address Specification> for information on specifying links.
forward data must specify an address to another record. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on specifying links.
The SELL, SELM, and SELN fields specify which output links are to be
used.
@@ -71,42 +72,57 @@ SELM is a menu, with three choices:
=menu dfanoutSELM
If SELM=="All", then all output links are used, and the values of
If SELM is C<All>, then all output links are used, and the values of
SELL and SELN are ignored.
If SELM=="Specified", then the value of SELN is used to specify a single
If SELM is C<Specified>, then the value of SELN is used to specify a single
link which will be used. If SELN==0, then no link will be used; if SELN==1,
then OUTA will be used, and so on.
SELN can either have its value set directly, or have its values retrieved
from another EPICS PV. If SELL is a valid PV link, then SELN will be set to
the values of the linked PV.
SELN can either have its value set directly, or have it retrieved from
another EPICS PV. If SELL is a valid PV link, then SELN will be read from
the linked PV.
If SELM=="Mask", then SELN will be treated as a bit mask. If bit one of
SELN is set, then OUTA will be used, if bit two is set, OUTB will be used.
Thus if SELN==5, OUTC and OUTA will be used.
If SELM is C<Mask>, then SELN will be treated as a bit mask. If bit zero
(the LSB) of SELN is set, then OUTA will be written to; if bit one is set,
OUTB will be written to, and so on. Thus when SELN==5, both OUTC and OUTA
will be written to.
=fields OUTA, OUTB, OUTC, OUTD, OUTE, OUTF, OUTG, OUTH
=fields SELL, SELM, SELN, OUTA, OUTB, OUTC, OUTD, OUTE, OUTF, OUTG, OUTH
=head3 Operator Display Parameters
These parameters are used to present meaningful data to the operator. They
display the value and other parameters of the data fanout record either
textually or graphically.
These parameters are used to present meaningful data to the operator.
They do not affect the functioning of the record at all.
The EGU field can contain a string of up to 16 characters describing the
value on the VAL field.
=over
The HOPR and LOPR fields determine the upper and lower display limits for
graphic displays and the upper and lower control limits for control
displays. They apply to the VAL, HIHI, HIGH, LOW, and LOLO fields. The
record support routines C<get_graphic_double()> and C<get_control_double()>
retrieve HOPR and LOPR.
=item *
NAME is the record's name, and can be useful when the PV name that a client
knows is an alias for the record.
=item *
DESC is a string that is usually used to briefly describe the record.
=item *
EGU is a string of up to 16 characters naming the engineering units that the VAL
field represents.
=item *
The HOPR and LOPR fields set the upper and lower display limits for the VAL,
HIHI, HIGH, LOW, and LOLO fields.
=item *
The PREC field determines the floating point precision (i.e. the number of
digits to show after the decimal point) with which to display VAL and the other
DOUBLE fields.
=back
See L<Fields Common to All Record Types|dbCommonRecord/Operator Display
Parameters> for more on the record name (NAME) and description (DESC) fields.
Parameters> for more about the record name (NAME) and description (DESC) fields.
=fields EGU, HOPR, LOPR, NAME, DESC
=fields NAME, DESC, EGU, HOPR, LOPR, PREC
=head3 Alarm Parameters
@@ -119,9 +135,10 @@ in the corresponding field (HHSV, LLSV, HSV, LSV) and can be either
NO_ALARM, MINOR, or MAJOR. In the hysteresis field (HYST) can be entered a
number which serves as the deadband on the limit alarms.
See L<Alarm Specification> for a complete explanation of alarms and these
fields. L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related to alarms that are
common to all record types.
See L<Alarm Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#alarm-specification>
for a complete explanation of record alarms and of the standard fields.
L<Alarm Fields|dbCommonRecord/Alarm Fields> lists other fields related
to alarms that are common to all record types.
=fields HIHI, HIGH, LOW, LOLO, HHSV, HSV, LSV, LLSV, HYST
@@ -211,7 +228,7 @@ hysteresis factors for monitor callbacks.
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
prompt("Desired Output Link")
promptgroup("40 - Input")
interest(1)
}

View File

@@ -37,10 +37,10 @@ recordtype(event) {
=head3 Scan Parameters
The event record has the standard fields for specifying under what circumstances
it will be processed. If the SCAN field specifies C<I/O Intr>, then device
support will provide an interrupt handler, posting an event number when an I/O
interrupt occurs.
These fields are listed in L<Scan Fields|dbCommonRecord/Scan Fields>.
it will be processed.
These fields are described in L<Scan Fields|dbCommonRecord/Scan Fields>.
=fields SCAN, PHAS, EVNT, PRIO, PINI
=head3 Event Number Parameters
@@ -73,8 +73,9 @@ The device support routines use the address in this record to obtain input. For
records that provide an interrupt handler, the INP field should specify the
address of the I/O card, and the DTYP field should specify a valid device
support module. Be aware that the address format differs according to the card
type used. See L<Address Specification> for information on the format of
hardware addresses and specifying links.
type used. See L<Address
Specification|https://docs.epics-controls.org/en/latest/guides/EPICS_Process_Database_Concepts.html#address-specification>
for information on the format of hardware addresses and specifying links.
For soft records, the INP field can be a constant, a database link, or a channel
access link. For soft records, the DTYP field should specify C<Soft Channel>.

View File

@@ -160,7 +160,7 @@ static long init_record(struct dbCommon *pcommon, int pass)
prec->bptr = calloc(prec->nelm, sizeof(epicsUInt32));
}
/* calulate width of array element */
/* calculate width of array element */
prec->wdth = (prec->ulim - prec->llim) / prec->nelm;
return 0;
}

View File

@@ -40,7 +40,7 @@
#undef GEN_SIZE_OFFSET
#include "epicsExport.h"
/* Hysterisis for alarm filtering: 1-1/e */
/* Hysteresis for alarm filtering: 1-1/e */
#define THRESHOLD 0.6321
/* Create RSET - Record Support Entry Table*/
#define report NULL
@@ -359,16 +359,16 @@ static void checkAlarms(int64inRecord *prec, epicsTimeStamp *timeLast)
}
/* DELTA calculates the absolute difference between its arguments
* expressed as an unsigned 32-bit integer */
* expressed as an unsigned 64-bit integer */
#define DELTA(last, val) \
((epicsUInt32) ((last) > (val) ? (last) - (val) : (val) - (last)))
((epicsUInt64) ((last) > (val) ? (last) - (val) : (val) - (last)))
static void monitor(int64inRecord *prec)
{
unsigned short monitor_mask = recGblResetAlarms(prec);
if (prec->mdel < 0 ||
DELTA(prec->mlst, prec->val) > (epicsUInt32) prec->mdel) {
DELTA(prec->mlst, prec->val) > (epicsUInt64) prec->mdel) {
/* post events for value change */
monitor_mask |= DBE_VALUE;
/* update last value monitored */
@@ -376,7 +376,7 @@ static void monitor(int64inRecord *prec)
}
if (prec->adel < 0 ||
DELTA(prec->alst, prec->val) > (epicsUInt32) prec->adel) {
DELTA(prec->alst, prec->val) > (epicsUInt64) prec->adel) {
/* post events for archive value change */
monitor_mask |= DBE_LOG;
/* update last archive value monitored */

View File

@@ -146,7 +146,7 @@ static long process(dbCommon *pcommon)
if (!status) convert(prec,value);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}

View File

@@ -154,7 +154,7 @@ monitoring deadband functionality.
interest(1)
}
field(DOL,DBF_INLINK) {
prompt("Desired Output Loc")
prompt("Desired Output Link")
promptgroup("40 - Input")
interest(1)
}

View File

@@ -41,7 +41,7 @@
#undef GEN_SIZE_OFFSET
#include "epicsExport.h"
/* Hysterisis for alarm filtering: 1-1/e */
/* Hysteresis for alarm filtering: 1-1/e */
#define THRESHOLD 0.6321
/* Create RSET - Record Support Entry Table*/
#define report NULL

View File

@@ -148,7 +148,7 @@ static long process(struct dbCommon *pcommon)
if (!status) convert(prec,value);
/* Update the timestamp before writing output values so it
* will be uptodate if any downstream records fetch it via TSEL */
* will be up to date if any downstream records fetch it via TSEL */
recGblGetTimeStampSimm(prec, prec->simm, NULL);
}

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