Merge branch '7.0' release 7.4.0.1 into PSI-7.0

Conflicts:
	.gitmodules
	modules/database/src/ioc/db/Makefile
	modules/libcom/test/epicsAtomicTest.cpp
	modules/pvAccess
	modules/pvData
	modules/pvDatabase
	modules/pva2pva
This commit is contained in:
2020-06-02 14:55:30 +02:00
868 changed files with 33281 additions and 27367 deletions

View File

@ -1,11 +1,18 @@
# AppVeyor configuration for EPICS Base
# Ralph Lange <ralph.lange@gmx.de>
# Copyright (c) 2016-2017 ITER Organization
# .appveyor.yml for use with EPICS Base ci-scripts
# (see: https://github.com/epics-base/ci-scripts)
# Version format
version: base-{branch}-{build}
#---------------------------------#
# build cache #
#---------------------------------#
# The AppVeyor cache allowance is way too small (1GB per account across all projects, branches and jobs)
# to be used for the dependency builds.
cache:
- C:\Users\appveyor\.tools
#---------------------------------#
# repository cloning #
#---------------------------------#
@ -16,15 +23,15 @@ init:
- git config --global core.autocrlf true
# Set clone depth (do not fetch complete history)
clone_depth: 50
clone_depth: 5
# Skipping commits affecting only specific files
skip_commits:
files:
- 'documentation/*'
- 'templates/*'
- '**/*.html'
- '**/*.md'
- '.travis.yml'
#---------------------------------#
# build matrix configuration #
@ -37,45 +44,44 @@ configuration:
- dynamic-debug
- static-debug
# Environment variables: compiler toolchain
# Environment variables: compiler toolchain, base version, setup file, ...
environment:
matrix:
- TOOLCHAIN: mingw
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
TOOLCHAIN: 2019
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLCHAIN: 2017
- TOOLCHAIN: 14.0
- TOOLCHAIN: 12.0
- TOOLCHAIN: 11.0
- TOOLCHAIN: 10.0
# common / default variables for all jobs
SETUP_PATH: .ci-local:.ci
BASE: SELF
# Platform: architecture
matrix:
- CMP: vs2019
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
- CMP: vs2017
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- CMP: vs2015
- CMP: vs2013
- CMP: vs2012
- CMP: vs2010
- CMP: mingw
# Platform: processor architecture
platform:
- x86
- x64
# Matrix configuration: allow specific failing jobs
# Matrix configuration: exclude sets of jobs
matrix:
exclude:
# VS Express installs don't have the 64 bit compiler
# VS2012 and older installs don't have the 64 bit compiler
- platform: x64
TOOLCHAIN: 10.0
# Exclude to reduce total job runtime
# skip 64-bit for older and 32-bit for newer
CMP: vs2012
- platform: x64
TOOLCHAIN: 11.0
CMP: vs2010
- platform: x64
CMP: vs2008
# Exclude more jobs to reduce build time
# Skip 32-bit for "middle-aged" compilers
- platform: x86
TOOLCHAIN: mingw
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
CMP: vs2017
- platform: x86
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
TOOLCHAIN: 2019
- platform: x86
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
TOOLCHAIN: 2017
CMP: vs2015
#---------------------------------#
# building & testing #
@ -83,18 +89,17 @@ matrix:
install:
- cmd: git submodule update --init --recursive
- cmd: .ci/appveyor-prepare.bat
- cmd: python .ci/appveyor/do.py prepare
build_script:
- cmd: .ci/appveyor-make.bat
- cmd: python .ci/appveyor/do.py build
test_script:
- cmd: .ci/appveyor-make.bat tapfiles
- cmd: .ci/appveyor-make.bat test-results
- cmd: python .ci/appveyor/do.py test
on_finish:
- ps: Get-ChildItem *.tap -Recurse -Force | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }
- cmd: python .ci/appveyor/do.py build test-results -s
#---------------------------------#
# debugging #
@ -104,10 +109,13 @@ on_finish:
## note that you will need to connect within the usual build timeout limit (60 minutes)
## so you may want to adjust the build matrix above to just build the one of interest
#on_failure:
# print the connection info
#init:
# - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
# block a failed build (until the watchdog barks)
#on_failure:
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
#---------------------------------#
# notifications #

View File

@ -1,132 +0,0 @@
:: Universal build script for AppVeyor (https://ci.appveyor.com/)
:: Environment:
:: TOOLCHAIN - toolchain version [10.0/11.0/12.0/14.0/2017/2019/mingw]
:: CONFIGURATION - determines EPICS build [dynamic/static]
:: PLATFORM - architecture [x86/x64]
::
:: All command line args are passed to make
Setlocal EnableDelayedExpansion
:: we do not currently have a combined static and debug EPICS_HOST_ARCH target
:: So a combined debug and static target will appear to be just static
:: but debug will have been specified in CONFIG_SITE by appveyor-prepare.bat
set "ST="
echo.%CONFIGURATION% | findstr /C:"debug">nul && (
set "ST=-debug"
)
echo.%CONFIGURATION% | findstr /C:"static">nul && (
set "ST=-static"
)
set MY_OS=64BIT
if "%PLATFORM%"=="x86" set MY_OS=32BIT
echo [INFO] Platform: %MY_OS%
:: Use parallel make, except for 3.14
set "MAKEARGS=-j2 -Otarget"
if "%APPVEYOR_REPO_BRANCH%"=="3.14" set MAKEARGS=
if "%TOOLCHAIN%"=="mingw" (
set "MAKE=mingw32-make"
if "%MY_OS%"=="64BIT" (
set "EPICS_HOST_ARCH=windows-x64-mingw"
set "INCLUDE=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\include;%INCLUDE%"
set "PATH=C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;%PATH%"
echo [INFO] MinGW Toolchain 64bit
) else (
set "EPICS_HOST_ARCH=win32-x86-mingw"
set "INCLUDE=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\include;%INCLUDE%"
set "PATH=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin;%PATH%"
echo [INFO] MinGW Toolchain 32bit
)
echo [INFO] Compiler Version
gcc -v
goto Finish
)
if "%TOOLCHAIN%"=="2019" (
echo [INFO] Setting strawberry perl path
set "PATH=c:\strawberry\perl\site\bin;C:\strawberry\perl\bin;%PATH%"
)
set "VSINSTALL=C:\Program Files (x86)\Microsoft Visual Studio %TOOLCHAIN%"
if not exist "%VSINSTALL%\" set "VSINSTALL=C:\Program Files (x86)\Microsoft Visual Studio\%TOOLCHAIN%\Community"
if not exist "%VSINSTALL%\" goto MSMissing
set "MAKE=C:\tools\make"
echo [INFO] APPVEYOR_BUILD_WORKER_IMAGE=%APPVEYOR_BUILD_WORKER_IMAGE%
if "%MY_OS%"=="64BIT" (
set EPICS_HOST_ARCH=windows-x64%ST%
:: VS 2017/2019
if exist "%VSINSTALL%\VC\Auxiliary\Build\vcvars64.bat" (
call "%VSINSTALL%\VC\Auxiliary\Build\vcvars64.bat"
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
if exist "%VSINSTALL%\VC\vcvarsall.bat" (
call "%VSINSTALL%\VC\vcvarsall.bat" amd64
where cl
if !ERRORLEVEL! NEQ 0 (
call "%VSINSTALL%\VC\vcvarsall.bat" x86_amd64
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
)
goto MSFound
)
if exist "%VSINSTALL%\VC\bin\amd64\vcvars64.bat" (
call "%VSINSTALL%\VC\bin\amd64\vcvars64.bat"
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
) else (
set EPICS_HOST_ARCH=win32-x86%ST%
:: VS 2017/2019
if exist "%VSINSTALL%\VC\Auxiliary\Build\vcvars32.bat" (
call "%VSINSTALL%\VC\Auxiliary\Build\vcvars32.bat"
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
if exist "%VSINSTALL%\VC\vcvarsall.bat" (
call "%VSINSTALL%\VC\vcvarsall.bat" x86
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
if exist "%VSINSTALL%\VC\bin\vcvars32.bat" (
call "%VSINSTALL%\VC\bin\vcvars32.bat"
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
if exist "%VSINSTALL%\Common7\Tools\vsvars32.bat" (
call "%VSINSTALL%\Common7\Tools\vsvars32.bat"
where cl
if !ERRORLEVEL! NEQ 0 goto MSMissing
goto MSFound
)
)
:MSMissing
echo [INFO] Installation for MSVC Toolchain %TOOLCHAIN% / %MY_OS% seems to be missing
exit 1
:MSFound
echo [INFO] Microsoft Visual Studio Toolchain %TOOLCHAIN%
echo [INFO] Compiler Version
cl
:Finish
echo [INFO] EPICS_HOST_ARCH: %EPICS_HOST_ARCH%
echo [INFO] Make version
%MAKE% --version
echo [INFO] Perl version
perl --version
%MAKE% %MAKEARGS% %*

View File

@ -1,52 +0,0 @@
:: Build script for AppVeyor (https://ci.appveyor.com/)
:: Environment:
:: TOOLCHAIN - Toolchain Version [9.0/10.0/11.0/12.0/14.0/mingw]
:: CONFIGURATION - determines EPICS build [dynamic/static, -debug]
:: PLATFORM - "x86" -> use 32bit architecture
::
:: Prepares an Appveyor build by excuting the following steps
:: - Set up configure\CONFIG_SITE for static vs. dynamic build
:: - Install Mingw (TOOLCHAIN setting) in the in the appropriate flavor
:: - Download and install Make-4.1 from EPICS download page
Setlocal EnableDelayedExpansion
set MY_OS=64BIT
if "%PLATFORM%"=="x86" set MY_OS=32BIT
echo [INFO] Platform: %MY_OS%
:: with MSVC either static or debug can be handled as part
:: of EPICS_HOST_ARCH but not both. So we set the appropriate
:: options in CONFIG_SITE. For mingw and cygwin they are missing
:: some static and debug targets so set things here too
echo.%CONFIGURATION% | findstr /C:"static">nul && (
echo SHARED_LIBRARIES=NO>> configure\CONFIG_SITE
echo STATIC_BUILD=YES>> configure\CONFIG_SITE
echo [INFO] EPICS set up for static build
) || (
echo [INFO] EPICS set up for dynamic build
)
echo.%CONFIGURATION% | findstr /C:"debug">nul && (
echo HOST_OPT=NO>> configure\CONFIG_SITE
echo [INFO] EPICS set up for debug build
) || (
echo [INFO] EPICS set up for optimized build
)
echo [INFO] Installing Make 4.2.1 from ANL web site
curl -fsS --retry 3 -o C:\tools\make-4.2.1.zip https://epics.anl.gov/download/tools/make-4.2.1-win64.zip
cd \tools
"C:\Program Files\7-Zip\7z" e make-4.2.1.zip
set "PERLVER=5.30.0.1"
if "%TOOLCHAIN%"=="2019" (
echo [INFO] Installing Strawberry Perl %PERLVER%
curl -fsS --retry 3 -o C:\tools\perl-%PERLVER%.zip http://strawberryperl.com/download/%PERLVER%/strawberry-perl-%PERLVER%-64bit.zip
cd \tools
"C:\Program Files\7-Zip\7z" x perl-%PERLVER%.zip -oC:\strawberry
cd \strawberry
:: we set PATH in appveyor-build.bat
call relocation.pl.bat
)

View File

@ -1,8 +0,0 @@
#!/bin/sh
#
# Checkout submodules on their appropriate branches
#
git submodule foreach '\
git checkout `git config -f $toplevel/.gitmodules submodule.$name.branch` && \
git pull '

View File

@ -1,77 +0,0 @@
#!/bin/sh
set -e -x
die() {
echo "$1" >&2
exit 1
}
CACHEKEY=1
export EPICS_HOST_ARCH=`perl src/tools/EpicsHostArch.pl`
[ -e configure/os/CONFIG_SITE.Common.linux-x86 ] || die "Wrong location: $PWD"
case "$CMPLR" in
clang)
echo "Host compiler is clang"
cat << EOF >> configure/os/CONFIG_SITE.Common.$EPICS_HOST_ARCH
GNU = NO
CMPLR_CLASS = clang
CC = clang
CCC = clang++
EOF
;;
*) echo "Host compiler is default";;
esac
if [ "$STATIC" = "YES" ]
then
echo "Build static libraries/executables"
cat << EOF >> configure/CONFIG_SITE
SHARED_LIBRARIES=NO
STATIC_BUILD=YES
EOF
fi
# requires wine and g++-mingw-w64-i686
if [ "$WINE" = "32" ]
then
echo "Cross mingw32"
sed -i -e '/CMPLR_PREFIX/d' configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
cat << EOF >> configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
CMPLR_PREFIX=i686-w64-mingw32-
EOF
cat << EOF >> configure/CONFIG_SITE
CROSS_COMPILER_TARGET_ARCHS+=win32-x86-mingw
EOF
fi
# set RTEMS to eg. "4.9" or "4.10"
if [ -n "$RTEMS" ]
then
echo "Cross RTEMS${RTEMS} for pc386"
curl -L "https://github.com/mdavidsaver/rsb/releases/download/20171203-${RTEMS}/i386-rtems${RTEMS}-trusty-20171203-${RTEMS}.tar.bz2" \
| tar -C / -xmj
sed -i -e '/^RTEMS_VERSION/d' -e '/^RTEMS_BASE/d' configure/os/CONFIG_SITE.Common.RTEMS
cat << EOF >> configure/os/CONFIG_SITE.Common.RTEMS
RTEMS_VERSION=$RTEMS
RTEMS_BASE=$HOME/.rtems
EOF
cat << EOF >> configure/CONFIG_SITE
CROSS_COMPILER_TARGET_ARCHS += RTEMS-pc386-qemu
EOF
# find local qemu-system-i386
echo -n "Using QEMU: "
type qemu-system-i386 || echo "Missing qemu"
fi
make -j2 RTEMS_QEMU_FIXUPS=YES CMD_CFLAGS="${CMD_CFLAGS}" CMD_CXXFLAGS="${CMD_CXXFLAGS}" CMD_LDFLAGS="${CMD_LDFLAGS}"
if [ "$TEST" != "NO" ]
then
make -j2 tapfiles
make -s test-results
fi

View File

@ -1,24 +0,0 @@
#!/bin/sh
set -e -x
die() {
echo "$1" >&2
exit 1
}
if [ -f /etc/hosts ]
then
# The travis-ci "bionic" image throws us a curveball in /etc/hosts
# by including two entries for localhost. The first for 127.0.1.1
# which causes epicsSockResolveTest to fail.
# cat /etc/hosts
# ...
# 127.0.1.1 localhost localhost ip4-loopback
# 127.0.0.1 localhost nettuno travis vagrant travis-job-....
sudo sed -i -e '/^127\.0\.1\.1/ s|localhost\s*||g' /etc/hosts
echo "==== /etc/hosts"
cat /etc/hosts
echo "===="
fi

8
.gitmodules vendored
View File

@ -22,6 +22,10 @@
path = modules/pva2pva
url = https://github.com/epics-base/pva2pva
branch = master
[submodule ".ci"]
path = .ci
url = https://github.com/epics-base/ci-scripts
branch = master
[submodule "modules/pcas"]
path = modules/pcas
url = https://github.com/epics-modules/pcas
path = modules/pcas
url = https://github.com/epics-modules/pcas

View File

@ -89,7 +89,8 @@ git archive --prefix=$PREFIX $TOPREV | tar -C "$TDIR"/tar -x
#
# sub-modules appear in tree as eg.:
# 160000 commit c3a6cfcf0dad4a4eeecf59b474710d06ff3eb68a modules/ca
git ls-tree -r $TOPREV | awk '/^[0-9]+ commit / {print $3, $4}' | \
git ls-tree -r $TOPREV | \
awk '/^[0-9]+ commit / && $4 != ".ci" {print $3, $4}' | \
while read HASH MODDIR
do
echo "Visiting $HASH $MODDIR"
@ -105,13 +106,17 @@ sed -i -e 's|^\./||' "$TDIR"/list.1
# Exclude files
sed \
-e '/\/\.\?ci\//d' \
-e '/\/\.ci\//d' \
-e '/\/\.ci-local\//d' \
-e '/\/\.tools\//d' \
-e '/\/jenkins\//d' \
-e '/\/\.git/d' \
-e '/\/\.hgtags$/d' \
-e '/\/\.cproject$/d' \
-e '/\/\.project$/d' \
-e '/\/\.travis\.yml$/d' \
-e '/\/\.appveyor\.yml$/d' \
-e '/\/\.readthedocs\.yml$/d' \
"$TDIR"/list.1 > "$TDIR"/list.2
if ! diff -U 0 "$TDIR"/list.1 "$TDIR"/list.2

View File

@ -1,63 +1,89 @@
language: c
# .travis.yml for use with EPICS Base ci-scripts
# (see: https://github.com/epics-base/ci-scripts)
matrix:
include:
- sudo: false
dist: bionic
compiler: gcc
env: CMPLR=gcc
- sudo: false
dist: xenial
compiler: gcc
env: CMPLR=gcc
- sudo: false
dist: bionic
compiler: gcc
env: CMPLR=gcc CMD_CXXFLAGS=-std=c++11
- sudo: false
dist: trusty
compiler: gcc
env: CMPLR=gcc STATIC=YES CMD_CXXFLAGS=-std=c++11
- sudo: false
dist: bionic
compiler: gcc
env: CMPLR=clang
- sudo: false
dist: xenial
compiler: gcc
env: CMPLR=clang
- sudo: false
dist: trusty
compiler: gcc
env: CMPLR=clang STATIC=YES
- sudo: false
dist: trusty
compiler: gcc
env: WINE=32 TEST=NO STATIC=YES
- sudo: false
dist: trusty
compiler: gcc
env: WINE=32 TEST=NO STATIC=NO
- sudo: false
dist: trusty
compiler: gcc
env: RTEMS=4.10
- sudo: false
dist: trusty
compiler: gcc
env: RTEMS=4.9
- os: osx
env: CMD_CFLAGS="-mmacosx-version-min=10.7" CMD_CXXFLAGS="-mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++" CMD_LDXFLAGS="-mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++"
language: cpp
compiler: gcc
dist: xenial
cache:
directories:
- $HOME/.cache
env:
global:
- SETUP_PATH=.ci-local:.ci
- BASE=SELF
addons:
apt:
packages:
# for all EPICS builds
- libreadline6-dev
- libncurses5-dev
- perl
# for clang compiler
- clang
# for mingw builds (32bit and 64bit)
- g++-mingw-w64-i686
- g++-mingw-w64-x86-64
# for RTEMS cross builds
- qemu-system-x86
homebrew:
packages:
# for all EPICS builds
- bash
update: true
install:
- ./.ci/travis/prepare.sh
script:
- .ci/travis-prepare.sh
- .ci/travis-build.sh
- ./.ci/travis/build.sh
# Define build jobs
jobs:
include:
# Different configurations of default gcc and clang
- dist: bionic
- dist: xenial
- dist: bionic
env: EXTRA="CMD_CXXFLAGS=-std=c++11"
- dist: trusty
env: STATIC=YES EXTRA="CMD_CXXFLAGS=-std=c++11"
- dist: bionic
compiler: clang
- compiler: clang
- dist: trusty
compiler: clang
env: STATIC=YES
# Cross-compilations to Windows using MinGW and WINE
- env: WINE=32 TEST=NO STATIC=YES
compiler: mingw
- env: WINE=32 TEST=NO STATIC=NO
compiler: mingw
# Cross-compilation to RTEMS
- env: RTEMS=4.10
- env: RTEMS=4.9
# MacOS build
- os: osx
env:
- EXTRA="CMD_CFLAGS=-mmacosx-version-min=10.7"
- EXTRA1="CMD_CXXFLAGS=-mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++"
- EXTRA2="CMD_LDXFLAGS=-mmacosx-version-min=10.7 -std=c++11 -stdlib=libc++"
compiler: clang

View File

@ -42,8 +42,6 @@ FIND_TOOL = $(firstword $(wildcard $(TOOLS)/$(1) $(EPICS_BASE)/src/tools/$(1)))
PODTOHTML = $(PERL) $(TOOLS)/podToHtml.pl
CONVERTRELEASE = $(PERL) $(call FIND_TOOL,convertRelease.pl)
FULLPATHNAME = $(PERL) $(TOOLS)/fullPathName.pl
TAPTOJUNIT = $(PERL) $(TOOLS)/tap-to-junit-xml.pl
PROVE = $(PERL) $(TOOLS)/epicsProve.pl
GENVERSIONHEADER = $(PERL) $(TOOLS)/genVersionHeader.pl $(QUIET_FLAG) $(QUESTION_FLAG)
MAKERPATH = $(PYTHON) $(TOOLS)/makeRPath.py
@ -63,3 +61,13 @@ REPLACEVAR = $(PERL) $(TOOLS)/replaceVAR.pl
# tools for cleaning out unwanted files
CVSCLEAN = $(call FIND_TOOL,cvsclean.pl)
DEPCLEAN = $(call FIND_TOOL,depclean.pl)
#---------------------------------------------------------------
# Tools for testing
TAPTOJUNIT = $(PERL) $(TOOLS)/tap-to-junit-xml.pl
PROVE = $(PERL) $(TOOLS)/epicsProve.pl
PROVE.tap = $(PROVE) --ext .tap --exec "$(CAT)"
TEST_FAILURE_FILENAME = .tests-failed.log
TEST_FAILURE_FILE = $(TOP)/$(TEST_FAILURE_FILENAME)
PROVE_FAILURE = echo $(abspath .)>> $(TEST_FAILURE_FILE)

View File

@ -48,11 +48,11 @@ EPICS_VERSION = 7
EPICS_REVISION = 0
# EPICS_MODIFICATION must be a number >=0 and <256
EPICS_MODIFICATION = 3
EPICS_MODIFICATION = 4
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
# Not included in the official EPICS version number if zero
EPICS_PATCH_LEVEL = 2
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)
@ -60,12 +60,8 @@ EPICS_PATCH_LEVEL = 2
EPICS_DEV_SNAPSHOT=-DEV
#EPICS_DEV_SNAPSHOT=-pre1
#EPICS_DEV_SNAPSHOT=-pre1-DEV
#EPICS_DEV_SNAPSHOT=-pre2
#EPICS_DEV_SNAPSHOT=-pre2-DEV
#EPICS_DEV_SNAPSHOT=-rc1
#EPICS_DEV_SNAPSHOT=-rc1-DEV
#EPICS_DEV_SNAPSHOT=-rc2
#EPICS_DEV_SNAPSHOT=-rc2-DEV
# No changes should be needed below here

View File

@ -2,7 +2,7 @@
EPICS_CA_MAJOR_VERSION = 4
EPICS_CA_MINOR_VERSION = 13
EPICS_CA_MAINTENANCE_VERSION = 6
EPICS_CA_MAINTENANCE_VERSION = 7
# Development flag, set to zero for release versions

View File

@ -306,7 +306,7 @@ LDLIBS = $(POSIX_LDLIBS) $(ARCH_DEP_LDLIBS) $(DEBUG_LDLIBS) $(OP_SYS_LDLIBS)\
CPPFLAGS = $($(BUILD_CLASS)_CPPFLAGS) $(POSIX_CPPFLAGS) $(OPT_CPPFLAGS)\
$(DEBUG_CPPFLAGS) $(WARN_CPPFLAGS) $(BASE_CPPFLAGS) $(TARGET_CPPFLAGS)\
$(USR_CPPFLAGS) $(CMD_CPPFLAGS) $(ARCH_DEP_CPPFLAGS) $(OP_SYS_CPPFLAGS)\
$(OP_SYS_INCLUDE_CPPFLAGS) $(CODE_CPPFLAGS)
$(OP_SYS_INCLUDE_CPPFLAGS) $(CODE_CPPFLAGS) $(API_CPPFLAGS)
#--------------------------------------------------
# ar definition default

View File

@ -1,8 +1,8 @@
# Version number for the database APIs and shared library
EPICS_DATABASE_MAJOR_VERSION = 3
EPICS_DATABASE_MINOR_VERSION = 17
EPICS_DATABASE_MAINTENANCE_VERSION = 6
EPICS_DATABASE_MINOR_VERSION = 18
EPICS_DATABASE_MAINTENANCE_VERSION = 1
# Development flag, set to zero for release versions

View File

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

View File

@ -436,7 +436,7 @@ $(COMMON_DIR)/%.html: %.dbd.pod
$(COMMON_DIR)/%.html: %.pod
@$(RM) $(notdir $@)
$(PODTOHTML) -o $(notdir $@) $<
$(PODTOHTML) -s -s -o $(notdir $@) $<
@$(MV) $(notdir $@) $@
$(COMMON_DIR)/%.html: %.pm

View File

@ -125,17 +125,17 @@ PRODTARGETS += $(PRODNAME) $(MUNCHNAME) $(CTDT_SRCS) $(CTDT_OBJS) $(NMS)
TESTPRODTARGETS += $(TESTPRODNAME) $(TESTMUNCHNAME)
#---------------------------------------------------------------
# Test specifications and test result files
# Test result files
#
ifneq (,$(strip $(TESTS)))
TARGETS += testspec
endif
# Enable testing if this host can run tests on the current target
ifneq (,$(findstring $(T_A),$(EPICS_HOST_ARCH) $(CROSS_COMPILER_RUNTEST_ARCHS)))
# Enable testing if this host can run tests for the current target
ifneq (,$(filter $(T_A), $(EPICS_HOST_ARCH) $(CROSS_COMPILER_RUNTEST_ARCHS)))
RUNTESTS_ENABLED = YES
TAPFILES += $(TESTSCRIPTS:.t=.tap)
JUNITFILES += $(TAPFILES:.tap=.xml)
TESTSCRIPTS.t = $(filter %.t, $(TESTSCRIPTS))
TAPFILES.t += $(TESTSCRIPTS.t:.t=.tap)
JUNITFILES.t += $(TESTSCRIPTS.t:.t=.xml)
TAPFILES += $(TAPFILES.t)
JUNITFILES += $(JUNITFILES.t)
endif
#---------------------------------------------------------------
@ -367,23 +367,22 @@ $(MODNAME): %$(MODEXT): %$(EXE)
#---------------------------------------------------------------
# Automated testing
runtests: $(TESTSCRIPTS)
runtests: run-tap-tests
run-tap-tests: $(TESTSCRIPTS.t)
ifneq ($(TESTSCRIPTS.t),)
ifdef RUNTESTS_ENABLED
$(PERL) -MTest::Harness -e 'runtests @ARGV if @ARGV;' $^
$(PROVE) --failures --color $^ || $(PROVE_FAILURE)
endif
endif
testspec: $(TESTSCRIPTS)
@$(RM) $@
@echo OS-class: $(OS_CLASS) > $@
@echo Target-arch: $(T_A) >> $@
$(if $^, @echo Tests: $^ >> $@)
$(if $(TESTFILES), @echo Files: $(TESTFILES) >> $@)
$(if $(TESTSPEC_$(OS_CLASS)), @echo "Harness: $(TESTSPEC_$(OS_CLASS))" >> $@)
tapfiles: $(TAPFILES)
junitfiles: $(JUNITFILES)
test-results: tapfiles
ifneq ($(TAPFILES),)
test-results: tap-results
tap-results: $(TAPFILES)
ifneq ($(strip $(TAPFILES)),)
ifdef RUNTESTS_ENABLED
$(PROVE) --failures --ext .tap --exec "$(CAT)" --color $(TAPFILES)
$(PROVE.tap) --failures --color $^ || $(PROVE_FAILURE)
endif
CURRENT_TAPFILES := $(wildcard $(TAPFILES))
@ -398,16 +397,13 @@ ifneq ($(CURRENT_JUNITFILES),)
$(RM) $(CURRENT_JUNITFILES)
endif
tapfiles: $(TESTSCRIPTS) $(TAPFILES)
junitfiles: $(JUNITFILES)
# A .tap file is the output from running the associated test script
%.tap: %.t
$(TAPFILES.t): %.tap: %.t
ifdef RUNTESTS_ENABLED
$(PERL) $< -tap > $@
endif
%.xml: %.tap
$(JUNITFILES.t): %.xml: %.tap
$(TAPTOJUNIT) --puretap --output $@ --input $< $*
# If there's a perl test script (.plt) available, use it
@ -422,6 +418,23 @@ endif
$(PERL) $(TOOLS)/makeTestfile.pl $(T_A) $(EPICS_HOST_ARCH) $@ $<
#---------------------------------------------------------------
# Generate $(API_HEADER) files on request (%API.h)
ifdef API_HEADER
# Install them
INC += $(API_HEADER)
# Ensure we generate them early enough
INSTALL_API_HEADERS = $(addprefix $(INSTALL_INCLUDE)/,$(API_HEADER))
$(filter-out $(INSTALL_API_HEADERS), $(INSTALL_INC)) $(HDEPENDS_FILES): \
| $(INSTALL_API_HEADERS)
# How to make one
$(COMMON_DIR)/%API.h: $(TOOLS)/makeAPIheader.pl
@$(RM) $@
$(PERL) $(TOOLS)/makeAPIheader.pl -o $@ $(@:$(COMMON_DIR)/%API.h=%)
endif
# Generate header with version number from VCS
ifneq ($(GENVERSION),)
@ -564,8 +577,8 @@ include $(CONFIG)/RULES_EXPAND
.PRECIOUS: $(COMMON_INC)
.PHONY: all host inc build install clean rebuild buildInstall build_clean
.PHONY: runtests tapfiles clean-tests test-results junitfiles
.PHONY: checkRelease warnRelease noCheckRelease FORCE
.PHONY: runtests run-tap-tests tapfiles junitfiles test-results tap-results
.PHONY: clean-tests checkRelease warnRelease noCheckRelease FORCE
include $(CONFIG)/RULES_COMMON

View File

@ -4,7 +4,7 @@
# Copyright (c) 2002 The Regents of the University of California, as
# Operator of Los Alamos National Laboratory.
# EPICS BASE is distributed subject to a Software License Agreement found
# in the file LICENSE that is included with this distribution.
# in the file LICENSE that is included with this distribution.
#*************************************************************************
ARCHS += $(BUILD_ARCHS)
@ -54,7 +54,7 @@ $(foreach dir, $(DIRS), \
define DEP_template2
$(1)$$(DIVIDER)$(2) : $$(foreach ddir, $$($(1)_DEPEND_DIRS), \
$$(addsuffix $$(DIVIDER)$(2),$$(ddir)))
$$(addsuffix $$(DIVIDER)$(2),$$(ddir))) | before-$(2)
endef
$(foreach action, $(ACTIONS), \
$(foreach dir, $(DIRS), \
@ -79,18 +79,24 @@ $(foreach arch, $(ARCHS), \
dirPart = $(join $(dir $@), $(word 1, $(subst $(DIVIDER), ,$(notdir $@))))
actionArchPart = $(join $(word 2, $(subst $(DIVIDER), ,$(notdir $@))), \
$(addprefix $(DIVIDER),$(word 3, $(subst $(DIVIDER), ,$(notdir $@)))))
$(DIRS) $(dirActionTargets) $(dirArchTargets) $(dirActionArchTargets) :
$(addprefix $(DIVIDER),$(word 3, $(subst $(DIVIDER), ,$(notdir $@)))))
$(DIRS) $(dirActionTargets) $(dirArchTargets) $(dirActionArchTargets):
$(MAKE) -C $(dirPart) $(actionArchPart)
# before-action rules are run once prior to recursing through the
# list of subdirectories and running the action rule in each one.
# See DEP_template2 above for how that rule ordering is achieved.
beforeActions = $(addprefix before-,$(ACTIONS))
$(beforeActions):
$(ARCHS) $(ACTIONS) $(actionArchTargets) :%: \
$(foreach dir, $(DIRS), $(dir)$(DIVIDER)%)
.PHONY: $(DIRS) all host rebuild
.PHONY: $(ARCHS) $(ACTIONS)
.PHONY: $(dirActionTargets) $(dirArchTargets)
.PHONY: $(dirActionArchTargets)
.PHONY: $(actionArchTargets)
.PHONY : $(DIRS) all host rebuild
.PHONY : $(ARCHS) $(ACTIONS) $(beforeActions)
.PHONY : $(dirActionTargets) $(dirArchTargets)
.PHONY : $(dirActionArchTargets)
.PHONY : $(actionArchTargets)
include $(CONFIG)/RULES_COMMON

View File

@ -12,28 +12,72 @@
vpath %@ $(USR_VPATH) $(ALL_SRC_DIRS)
#---------------------------------------------------------------
# Variable expansion
# Template variable expansion
# This feature allows you to instantiate simple template files at
# build-time, replacing macros spelled @NAME@ with values provided
# by the Makefile. The template filename must end with an @ sign,
# which is removed to create the expanded filename.
# Makefiles can use this variable expansion as follows:
#
# 1. Add the template filename (with the trailing @ sign) to either
# the EXPAND or EXPAND_COMMON variable, for example:
# EXPAND_COMMON += myVersion.h@
# Use EXPAND_COMMON for templates that don't depend on the
# target architecture (these will be generated in O.Common).
# 2. There are 2 ways of defining template macros. The simplest
# is to add a NAME=VALUE string to the EXPAND_VARS variable for
# the desired macros, e.g.:
# EXPAND_VARS += MY_MAJOR_VERSION=$(MY_MAJOR_VERSION)
# EXPAND_VARS += MY_MINOR_VERSION=$(MY_MINOR_VERSION)
# These values may not contain spaces, even if inside quotes.
# 3. A better way in the above case is to add the names of any
# Makefile variables that should be provided as macros to the
# variable EXPAND_ME, like this:
# EXPAND_ME += MY_MAJOR_VERSION
# EXPAND_ME += MY_MINOR_VERSION
# The values of these variables may contain spaces.
# 4. The macros TOP and ARCH will be set by the build system.
# TOP is the value of $(INSTALL_LOCATION) for this module.
# ARCH is the target architecture $(T_A), but is only set
# while expanding files in EXPAND
# 5. Add the expanded filename to some other variable that will
# cause it to be created and used, such as INC here:
# INC += myVersion.h
# Default settings
EXPAND_TOOL ?= $(PERL) $(TOOLS)/expandVars.pl
EXPANDFLAGS += -t $(INSTALL_LOCATION) -a $(T_A)
EXPANDFLAGS += $(addprefix -D ,$(EXPAND_VARS))
EXPANDARCH = -a $(T_A)
EXPANDFLAGS += -t $(INSTALL_LOCATION)
EXPANDFLAGS += $(addprefix -D ,$(EXPAND_VARS) $($@_EXPAND_VARS))
EXPANDFLAGS += $(foreach var, $(EXPAND_ME) $($@_EXPAND_ME), \
-D$(var)="$(strip $($(var)))")
# The names of files to be expanded must end with '@'
EXPANDED = $(EXPAND:%@=%)
EXPANDED_COM = $(EXPAND_COMMON:%@=%)
EXPANDED_COMMON = $(EXPANDED_COM:%=$(COMMON_DIR)/%)
$(EXPANDED): %: %@
$(ECHO) "Expanding $< to $@"
@$(RM) $@
@$(EXPAND_TOOL) $(EXPANDFLAGS) $($@_EXPANDFLAGS) $< $@
$(EXPAND_TOOL) $(EXPANDARCH) $(EXPANDFLAGS) $($@_EXPANDFLAGS) $< $@
$(EXPANDED_COM): %: %@
$(ECHO) "Expanding $< to $(COMMON_DIR)/$@"
@$(RM) $@
$(EXPAND_TOOL) $(EXPANDFLAGS) $($@_EXPANDFLAGS) $< $@
$(EXPANDED_COMMON): $(COMMON_DIR)/%: %
@$(MV) $< $@
clean: expand_clean
expand_clean:
@$(RM) $(EXPANDED)
@$(RM) $(EXPANDED) $(EXPANDED_COMMON)
.PRECIOUS: $(EXPANDED)
.PRECIOUS: $(EXPANDED) $(EXPANDED_COMMON)
.PHONY: expand_clean
#---------------------------------------------------------------
@ -70,4 +114,3 @@ $1$(DEP):
endef
$(foreach asy, $(sort $(COMMON_ASSEMBLIES) $(ASSEMBLIES)), \
$(eval $(call ASSEMBLY_DEP_template,$(strip $(asy)))))

View File

@ -23,7 +23,8 @@
# -include $(TOP)/../CONFIG_SITE.local
# Add checked-out submodules to DIRS
DIRS += $(subst /Makefile,,$(wildcard $(addsuffix /Makefile, $(SUBMODULES))))
LIVE_SUBMODULES = $(subst /Makefile,,$(wildcard $(addsuffix /Makefile, $(SUBMODULES))))
DIRS += $(LIVE_SUBMODULES)
include $(CONFIG)/RULES_DIRS
@ -45,3 +46,13 @@ realclean:
$(RM) $(wildcard RELEASE.*.local)
.PHONY: RELEASE.host realclean
# Append all our live submodule failure files
FAILURE_FILES = $(addsuffix /$(TEST_FAILURE_FILENAME), $(LIVE_SUBMODULES))
runtests: | $(addsuffix $(DIVIDER)runtests, $(LIVE_SUBMODULES))
@$(TOUCH) $(FAILURE_FILES)
@$(CAT) $(FAILURE_FILES) >> $(TEST_FAILURE_FILE)
test-results: | $(addsuffix $(DIVIDER)test-results, $(LIVE_SUBMODULES))
@$(TOUCH) $(FAILURE_FILES)
@$(CAT) $(FAILURE_FILES) >> $(TEST_FAILURE_FILE)

View File

@ -95,12 +95,20 @@ $(1)_DLL_DEPLIBS=$$(foreach lib, $$($(1)_DLL_LIBS), \
$$(LIB_PREFIX)$(1)$$(LIB_SUFFIX):$$($(1)_OBJSNAME) $$($(1)_RESS)
$$(LIB_PREFIX)$(1)$$(LIB_SUFFIX):$$($(1)_DEPLIBS)
ifneq ($$($(1)_API),)
$$(LIB_PREFIX)$(1)$$(LIB_SUFFIX): API_CPPFLAGS += -DBUILDING_$$($(1)_API)_API
endif
ifeq ($$(SHARED_LIBRARIES),YES)
ifdef SHRLIB_SUFFIX
$$(SHRLIB_PREFIX)$(1)$$(SHRLIB_SUFFIX):$$($(1)_OBJSNAME) $$($(1)_RESS)
$$(SHRLIB_PREFIX)$(1)$$(SHRLIB_SUFFIX):$$($(1)_DEPLIBS)
$$(SHRLIB_PREFIX)$(1)$$(SHRLIB_SUFFIX):$$($(1)_DLL_DEPLIBS)
ifneq ($$($(1)_API),)
$$(SHRLIB_PREFIX)$(1)$$(SHRLIB_SUFFIX): API_CPPFLAGS += -DBUILDING_$$($(1)_API)_API
endif
endif
endif
@ -141,6 +149,11 @@ $(1)_DLL_DEPLIBS=$$(foreach lib, $$($(1)_DLL_LIBS),\
$$(LOADABLE_SHRLIB_PREFIX)$(1)$$(LOADABLE_SHRLIB_SUFFIX):$$($(1)_OBJSNAME) $$($(1)_RESS)
$$(LOADABLE_SHRLIB_PREFIX)$(1)$$(LOADABLE_SHRLIB_SUFFIX):$$($(1)_DEPLIBS)
$$(LOADABLE_SHRLIB_PREFIX)$(1)$$(LOADABLE_SHRLIB_SUFFIX):$$($(1)_DLL_DEPLIBS)
ifneq ($$($(1)_API),)
$$(LOADABLE_SHRLIB_PREFIX)$(1)$$(LOADABLE_SHRLIB_SUFFIX): \
API_CPPFLAGS += -DBUILDING_$$($(1)_API)_API
endif
endef
$(foreach target, $(LOADABLE_LIBRARY), \

View File

@ -50,6 +50,9 @@ uninstall$(DIVIDER)%:
$(RMDIR) $(addsuffix /$(subst uninstall$(DIVIDER),,$@), \
$(INSTALL_LOCATION_BIN) $(INSTALL_LOCATION_LIB))
runtests test-results:
@$(PERL) $(TOOLS)/testFailures.pl $(TEST_FAILURE_FILE)
else
#
# Using a disabled rule aborts
@ -60,6 +63,10 @@ else
endif # DISABLE_TOP_RULES
before-runtests before-test-results: rm-failure-file
rm-failure-file:
@$(RM) $(TEST_FAILURE_FILE)
@$(TOUCH) $(TEST_FAILURE_FILE)
help:
@echo "Usage: gnumake [options] [target] ..."
@ -99,7 +106,7 @@ endif
@echo "Object targets are supported by the O.<arch> level Makefile .e.g"
@echo " xxxRecord.o"
.PHONY: distclean uninstall help
.PHONY: distclean uninstall rm-failure-file help
.PHONY: realuninstall archuninstall uninstallDirs
ifndef DISABLE_TOP_RULES

View File

@ -30,7 +30,7 @@ ARCH_DEP_LDFLAGS += -m32
# Compiler does not define __unix __unix__ unix
# Override for -DUNIX from CONFIG.Common.UnixCommon
OP_SYS_CPPFLAGS = -D_MINGW -Wno-format
OP_SYS_CPPFLAGS = -D_MINGW -D__USE_MINGW_ANSI_STDIO
EXE = .exe
RES = .coff

View File

@ -11,6 +11,7 @@ RM = rm -f
MKDIR = mkdir -p
RMDIR = rm -rf
CAT = cat
TOUCH = touch
# Allow site overrides
-include $(CONFIG)/os/CONFIG_SITE.UnixCommon.Common

View File

@ -21,4 +21,4 @@ LOADABLE_SHRLIB_LDFLAGS = -shared \
GNU_LDLIBS_YES =
# Link with system libraries
OP_SYS_LDLIBS = -lws2_32 -ladvapi32 -luser32 -lkernel32 -lwinmm -ldbghelp
OP_SYS_LDLIBS = -lpsapi -lws2_32 -ladvapi32 -luser32 -lkernel32 -lwinmm -ldbghelp

View File

@ -32,4 +32,4 @@ LOADABLE_SHRLIB_LDFLAGS = -shared \
GNU_LDLIBS_YES =
# Link with system libraries
OP_SYS_LDLIBS = -lws2_32 -ladvapi32 -luser32 -lkernel32 -lwinmm -ldbghelp
OP_SYS_LDLIBS = -lpsapi -lws2_32 -ladvapi32 -luser32 -lkernel32 -lwinmm -ldbghelp

View File

@ -11,6 +11,7 @@ MKDIR = $(PERL) -MExtUtils::Command -e mkpath
RMDIR = $(PERL) -MExtUtils::Command -e rm_rf
NOP = $(PERL) -e ''
CAT = $(PERL) -MExtUtils::Command -e cat
TOUCH = $(PERL) -MExtUtils::Command -e touch
WIND_HOST_TYPE = x86-win32
OSITHREAD_USE_DEFAULT_STACK = NO

View File

@ -8,9 +8,199 @@ which they were originally committed.** Thus it is important to read more than
just the first section to understand everything that has changed in each
release.
The external PVA submodules each have their own separate set of release notes
which should also be read to understand what has changed since an earlier
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.
**This version of EPICS has not been released yet.**
## Changes made on the 7.0 branch since 7.0.4
<!-- Insert new items immediately below here ... -->
## EPICS Release 7.0.4
### Bug fixes
The following launchpad bugs have fixes included in this release:
- [lp: 1812084](https://bugs.launchpad.net/bugs/1812084), Build failure on
RTEMS 4.10.2
- [lp: 1829919](https://bugs.launchpad.net/bugs/1829919), IOC segfaults when
calling dbLoadRecords after iocInit
- [lp: 1838792](https://bugs.launchpad.net/bugs/1838792), epicsCalc bit-wise
operators on aarch64
- [lp: 1853148](https://bugs.launchpad.net/bugs/1853148), mingw compiler
problem with printf/scanf formats
- [lp: 1852653](https://bugs.launchpad.net/bugs/1852653), USE_TYPED_DSET
incompatible with C++
- [lp: 1862328](https://bugs.launchpad.net/bugs/1862328), Race condition on
IOC start leaves rsrv unresponsive
- [lp: 1866651](https://bugs.launchpad.net/bugs/1866651), thread joinable race
- [lp: 1868486](https://bugs.launchpad.net/bugs/1868486), epicsMessageQueue
lost messages
- [lp: 1868680](https://bugs.launchpad.net/bugs/1868680), Access Security file
reload (asInit) fails
### \*_API macros in EPICS headers
Internally, the Com and ca libraries now express dllimport/export (Windows)
and symbol visibility (GCC) using library-specific macros (eg. `LIBCOM_API`)
instead of the macros `epicsShareFunc`, `epicsShareClass`, `epicsShareDef` etc.
that are defined in the `shareLib.h` header.
This change may affect some user code which uses the `epicsShare*` macros
without having explicitly included the `shareLib.h` header themselves.
Such code should be changed to include `shareLib.h` directly.
A new helper script `makeAPIheader.pl` and build rules to generate a
library-specific `*API.h` header file has been added. Run `makeAPIheader.pl -h`
for information on how to use this in your own applications, but note that the
resulting sources will not be able to be compiled using earlier versions of
EPICS Base.
### IOCsh usage messages
At the iocShell prompt `help <cmd>` now prints a descriptive usage message
for many internal IOCsh commands in addition to the command parameters.
Try `help *` to see all commands, or a glob pattern such as `help db*` to see
a subset.
External code may provide usage messages when registering commands using a
new `const char *usage` member of the `iocshFuncDef` structure.
The `iocsh.h` header also now defines a macro `IOCSHFUNCDEF_HAS_USAGE` which
can be used to detect Base versions that support this feature at compile-time.
### Variable names in RELEASE files
`configure/RELEASE` files are parsed by both GNUmake and the `convertRelease.pl`
script. While GNUmake is quite relaxed about what characters may be used in a
RELEASE variable name, the `convertRelease.pl` script parser has only recognized
variable names that match the Perl regular expression `\w+`, i.e. upper and
lower-case letters, digits and underscore characters.
The script has been modified so now RELEASE variable names must start with a
letter or underscore, and be followed by any number of letters, digits,
underscore or hyphen characters, matching the regular expression
`[A-Za-z_][A-Za-z_0-9-]*`. The hyphen character `-` was not previously allowed
and if used would have prevented a build from finding include files and
libraries in any module using that in its RELEASE variable name.
This change does disallow names that start with a digit which used to be
allowed, but hopefully nobody has been relying on that ability. The regular
expression used for names can be found in the file `src/tools/EPICS/Release.pm`
and can be adjusted locally if necessary.
### caRepeater /dev/null
On \*NIX targets caRepeater will now partially daemonize by redirecting
stdin/out/err to /dev/null. This prevents caRepeater from inheriting
the stdin/out of a process, like caget, which has spawned it in the
background. This has been known to cause problems in some cases when
caget is itself being run from a shell script.
caRepeater will now understand the `-v` argument to retain stdin/out/err
which may be necessary to see any error messages it may emit.
### `state` record deprecated
IOCs now emit a warning when a database file containing the `state` record is
loaded. This record has been deprecated for a while and will be removed
beginning with EPICS 7.1. Consider using the `stringin` record instead.
### Record types publish dset's
The record types in Base now define their device support entry table (DSET)
structures in the record header file. While still optional, developers of
external support modules are encouraged to start converting their code to use
the record's new definitions instead of the traditional approach of copying the
structure definitions into each source file that needs them. By following the
instructions below it is still possible for the converted code to build and
work with older Base releases.
This would also be a good time to modify the device support to use the type-safe
device support entry tables that were introduced in Base-3.16.2 -- see
[#type-safe-device-and-driver-support-tables](this entry below) for the
description of that change, which is also optional for now.
Look at the aiRecord for example. Near the top of the generated `aiRecord.h`
header file is a new section that declares the `aidset`:
```C
/* Declare Device Support Entry Table */
struct aiRecord;
typedef struct aidset {
dset common;
long (*read_ai)(struct aiRecord *prec);
long (*special_linconv)(struct aiRecord *prec, int after);
} aidset;
#define HAS_aidset
```
Notice that the common members (`number`, `report()`, `init()`, `init_record()`
and `get_ioint_info()` don't appear directly but are included by embedding the
`dset common` member instead. This avoids the need to have separate definitions
of those members in each record dset, but does require those members to be
wrapped inside another set of braces `{}` when initializing the data structure
for the individual device supports. It also requires changes to code that
references those common members, but that code usually only appears inside the
record type implementation and very rarely in device supports.
An aiRecord device support that will only be built against this or later
versions of EPICS can now declare its dset like this:
```C
aidset devAiSoft = {
{ 6, NULL, NULL, init_record, NULL },
read_ai, NULL
};
epicsExportAddress(dset, devAiSoft);
```
However most device support that is not built into EPICS itself will need to
remain compatible with older EPICS versions, which is why the ai record's header
file also declares the preprocessor macro `HAS_aidset`. This makes it easy to
define the `aidset` in the device support code when it's needed, and not when
it's provided in the header:
```C
#ifndef HAS_aidset
typedef struct aidset {
dset common;
long (*read_ai)(aiRecord *prec);
long (*special_linconv)(aiRecord *prec, int after);
} aidset;
#endif
aidset devAiSoft = {
{ 6, NULL, NULL, init_record, NULL },
read_ai, NULL
};
epicsExportAddress(dset, devAiSoft);
```
The above `typedef struct` declaration was copied directly from the new
aiRecord.h file and wrapped in the `#ifndef HAS_aidset` conditional.
This same pattern should be followed for all record types except for the lsi,
lso and printf record types, which have published their device support entry
table structures since they were first added to Base but didn't previously embed
the `dset common` member. Device support for these record types therefore can't
use the dset name since the new definitions are different from the originals and
will cause a compile error, so this pattern should be used instead:
```C
#ifndef HAS_lsidset
struct {
dset common;
long (*read_string)(lsiRecord *prec);
}
#else
lsidset
#endif
devLsiEtherIP = {
{5, NULL, lsi_init, lsi_init_record, get_ioint_info},
lsi_read
};
```
## EPICS Release 7.0.3.1
@ -162,7 +352,7 @@ set to their default values.
void startitup(void) {
epicsThreadOpts opts = EPICS_THREAD_OPTS_INIT;
epicsThreadId tid;
opts.priority = epicsThreadPriorityMedium;
tid = epicsThreadCreateOpt("my thread", &threadMain, NULL, &opts);
}
@ -629,14 +819,14 @@ number instead, like this:
```
#include <epicsVersion.h>
#ifndef VERSION_INT
# define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P))
#endif
#ifndef EPICS_VERSION_INT
# define EPICS_VERSION_INT VERSION_INT(EPICS_VERSION, EPICS_REVISION, EPICS_MODIFICATION, EPICS_PATCH_LEVEL)
#endif
#if EPICS_VERSION_INT >= VERSION_INT(3,16,1,0)
/* Code where Base has INT64 support */
#else
@ -962,7 +1152,7 @@ excerpts from a database file:
record(ai, math:pi) {
field(INP, {const: 3.14159265358979}) # Correct
field(SIOL, "{const: 3.142857}") # Wrong
info(autosave, { # White-space and comments are allowed
fields:[DESC, SIMM],
pass0:[VAL]
@ -1110,7 +1300,7 @@ this:
```
#include "epicsTime.h"
#ifndef M_time
/* S_time_... status values were not provided before Base 3.16 */
#define S_time_unsynchronized epicsTimeERROR
@ -1135,9 +1325,115 @@ Added a new macro `callbackGetPriority(prio, callback)` to the callback.h
header and removed the need for dbScan.c to reach into the internals of its
`CALLBACK` objects.
## Changes from the 3.15 branch since 3.15.7
> None.
# Changes incorporated from the 3.15 branch
## Changes made between 3.15.7 and 3.15.8
### Bug fixes
The following launchpad bugs have fixes included in this release:
- [lp: 1812084](https://bugs.launchpad.net/epics-base/+bug/1812084), Build
failure on RTEMS 4.10.2
- [lp: 1829770](https://bugs.launchpad.net/epics-base/+bug/1829770), event
record device support broken with constant INP
- [lp: 1829919](https://bugs.launchpad.net/epics-base/+bug/1829919), IOC
segfaults when calling dbLoadRecords after iocInit
- [lp: 1838792](https://bugs.launchpad.net/epics-base/+bug/1838792), epicsCalc
bit-wise operators on aarch64
- [lp: 1841608](https://bugs.launchpad.net/epics-base/+bug/1841608), logClient
falsely sends error logs on all connections
- [lp: 1853168](https://bugs.launchpad.net/epics-base/+bug/1853168), undefined
reference to `clock_gettime()`
- [lp: 1862328](https://bugs.launchpad.net/epics-base/+bug/1862328), Race
condition on IOC start leaves rsrv unresponsive
- [lp: 1868486](https://bugs.launchpad.net/epics-base/+bug/1868486),
epicsMessageQueue lost messages
### Improvements to the self-test build targets
This release contains changes that make it possible to integrate another test
running and reporting system (such as Google's gtest) into the EPICS build
system. The built-in test-runner and reporting system will continue to be used
by the test programs inside Base however.
These GNUmake `tapfiles` and `test-results` build targets now collect a list of
the directories that experienced test failures and display those at the end of
running and/or reporting all of the tests. The GNUmake process will also only
exit with an error status after running and/or reporting all of the test
results; previously the `-k` flag to make was needed and even that didn't always
work.
Continuous Integration systems are recommended to run `make tapfiles` (or if
they can read junittest output instead of TAP `make junitests`) followed by
`make -s test-results` to display the results of the tests. If multiple CPUs are
available the `-j` flag can be used to run tests in parallel, giving the maximum
jobs that should be allowed so `make -j4 tapfiles` for a system with 4 CPUs say.
Running many more jobs than you have CPUs is likely to be slower and is not
recommended.
### Calc Engine Fixes and Enhancements
The code that implements bit operations for Calc expressions has been reworked
to better handle some CPU architectures and compilers. As part of this work a
new operator has been added: `>>>` performs a logical right-shift, inserting
zero bits into the most significant bits (the operator `>>` is an arithmetic
right-shift which copies the sign bit as it shifts the value rightwards).
### IOC logClient Changes
The IOC's error logging system has been updated significantly to fix a number
of issues including:
- Only send errlog messages to iocLogClient listeners
- Try to minimize lost messages while the log server is down:
+ Detect disconnects sooner
+ Don't discard the buffer on disconnect
+ Flush the buffer immediately after a server reconnects
### epicsThread: Main thread defaults to allow blocking I/O
VxWorks IOCs (and potentially RTEMS IOCs running GeSys) have had problems with
garbled error messages from dbStaticLib routines for some time &mdash; messages
printed before `iocInit` were being queued through the errlog thread instead of
being output immediately. This has been fixed by initializing the main thread
with its `OkToBlock` flag set instead of cleared. IOCs running on other
operating systems that use iocsh to execute the startup script previously had
that set anyway in iocsh so were not affected, but this change might cause other
programs that don't use iocsh to change their behavior slightly if they use
`errlogPrintf()`, `epicsPrintf()` or `errPrintf()`.
### catools: Handle data type changes in camonitor
The camonitor program didn't properly cope if subscribed to a channel whose data
type changed when its IOC was rebooted without restarting the camonitor program.
This has now been fixed.
### More Record Reference Documentation
The remaining record types have had their reference pages moved from the Wiki,
and some new reference pages have been written to cover the analog array and
long string input and output record types plus the printf record type, none of
which were previously documented. The wiki reference pages covering the fields
common to all, input, and output record types have also been added, thanks to
Rolf Keitel. The POD conversion scripts have also been improved and they now
properly support linking to subsections in a different document, although the
POD changes to add the cross-links that appeared in the original wiki pages
still needs to be done in most cases.
### Fix build issues with newer MinGW versions
The `clock_gettime()` routine is no longer used under MinGW since newer versions
don't provide it any more.
### Fix race for port in RSRV when multiple IOCs start simultaneously
If multiple IOCs were started at the same time, by systemd say, they could race
to obtain the Channel Access TCP port number 5064. This issue has been fixed.
## Changes made between 3.15.6 and 3.15.7
@ -1854,4 +2150,3 @@ Simpler versions of the `epicsTime_gmtime()` and `epicsTime_localtime()`
routines have been included in the Windows implementations, and a new test
program added. The original versions do not report DST status properly. Fixes
[Launchpad bug 1528284](https://bugs.launchpad.net/bugs/1528284).

View File

@ -1,9 +1,17 @@
# Record Reference Documentation
The following documentation for the record types and menus include with Base was converted from the old EPICS Wiki pages and updated. This list does not include all of the available record types as some have not been documented yet.
The following documentation for the record types and menus include with Base was
converted from the old EPICS Wiki pages and updated. This list only includes the
record types supplied with Base.
* [Fields Common to All Record Types](dbCommonRecord.html)
* [Fields Common to Input Record Types](dbCommonInput.html)
* [Fields Common to Output Record Types](dbCommonOutput.html)
## Record Types
* [Analog Array Input Record (aai)](aaiRecord.html)
* [Analog Array Output Record (aao)](aaoRecord.html)
* [Analog Input Record (ai)](aiRecord.html)
* [Analog Output Record (ao)](aoRecord.html)
* [Array Subroutine Record (aSub)](aSubRecord.html)
@ -15,15 +23,19 @@ The following documentation for the record types and menus include with Base was
* [Data Fanout Record (dfanout)](dfanoutRecord.html)
* [Event Record (event)](eventRecord.html)
* [Fanout Record (fanout)](fanoutRecord.html)
* [Histogram Record (histogram)](histogramRecord.html)
* [64bit Integer Input Record (int64in)](int64inRecord.html)
* [64bit Integer Output Record (int64out)](int64outRecord.html)
* [Long Input Record (longin)](longinRecord.html)
* [Long Output Record (longout)](longoutRecord.html)
* [Long String Input Record (lsi)](lsiRecord.html)
* [Long String Output Record (lso)](lsoRecord.html)
* [Multi-Bit Binary Input Direct Record (mbbiDirect)](mbbiDirectRecord.html)
* [Multi-Bit Binary Input Record (mbbi)](mbbiRecord.html)
* [Multi-Bit Binary Output Direct Record (mbboDirect)](mbboDirectRecord.html)
* [Multi-Bit Binary Output Record (mbbo)](mbboRecord.html)
* [Permissive Record (permissive)](permissiveRecord.html)
* [Printf Record (prinf)](printfRecord.html)
* [Select Record (sel)](selRecord.html)
* [Sequence Record (seq)](seqRecord.html)
* [State Record (state)](stateRecord.html)
@ -47,4 +59,10 @@ The following documentation for the record types and menus include with Base was
## Corrections and Updates
Corrections to these documents can be submitted as patch files to the EPICS core developers, or as merge requests or pull requests to the 7.0 branch of epics-base. The document sources can be found in the `modules/database/src/std/rec` and `modules/database/src/ioc/db` directories in files with extension `.dbd.pod`. The documentation format is an extended version of Perl POD, run `perldoc pod` for details.
Corrections to these documents can be submitted as patch files to the EPICS core
developers, or as merge requests or pull requests to the 7.0 branch of Base.
The document sources can be found in the `modules/database/src/std/rec` and
`modules/database/src/ioc/db` directories in files with extension `.dbd.pod`.
The documentation source format is a combination of the EPICS DBD file format
with an extended version of Perl's POD (plain old documentation); run `perldoc
pod` for details of POD.

View File

@ -147,17 +147,17 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Tag the module in Git, using these tag conventions:
<ul>
<li>
<tt>R7.0.3.2-pre<i>n</i></tt>
<tt>R7.0.4.1-pre<i>n</i></tt>
&mdash; pre-release tag
</li>
<li>
<tt>R7.0.3.2-rc<i>n</i></tt>
<tt>R7.0.4.1-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.3.2-rc1' R7.0.3.2-rc1
git tag -m 'ANJ: Tagged for 7.0.4.1-rc1' R7.0.4.1-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
@ -171,11 +171,11 @@ 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.3.2-rc1 base-7.0.3.2-rc1.tar.gz base-7.0.3.2-rc1/
./.tools/make-tar.sh R7.0.4.1-rc1 base-7.0.4.1-rc1.tar.gz base-7.0.4.1-rc1/
</tt></blockquote>
Create a GPG signature file of the tarfile as follows:
<blockquote><tt>
gpg --armor --sign --detach-sig base-7.0.3.2-rc1.tar.gz
gpg --armor --sign --detach-sig base-7.0.4.1-rc1.tar.gz
</tt></blockquote>
</td>
</tr>
@ -298,7 +298,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.3.2' &lt;module-version&gt;
git tag -m 'ANJ: Tag for EPICS 7.0.4.1' &lt;module-version&gt;
</tt></blockquote>
</li>
@ -355,7 +355,7 @@ 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 7.0.3.2' R7.0.3.2
git tag -m 'ANJ: Tagged for release' R7.0.4.1
</tt></blockquote>
<p>Don't push these commits or the new tag to the Launchpad repository
yet.</p>
@ -387,12 +387,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.3.2 ../base-7.0.3.2.tar.gz base-7.0.3.2/
./.tools/make-tar.sh R7.0.4.1 ../base-7.0.4.1.tar.gz base-7.0.4.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.3.2.tar.gz
gpg --armor --sign --detach-sig base-7.0.4.1.tar.gz
</tt></blockquote>
</td>
</tr>
@ -457,7 +457,7 @@ starting at <a href="#ReleaseApproval">Release Approval</a>.</p>
<td>Upload the tar file and its <tt>.asc</tt> signature file to the
epics-controls web-server.
<blockquote><tt>
scp base-7.0.3.2.tar.gz base-7.0.3.2.tar.gz.asc epics-controls:download/base<br />
scp base-7.0.4.1.tar.gz base-7.0.4.1.tar.gz.asc epics-controls:download/base<br />
</tt></blockquote>
</td>
</tr>

View File

@ -12,4 +12,4 @@ include $(TOP)/configure/CONFIG
DIRS += src
include $(TOP)/configure/RULES_TOP
include $(TOP)/configure/RULES_DIRS

View File

@ -18,7 +18,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "syncGroup.h"
#include "oldAccess.h"
@ -83,7 +82,7 @@ int CASG::block (
return ECA_TIMEOUT;
}
cur_time = epicsTime::getMonotonic ();
cur_time = epicsTime::getCurrent ();
this->client.flush ( guard );
@ -121,7 +120,7 @@ int CASG::block (
/*
* force a time update
*/
cur_time = epicsTime::getMonotonic ();
cur_time = epicsTime::getCurrent ();
delay = cur_time - beg_time;
}
@ -209,23 +208,23 @@ bool CASG::ioComplete (
return this->ioPendingList.count () == 0u;
}
void CASG::put ( epicsGuard < epicsMutex > & guard, chid pChan,
void CASG::put ( epicsGuard < epicsMutex > & guard, chid pChan,
unsigned type, arrayElementCount count, const void * pValue )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
sgAutoPtr < syncGroupWriteNotify > pNotify ( guard, *this );
pNotify = syncGroupWriteNotify::factory (
pNotify = syncGroupWriteNotify::factory (
this->freeListWriteOP, *this, & CASG :: recycleWriteNotifyIO, pChan );
pNotify->begin ( guard, type, count, pValue );
pNotify.release ();
}
void CASG::get ( epicsGuard < epicsMutex > & guard, chid pChan,
void CASG::get ( epicsGuard < epicsMutex > & guard, chid pChan,
unsigned type, arrayElementCount count, void *pValue )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
sgAutoPtr < syncGroupReadNotify > pNotify ( guard, *this );
pNotify = syncGroupReadNotify::factory (
pNotify = syncGroupReadNotify::factory (
this->freeListReadOP, *this, & CASG :: recycleReadNotifyIO, pChan, pValue );
pNotify->begin ( guard, type, count );
pNotify.release ();
@ -242,14 +241,14 @@ void CASG::completionNotify (
}
}
void CASG :: recycleReadNotifyIO ( epicsGuard < epicsMutex > & guard,
void CASG :: recycleReadNotifyIO ( epicsGuard < epicsMutex > & guard,
syncGroupReadNotify & io )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
this->freeListReadOP.release ( & io );
}
void CASG :: recycleWriteNotifyIO ( epicsGuard < epicsMutex > & guard,
void CASG :: recycleWriteNotifyIO ( epicsGuard < epicsMutex > & guard,
syncGroupWriteNotify & io )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );

View File

@ -26,7 +26,13 @@ INC += cacIO.h
INC += caDiagnostics.h
INC += net_convert.h
INC += caVersion.h
INC += caVersionNum.h
EXPAND_COMMON += caVersion.h@
EXPAND_ME += EPICS_CA_MAJOR_VERSION
EXPAND_ME += EPICS_CA_MINOR_VERSION
EXPAND_ME += EPICS_CA_MAINTENANCE_VERSION
EXPAND_ME += EPICS_CA_DEVELOPMENT_FLAG
LIBSRCS += cac.cpp
LIBSRCS += cacChannel.cpp
@ -74,6 +80,9 @@ LIBSRCS += hostNameCache.cpp
LIBSRCS += msgForMultiplyDefinedPV.cpp
LIBSRCS_vxWorks += templateInstances.cpp
API_HEADER = libCaAPI.h
ca_API = libCa
LIBRARY=ca
ca_RCS = ca.rc
@ -118,20 +127,7 @@ ca_test_SYS_LIBS_WIN32 = ws2_32 advapi32 user32
OBJS_vxWorks += ca_test
EXPANDVARS += EPICS_CA_MAJOR_VERSION
EXPANDVARS += EPICS_CA_MINOR_VERSION
EXPANDVARS += EPICS_CA_MAINTENANCE_VERSION
EXPANDVARS += EPICS_CA_DEVELOPMENT_FLAG
EXPANDFLAGS += $(foreach var,$(EXPANDVARS),-D$(var)="$(strip $($(var)))")
# shared library ABI version.
SHRLIB_VERSION = $(EPICS_CA_MAJOR_VERSION).$(EPICS_CA_MINOR_VERSION).$(EPICS_CA_MAINTENANCE_VERSION)
include $(TOP)/configure/RULES
# Can't use EXPAND as generated headers must appear
# in O.Common, but EXPAND emits rules for O.$(T_A)
../O.Common/caVersionNum.h: ../caVersionNum.h@
$(EXPAND_TOOL) $(EXPANDFLAGS) $($@_EXPANDFLAGS) $< $@

View File

@ -5,11 +5,11 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef SearchDest_h
#define SearchDest_h
#ifndef INC_SearchDest_H
#define INC_SearchDest_H
#include <osiSock.h>
#include <epicsTime.h>
@ -28,7 +28,7 @@ struct SearchDest :
virtual void notify (
const caHdr & msg, const void * pPayload,
const osiSockAddr & addr, const epicsTime & ) = 0;
virtual void show (
virtual void show (
epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
virtual void searchRequest ( epicsGuard < epicsMutex > &,
@ -36,4 +36,4 @@ struct SearchDest :
virtual void show ( epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
#endif // SearchDest_h
#endif // ifndef INC_SearchDest_H

View File

@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
@ -40,7 +39,6 @@
*/
#define CAC_VERSION_GLOBAL
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
@ -165,13 +163,13 @@ int fetchClientContext ( ca_client_context **ppcac )
* ca_task_initialize ()
*/
// extern "C"
int epicsShareAPI ca_task_initialize ( void )
int epicsStdCall ca_task_initialize ( void )
{
return ca_context_create ( ca_disable_preemptive_callback );
}
// extern "C"
int epicsShareAPI ca_context_create (
int epicsStdCall ca_context_create (
ca_preemptive_callback_select premptiveCallbackSelect )
{
ca_client_context *pcac;
@ -183,19 +181,19 @@ int epicsShareAPI ca_context_create (
}
pcac = ( ca_client_context * ) epicsThreadPrivateGet ( caClientContextId );
if ( pcac ) {
if ( pcac ) {
if ( premptiveCallbackSelect == ca_enable_preemptive_callback &&
! pcac->preemptiveCallbakIsEnabled() ) {
return ECA_NOTTHREADED;
}
return ECA_NORMAL;
}
return ECA_NORMAL;
}
pcac = new ca_client_context (
premptiveCallbackSelect == ca_enable_preemptive_callback );
if ( ! pcac ) {
return ECA_ALLOCMEM;
}
if ( ! pcac ) {
return ECA_ALLOCMEM;
}
epicsThreadPrivateSet ( caClientContextId, (void *) pcac );
}
@ -211,7 +209,7 @@ int epicsShareAPI ca_context_create (
// defunct
//
// extern "C"
int epicsShareAPI ca_modify_host_name ( const char * )
int epicsStdCall ca_modify_host_name ( const char * )
{
return ECA_NORMAL;
}
@ -222,7 +220,7 @@ int epicsShareAPI ca_modify_host_name ( const char * )
// defunct
//
// extern "C"
int epicsShareAPI ca_modify_user_name ( const char * )
int epicsStdCall ca_modify_user_name ( const char * )
{
return ECA_NORMAL;
}
@ -231,7 +229,7 @@ int epicsShareAPI ca_modify_user_name ( const char * )
// ca_context_destroy ()
//
// extern "C"
void epicsShareAPI ca_context_destroy ()
void epicsStdCall ca_context_destroy ()
{
ca_client_context *pcac;
@ -250,7 +248,7 @@ void epicsShareAPI ca_context_destroy ()
* releases all resources alloc to a channel access client
*/
// extern "C"
int epicsShareAPI ca_task_exit ()
int epicsStdCall ca_task_exit ()
{
ca_context_destroy ();
return ECA_NORMAL;
@ -263,7 +261,7 @@ int epicsShareAPI ca_task_exit ()
* backwards compatible entry point to ca_search_and_connect()
*/
// extern "C"
int epicsShareAPI ca_build_and_connect ( const char *name_str, chtype get_type,
int epicsStdCall ca_build_and_connect ( const char *name_str, chtype get_type,
arrayElementCount get_count, chid * chan, void *pvalue,
caCh *conn_func, void *puser )
{
@ -278,7 +276,7 @@ int epicsShareAPI ca_build_and_connect ( const char *name_str, chtype get_type,
* ca_search_and_connect()
*/
// extern "C"
int epicsShareAPI ca_search_and_connect (
int epicsStdCall ca_search_and_connect (
const char * name_str, chid * chanptr,
caCh * conn_func, void * puser )
{
@ -287,7 +285,7 @@ int epicsShareAPI ca_search_and_connect (
}
// extern "C"
int epicsShareAPI ca_create_channel (
int epicsStdCall ca_create_channel (
const char * name_str, caCh * conn_func, void * puser,
capri priority, chid * chanptr )
{
@ -362,7 +360,7 @@ int epicsShareAPI ca_create_channel (
* its context
*/
// extern "C"
int epicsShareAPI ca_clear_channel ( chid pChan )
int epicsStdCall ca_clear_channel ( chid pChan )
{
ca_client_context & cac = pChan->getClientCtx ();
{
@ -401,7 +399,7 @@ int epicsShareAPI ca_clear_channel ( chid pChan )
* Specify an event subroutine to be run for asynch exceptions
*/
// extern "C"
int epicsShareAPI ca_add_exception_event ( caExceptionHandler *pfunc, void *arg )
int epicsStdCall ca_add_exception_event ( caExceptionHandler *pfunc, void *arg )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@ -417,7 +415,7 @@ int epicsShareAPI ca_add_exception_event ( caExceptionHandler *pfunc, void *arg
/*
* ca_add_masked_array_event
*/
int epicsShareAPI ca_add_masked_array_event (
int epicsStdCall ca_add_masked_array_event (
chtype type, arrayElementCount count, chid pChan,
caEventCallBackFunc *pCallBack, void *pCallBackArg,
ca_real, ca_real, ca_real,
@ -430,19 +428,19 @@ int epicsShareAPI ca_add_masked_array_event (
/*
* ca_clear_event ()
*/
int epicsShareAPI ca_clear_event ( evid pMon )
int epicsStdCall ca_clear_event ( evid pMon )
{
return ca_clear_subscription ( pMon );
}
// extern "C"
chid epicsShareAPI ca_evid_to_chid ( evid pMon )
chid epicsStdCall ca_evid_to_chid ( evid pMon )
{
return & pMon->channel ();
}
// extern "C"
int epicsShareAPI ca_pend ( ca_real timeout, int early )
int epicsStdCall ca_pend ( ca_real timeout, int early )
{
if ( early ) {
return ca_pend_io ( timeout );
@ -456,7 +454,7 @@ int epicsShareAPI ca_pend ( ca_real timeout, int early )
* ca_pend_event ()
*/
// extern "C"
int epicsShareAPI ca_pend_event ( ca_real timeout )
int epicsStdCall ca_pend_event ( ca_real timeout )
{
ca_client_context *pcac;
int status = fetchClientContext ( &pcac );
@ -467,7 +465,7 @@ int epicsShareAPI ca_pend_event ( ca_real timeout )
try {
// preserve past odd ball behavior of waiting forever when
// the delay is zero
if ( timeout == 0.0 ) {
if ( timeout == 0.0 ) {
while ( true ) {
pcac->pendEvent ( 60.0 );
}
@ -483,7 +481,7 @@ int epicsShareAPI ca_pend_event ( ca_real timeout )
* ca_pend_io ()
*/
// extern "C"
int epicsShareAPI ca_pend_io ( ca_real timeout )
int epicsStdCall ca_pend_io ( ca_real timeout )
{
ca_client_context *pcac;
int status = fetchClientContext ( &pcac );
@ -508,7 +506,7 @@ int epicsShareAPI ca_pend_io ( ca_real timeout )
/*
* ca_flush_io ()
*/
int epicsShareAPI ca_flush_io ()
int epicsStdCall ca_flush_io ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext (&pcac);
@ -525,7 +523,7 @@ int epicsShareAPI ca_flush_io ()
/*
* CA_TEST_IO ()
*/
int epicsShareAPI ca_test_io ()
int epicsStdCall ca_test_io ()
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@ -545,7 +543,7 @@ int epicsShareAPI ca_test_io ()
* CA_SIGNAL()
*/
// extern "C"
void epicsShareAPI ca_signal ( long ca_status, const char *message )
void epicsStdCall ca_signal ( long ca_status, const char *message )
{
ca_signal_with_file_and_lineno ( ca_status, message, NULL, 0 );
}
@ -560,7 +558,7 @@ void epicsShareAPI ca_signal ( long ca_status, const char *message )
* (if they call this routine again).
*/
// extern "C"
const char * epicsShareAPI ca_message ( long ca_status )
const char * epicsStdCall ca_message ( long ca_status )
{
unsigned msgNo = CA_EXTRACT_MSG_NO ( ca_status );
@ -576,7 +574,7 @@ const char * epicsShareAPI ca_message ( long ca_status )
* ca_signal_with_file_and_lineno()
*/
// extern "C"
void epicsShareAPI ca_signal_with_file_and_lineno ( long ca_status,
void epicsStdCall ca_signal_with_file_and_lineno ( long ca_status,
const char *message, const char *pfilenm, int lineno )
{
ca_signal_formated ( ca_status, pfilenm, lineno, message );
@ -586,7 +584,7 @@ void epicsShareAPI ca_signal_with_file_and_lineno ( long ca_status,
* ca_signal_formated()
*/
// extern "C"
void epicsShareAPI ca_signal_formated ( long ca_status, const char *pfilenm,
void epicsStdCall ca_signal_formated ( long ca_status, const char *pfilenm,
int lineno, const char *pFormat, ... )
{
ca_client_context *pcac;
@ -622,7 +620,7 @@ void epicsShareAPI ca_signal_formated ( long ca_status, const char *pfilenm,
*
*/
// extern "C"
int epicsShareAPI ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
int epicsStdCall ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@ -640,7 +638,7 @@ int epicsShareAPI ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
* function that returns the CA version string
*/
// extern "C"
const char * epicsShareAPI ca_version ()
const char * epicsStdCall ca_version ()
{
return CA_VERSION_STRING ( CA_MINOR_PROTOCOL_REVISION );
}
@ -649,7 +647,7 @@ const char * epicsShareAPI ca_version ()
* ca_replace_printf_handler ()
*/
// extern "C"
int epicsShareAPI ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
int epicsStdCall ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
{
ca_client_context *pcac;
int caStatus = fetchClientContext (&pcac);
@ -669,7 +667,7 @@ int epicsShareAPI ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
* (for testing purposes only)
*/
// extern "C"
unsigned epicsShareAPI ca_get_ioc_connection_count ()
unsigned epicsStdCall ca_get_ioc_connection_count ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( & pcac );
@ -680,7 +678,7 @@ unsigned epicsShareAPI ca_get_ioc_connection_count ()
return pcac->circuitCount ();
}
unsigned epicsShareAPI ca_beacon_anomaly_count ()
unsigned epicsStdCall ca_beacon_anomaly_count ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( & pcac );
@ -692,15 +690,15 @@ unsigned epicsShareAPI ca_beacon_anomaly_count ()
}
// extern "C"
int epicsShareAPI ca_channel_status ( epicsThreadId /* tid */ )
int epicsStdCall ca_channel_status ( epicsThreadId /* tid */ )
{
::printf ("The R3.14 EPICS OS abstraction API does not allow peeking at thread private storage of another thread.\n");
::printf ("Please call \"ca_client_status ( unsigned level )\" from the subsystem specific diagnostic code.\n");
return ECA_ANACHRONISM;
return ECA_ANACHRONISM;
}
// extern "C"
int epicsShareAPI ca_client_status ( unsigned level )
int epicsStdCall ca_client_status ( unsigned level )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@ -712,7 +710,7 @@ int epicsShareAPI ca_client_status ( unsigned level )
return ECA_NORMAL;
}
int epicsShareAPI ca_context_status ( ca_client_context * pcac, unsigned level )
int epicsStdCall ca_context_status ( ca_client_context * pcac, unsigned level )
{
pcac->show ( level );
return ECA_NORMAL;
@ -725,7 +723,7 @@ int epicsShareAPI ca_context_status ( ca_client_context * pcac, unsigned level )
* by another thread
*/
// extern "C"
struct ca_client_context * epicsShareAPI ca_current_context ()
struct ca_client_context * epicsStdCall ca_current_context ()
{
struct ca_client_context *pCtx;
if ( caClientContextId ) {
@ -745,7 +743,7 @@ struct ca_client_context * epicsShareAPI ca_current_context ()
* by another thread
*/
// extern "C"
int epicsShareAPI ca_attach_context ( struct ca_client_context * pCtx )
int epicsStdCall ca_attach_context ( struct ca_client_context * pCtx )
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( pcac && pCtx != 0 ) {
@ -758,14 +756,14 @@ int epicsShareAPI ca_attach_context ( struct ca_client_context * pCtx )
return ECA_NORMAL;
}
void epicsShareAPI ca_detach_context ()
void epicsStdCall ca_detach_context ()
{
if ( caClientContextId ) {
epicsThreadPrivateSet ( caClientContextId, 0 );
}
}
int epicsShareAPI ca_preemtive_callback_is_enabled ()
int epicsStdCall ca_preemtive_callback_is_enabled ()
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( ! pcac ) {
@ -776,7 +774,7 @@ int epicsShareAPI ca_preemtive_callback_is_enabled ()
// extern "C"
void epicsShareAPI ca_self_test ()
void epicsStdCall ca_self_test ()
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( ! pcac ) {
@ -785,8 +783,7 @@ void epicsShareAPI ca_self_test ()
pcac->selfTest ();
}
// extern "C"
epicsShareDef const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
DBR_SHORT, /* forces conversion fronm uint8 to int16 */
DBR_CHAR,
DBR_SHORT,
@ -800,265 +797,257 @@ epicsShareDef const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
DBR_STRING
};
// extern "C"
epicsShareDef const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1] = {
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1] = {
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsUInt16T,
epicsUInt16T,
epicsOldStringT,
epicsOldStringT
epicsUInt16T,
epicsUInt16T,
epicsOldStringT,
epicsOldStringT
};
// extern "C"
epicsShareDef const unsigned short dbr_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
const unsigned short dbr_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(struct dbr_sts_string), /* string field with status */
sizeof(struct dbr_sts_short), /* short field with status */
sizeof(struct dbr_sts_float), /* float field with status */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(struct dbr_sts_string), /* string field with status */
sizeof(struct dbr_sts_short), /* short field with status */
sizeof(struct dbr_sts_float), /* float field with status */
sizeof(struct dbr_sts_enum), /* item number with status */
sizeof(struct dbr_sts_char), /* char field with status */
sizeof(struct dbr_sts_long), /* long field with status */
sizeof(struct dbr_sts_double), /* double field with time */
sizeof(struct dbr_time_string), /* string field with time */
sizeof(struct dbr_sts_enum), /* item number with status */
sizeof(struct dbr_sts_char), /* char field with status */
sizeof(struct dbr_sts_long), /* long field with status */
sizeof(struct dbr_sts_double), /* double field with time */
sizeof(struct dbr_time_string), /* string field with time */
sizeof(struct dbr_time_short), /* short field with time */
sizeof(struct dbr_time_float), /* float field with time */
sizeof(struct dbr_time_enum), /* item number with time */
sizeof(struct dbr_time_char), /* char field with time */
sizeof(struct dbr_time_long), /* long field with time */
sizeof(struct dbr_time_short), /* short field with time */
sizeof(struct dbr_time_float), /* float field with time */
sizeof(struct dbr_time_enum), /* item number with time */
sizeof(struct dbr_time_char), /* char field with time */
sizeof(struct dbr_time_long), /* long field with time */
sizeof(struct dbr_time_double), /* double field with time */
sizeof(struct dbr_sts_string), /* graphic string info */
sizeof(struct dbr_gr_short), /* graphic short info */
sizeof(struct dbr_gr_float), /* graphic float info */
sizeof(struct dbr_gr_enum), /* graphic item info */
sizeof(struct dbr_time_double), /* double field with time */
sizeof(struct dbr_sts_string), /* graphic string info */
sizeof(struct dbr_gr_short), /* graphic short info */
sizeof(struct dbr_gr_float), /* graphic float info */
sizeof(struct dbr_gr_enum), /* graphic item info */
sizeof(struct dbr_gr_char), /* graphic char info */
sizeof(struct dbr_gr_long), /* graphic long info */
sizeof(struct dbr_gr_double), /* graphic double info */
sizeof(struct dbr_sts_string), /* control string info */
sizeof(struct dbr_ctrl_short), /* control short info */
sizeof(struct dbr_gr_char), /* graphic char info */
sizeof(struct dbr_gr_long), /* graphic long info */
sizeof(struct dbr_gr_double), /* graphic double info */
sizeof(struct dbr_sts_string), /* control string info */
sizeof(struct dbr_ctrl_short), /* control short info */
sizeof(struct dbr_ctrl_float), /* control float info */
sizeof(struct dbr_ctrl_enum), /* control item info */
sizeof(struct dbr_ctrl_char), /* control char info */
sizeof(struct dbr_ctrl_long), /* control long info */
sizeof(struct dbr_ctrl_double), /* control double info */
sizeof(struct dbr_ctrl_float), /* control float info */
sizeof(struct dbr_ctrl_enum), /* control item info */
sizeof(struct dbr_ctrl_char), /* control char info */
sizeof(struct dbr_ctrl_long), /* control long info */
sizeof(struct dbr_ctrl_double), /* control double info */
sizeof(dbr_put_ackt_t), /* put ackt */
sizeof(dbr_put_acks_t), /* put acks */
sizeof(struct dbr_stsack_string),/* string field with status/ack*/
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_put_ackt_t), /* put ackt */
sizeof(dbr_put_acks_t), /* put acks */
sizeof(struct dbr_stsack_string),/* string field with status/ack*/
sizeof(dbr_string_t), /* string max size */
};
// extern "C"
epicsShareDef const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_ushort_t), /* put_ackt */
sizeof(dbr_ushort_t), /* put_acks */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_ushort_t), /* put_ackt */
sizeof(dbr_ushort_t), /* put_acks */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_string_t), /* string max size */
};
//extern "C"
epicsShareDef const enum dbr_value_class dbr_value_class[LAST_BUFFER_TYPE+1] = {
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
const enum dbr_value_class dbr_value_class[LAST_BUFFER_TYPE+1] = {
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_int,
dbr_class_int,
dbr_class_string,
dbr_class_string, /* string max size */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_int,
dbr_class_int,
dbr_class_string,
dbr_class_string, /* string max size */
};
// extern "C"
epicsShareDef const unsigned short dbr_value_offset[LAST_BUFFER_TYPE+1] = {
0, /* string */
0, /* short */
0, /* IEEE Float */
0, /* item number */
0, /* character */
0, /* long */
0, /* IEEE double */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* string field with status */
(unsigned short) offsetof(dbr_sts_short,value), /* short field with status */
(unsigned short) offsetof(dbr_sts_float,value), /* float field with status */
(unsigned short) offsetof(dbr_sts_enum,value), /* item number with status */
(unsigned short) offsetof(dbr_sts_char,value), /* char field with status */
(unsigned short) offsetof(dbr_sts_long,value), /* long field with status */
(unsigned short) offsetof(dbr_sts_double,value), /* double field with time */
(unsigned short) offsetof(dbr_time_string,value[0] ),/* string field with time */
(unsigned short) offsetof(dbr_time_short,value), /* short field with time */
(unsigned short) offsetof(dbr_time_float,value), /* float field with time */
(unsigned short) offsetof(dbr_time_enum,value), /* item number with time */
(unsigned short) offsetof(dbr_time_char,value), /* char field with time */
(unsigned short) offsetof(dbr_time_long,value), /* long field with time */
(unsigned short) offsetof(dbr_time_double,value), /* double field with time */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* graphic string info */
(unsigned short) offsetof(dbr_gr_short,value), /* graphic short info */
(unsigned short) offsetof(dbr_gr_float,value), /* graphic float info */
(unsigned short) offsetof(dbr_gr_enum,value), /* graphic item info */
(unsigned short) offsetof(dbr_gr_char,value), /* graphic char info */
(unsigned short) offsetof(dbr_gr_long,value), /* graphic long info */
(unsigned short) offsetof(dbr_gr_double,value), /* graphic double info */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* control string info */
(unsigned short) offsetof(dbr_ctrl_short,value), /* control short info */
(unsigned short) offsetof(dbr_ctrl_float,value), /* control float info */
(unsigned short) offsetof(dbr_ctrl_enum,value), /* control item info */
(unsigned short) offsetof(dbr_ctrl_char,value), /* control char info */
(unsigned short) offsetof(dbr_ctrl_long,value), /* control long info */
(unsigned short) offsetof(dbr_ctrl_double,value), /* control double info */
0, /* put ackt */
0, /* put acks */
(unsigned short) offsetof(dbr_stsack_string,value[0]),/* string field with status */
0, /* string */
const unsigned short dbr_value_offset[LAST_BUFFER_TYPE+1] = {
0, /* string */
0, /* short */
0, /* IEEE Float */
0, /* item number */
0, /* character */
0, /* long */
0, /* IEEE double */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* string field with status */
(unsigned short) offsetof(dbr_sts_short,value), /* short field with status */
(unsigned short) offsetof(dbr_sts_float,value), /* float field with status */
(unsigned short) offsetof(dbr_sts_enum,value), /* item number with status */
(unsigned short) offsetof(dbr_sts_char,value), /* char field with status */
(unsigned short) offsetof(dbr_sts_long,value), /* long field with status */
(unsigned short) offsetof(dbr_sts_double,value), /* double field with time */
(unsigned short) offsetof(dbr_time_string,value[0] ), /* string field with time */
(unsigned short) offsetof(dbr_time_short,value), /* short field with time */
(unsigned short) offsetof(dbr_time_float,value), /* float field with time */
(unsigned short) offsetof(dbr_time_enum,value), /* item number with time */
(unsigned short) offsetof(dbr_time_char,value), /* char field with time */
(unsigned short) offsetof(dbr_time_long,value), /* long field with time */
(unsigned short) offsetof(dbr_time_double,value), /* double field with time */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* graphic string info */
(unsigned short) offsetof(dbr_gr_short,value), /* graphic short info */
(unsigned short) offsetof(dbr_gr_float,value), /* graphic float info */
(unsigned short) offsetof(dbr_gr_enum,value), /* graphic item info */
(unsigned short) offsetof(dbr_gr_char,value), /* graphic char info */
(unsigned short) offsetof(dbr_gr_long,value), /* graphic long info */
(unsigned short) offsetof(dbr_gr_double,value), /* graphic double info */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* control string info */
(unsigned short) offsetof(dbr_ctrl_short,value), /* control short info */
(unsigned short) offsetof(dbr_ctrl_float,value), /* control float info */
(unsigned short) offsetof(dbr_ctrl_enum,value), /* control item info */
(unsigned short) offsetof(dbr_ctrl_char,value), /* control char info */
(unsigned short) offsetof(dbr_ctrl_long,value), /* control long info */
(unsigned short) offsetof(dbr_ctrl_double,value), /* control double info */
0, /* put ackt */
0, /* put acks */
(unsigned short) offsetof(dbr_stsack_string,value[0]), /* string field with status */
0, /* string */
};
// extern "C"
epicsShareDef const char *dbf_text[LAST_TYPE+3] = {
"TYPENOTCONN",
"DBF_STRING",
"DBF_SHORT",
"DBF_FLOAT",
"DBF_ENUM",
"DBF_CHAR",
"DBF_LONG",
"DBF_DOUBLE",
"DBF_NO_ACCESS"
const char *dbf_text[LAST_TYPE+3] = {
"TYPENOTCONN",
"DBF_STRING",
"DBF_SHORT",
"DBF_FLOAT",
"DBF_ENUM",
"DBF_CHAR",
"DBF_LONG",
"DBF_DOUBLE",
"DBF_NO_ACCESS"
};
// extern "C"
epicsShareDef const char *dbf_text_invalid = "DBF_invalid";
const char *dbf_text_invalid = "DBF_invalid";
// extern "C"
epicsShareDef const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *));
const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *));
// extern "C"
epicsShareDef const char *dbr_text[LAST_BUFFER_TYPE+1] = {
const char *dbr_text[LAST_BUFFER_TYPE+1] = {
"DBR_STRING",
"DBR_SHORT",
"DBR_FLOAT",
@ -1100,8 +1089,6 @@ epicsShareDef const char *dbr_text[LAST_BUFFER_TYPE+1] = {
"DBR_CLASS_NAME"
};
// extern "C"
epicsShareDef const char *dbr_text_invalid = "DBR_invalid";
const char *dbr_text_invalid = "DBR_invalid";
// extern "C"
epicsShareDef const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1;
const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1;

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@ -19,15 +19,15 @@ int main ( int argc, char **argv )
unsigned progressLoggingLevel;
unsigned channelCount;
unsigned repetitionCount;
enum ca_preemptive_callback_select preempt;
int aBoolean;
enum ca_preemptive_callback_select preempt;
int aBoolean;
if ( argc < 2 || argc > 6 ) {
printf ("usage: %s <PV name> [progress logging level] [channel count] "
"[repetition count] [enable preemptive callback]\n",
"[repetition count] [enable preemptive callback]\n",
argv[0] );
return 1;
return 1;
}
if ( argc >= 3 ) {
@ -57,12 +57,12 @@ int main ( int argc, char **argv )
else {
aBoolean = 0;
}
if ( aBoolean ) {
preempt = ca_enable_preemptive_callback;
}
else {
preempt = ca_disable_preemptive_callback;
}
if ( aBoolean ) {
preempt = ca_enable_preemptive_callback;
}
else {
preempt = ca_disable_preemptive_callback;
}
acctst ( argv[1], progressLoggingLevel, channelCount, repetitionCount, preempt );

View File

@ -60,7 +60,7 @@ struct AutoInit {
AutoInit ();
};
AutoInit :: AutoInit ()
AutoInit :: AutoInit ()
{
iocshRegister ( &acctstFuncDef, acctstCallFunc );
}

View File

@ -3,38 +3,38 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef addrListh
#define addrListh
#ifndef INC_addrList_H
#define INC_addrList_H
#include "shareLib.h"
#include "envDefs.h"
#include "envDefs.h"
#include "osiSock.h"
#include "libCaAPI.h"
#ifdef __cplusplus
extern "C" {
#endif
epicsShareFunc void epicsShareAPI configureChannelAccessAddressList
LIBCA_API void epicsStdCall configureChannelAccessAddressList
( struct ELLLIST *pList, SOCKET sock, unsigned short port );
epicsShareFunc int epicsShareAPI addAddrToChannelAccessAddressList
( struct ELLLIST *pList, const ENV_PARAM *pEnv,
LIBCA_API int epicsStdCall addAddrToChannelAccessAddressList
( struct ELLLIST *pList, const ENV_PARAM *pEnv,
unsigned short port, int ignoreNonDefaultPort );
epicsShareFunc void epicsShareAPI printChannelAccessAddressList
LIBCA_API void epicsStdCall printChannelAccessAddressList
( const struct ELLLIST *pList );
epicsShareFunc void epicsShareAPI removeDuplicateAddresses
LIBCA_API void epicsStdCall removeDuplicateAddresses
( struct ELLLIST *pDestList, ELLLIST *pSrcList, int silent);
#ifdef __cplusplus
}
#endif
#endif /* ifndef addrListh */
#endif /* ifndef INC_addrList_H */

View File

@ -3,41 +3,31 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef autoPtrFreeListh
#define autoPtrFreeListh
#ifdef epicsExportSharedSymbols
# define autoPtrFreeListh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_autoPtrFreeList_H
#define INC_autoPtrFreeList_H
#include "tsFreeList.h"
#include "compilerDependencies.h"
#ifdef autoPtrFreeListh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
template < class T, unsigned N = 0x400, class MUTEX = epicsMutex >
class autoPtrFreeList {
public:
@ -56,7 +46,7 @@ private:
};
template < class T, unsigned N, class MUTEX >
inline autoPtrFreeList < T, N, MUTEX >::autoPtrFreeList (
inline autoPtrFreeList < T, N, MUTEX >::autoPtrFreeList (
tsFreeList < T, N, MUTEX > & freeListIn, T * pIn ) :
p ( pIn ), freeList ( freeListIn ) {}
@ -101,4 +91,4 @@ inline T * autoPtrFreeList < T, N, MUTEX >::release ()
return pTmp;
}
#endif // #ifdef autoPtrFreeListh
#endif // #ifndef INC_autoPtrFreeList_H

View File

@ -5,22 +5,22 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef autoPtrRecycleh
@ -29,7 +29,7 @@
template < class T >
class autoPtrRecycle {
public:
autoPtrRecycle (
autoPtrRecycle (
epicsGuard < epicsMutex > &, chronIntIdResTable < baseNMIU > &,
cacRecycle &, T * );
~autoPtrRecycle ();
@ -43,12 +43,12 @@ private:
chronIntIdResTable < baseNMIU > & ioTable;
epicsGuard < epicsMutex > & guard;
// not implemented
autoPtrRecycle ( const autoPtrRecycle & );
autoPtrRecycle & operator = ( const autoPtrRecycle & );
autoPtrRecycle ( const autoPtrRecycle & );
autoPtrRecycle & operator = ( const autoPtrRecycle & );
};
template < class T >
inline autoPtrRecycle<T>::autoPtrRecycle (
inline autoPtrRecycle<T>::autoPtrRecycle (
epicsGuard < epicsMutex > & guardIn, chronIntIdResTable < baseNMIU > & tbl,
cacRecycle & rIn, T * pIn ) :
p ( pIn ), r ( rIn ), ioTable ( tbl ), guard ( guardIn ) {}

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -28,7 +27,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "virtualCircuit.h"
#include "bhe.h"
@ -42,12 +40,12 @@
* start up
*
* if creating this in response to a search reply
* and not in response to a beacon then
* and not in response to a beacon then
* we set the beacon time stamp to
* zero (so we can correctly compute the period
* between the 1st and 2nd beacons)
*/
bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp,
bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp,
unsigned initialBeaconNumber, const inetAddrID & addr ) :
inetAddrID ( addr ), timeStamp ( initialTimeStamp ), averagePeriod ( - DBL_MAX ),
mutex ( mutexIn ), pIIU ( 0 ), lastBeaconNumber ( initialBeaconNumber )
@ -74,7 +72,7 @@ void bhe::beaconAnomalyNotify ( epicsGuard < epicsMutex > & guard )
}
#ifdef DEBUG
void bhe::logBeacon ( const char * pDiagnostic,
void bhe::logBeacon ( const char * pDiagnostic,
const double & currentPeriod,
const epicsTime & currentTime )
{
@ -82,10 +80,10 @@ void bhe::logBeacon ( const char * pDiagnostic,
char name[64];
this->name ( name, sizeof ( name ) );
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%a %b %d %Y %H:%M:%S.%f");
::printf ( "%s cp=%g ap=%g %s %s\n",
pDiagnostic, currentPeriod,
pDiagnostic, currentPeriod,
this->averagePeriod, name, date );
}
}
@ -105,7 +103,7 @@ void bhe::logBeaconDiscard ( unsigned beaconAdvance,
char name[64];
this->name ( name, sizeof ( name ) );
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%a %b %d %Y %H:%M:%S.%f");
::printf ( "bb %u %s %s\n",
beaconAdvance, name, date );
@ -123,16 +121,16 @@ void bhe::logBeaconDiscard ( unsigned /* beaconAdvance */,
*
* updates beacon period, and looks for beacon anomalies
*/
bool bhe::updatePeriod (
epicsGuard < epicsMutex > & guard, const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
bool bhe::updatePeriod (
epicsGuard < epicsMutex > & guard, const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
unsigned protocolRevision )
{
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
// creating a connection and so we dont yet know the first beacon time
// and sequence number
//
if ( this->timeStamp == epicsTime () ) {
@ -142,7 +140,7 @@ bool bhe::updatePeriod (
this->beaconAnomalyNotify ( guard );
/*
/*
* this is the 1st beacon seen - the beacon time stamp
* was not initialized during BHE create because
* a TCP/IP connection created the beacon.
@ -167,15 +165,15 @@ bool bhe::updatePeriod (
}
this->lastBeaconNumber = beaconNumber;
// throw out sequence numbers just prior to, or the same as, the last one received
// throw out sequence numbers just prior to, or the same as, the last one received
// (this situation is probably caused by a temporary duplicate route )
if ( beaconSeqAdvance == 0 || beaconSeqAdvance > ca_uint32_max - 256 ) {
logBeaconDiscard ( beaconSeqAdvance, currentTime );
return false;
}
// throw out sequence numbers that jump forward by only a few numbers
// (this situation is probably caused by a duplicate route
// 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)
if ( beaconSeqAdvance > 1 && beaconSeqAdvance < 4 ) {
logBeaconDiscard ( beaconSeqAdvance, currentTime );
@ -205,7 +203,7 @@ bool bhe::updatePeriod (
/*
* ignore beacons seen for the first time shortly after
* init, but do not ignore beacons arriving with a short
* period because the IOC was rebooted soon after the
* period because the IOC was rebooted soon after the
* client starts up.
*/
totalRunningTime = this->timeStamp - programBeginTime;
@ -217,24 +215,24 @@ bool bhe::updatePeriod (
/*
* Is this an IOC seen because of a restored
* network segment?
* network segment?
*
* It may be possible to get false triggers here
* It may be possible to get false triggers here
* if the client is busy, but this does not cause
* problems because the echo response will tell us
* problems because the echo response will tell us
* that the server is available
*/
if ( currentPeriod >= this->averagePeriod * 1.25 ) {
/*
* trigger on any missing beacon
/*
* trigger on any missing beacon
* if connected to this server
*/
*/
this->beaconAnomalyNotify ( guard );
if ( currentPeriod >= this->averagePeriod * 3.25 ) {
/*
* trigger on any 3 contiguous missing beacons
/*
* trigger on any 3 contiguous missing beacons
* if not connected to this server
*/
netChange = true;
@ -248,9 +246,9 @@ bool bhe::updatePeriod (
* IOC reboots). Lower tolarance here because we
* dont have to worry about lost beacons.
*
* It may be possible to get false triggers here
* It may be possible to get false triggers here
* if the client is busy, but this does not cause
* problems because the echo response will tell us
* problems because the echo response will tell us
* that the server is available
*/
else if ( currentPeriod <= this->averagePeriod * 0.80 ) {
@ -259,14 +257,14 @@ bool bhe::updatePeriod (
logBeacon ( "bal", currentPeriod, currentTime );
}
else if ( this->pIIU ) {
// update state of health for active virtual circuits
// update state of health for active virtual circuits
// if the beacon looks ok
this->pIIU->beaconArrivalNotify ( guard );
logBeacon ( "vb", currentPeriod, currentTime );
}
// update a running average period
this->averagePeriod = currentPeriod * 0.125 +
this->averagePeriod = currentPeriod * 0.125 +
this->averagePeriod * 0.875;
}
@ -286,22 +284,22 @@ void bhe::show ( epicsGuard < epicsMutex > &, unsigned level ) const
char host [64];
this->name ( host, sizeof ( host ) );
if ( this->averagePeriod == -DBL_MAX ) {
::printf ( "CA beacon hash entry for %s <no period estimate>\n",
::printf ( "CA beacon hash entry for %s <no period estimate>\n",
host );
}
else {
::printf ( "CA beacon hash entry for %s with period estimate %f\n",
::printf ( "CA beacon hash entry for %s with period estimate %f\n",
host, this->averagePeriod );
}
if ( level > 0u ) {
char date[64];
this->timeStamp.strftime ( date, sizeof ( date ), "%a %b %d %Y %H:%M:%S");
::printf ( "\tbeacon number %u, on %s\n",
::printf ( "\tbeacon number %u, on %s\n",
this->lastBeaconNumber, date );
}
}
double bhe::period ( epicsGuard < epicsMutex > & guard ) const
double bhe::period ( epicsGuard < epicsMutex > & guard ) const
{
guard.assertIdenticalMutex ( this->mutex );
return this->averagePeriod;
@ -313,14 +311,14 @@ epicsTime bhe::updateTime ( epicsGuard < epicsMutex > & guard ) const
return this->timeStamp;
}
void bhe::registerIIU (
void bhe::registerIIU (
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
{
guard.assertIdenticalMutex ( this->mutex );
this->pIIU = & iiu;
}
void bhe::unregisterIIU (
void bhe::unregisterIIU (
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
{
guard.assertIdenticalMutex ( this->mutex );

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -19,24 +18,15 @@
* Author: Jeff Hill
*/
#ifndef bheh
#define bheh
#ifdef epicsExportSharedSymbols
# define bhehEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_bhe_H
#define INC_bhe_H
#include "tsDLList.h"
#include "tsFreeList.h"
#include "epicsTime.h"
#include "compilerDependencies.h"
#ifdef bhehEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "inetAddrID.h"
#include "caProto.h"
@ -45,7 +35,7 @@ class bheMemoryManager;
// using a pure abstract wrapper class around the free list avoids
// Tornado 2.0.1 GNU compiler bugs
class epicsShareClass bheMemoryManager {
class LIBCA_API bheMemoryManager {
public:
virtual ~bheMemoryManager ();
virtual void * allocate ( size_t ) = 0;
@ -54,24 +44,24 @@ public:
class bhe : public tsSLNode < bhe >, public inetAddrID {
public:
epicsShareFunc bhe (
epicsMutex &, const epicsTime & initialTimeStamp,
LIBCA_API bhe (
epicsMutex &, const epicsTime & initialTimeStamp,
unsigned initialBeaconNumber, const inetAddrID & addr );
epicsShareFunc ~bhe ();
epicsShareFunc bool updatePeriod (
LIBCA_API ~bhe ();
LIBCA_API bool updatePeriod (
epicsGuard < epicsMutex > &,
const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
unsigned protocolRevision );
epicsShareFunc double period ( epicsGuard < epicsMutex > & ) const;
epicsShareFunc epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
epicsShareFunc void show ( unsigned level ) const;
epicsShareFunc void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
epicsShareFunc void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
epicsShareFunc void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
epicsShareFunc void * operator new ( size_t size, bheMemoryManager & );
LIBCA_API double period ( epicsGuard < epicsMutex > & ) const;
LIBCA_API epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
LIBCA_API void show ( unsigned level ) const;
LIBCA_API void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
LIBCA_API void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
LIBCA_API void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
LIBCA_API void * operator new ( size_t size, bheMemoryManager & );
#ifdef CXX_PLACEMENT_DELETE
epicsShareFunc void operator delete ( void *, bheMemoryManager & );
LIBCA_API void operator delete ( void *, bheMemoryManager & );
#endif
private:
epicsTime timeStamp;
@ -80,14 +70,14 @@ private:
tcpiiu * pIIU;
ca_uint32_t lastBeaconNumber;
void beaconAnomalyNotify ( epicsGuard < epicsMutex > & );
void logBeacon ( const char * pDiagnostic,
void logBeacon ( const char * pDiagnostic,
const double & currentPeriod,
const epicsTime & currentTime );
void logBeaconDiscard ( unsigned beaconAdvance,
const epicsTime & currentTime );
bhe ( const bhe & );
bhe & operator = ( const bhe & );
epicsShareFunc void operator delete ( void * );
bhe ( const bhe & );
bhe & operator = ( const bhe & );
LIBCA_API void operator delete ( void * );
};
// using a wrapper class around the free list avoids
@ -99,24 +89,24 @@ public:
void release ( void * );
private:
tsFreeList < bhe, 0x100 > freeList;
bheFreeStore ( const bheFreeStore & );
bheFreeStore & operator = ( const bheFreeStore & );
bheFreeStore ( const bheFreeStore & );
bheFreeStore & operator = ( const bheFreeStore & );
};
inline void * bhe::operator new ( size_t size,
inline void * bhe::operator new ( size_t size,
bheMemoryManager & mgr )
{
{
return mgr.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
inline void bhe::operator delete ( void * pCadaver,
inline void bhe::operator delete ( void * pCadaver,
bheMemoryManager & mgr )
{
{
mgr.release ( pCadaver );
}
#endif
#endif // ifdef bheh
#endif // ifndef INC_bhe_H

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@ -60,50 +59,50 @@ void caConnTest ( const char *pNameIn, unsigned channelCountIn, double delayIn )
{
unsigned iteration = 0u;
int status;
unsigned i;
chid *pChans;
unsigned i;
chid *pChans;
channelCount = channelCountIn;
pChans = new chid [channelCount];
while ( 1 ) {
while ( 1 ) {
connCount = 0u;
subsequentConnect = false;
begin = epicsTime::getCurrent ();
printf ( "initializing CA client library\n" );
status = ca_task_initialize();
SEVCHK ( status, "CA init failed" );
status = ca_task_initialize();
SEVCHK ( status, "CA init failed" );
printf ( "creating channels\n" );
for ( i = 0u; i < channelCount; i++ ) {
status = ca_search_and_connect ( pNameIn,
for ( i = 0u; i < channelCount; i++ ) {
status = ca_search_and_connect ( pNameIn,
&pChans[i], caConnTestConnHandler, 0 );
SEVCHK ( status, "CA search problems" );
}
SEVCHK ( status, "CA search problems" );
}
printf ( "all channels were created\n" );
ca_pend_event ( delayIn );
ca_pend_event ( delayIn );
if ( iteration & 1 ) {
for ( i = 0u; i < channelCount; i++ ) {
status = ca_clear_channel ( pChans[i] );
SEVCHK ( status, "ca_clear_channel() problems" );
}
for ( i = 0u; i < channelCount; i++ ) {
status = ca_clear_channel ( pChans[i] );
SEVCHK ( status, "ca_clear_channel() problems" );
}
printf ( "all channels were destroyed\n" );
}
printf ( "shutting down CA client library\n" );
status = ca_task_exit ();
SEVCHK ( status, "task exit problems" );
status = ca_task_exit ();
SEVCHK ( status, "task exit problems" );
iteration++;
}
}
//delete [] pChans;
}

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@ -3,13 +3,12 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef caDiagnosticsh
#define caDiagnosticsh
#ifndef INC_caDiagnostics_H
#define INC_caDiagnostics_H
#include "cadef.h"
@ -20,8 +19,8 @@ extern "C" {
enum appendNumberFlag {appendNumber, dontAppendNumber};
int catime ( const char *channelName, unsigned channelCount, enum appendNumberFlag appNF );
int acctst ( const char *pname, unsigned logggingInterestLevel,
unsigned channelCount, unsigned repetitionCount,
int acctst ( const char *pname, unsigned logggingInterestLevel,
unsigned channelCount, unsigned repetitionCount,
enum ca_preemptive_callback_select select );
#define CATIME_OK 0
@ -33,6 +32,6 @@ int acctst ( const char *pname, unsigned logggingInterestLevel,
void caConnTest ( const char *pNameIn, unsigned channelCountIn, double delayIn );
#endif /* caDiagnosticsh */
#endif /* ifndef INC_caDiagnostics_H */

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@ -38,50 +37,50 @@ void caEventRate ( const char *pName, unsigned count )
chid * pChidTable = new chid [ count ];
{
printf ( "Connecting to CA Channel \"%s\" %u times.",
printf ( "Connecting to CA Channel \"%s\" %u times.",
pName, count );
fflush ( stdout );
epicsTime begin = epicsTime::getCurrent ();
for ( unsigned i = 0u; i < count; i++ ) {
int status = ca_search ( pName, & pChidTable[i] );
SEVCHK ( status, NULL );
}
int status = ca_pend_io ( 10000.0 );
if ( status != ECA_NORMAL ) {
fprintf ( stderr, " not found.\n" );
return;
}
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
{
printf ( "Subscribing %u times.", count );
fflush ( stdout );
epicsTime begin = epicsTime::getCurrent ();
for ( unsigned i = 0u; i < count; i++ ) {
int addEventStatus = ca_add_event ( DBR_FLOAT,
int addEventStatus = ca_add_event ( DBR_FLOAT,
pChidTable[i], eventCallBack, &eventCount, NULL);
SEVCHK ( addEventStatus, __FILE__ );
}
int status = ca_flush_io ();
SEVCHK ( status, __FILE__ );
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
{
printf ( "Waiting for initial value events." );
fflush ( stdout );
// let the first one go by
// let the first one go by
epicsTime begin = epicsTime::getCurrent ();
while ( eventCount < count ) {
int status = ca_pend_event ( 0.01 );
@ -90,7 +89,7 @@ void caEventRate ( const char *pName, unsigned count )
}
}
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
@ -128,7 +127,7 @@ void caEventRate ( const char *pName, unsigned count )
double mean = X / N;
double stdDev = sqrt ( XX / N - mean * mean );
printf ( "CA Event Rate (Hz): current %g mean %g std dev %g\n",
printf ( "CA Event Rate (Hz): current %g mean %g std dev %g\n",
Hz, mean, stdDev );
if ( samplePeriod < maxSamplePeriod ) {

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -14,15 +13,15 @@
* 505 665 1831
*/
#ifndef __CAPROTO__
#define __CAPROTO__
#ifndef INC_caProto_H
#define INC_caProto_H
#define capStrOf(A) #A
#define capStrOfX(A) capStrOf ( A )
/*
/*
* CA protocol revision
* TCP/UDP port number (bumped each major protocol change)
* TCP/UDP port number (bumped each major protocol change)
*/
#define CA_MAJOR_PROTOCOL_REVISION 4
#define CA_VERSION_STRING( MINOR_REVISION ) \
@ -30,7 +29,7 @@
#define CA_UKN_MINOR_VERSION 0u /* unknown minor version */
#define CA_MINIMUM_SUPPORTED_VERSION 4u
# define CA_VSUPPORTED(MINOR) ((MINOR)>=CA_MINIMUM_SUPPORTED_VERSION)
# define CA_V41(MINOR) ((MINOR)>=1u)
# define CA_V41(MINOR) ((MINOR)>=1u)
# define CA_V42(MINOR) ((MINOR)>=2u)
# define CA_V43(MINOR) ((MINOR)>=3u)
# define CA_V44(MINOR) ((MINOR)>=4u)
@ -45,8 +44,8 @@
# define CA_V413(MINOR) ((MINOR)>=13u) /* Allow zero length in requests. */
/*
* These port numbers are only used if the CA repeater and
* CA server port numbers cant be obtained from the EPICS
* These port numbers are only used if the CA repeater and
* CA server port numbers cant be obtained from the EPICS
* environment variables "EPICS_CA_REPEATER_PORT" and
* "EPICS_CA_SERVER_PORT"
*/
@ -54,8 +53,8 @@
#define CA_SERVER_PORT (CA_PORT_BASE+CA_MAJOR_PROTOCOL_REVISION*2u)
#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)
/*
* 1500 (max of ethernet and 802.{2,3} MTU) - 20(IP) - 8(UDP)
* (the MTU of Ethernet is currently independent of its speed varient)
*/
#define ETHERNET_MAX_UDP ( 1500u - 20u - 8u )
@ -89,10 +88,10 @@ typedef ca_uint32_t caResId;
#define CA_PROTO_SNAPSHOT 5u /* snapshot of the system */
#define CA_PROTO_SEARCH 6u /* IOC channel search */
#define CA_PROTO_BUILD 7u /* build - obsolete */
#define CA_PROTO_EVENTS_OFF 8u /* flow control */
#define CA_PROTO_EVENTS_ON 9u /* flow control */
#define CA_PROTO_READ_SYNC 10u /* purge old reads */
#define CA_PROTO_ERROR 11u /* an operation failed */
#define CA_PROTO_EVENTS_OFF 8u /* flow control */
#define CA_PROTO_EVENTS_ON 9u /* flow control */
#define CA_PROTO_READ_SYNC 10u /* purge old reads */
#define CA_PROTO_ERROR 11u /* an operation failed */
#define CA_PROTO_CLEAR_CHANNEL 12u /* free chan resources */
#define CA_PROTO_RSRV_IS_UP 13u /* CA server has joined the net */
#define CA_PROTO_NOT_FOUND 14u /* channel not found */
@ -172,7 +171,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_hval; /* high delta */
ca_float32_t m_toval; /* period btween samples */
ca_uint16_t m_mask; /* event select mask */
ca_uint16_t m_pad; /* extend to 32 bits */
@ -183,5 +182,5 @@ struct mon_info {
*/
#define unreasonablePVNameSize 500u
#endif /* __CAPROTO__ */
#endif /* ifndef INC_caProto_H */

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -31,12 +30,65 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include <stdio.h>
#if !defined(_WIN32) && !defined(__rtems__) && !defined(vxWorks)
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
#define CAN_DETACH_STDINOUT
#endif
#include "epicsAssert.h"
#include "osiUnistd.h"
#include "epicsGetopt.h"
#include "udpiiu.h"
int main()
static void usage(char* argv[])
{
fprintf(stderr, "Usage: %s -hv\n"
"\n"
" -h - Print this message\n"
" -v - Do not replace stdin/out/err with /dev/null\n",
argv[0]);
}
int main(int argc, char* argv[])
{
bool detachinout = true;
int opt;
while ((opt = getopt(argc, argv, "hv")) != -1) {
switch (opt) {
default:
usage(argv);
fprintf(stderr, "\nUnknown argument '%c'\n", opt);
return 1;
case 'h':
usage(argv);
return 0;
case 'v':
detachinout = false;
break;
}
}
#ifdef CAN_DETACH_STDINOUT
if(detachinout) {
int readfd = open("/dev/null", O_RDONLY);
int writefd = open("/dev/null", O_WRONLY);
dup2(readfd, 0);
dup2(writefd, 1);
dup2(writefd, 2);
close(readfd);
close(writefd);
}
#else
(void)detachinout;
#endif
chdir ( "/" );
ca_repeater ();
return ( 0 );

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -18,8 +17,8 @@
* Author: Jeff Hill
*/
#ifndef caServerIDh
#define caServerIDh
#ifndef INC_caServerID_H
#define INC_caServerID_H
#include "osiSock.h"
#include "resourceLib.h"
@ -37,7 +36,7 @@ private:
ca_uint8_t pri;
};
inline caServerID::caServerID (
inline caServerID::caServerID (
const struct sockaddr_in & addrIn, unsigned priorityIn ) :
addr ( addrIn ), pri ( static_cast <ca_uint8_t> ( priorityIn ) )
{
@ -46,7 +45,7 @@ inline caServerID::caServerID (
inline bool caServerID::operator == ( const caServerID & rhs ) const
{
if ( this->addr.sin_addr.s_addr == rhs.addr.sin_addr.s_addr &&
if ( this->addr.sin_addr.s_addr == rhs.addr.sin_addr.s_addr &&
this->addr.sin_port == rhs.addr.sin_port &&
this->pri == rhs.pri ) {
return true;
@ -67,7 +66,7 @@ inline resTableIndex caServerID::hash () const
index ^= this->addr.sin_port;
index ^= this->addr.sin_port >> 8u;
index ^= this->pri;
return integerHash ( caServerMinIndexBitWidth,
return integerHash ( caServerMinIndexBitWidth,
caServerMaxIndexBitWidth, index );
}
@ -83,6 +82,4 @@ inline unsigned caServerID::priority () const
return this->pri;
}
#endif // ifdef caServerID
#endif // ifdef INC_caServerID_H

View File

@ -1,28 +0,0 @@
/*************************************************************************\
* Copyright (c) 2017 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef CAVERSION_H
#define CAVERSION_H
#include <epicsVersion.h>
#include <shareLib.h>
#ifndef VERSION_INT
# define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P))
#endif
/* include generated headers with:
* EPICS_CA_MAJOR_VERSION
* EPICS_CA_MINOR_VERSION
* EPICS_CA_MAINTENANCE_VERSION
* EPICS_CA_DEVELOPMENT_FLAG
*/
#include "caVersionNum.h"
#define CA_VERSION_INT VERSION_INT(EPICS_CA_MAJOR_VERSION, EPICS_CA_MINOR_VERSION, EPICS_CA_MAINTENANCE_VERSION, 0)
#endif // CAVERSION_H

View File

@ -0,0 +1,21 @@
/*************************************************************************\
* Copyright (c) 2017 UChicago Argonne LLC, as Operator of Argonne
* National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef INC_caVersion_H
#define INC_caVersion_H
#define EPICS_CA_MAJOR_VERSION @EPICS_CA_MAJOR_VERSION@
#define EPICS_CA_MINOR_VERSION @EPICS_CA_MINOR_VERSION@
#define EPICS_CA_MAINTENANCE_VERSION @EPICS_CA_MAINTENANCE_VERSION@
#define EPICS_CA_DEVELOPMENT_FLAG @EPICS_CA_DEVELOPMENT_FLAG@
#include <epicsVersion.h>
#define CA_VERSION_INT VERSION_INT(EPICS_CA_MAJOR_VERSION, \
EPICS_CA_MINOR_VERSION, EPICS_CA_MAINTENANCE_VERSION, 0)
#endif /* INC_caVersion_H */

View File

@ -1,7 +0,0 @@
#ifndef CAVERSION_H
# error include caVersion.h, not this header
#endif
#define EPICS_CA_MAJOR_VERSION @EPICS_CA_MAJOR_VERSION@
#define EPICS_CA_MINOR_VERSION @EPICS_CA_MINOR_VERSION@
#define EPICS_CA_MAINTENANCE_VERSION @EPICS_CA_MAINTENANCE_VERSION@
#define EPICS_CA_DEVELOPMENT_FLAG @EPICS_CA_DEVELOPMENT_FLAG@

View File

@ -17,9 +17,9 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifdef _MSC_VER
@ -34,12 +34,11 @@
#include "errlog.h"
#include "locationException.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
epicsShareDef epicsThreadPrivateId caClientCallbackThreadId;
epicsThreadPrivateId caClientCallbackThreadId;
static epicsThreadOnceId cacOnce = EPICS_THREAD_ONCE_INIT;
@ -475,7 +474,7 @@ int ca_client_context::pendIO ( const double & timeout )
}
int status = ECA_NORMAL;
epicsTime beg_time = epicsTime::getMonotonic ();
epicsTime beg_time = epicsTime::getCurrent ();
double remaining = timeout;
epicsGuard < epicsMutex > guard ( this->mutex );
@ -493,7 +492,7 @@ int ca_client_context::pendIO ( const double & timeout )
this->blockForEventAndEnableCallbacks ( this->ioDone, remaining );
}
double delay = epicsTime::getMonotonic () - beg_time;
double delay = epicsTime::getCurrent () - beg_time;
if ( delay < timeout ) {
remaining = timeout - delay;
}
@ -522,7 +521,7 @@ int ca_client_context::pendEvent ( const double & timeout )
return ECA_EVDISALLOW;
}
epicsTime current = epicsTime::getMonotonic ();
epicsTime current = epicsTime::getCurrent ();
{
epicsGuard < epicsMutex > guard ( this->mutex );
@ -563,7 +562,7 @@ int ca_client_context::pendEvent ( const double & timeout )
this->noWakeupSincePend = true;
}
double elapsed = epicsTime::getMonotonic() - current;
double elapsed = epicsTime::getCurrent() - current;
double delay;
if ( timeout > elapsed ) {
@ -736,12 +735,12 @@ void ca_client_context::installDefaultService ( cacService & service )
ca_client_context::pDefaultService = & service;
}
void epicsShareAPI caInstallDefaultService ( cacService & service )
void epicsStdCall caInstallDefaultService ( cacService & service )
{
ca_client_context::installDefaultService ( service );
}
epicsShareFunc int epicsShareAPI ca_clear_subscription ( evid pMon )
LIBCA_API int epicsStdCall ca_clear_subscription ( evid pMon )
{
oldChannelNotify & chan = pMon->channel ();
ca_client_context & cac = chan.getClientCtx ();

View File

@ -34,7 +34,6 @@
#include "errlog.h"
#include "epicsExport.h"
#define epicsExportSharedSymbols
#include "addrList.h"
#include "iocinf.h"
#include "cac.h"
@ -130,7 +129,7 @@ cac::cac (
epicsMutex & callbackControlIn,
cacContextNotify & notifyIn ) :
_refLocalHostName ( localHostNameCache.getReference () ),
programBeginTime ( epicsTime::getMonotonic() ),
programBeginTime ( epicsTime::getCurrent() ),
connTMO ( CA_CONN_VERIFY_PERIOD ),
mutex ( mutualExclusionIn ),
cbMutex ( callbackControlIn ),
@ -155,7 +154,7 @@ cac::cac (
}
try {
long status;
long status;
/*
* Certain os, such as HPUX, do not unblock a socket system call

View File

@ -19,13 +19,8 @@
*
*/
#ifndef cach
#define cach
#ifdef epicsExportSharedSymbols
# define cach_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_cac_H
#define INC_cac_H
#include "compilerDependencies.h"
#include "ipAddrToAsciiAsynchronous.h"
@ -35,11 +30,7 @@
#include "freeList.h"
#include "localHostName.h"
#ifdef cach_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "nciu.h"
#include "comBuf.h"
#include "bhe.h"
@ -81,8 +72,8 @@ public:
void release ( void * );
private:
tsFreeList < comBuf, 0x20 > freeList;
cacComBufMemoryManager ( const cacComBufMemoryManager & );
cacComBufMemoryManager & operator = ( const cacComBufMemoryManager & );
cacComBufMemoryManager ( const cacComBufMemoryManager & );
cacComBufMemoryManager & operator = ( const cacComBufMemoryManager & );
};
class notifyGuard {
@ -348,8 +339,8 @@ private:
const char *pCtx, unsigned status );
static const pExcepProtoStubTCP tcpExcepJumpTableCAC [];
cac ( const cac & );
cac & operator = ( const cac & );
cac ( const cac & );
cac & operator = ( const cac & );
friend class tcpiiu;
};
@ -432,4 +423,4 @@ inline double cac ::
return this->connTMO;
}
#endif // ifdef cach
#endif // ifndef INC_cac_H

View File

@ -3,13 +3,12 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -27,7 +26,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "localHostName.h"
#include "cacIO.h"
@ -41,7 +39,7 @@ private:
epicsSingleton < localHostName > :: reference
_refLocalHostName;
};
static epicsThreadOnceId cacChannelIdOnce = EPICS_THREAD_ONCE_INIT;
const cacChannel::priLev cacChannel::priorityMax = 99u;
@ -55,63 +53,63 @@ cacChannel::~cacChannel ()
{
}
caAccessRights cacChannel::accessRights (
epicsGuard < epicsMutex > & ) const
caAccessRights cacChannel::accessRights (
epicsGuard < epicsMutex > & ) const
{
static caAccessRights ar ( true, true );
return ar;
}
unsigned cacChannel::searchAttempts (
epicsGuard < epicsMutex > & ) const
unsigned cacChannel::searchAttempts (
epicsGuard < epicsMutex > & ) const
{
return 0u;
}
double cacChannel::beaconPeriod (
epicsGuard < epicsMutex > & ) const
double cacChannel::beaconPeriod (
epicsGuard < epicsMutex > & ) const
{
return - DBL_MAX;
}
double cacChannel::receiveWatchdogDelay (
double cacChannel::receiveWatchdogDelay (
epicsGuard < epicsMutex > & ) const
{
return - DBL_MAX;
}
bool cacChannel::ca_v42_ok (
epicsGuard < epicsMutex > & ) const
epicsGuard < epicsMutex > & ) const
{
return true;
}
bool cacChannel::connected (
epicsGuard < epicsMutex > & ) const
epicsGuard < epicsMutex > & ) const
{
return true;
}
CACChannelPrivate ::
CACChannelPrivate ::
CACChannelPrivate() :
_refLocalHostName ( localHostNameCache.getReference () )
{
}
inline unsigned CACChannelPrivate ::
inline unsigned CACChannelPrivate ::
getHostName ( char * pBuf, unsigned bufLength )
{
return _refLocalHostName->getName ( pBuf, bufLength );
}
inline const char * CACChannelPrivate ::
inline const char * CACChannelPrivate ::
pHostName ()
{
return _refLocalHostName->pointer ();
}
static CACChannelPrivate * pCACChannelPrivate = 0;
// runs once only for each process
extern "C" void cacChannelSetup ( void * )
{
@ -119,7 +117,7 @@ extern "C" void cacChannelSetup ( void * )
}
// the default is to assume that it is a locally hosted channel
unsigned cacChannel::getHostName (
unsigned cacChannel::getHostName (
epicsGuard < epicsMutex > &,
char * pBuf, unsigned bufLength ) const throw ()
{

View File

@ -3,32 +3,29 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacChannelNotify::~cacChannelNotify ()
cacChannelNotify::~cacChannelNotify ()
{
}

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -23,19 +22,17 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacContextNotify::~cacContextNotify ()
{
}
void cacContextNotify::callbackProcessingInitiateNotify ()
void cacContextNotify::callbackProcessingInitiateNotify ()
{
}
void cacContextNotify::callbackProcessingCompleteNotify ()
void cacContextNotify::callbackProcessingCompleteNotify ()
{
}

View File

@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@ -17,13 +16,13 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef cacIOh
#define cacIOh
#ifndef INC_cacIO_H
#define INC_cacIO_H
//
// Open Issues
@ -47,20 +46,12 @@
#include <new>
#include <stdarg.h>
#ifdef epicsExportSharedSymbols
# define cacIOh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "tsDLList.h"
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsThread.h"
#ifdef cacIOh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
class cacChannel;
@ -69,7 +60,7 @@ typedef unsigned long arrayElementCount;
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacWriteNotify {
class LIBCA_API cacWriteNotify {
public:
virtual ~cacWriteNotify () = 0;
virtual void completion ( epicsGuard < epicsMutex > & ) = 0;
@ -82,7 +73,7 @@ public:
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacReadNotify {
class LIBCA_API cacReadNotify {
public:
virtual ~cacReadNotify () = 0;
virtual void completion (
@ -97,7 +88,7 @@ public:
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacStateNotify {
class LIBCA_API cacStateNotify {
public:
virtual ~cacStateNotify () = 0;
virtual void current (
@ -131,7 +122,7 @@ private:
bool f_operatorConfirmationRequest:1;
};
class epicsShareClass cacChannelNotify {
class LIBCA_API cacChannelNotify {
public:
virtual ~cacChannelNotify () = 0;
virtual void connectNotify ( epicsGuard < epicsMutex > & ) = 0;
@ -169,7 +160,7 @@ private:
// but perhaps is a bad practice that should be eliminated? If so,
// then the IO should not store or use a pointer to the channel.
//
class epicsShareClass cacChannel {
class LIBCA_API cacChannel {
public:
typedef unsigned priLev;
static const priLev priorityMax;
@ -273,11 +264,11 @@ protected:
private:
cacChannelNotify & callback;
cacChannel ( const cacChannel & );
cacChannel & operator = ( const cacChannel & );
cacChannel ( const cacChannel & );
cacChannel & operator = ( const cacChannel & );
};
class epicsShareClass cacContext {
class LIBCA_API cacContext {
public:
virtual ~cacContext ();
virtual cacChannel & createChannel (
@ -296,7 +287,7 @@ public:
epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
class epicsShareClass cacContextNotify {
class LIBCA_API cacContextNotify {
public:
virtual ~cacContextNotify () = 0;
virtual cacContext & createNetworkContext (
@ -316,7 +307,7 @@ public:
// **** Lock Hierarchy ****
// callbackControl must be taken before mutualExclusion if both are held at
// the same time
class epicsShareClass cacService {
class LIBCA_API cacService {
public:
virtual ~cacService () = 0;
virtual cacContext & contextCreate (
@ -325,9 +316,9 @@ public:
cacContextNotify & ) = 0;
};
epicsShareFunc void epicsShareAPI caInstallDefaultService ( cacService & service );
LIBCA_API void epicsStdCall caInstallDefaultService ( cacService & service );
epicsShareExtern epicsThreadPrivateId caClientCallbackThreadId;
LIBCA_API extern epicsThreadPrivateId caClientCallbackThreadId;
inline cacChannel::cacChannel ( cacChannelNotify & notify ) :
callback ( notify )
@ -389,4 +380,4 @@ inline bool caAccessRights::operatorConfirmationRequest () const
return this->f_operatorConfirmationRequest;
}
#endif // ifndef cacIOh
#endif // ifndef INC_cacIO_H

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacReadNotify::~cacReadNotify ()
{

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacStateNotify::~cacStateNotify ()
{

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacWriteNotify::~cacWriteNotify ()
{

View File

@ -3,11 +3,10 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -21,8 +20,8 @@
*
*/
#ifndef INCLcadefh
#define INCLcadefh
#ifndef INC_cadef_H
#define INC_cadef_H
/*
* done in two ifdef steps so that we will remain compatible with
@ -32,19 +31,9 @@
# include <stdarg.h>
#endif
#ifdef epicsExportSharedSymbols
# define INCLcadefh_accessh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsThread.h"
#ifdef INCLcadefh_accessh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caerr.h"
#include "db_access.h"
#include "caeventmask.h"
@ -83,8 +72,8 @@ typedef void caArh (struct access_rights_handler_args args);
/* The conversion routine to call for each type */
#define VALID_TYPE(TYPE) (((unsigned short)TYPE)<=LAST_BUFFER_TYPE)
/*
* Arguments passed to event handlers and get/put call back handlers.
/*
* Arguments passed to event handlers and get/put call back handlers.
*
* The status field below is the CA ECA_XXX status of the requested
* operation which is saved from when the operation was attempted in the
@ -95,14 +84,14 @@ typedef void caArh (struct access_rights_handler_args args);
typedef struct event_handler_args {
void *usr; /* user argument supplied with request */
chanId chid; /* channel id */
long type; /* the type of the item returned */
long type; /* the type of the item returned */
long count; /* the element count of the item returned */
const void *dbr; /* a pointer to the item returned */
int status; /* ECA_XXX status of the requested op from the server */
} evargs;
typedef void caEventCallBackFunc (struct event_handler_args);
epicsShareFunc void epicsShareAPI ca_test_event
LIBCA_API void epicsStdCall ca_test_event
(
struct event_handler_args
);
@ -133,8 +122,8 @@ typedef unsigned CA_SYNC_GID;
#define CA_OP_CLEAR_EVENT 4
#define CA_OP_OTHER 5
/*
* used with connection_handler_args
/*
* used with connection_handler_args
*/
#define CA_OP_CONN_UP 6
#define CA_OP_CONN_DOWN 7
@ -158,46 +147,46 @@ typedef unsigned CA_SYNC_GID;
#define TYPENOTCONN (-1) /* the channel's native type when disconnected */
epicsShareFunc short epicsShareAPI ca_field_type (chid chan);
epicsShareFunc unsigned long epicsShareAPI ca_element_count (chid chan);
epicsShareFunc const char * epicsShareAPI ca_name (chid chan);
epicsShareFunc void epicsShareAPI ca_set_puser (chid chan, void *puser);
epicsShareFunc void * epicsShareAPI ca_puser (chid chan);
epicsShareFunc unsigned epicsShareAPI ca_read_access (chid chan);
epicsShareFunc unsigned epicsShareAPI ca_write_access (chid chan);
LIBCA_API short epicsStdCall ca_field_type (chid chan);
LIBCA_API unsigned long epicsStdCall ca_element_count (chid chan);
LIBCA_API const char * epicsStdCall ca_name (chid chan);
LIBCA_API void epicsStdCall ca_set_puser (chid chan, void *puser);
LIBCA_API void * epicsStdCall ca_puser (chid chan);
LIBCA_API unsigned epicsStdCall ca_read_access (chid chan);
LIBCA_API unsigned epicsStdCall ca_write_access (chid chan);
/*
* cs_ - `channel state'
*
* cs_ - `channel state'
*
* cs_never_conn valid chid, IOC not found
* cs_prev_conn valid chid, IOC was found, but unavailable
* cs_conn valid chid, IOC was found, still available
* cs_closed channel deleted by user
*/
enum channel_state {cs_never_conn, cs_prev_conn, cs_conn, cs_closed};
epicsShareFunc enum channel_state epicsShareAPI ca_state (chid chan);
LIBCA_API enum channel_state epicsStdCall ca_state (chid chan);
/************************************************************************/
/* Perform Library Initialization */
/* */
/* Must be called once before calling any of the other routines */
/************************************************************************/
epicsShareFunc int epicsShareAPI ca_task_initialize (void);
enum ca_preemptive_callback_select
LIBCA_API int epicsStdCall ca_task_initialize (void);
enum ca_preemptive_callback_select
{ ca_disable_preemptive_callback, ca_enable_preemptive_callback };
epicsShareFunc int epicsShareAPI
LIBCA_API int epicsStdCall
ca_context_create (enum ca_preemptive_callback_select select);
epicsShareFunc void epicsShareAPI ca_detach_context ();
LIBCA_API void epicsStdCall ca_detach_context ();
/************************************************************************/
/* Remove CA facility from your task */
/* */
/* Normally called automatically at task exit */
/************************************************************************/
epicsShareFunc int epicsShareAPI ca_task_exit (void);
epicsShareFunc void epicsShareAPI ca_context_destroy (void);
LIBCA_API int epicsStdCall ca_task_exit (void);
LIBCA_API void epicsStdCall ca_context_destroy (void);
typedef unsigned capri;
typedef unsigned capri;
#define CA_PRIORITY_MAX 99
#define CA_PRIORITY_MIN 0
#define CA_PRIORITY_DEFAULT CA_PRIORITY_MIN
@ -210,7 +199,7 @@ typedef unsigned capri;
* ca_create_channel ()
*
* pChanName R channel name string
* pConnStateCallback R address of connection state change
* pConnStateCallback R address of connection state change
* callback function
* pUserPrivate R placed in the channel's user private field
* o can be fetched later by ca_puser(CHID)
@ -218,10 +207,10 @@ typedef unsigned capri;
* priority R priority level in the server 0 - 100
* pChanID RW channel id written here
*/
epicsShareFunc int epicsShareAPI ca_create_channel
LIBCA_API int epicsStdCall ca_create_channel
(
const char *pChanName,
caCh *pConnStateCallback,
const char *pChanName,
caCh *pConnStateCallback,
void *pUserPrivate,
capri priority,
chid *pChanID
@ -230,10 +219,10 @@ epicsShareFunc int epicsShareAPI ca_create_channel
/*
* ca_change_connection_event()
*
* chan R channel identifier
* chan R channel identifier
* pfunc R address of connection call-back function
*/
epicsShareFunc int epicsShareAPI ca_change_connection_event
LIBCA_API int epicsStdCall ca_change_connection_event
(
chid chan,
caCh * pfunc
@ -242,10 +231,10 @@ epicsShareFunc int epicsShareAPI ca_change_connection_event
/*
* ca_replace_access_rights_event ()
*
* chan R channel identifier
* chan R channel identifier
* pfunc R address of access rights call-back function
*/
epicsShareFunc int epicsShareAPI ca_replace_access_rights_event (
LIBCA_API int epicsStdCall ca_replace_access_rights_event (
chid chan,
caArh *pfunc
);
@ -256,11 +245,11 @@ epicsShareFunc int epicsShareAPI ca_replace_access_rights_event (
* replace the default exception handler
*
* pfunc R address of exception call-back function
* pArg R copy of this pointer passed to exception
* pArg R copy of this pointer passed to exception
* call-back function
*/
typedef void caExceptionHandler (struct exception_handler_args);
epicsShareFunc int epicsShareAPI ca_add_exception_event
LIBCA_API int epicsStdCall ca_add_exception_event
(
caExceptionHandler *pfunc,
void *pArg
@ -272,7 +261,7 @@ epicsShareFunc int epicsShareAPI ca_add_exception_event
*
* chanId R channel ID
*/
epicsShareFunc int epicsShareAPI ca_clear_channel
LIBCA_API int epicsStdCall ca_clear_channel
(
chid chanId
);
@ -283,10 +272,10 @@ epicsShareFunc int epicsShareAPI ca_clear_channel
/*
* ca_bput()
*
* WARNING: this copies the new value from a string (dbr_string_t)
* WARNING: this copies the new value from a string (dbr_string_t)
* (and not as an integer)
*
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value string copied from this location
*/
#define ca_bput(chan, pValue) \
@ -295,9 +284,9 @@ ca_array_put(DBR_STRING, 1u, chan, (const dbr_string_t *) (pValue))
/*
* ca_rput()
*
* WARNING: this copies the new value from a dbr_float_t
* WARNING: this copies the new value from a dbr_float_t
*
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
#define ca_rput(chan,pValue) \
@ -307,7 +296,7 @@ ca_array_put(DBR_FLOAT, 1u, chan, (const dbr_float_t *) pValue)
* ca_put()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
#define ca_put(type, chan, pValue) ca_array_put (type, 1u, chan, pValue)
@ -317,13 +306,13 @@ ca_array_put(DBR_FLOAT, 1u, chan, (const dbr_float_t *) pValue)
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
epicsShareFunc int epicsShareAPI ca_array_put
LIBCA_API int epicsStdCall ca_array_put
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
const void * pValue
);
@ -331,8 +320,8 @@ epicsShareFunc int epicsShareAPI ca_array_put
/*
* ca_array_put_callback()
*
* This routine functions identically to the original ca put request
* with the addition of a callback to the user supplied function
* This routine functions identically to the original ca put request
* with the addition of a callback to the user supplied function
* after recod processing completes in the IOC. The arguments
* to the user supplied callback function are declared in
* the structure event_handler_args and include the pointer
@ -340,15 +329,15 @@ epicsShareFunc int epicsShareAPI ca_array_put
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
epicsShareFunc int epicsShareAPI ca_array_put_callback
LIBCA_API int epicsStdCall ca_array_put_callback
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
const void * pValue,
caEventCallBackFunc * pFunc,
@ -365,10 +354,10 @@ epicsShareFunc int epicsShareAPI ca_array_put_callback
/*
* ca_bget()
*
* WARNING: this copies the new value into a string (dbr_string_t)
* WARNING: this copies the new value into a string (dbr_string_t)
* (and not into an integer)
*
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_bget(chan, pValue) \
@ -377,9 +366,9 @@ ca_array_get(DBR_STRING, 1u, chan, (dbr_string_t *)(pValue))
/*
* ca_rget()
*
* WARNING: this copies the new value into a 32 bit float (dbr_float_t)
* WARNING: this copies the new value into a 32 bit float (dbr_float_t)
*
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_rget(chan, pValue) \
@ -389,7 +378,7 @@ ca_array_get(DBR_FLOAT, 1u, chan, (dbr_float_t *)(pValue))
* ca_rget()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_get(type, chan, pValue) ca_array_get(type, 1u, chan, pValue)
@ -399,13 +388,13 @@ ca_array_get(DBR_FLOAT, 1u, chan, (dbr_float_t *)(pValue))
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
epicsShareFunc int epicsShareAPI ca_array_get
LIBCA_API int epicsStdCall ca_array_get
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
void * pValue
);
@ -419,10 +408,10 @@ epicsShareFunc int epicsShareAPI ca_array_get
/*
* ca_bget_callback()
*
* WARNING: this returns the new value as a string (dbr_string_t)
* WARNING: this returns the new value as a string (dbr_string_t)
* (and not as an integer)
*
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@ -432,9 +421,9 @@ ca_array_get_callback (DBR_STRING, 1u, chan, pFunc, pArg)
/*
* ca_rget_callback()
*
* WARNING: this returns the new value as a float (dbr_float_t)
* WARNING: this returns the new value as a float (dbr_float_t)
*
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@ -445,7 +434,7 @@ ca_array_get_callback (DBR_FLOAT, 1u, chan, pFunc, pArg)
* ca_get_callback()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@ -457,14 +446,14 @@ ca_array_get_callback (type, 1u, chan, pFunc, pArg)
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
epicsShareFunc int epicsShareAPI ca_array_get_callback
LIBCA_API int epicsStdCall ca_array_get_callback
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
caEventCallBackFunc * pFunc,
void * pArg
@ -476,7 +465,7 @@ epicsShareFunc int epicsShareAPI ca_array_get_callback
/* NOTES: */
/* 1) Evid may be omited by passing a NULL pointer */
/* */
/* 2) An array count of zero specifies the native db count */
/* 2) An array count of zero specifies the native db count */
/* */
/************************************************************************/
@ -485,16 +474,16 @@ epicsShareFunc int epicsShareAPI ca_array_get_callback
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* mask R event mask - one of {DBE_VALUE, DBE_ALARM, DBE_LOG}
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
* pEventID W event id written at specified address
*/
epicsShareFunc int epicsShareAPI ca_create_subscription
LIBCA_API int epicsStdCall ca_create_subscription
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
long mask,
caEventCallBackFunc * pFunc,
@ -512,12 +501,12 @@ epicsShareFunc int epicsShareAPI ca_create_subscription
*
* eventID R event id
*/
epicsShareFunc int epicsShareAPI ca_clear_subscription
LIBCA_API int epicsStdCall ca_clear_subscription
(
evid eventID
);
epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
LIBCA_API chid epicsStdCall ca_evid_to_chid ( evid id );
/************************************************************************/
@ -535,24 +524,24 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
/* FLOW OF TYPICAL APPLICATION */
/* */
/* search() ! Obtain Channel ids */
/* . ! " */
/* . ! " */
/* . ! " */
/* pend_io ! wait for channels to connect */
/* */
/* get() ! several requests for remote info */
/* get() ! " */
/* add_event() ! " */
/* get() ! " */
/* get() ! " */
/* add_event() ! " */
/* get() ! " */
/* . */
/* . */
/* . */
/* flush_io() ! send get requests */
/* ! optional parallel processing */
/* . ! " */
/* . ! " */
/* . ! " */
/* . ! " */
/* pend_io() ! wait for replies from get requests */
/* . ! access to requested data */
/* . ! " */
/* . ! " */
/* pend_event() ! wait for requested events */
/* */
/************************************************************************/
@ -562,7 +551,7 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
/* functions specified with add_event when events occur. If the */
/* timeout is specified as 0 an infinite timeout is assumed. */
/* ca_flush_io() is called by this routine. If ca_pend_io () */
/* is called when no IO is outstanding then it will return immediately */
/* is called when no IO is outstanding then it will return immediately */
/* without processing. */
/************************************************************************/
@ -571,28 +560,28 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
*
* timeOut R wait for this delay in seconds
*/
epicsShareFunc int epicsShareAPI ca_pend_event (ca_real timeOut);
LIBCA_API int epicsStdCall ca_pend_event (ca_real timeOut);
#define ca_poll() ca_pend_event(1e-12)
/*
* ca_pend_io()
*
* timeOut R wait for this delay in seconds but return early
* if all get requests (or search requests with null
* timeOut R wait for this delay in seconds but return early
* if all get requests (or search requests with null
* connection handler pointer have completed)
*/
epicsShareFunc int epicsShareAPI ca_pend_io (ca_real timeOut);
LIBCA_API int epicsStdCall ca_pend_io (ca_real timeOut);
/* calls ca_pend_io() if early is true otherwise ca_pend_event() is called */
epicsShareFunc int epicsShareAPI ca_pend (ca_real timeout, int early);
LIBCA_API int epicsStdCall ca_pend (ca_real timeout, int early);
/*
* ca_test_io()
*
* returns TRUE when get requests (or search requests with null
* returns TRUE when get requests (or search requests with null
* connection handler pointer) are outstanding
*/
epicsShareFunc int epicsShareAPI ca_test_io (void);
LIBCA_API int epicsStdCall ca_test_io (void);
/************************************************************************/
/* Send out all outstanding messages in the send queue */
@ -600,7 +589,7 @@ epicsShareFunc int epicsShareAPI ca_test_io (void);
/*
* ca_flush_io()
*/
epicsShareFunc int epicsShareAPI ca_flush_io (void);
LIBCA_API int epicsStdCall ca_flush_io (void);
/*
@ -609,10 +598,10 @@ epicsShareFunc int epicsShareAPI ca_flush_io (void);
* errorCode R status returned from channel access function
* pCtxStr R context string included with error print out
*/
epicsShareFunc void epicsShareAPI ca_signal
LIBCA_API void epicsStdCall ca_signal
(
long errorCode,
const char *pCtxStr
long errorCode,
const char *pCtxStr
);
/*
@ -623,12 +612,12 @@ epicsShareFunc void epicsShareAPI ca_signal
* lineNo R line number included with error print out
*
*/
epicsShareFunc void epicsShareAPI ca_signal_with_file_and_lineno
LIBCA_API void epicsStdCall ca_signal_with_file_and_lineno
(
long errorCode,
const char *pCtxStr,
const char *pFileStr,
int lineNo
long errorCode,
const char *pCtxStr,
const char *pFileStr,
int lineNo
);
/*
@ -639,7 +628,7 @@ epicsShareFunc void epicsShareAPI ca_signal_with_file_and_lineno
* pFormat R printf dtyle format string (and optional arguments)
*
*/
epicsShareFunc void epicsShareAPI ca_signal_formated (long ca_status, const char *pfilenm,
LIBCA_API void epicsStdCall ca_signal_formated (long ca_status, const char *pfilenm,
int lineno, const char *pFormat, ...);
/*
@ -649,15 +638,15 @@ epicsShareFunc void epicsShareAPI ca_signal_formated (long ca_status, const char
*
* !!!! this function is _not_ thread safe !!!!
*/
epicsShareFunc const char * epicsShareAPI ca_host_name (chid channel);
LIBCA_API const char * epicsStdCall ca_host_name (chid channel);
/* thread safe version */
epicsShareFunc unsigned epicsShareAPI ca_get_host_name ( chid pChan,
LIBCA_API unsigned epicsStdCall ca_get_host_name ( chid pChan,
char *pBuf, unsigned bufLength );
/*
* CA_ADD_FD_REGISTRATION
*
* call their function with their argument whenever
* call their function with their argument whenever
* a new fd is added or removed
* (for use with a manager of the select system call under UNIX)
*
@ -665,7 +654,7 @@ epicsShareFunc unsigned epicsShareAPI ca_get_host_name ( chid pChan,
* if (!opened) then fd was deleted
*
*/
typedef void CAFDHANDLER (void *parg, int fd, int opened);
typedef void CAFDHANDLER (void *parg, int fd, int opened);
/*
* ca_add_fd_registration()
@ -674,7 +663,7 @@ typedef void CAFDHANDLER (void *parg, int fd, int opened);
* when an fd is created or deleted
* pArg R argument passed to above function
*/
epicsShareFunc int epicsShareAPI ca_add_fd_registration
LIBCA_API int epicsStdCall ca_add_fd_registration
(
CAFDHANDLER *pHandler,
void *pArg
@ -696,29 +685,29 @@ epicsShareFunc int epicsShareAPI ca_add_fd_registration
*
* create a sync group
*
* pgid W pointer to sync group id that will be written
* pgid W pointer to sync group id that will be written
*/
epicsShareFunc int epicsShareAPI ca_sg_create (CA_SYNC_GID * pgid);
LIBCA_API int epicsStdCall ca_sg_create (CA_SYNC_GID * pgid);
/*
* ca_sg_delete()
*
* delete a sync group
*
* gid R sync group id
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_delete (const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_delete (const CA_SYNC_GID gid);
/*
* ca_sg_block()
*
* block for IO performed within a sync group to complete
* block for IO performed within a sync group to complete
*
* gid R sync group id
* gid R sync group id
* timeout R wait for this duration prior to timing out
* and returning ECA_TIMEOUT
*/
epicsShareFunc int epicsShareAPI ca_sg_block (const CA_SYNC_GID gid, ca_real timeout);
LIBCA_API int epicsStdCall ca_sg_block (const CA_SYNC_GID gid, ca_real timeout);
/*
* ca_sg_test()
@ -726,17 +715,17 @@ epicsShareFunc int epicsShareAPI ca_sg_block (const CA_SYNC_GID gid, ca_real tim
* test for sync group IO operations in progress
*
* gid R sync group id
*
*
* returns one of ECA_BADSYNCGRP, ECA_IOINPROGRESS, ECA_IODONE
*/
epicsShareFunc int epicsShareAPI ca_sg_test (const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_test (const CA_SYNC_GID gid);
/*
* ca_sg_reset
*
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_reset(const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_reset(const CA_SYNC_GID gid);
/*
* ca_sg_array_get()
@ -747,16 +736,16 @@ epicsShareFunc int epicsShareAPI ca_sg_reset(const CA_SYNC_GID gid);
* gid R sync group id
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
epicsShareFunc int epicsShareAPI ca_sg_array_get
LIBCA_API int epicsStdCall ca_sg_array_get
(
const CA_SYNC_GID gid,
chtype type,
chtype type,
unsigned long count,
chid chan,
void *pValue
void *pValue
);
#define ca_sg_get(gid, type, chan, pValue) \
@ -771,16 +760,16 @@ ca_sg_array_get (gid, type, 1u, chan, pValue)
* gid R sync group id
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
epicsShareFunc int epicsShareAPI ca_sg_array_put
LIBCA_API int epicsStdCall ca_sg_array_put
(
const CA_SYNC_GID gid,
chtype type,
chtype type,
unsigned long count,
chid chan,
const void *pValue
const void *pValue
);
#define ca_sg_put(gid, type, chan, pValue) \
@ -793,29 +782,29 @@ ca_sg_array_put (gid, type, 1u, chan, pValue)
*
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_stat (CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_stat (CA_SYNC_GID gid);
epicsShareFunc void epicsShareAPI ca_dump_dbr (chtype type, unsigned count, const void * pbuffer);
LIBCA_API void epicsStdCall ca_dump_dbr (chtype type, unsigned count, const void * pbuffer);
/*
* ca_v42_ok()
*
* Put call back is available if the CA server is on version is 4.2
* Put call back is available if the CA server is on version is 4.2
* or higher.
*
* chan R channel identifier
*
*
* (returns true or false)
*/
epicsShareFunc int epicsShareAPI ca_v42_ok (chid chan);
LIBCA_API int epicsStdCall ca_v42_ok (chid chan);
/*
* ca_version()
*
* returns the CA version string
*/
epicsShareFunc const char * epicsShareAPI ca_version (void);
LIBCA_API const char * epicsStdCall ca_version (void);
/*
* ca_replace_printf_handler ()
@ -830,7 +819,7 @@ epicsShareFunc const char * epicsShareAPI ca_version (void);
*/
#ifndef CA_DONT_INCLUDE_STDARGH
typedef int caPrintfFunc (const char *pformat, va_list args);
epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
LIBCA_API int epicsStdCall ca_replace_printf_handler (
caPrintfFunc *ca_printf_func
);
#endif /*CA_DONT_INCLUDE_STDARGH*/
@ -838,24 +827,24 @@ epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
/*
* (for testing purposes only)
*/
epicsShareFunc unsigned epicsShareAPI ca_get_ioc_connection_count (void);
epicsShareFunc int epicsShareAPI ca_preemtive_callback_is_enabled (void);
epicsShareFunc void epicsShareAPI ca_self_test (void);
epicsShareFunc unsigned epicsShareAPI ca_beacon_anomaly_count (void);
epicsShareFunc unsigned epicsShareAPI ca_search_attempts (chid chan);
epicsShareFunc double epicsShareAPI ca_beacon_period (chid chan);
epicsShareFunc double epicsShareAPI ca_receive_watchdog_delay (chid chan);
LIBCA_API unsigned epicsStdCall ca_get_ioc_connection_count (void);
LIBCA_API int epicsStdCall ca_preemtive_callback_is_enabled (void);
LIBCA_API void epicsStdCall ca_self_test (void);
LIBCA_API unsigned epicsStdCall ca_beacon_anomaly_count (void);
LIBCA_API unsigned epicsStdCall ca_search_attempts (chid chan);
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
* by another thread
*/
epicsShareFunc struct ca_client_context * epicsShareAPI ca_current_context ();
epicsShareFunc int epicsShareAPI ca_attach_context ( struct ca_client_context * context );
LIBCA_API struct ca_client_context * epicsStdCall ca_current_context ();
LIBCA_API int epicsStdCall ca_attach_context ( struct ca_client_context * context );
epicsShareFunc int epicsShareAPI ca_client_status ( unsigned level );
epicsShareFunc int epicsShareAPI ca_context_status ( struct ca_client_context *, unsigned level );
LIBCA_API int epicsStdCall ca_client_status ( unsigned level );
LIBCA_API int epicsStdCall ca_context_status ( struct ca_client_context *, unsigned level );
/*
* deprecated
@ -864,16 +853,16 @@ epicsShareFunc int epicsShareAPI ca_context_status ( struct ca_client_context *,
ca_build_and_connect(NAME, XXXXX, 1, CHIDPTR, YYYYY, 0, 0)
#define ca_array_build(NAME,XXXXX, ZZZZZZ, CHIDPTR,YYYYY)\
ca_build_and_connect(NAME, XXXXX, ZZZZZZ, CHIDPTR, YYYYY, 0, 0)
epicsShareFunc int epicsShareAPI ca_build_and_connect
( const char *pChanName, chtype, unsigned long,
LIBCA_API int epicsStdCall ca_build_and_connect
( const char *pChanName, chtype, unsigned long,
chid * pChanID, void *, caCh * pFunc, void * pArg );
#define ca_search(pChanName, pChanID)\
ca_search_and_connect (pChanName, pChanID, 0, 0)
epicsShareFunc int epicsShareAPI ca_search_and_connect
( const char * pChanName, chid * pChanID,
LIBCA_API int epicsStdCall ca_search_and_connect
( const char * pChanName, chid * pChanID,
caCh *pFunc, void * pArg );
epicsShareFunc int epicsShareAPI ca_channel_status (epicsThreadId tid);
epicsShareFunc int epicsShareAPI ca_clear_event ( evid eventID );
LIBCA_API int epicsStdCall ca_channel_status (epicsThreadId tid);
LIBCA_API int epicsStdCall ca_clear_event ( evid eventID );
#define ca_add_event(type,chan,pFunc,pArg,pEventID)\
ca_add_array_event(type,1u,chan,pFunc,pArg,0.0,0.0,0.0,pEventID)
#define ca_add_delta_event(TYPE,CHID,ENTRY,ARG,DELTA,EVID)\
@ -882,7 +871,7 @@ ca_add_array_event(type,1u,chan,pFunc,pArg,0.0,0.0,0.0,pEventID)
ca_add_array_event(TYPE,1,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)
#define ca_add_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)\
ca_add_masked_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID, DBE_VALUE | DBE_ALARM)
epicsShareFunc int epicsShareAPI ca_add_masked_array_event
LIBCA_API int epicsStdCall ca_add_masked_array_event
( chtype type, unsigned long count, chid chanId, caEventCallBackFunc * pFunc,
void * pArg, ca_real p_delta, ca_real n_delta, ca_real timeout,
evid * pEventID, long mask );
@ -890,8 +879,8 @@ epicsShareFunc int epicsShareAPI ca_add_masked_array_event
/*
* defunct
*/
epicsShareFunc int epicsShareAPI ca_modify_user_name ( const char *pUserName );
epicsShareFunc int epicsShareAPI ca_modify_host_name ( const char *pHostName );
LIBCA_API int epicsStdCall ca_modify_user_name ( const char *pUserName );
LIBCA_API int epicsStdCall ca_modify_host_name ( const char *pHostName );
#ifdef __cplusplus
}
@ -900,5 +889,5 @@ epicsShareFunc int epicsShareAPI ca_modify_host_name ( const char *pHostName );
/*
* no additions below this endif
*/
#endif /* ifndef INCLcadefh */
#endif /* ifndef INC_cadef_H */

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -17,23 +16,15 @@
*
* Author: Jeffrey O. Hill
*
*/
*/
#ifndef INCLcaerrh
#define INCLcaerrh
#ifndef INC_caerr_H
#define INC_caerr_H
#ifdef epicsExportSharedSymbols
# define INCLcaerrh_accessh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsTypes.h"
# include "epicsTypes.h"
#ifdef INCLcaerrh_accessh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
/* CA Status Code Definitions */
@ -78,9 +69,9 @@
(CA_INSERT_MSG_NO(NUMBER) | CA_INSERT_SEVERITY(SEVERITY))
/*
* In the lines below "defunct" indicates that current release
* In the lines below "defunct" indicates that current release
* servers and client library will not return this error code, but
* servers on earlier releases that communicate with current clients
* servers on earlier releases that communicate with current clients
* might still generate exceptions with these error constants
*/
#define ECA_NORMAL DEFMSG(CA_K_SUCCESS, 0) /* success */
@ -89,10 +80,10 @@
#define ECA_UKNSERV DEFMSG(CA_K_ERROR, 3) /* defunct */
#define ECA_SOCK DEFMSG(CA_K_ERROR, 4) /* defunct */
#define ECA_CONN DEFMSG(CA_K_WARNING, 5) /* defunct */
#define ECA_ALLOCMEM DEFMSG(CA_K_WARNING, 6)
#define ECA_ALLOCMEM DEFMSG(CA_K_WARNING, 6)
#define ECA_UKNCHAN DEFMSG(CA_K_WARNING, 7) /* defunct */
#define ECA_UKNFIELD DEFMSG(CA_K_WARNING, 8) /* defunct */
#define ECA_TOLARGE DEFMSG(CA_K_WARNING, 9)
#define ECA_TOLARGE DEFMSG(CA_K_WARNING, 9)
#define ECA_TIMEOUT DEFMSG(CA_K_WARNING, 10)
#define ECA_NOSUPPORT DEFMSG(CA_K_WARNING, 11) /* defunct */
#define ECA_STRTOBIG DEFMSG(CA_K_WARNING, 12) /* defunct */
@ -149,9 +140,9 @@
extern "C" {
#endif
epicsShareFunc const char * epicsShareAPI ca_message(long ca_status);
LIBCA_API const char * epicsStdCall ca_message(long ca_status);
epicsShareExtern const char * ca_message_text [];
LIBCA_API extern const char * ca_message_text [];
#ifdef __cplusplus
}

View File

@ -5,7 +5,7 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef INCLcaeventmaskh
@ -13,12 +13,12 @@
/*
event selections
(If any more than 8 of these are needed then update the
select field in the event_block struct in db_event.c from
(If any more than 8 of these are needed then update the
select field in the event_block struct in db_event.c from
unsigned char to unsigned short)
DBE_VALUE
DBE_VALUE
Trigger an event when a significant change in the channel's value
occurs. Relies on the monitor deadband field under DCT.

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -23,7 +22,7 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include "envDefs.h"
#include "envDefs.h"
#include "errlog.h"
#include "osiWireFormat.h"
@ -40,8 +39,8 @@ public:
void release ( void * );
private:
tsFreeList < class bhe, 0x100 > freeList;
bheFreeStoreMgr ( const bheFreeStoreMgr & );
bheFreeStoreMgr & operator = ( const bheFreeStoreMgr & );
bheFreeStoreMgr ( const bheFreeStoreMgr & );
bheFreeStoreMgr & operator = ( const bheFreeStoreMgr & );
};
void * bheFreeStoreMgr::allocate ( size_t size )
@ -59,7 +58,7 @@ int main ( int argc, char ** argv )
epicsMutex mutex;
epicsGuard < epicsMutex > guard ( mutex );
bheFreeStoreMgr bheFreeList;
epicsTime programBeginTime = epicsTime::getMonotonic ();
epicsTime programBeginTime = epicsTime::getCurrent();
bool validCommandLine = false;
unsigned interest = 0u;
SOCKET sock;
@ -108,7 +107,7 @@ int main ( int argc, char ** argv )
sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( sock == INVALID_SOCKET ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("casw: unable to create datagram socket because = \"%s\"\n",
sockErrBuf );
@ -122,7 +121,7 @@ int main ( int argc, char ** argv )
status = bind ( sock, &addr.sa, sizeof (addr) );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to bind to an unconstrained address because = \"%s\"\n",
@ -134,7 +133,7 @@ int main ( int argc, char ** argv )
status = socket_ioctl ( sock, FIONBIO, &yes );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to set socket to nonblocking state because \"%s\"\n",
@ -169,7 +168,7 @@ int main ( int argc, char ** argv )
status = socket_ioctl ( sock, FIONBIO, &no );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to set socket to blocking state because \"%s\"\n",
@ -185,7 +184,7 @@ int main ( int argc, char ** argv )
&addr.sa, &addrSize );
if ( status <= 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ("casw: error from recv was = \"%s\"\n",
@ -196,7 +195,7 @@ int main ( int argc, char ** argv )
if ( addr.sa.sa_family != AF_INET ) {
continue;
}
unsigned byteCount = static_cast <unsigned> ( status );
pCurMsg = reinterpret_cast < const caHdr * > ( ( pCurBuf = buf ) );
while ( byteCount ) {
@ -213,9 +212,9 @@ int main ( int argc, char ** argv )
epicsTime previousTime;
struct sockaddr_in ina;
/*
/*
* this allows a fan-out server to potentially
* insert the true address of the CA server
* insert the true address of the CA server
*
* old servers:
* 1) set this field to one of the ip addresses of the host _or_
@ -244,7 +243,7 @@ int main ( int argc, char ** argv )
ca_uint32_t beaconNumber = ntohl ( pCurMsg->m_cid );
unsigned protocolRevision = ntohs ( pCurMsg->m_dataType );
epicsTime currentTime = epicsTime::getMonotonic();
epicsTime currentTime = epicsTime::getCurrent();
/*
* look for it in the hash table
@ -252,8 +251,8 @@ int main ( int argc, char ** argv )
bhe *pBHE = beaconTable.lookup ( ina );
if ( pBHE ) {
previousTime = pBHE->updateTime ( guard );
anomaly = pBHE->updatePeriod (
guard, programBeginTime,
anomaly = pBHE->updatePeriod (
guard, programBeginTime,
currentTime, beaconNumber, protocolRevision );
}
else {
@ -264,7 +263,7 @@ int main ( int argc, char ** argv )
* time that we have seen a server's beacon
* shortly after the program started up)
*/
pBHE = new ( bheFreeList )
pBHE = new ( bheFreeList )
bhe ( mutex, currentTime, beaconNumber, ina );
if ( pBHE ) {
if ( beaconTable.add ( *pBHE ) < 0 ) {
@ -275,7 +274,7 @@ int main ( int argc, char ** argv )
}
if ( anomaly || interest > 1 ) {
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%Y-%m-%d %H:%M:%S.%09f");
char host[64];
ipAddrToA ( &ina, host, sizeof ( host ) );
@ -288,11 +287,11 @@ int main ( int argc, char ** argv )
pPrefix = " ";
}
}
printf ( "%s%-40s %s\n",
printf ( "%s%-40s %s\n",
pPrefix, host, date );
if ( anomaly && interest > 0 ) {
printf ( "\testimate=%f current=%f\n",
pBHE->period ( guard ),
printf ( "\testimate=%f current=%f\n",
pBHE->period ( guard ),
currentTime - previousTime );
}
fflush(stdout);

View File

@ -5,17 +5,17 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
* CA performance test
* CA performance test
*
* History
* History
* joh 09-12-89 Initial release
* joh 12-20-94 portability
*
*
*
*/
#include <stdio.h>
@ -45,7 +45,7 @@ typedef struct testItem {
char name[128];
int type;
int count;
void * pValue;
void * pValue;
} ti;
typedef void tf ( ti *pItems, unsigned iterations, unsigned *pInlineIter );
@ -144,7 +144,7 @@ unsigned *pInlineIter
{
int status;
unsigned i;
for (i=0u; i<iterations; i++) {
status = ca_clear_channel (pItems[i].chix);
SEVCHK (status, NULL);
@ -166,7 +166,7 @@ unsigned *pInlineIter
ti *pi;
int status;
dbr_int_t val;
for (pi=pItems; pi < &pItems[iterations]; pi++) {
status = ca_array_put(
pi->type,
@ -257,7 +257,7 @@ unsigned *pInlineIter
{
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
@ -337,7 +337,7 @@ unsigned *pInlineIter
{
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
@ -361,9 +361,9 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
epicsTimeStamp start_time;
double delay;
double X = 0u;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double mean;
double stdDev;
ti *pi;
@ -371,7 +371,7 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
for ( pi = pItems; pi < &pItems[iterations]; pi++ ) {
epicsTimeGetCurrent ( &start_time );
status = ca_array_get ( pi->type, pi->count,
status = ca_array_get ( pi->type, pi->count,
pi->chix, pi->pValue );
SEVCHK ( status, NULL );
status = ca_pend_io ( 100.0 );
@ -395,13 +395,13 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
mean = X/iterations;
stdDev = sqrt ( XX/iterations - mean*mean );
printf (
printf (
"Get Latency - "
"mean = %3.1f uS, "
"std dev = %3.1f uS, "
"min = %3.1f uS "
"max = %3.1f uS\n",
mean * 1e6, stdDev * 1e6,
mean * 1e6, stdDev * 1e6,
min * 1e6, max * 1e6 );
}
@ -412,9 +412,9 @@ static void printSearchStat ( const ti * pi, unsigned iterations )
{
unsigned i;
double X = 0u;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double mean;
double stdDev;
@ -432,7 +432,7 @@ static void printSearchStat ( const ti * pi, unsigned iterations )
mean = X / iterations;
stdDev = sqrt( XX / iterations - mean * mean );
printf (
printf (
"Search tries per chan - "
"mean = %3.1f "
"std dev = %3.1f "
@ -458,10 +458,10 @@ void timeIt ( tf *pfunc, ti *pItems, unsigned iterations,
delay = epicsTimeDiffInSeconds ( &end_time, &start_time );
if ( delay > 0.0 ) {
double freq = ( iterations * inlineIter ) / delay;
printf ( "Per Op, %8.4f uS ( %8.4f MHz )",
printf ( "Per Op, %8.4f uS ( %8.4f MHz )",
1e6 / freq, freq / 1e6 );
if ( pItems != NULL ) {
printf(", %8.4f snd Mbps, %8.4f rcv Mbps\n",
printf(", %8.4f snd Mbps, %8.4f rcv Mbps\n",
(inlineIter*nBytesSent*CHAR_BIT)/(delay*1e6),
(inlineIter*nBytesRecv*CHAR_BIT)/(delay*1e6) );
}
@ -479,13 +479,13 @@ static void test ( ti *pItems, unsigned iterations )
unsigned payloadSize, dblPayloadSize;
unsigned nBytesSent, nBytesRecv;
payloadSize =
payloadSize =
dbr_size_n ( pItems[0].type, pItems[0].count );
payloadSize = CA_MESSAGE_ALIGN ( payloadSize );
dblPayloadSize = dbr_size [ DBR_DOUBLE ];
dblPayloadSize = CA_MESSAGE_ALIGN ( dblPayloadSize );
if ( payloadSize > dblPayloadSize ) {
unsigned factor = payloadSize / dblPayloadSize;
while ( factor ) {
@ -500,15 +500,15 @@ static void test ( ti *pItems, unsigned iterations )
printf ( "\t### async put test ###\n");
nBytesSent = sizeof ( caHdr ) + CA_MESSAGE_ALIGN( payloadSize );
nBytesRecv = 0u;
timeIt ( test_put, pItems, iterations,
nBytesSent * iterations,
timeIt ( test_put, pItems, iterations,
nBytesSent * iterations,
nBytesRecv * iterations );
printf ( "\t### async get test ###\n");
nBytesSent = sizeof ( caHdr );
nBytesRecv = sizeof ( caHdr ) + CA_MESSAGE_ALIGN ( payloadSize );
timeIt ( test_get, pItems, iterations,
nBytesSent * ( iterations ),
timeIt ( test_get, pItems, iterations,
nBytesSent * ( iterations ),
nBytesRecv * ( iterations ) );
printf ("\t### synch get test ###\n");
@ -520,7 +520,7 @@ static void test ( ti *pItems, unsigned iterations )
else if ( iterations > 10 ) {
iterations /= 10;
}
timeIt ( test_wait, pItems, iterations,
timeIt ( test_wait, pItems, iterations,
nBytesSent * iterations,
nBytesRecv * iterations );
}
@ -528,7 +528,7 @@ static void test ( ti *pItems, unsigned iterations )
/*
* catime ()
*/
int catime ( const char * channelName,
int catime ( const char * channelName,
unsigned channelCount, enum appendNumberFlag appNF )
{
unsigned i;
@ -536,7 +536,7 @@ int catime ( const char * channelName,
unsigned strsize;
unsigned nBytesSent, nBytesRecv;
ti *pItemList;
if ( channelCount == 0 ) {
printf ( "channel count was zero\n" );
return 0;
@ -547,15 +547,15 @@ int catime ( const char * channelName,
return -1;
}
SEVCHK ( ca_context_create ( ca_disable_preemptive_callback ),
SEVCHK ( ca_context_create ( ca_disable_preemptive_callback ),
"Unable to initialize" );
if ( appNF == appendNumber ) {
printf ( "Testing with %u channels named %snnn\n",
printf ( "Testing with %u channels named %snnn\n",
channelCount, channelName );
}
else {
printf ( "Testing with %u channels named %s\n",
printf ( "Testing with %u channels named %s\n",
channelCount, channelName );
}
@ -573,7 +573,7 @@ int catime ( const char * channelName,
pItemList[i].name[strsize]= '\0';
pItemList[i].count = 0;
pItemList[i].pValue = 0;
nBytesSent += 2 * ( CA_MESSAGE_ALIGN ( strlen ( pItemList[i].name ) )
nBytesSent += 2 * ( CA_MESSAGE_ALIGN ( strlen ( pItemList[i].name ) )
+ sizeof (caHdr) );
nBytesRecv += 2 * sizeof (caHdr);
}
@ -582,7 +582,7 @@ int catime ( const char * channelName,
printf ( "--------------------\n" );
timeIt ( test_search, pItemList, channelCount, nBytesSent, nBytesRecv );
printSearchStat ( pItemList, channelCount );
for ( i = 0; i < channelCount; i++ ) {
size_t count = ca_element_count ( pItemList[i].chix );
size_t size = sizeof ( dbr_string_t ) * count;
@ -608,7 +608,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pFltVal[j] = (dbr_float_t) val;
}
pItemList[i].type = DBR_FLOAT;
pItemList[i].type = DBR_FLOAT;
}
printf ( "DBR_FLOAT Test\n" );
printf ( "--------------\n" );
@ -621,13 +621,13 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pDblVal[j] = (dbr_double_t) val;
}
pItemList[i].type = DBR_DOUBLE;
pItemList[i].type = DBR_DOUBLE;
}
printf ( "DBR_DOUBLE Test\n" );
printf ( "---------------\n" );
test ( pItemList, channelCount );
for ( i = 0; i < channelCount; i++ ) {
dbr_string_t * pStrVal = ( dbr_string_t * ) pItemList[i].pValue;
double val = i;
@ -635,7 +635,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
sprintf ( pStrVal[j], "%f", val );
}
pItemList[i].type = DBR_STRING;
pItemList[i].type = DBR_STRING;
}
printf ( "DBR_STRING Test\n" );
printf ( "---------------\n" );
@ -648,7 +648,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pIntVal[j] = (dbr_int_t) val;
}
pItemList[i].type = DBR_INT;
pItemList[i].type = DBR_INT;
}
printf ( "DBR_INT Test\n" );
printf ( "------------\n" );
@ -661,8 +661,8 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pDblVal[j] = 0;
}
pItemList[i].type = DBR_DOUBLE;
}
pItemList[i].type = DBR_DOUBLE;
}
measure_get_latency ( pItemList, channelCount );
printf ( "Free Channel Test\n" );
@ -670,10 +670,10 @@ int catime ( const char * channelName,
timeIt ( test_free, pItemList, channelCount, 0, 0 );
SEVCHK ( ca_task_exit (), "Unable to free resources at exit" );
for ( i = 0; i < channelCount; i++ ) {
free ( pItemList[i].pValue );
}
}
free ( pItemList );

View File

@ -5,7 +5,7 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@ -3,22 +3,21 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#include <stdexcept>
@ -33,7 +32,7 @@ bool comBuf::flushToWire ( wireSendAdapter & wire, const epicsTime & currentTime
unsigned index = this->nextReadIndex;
unsigned finalIndex = this->commitIndex;
while ( index < finalIndex ) {
unsigned nBytes = wire.sendBytes (
unsigned nBytes = wire.sendBytes (
&this->buf[index], finalIndex - index, currentTime );
if ( nBytes == 0u ) {
this->nextReadIndex = index;
@ -45,9 +44,9 @@ 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 isnt inline
// shrinks the GNU compiled object code
void comBuf::throwInsufficentBytesException ()
void comBuf::throwInsufficentBytesException ()
{
throw comBuf::insufficentBytesAvailable ();
}

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -17,12 +16,12 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#ifndef comBufh
#define comBufh
#ifndef INC_comBuf_H
#define INC_comBuf_H
#include <new>
#include <cstring>
@ -40,23 +39,23 @@ static const unsigned comBufSize = 0x4000;
class comBufMemoryManager {
public:
virtual ~comBufMemoryManager ();
virtual void * allocate ( size_t ) = 0;
virtual void release ( void * ) = 0;
virtual void * allocate ( size_t ) = 0;
virtual void release ( void * ) = 0;
};
class wireSendAdapter {
public:
virtual unsigned sendBytes ( const void * pBuf,
unsigned nBytesInBuf,
virtual unsigned sendBytes ( const void * pBuf,
unsigned nBytesInBuf,
const class epicsTime & currentTime ) = 0;
protected:
virtual ~wireSendAdapter() {}
};
enum swioCircuitState {
swioConnected,
swioPeerHangup,
swioPeerAbort,
enum swioCircuitState {
swioConnected,
swioPeerHangup,
swioPeerAbort,
swioLinkFailure,
swioLocalAbort
};
@ -67,7 +66,7 @@ struct statusWireIO {
class wireRecvAdapter {
public:
virtual void recvBytes ( void * pBuf,
virtual void recvBytes ( void * pBuf,
unsigned nBytesInBuf, statusWireIO & ) = 0;
protected:
virtual ~wireRecvAdapter() {}
@ -106,7 +105,7 @@ public:
template < class T >
popStatus pop ( T & );
static void throwInsufficentBytesException ();
void * operator new ( size_t size,
void * operator new ( size_t size,
comBufMemoryManager & );
epicsPlacementDeleteOperator (( void *, comBufMemoryManager & ))
private:
@ -119,14 +118,14 @@ private:
bool push ( const T * ); // disabled
};
inline void * comBuf::operator new ( size_t size,
inline void * comBuf::operator new ( size_t size,
comBufMemoryManager & mgr )
{
return mgr.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
inline void comBuf::operator delete ( void * pCadaver,
inline void comBuf::operator delete ( void * pCadaver,
comBufMemoryManager & mgr )
{
mgr.release ( pCadaver );
@ -162,8 +161,8 @@ inline unsigned comBuf :: uncommittedBytes () const
inline unsigned comBuf :: push ( comBuf & bufIn )
{
unsigned nBytes = this->copyInBytes (
& bufIn.buf[ bufIn.nextReadIndex ],
unsigned nBytes = this->copyInBytes (
& bufIn.buf[ bufIn.nextReadIndex ],
bufIn.commitIndex - bufIn.nextReadIndex );
bufIn.nextReadIndex += nBytes;
return nBytes;
@ -174,11 +173,11 @@ inline unsigned comBuf :: capacityBytes ()
return comBufSize;
}
inline void comBuf :: fillFromWire (
inline void comBuf :: fillFromWire (
wireRecvAdapter & wire, statusWireIO & stat )
{
wire.recvBytes (
& this->buf[this->nextWriteIndex],
wire.recvBytes (
& this->buf[this->nextWriteIndex],
sizeof ( this->buf ) - this->nextWriteIndex, stat );
if ( stat.circuitState == swioConnected ) {
this->nextWriteIndex += stat.bytesCopied;
@ -332,4 +331,4 @@ comBuf :: popStatus comBuf :: pop ( T & returnVal )
return status;
}
#endif // ifndef comBufh
#endif // ifndef INC_comBuf_H

View File

@ -3,11 +3,10 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
* L O S A L A M O S
@ -26,8 +25,8 @@
#include "iocinf.h"
#include "virtualCircuit.h"
comQueRecv::comQueRecv ( comBufMemoryManager & comBufMemoryManagerIn ):
comBufMemMgr ( comBufMemoryManagerIn ), nBytesPending ( 0u )
comQueRecv::comQueRecv ( comBufMemoryManager & comBufMemoryManagerIn ):
comBufMemMgr ( comBufMemoryManagerIn ), nBytesPending ( 0u )
{
}
@ -101,7 +100,7 @@ void comQueRecv::popString ( epicsOldString *pStr )
}
void comQueRecv::pushLastComBufReceived ( comBuf & bufIn )
{
bufIn.commitIncomming ();
comBuf * pComBuf = this->bufs.last ();
@ -172,7 +171,7 @@ void comQueRecv::removeAndDestroyBuf ( comBuf & buf )
this->comBufMemMgr.release ( & buf );
}
epicsUInt8 comQueRecv::popUInt8 ()
epicsUInt8 comQueRecv::popUInt8 ()
{
comBuf * pComBuf = this->bufs.first ();
if ( ! pComBuf ) {

View File

@ -3,28 +3,27 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef comQueRecvh
#define comQueRecvh
#ifndef INC_comQueRecv_H
#define INC_comQueRecv_H
#include "comBuf.h"
@ -54,8 +53,8 @@ private:
epicsUInt16 multiBufferPopUInt16 ();
epicsUInt32 multiBufferPopUInt32 ();
void removeAndDestroyBuf ( comBuf & );
comQueRecv ( const comQueRecv & );
comQueRecv & operator = ( const comQueRecv & );
comQueRecv ( const comQueRecv & );
comQueRecv & operator = ( const comQueRecv & );
};
inline unsigned comQueRecv::occupiedBytes () const
@ -108,4 +107,4 @@ inline epicsFloat64 comQueRecv::popFloat64 ()
return AlignedWireRef < epicsFloat64 > ( tmp._fp );
}
#endif // ifndef comQueRecvh
#endif // ifndef INC_comQueRecv_H

View File

@ -3,23 +3,22 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
//
@ -35,7 +34,7 @@
// a connection dropped.
// 4) Do not allocate too much memory in exception situatons (such as
// after a circuit disconnect).
// 5) Avoid allocating more memory than is absolutely necessary to meet
// 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
// enough memory to queue part of a message (we also must not force
@ -44,7 +43,7 @@
// protocol stream.
//
// Implementation:
// 1) When queuing a complete message, first test to see if a flush is
// 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
// send thread, and otherwise directly execute the system call. The
// send thread must run at a higher priority than the receive thread
@ -52,14 +51,14 @@
// 2) Preallocate space for the entire message prior to copying in the
// message so that message fragments are not flushed out just prior
// to detecting that memory is unavailable.
// 3) Return a special error constant when the following situations
// 3) Return a special error constant when the following situations
// are detected when the user is attempting to queue a request
// from within a user callback executed by a receive thread:
// a) A user is queuing more requests that demand a response from a
// 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.
// b) A user is queuing many requests that demand a response from one
// b) A user is queuing many requests that demand a response from one
// callback until all buffering in the system is exausted.
// c) Some combination of both (a) nad (b).
//
@ -67,21 +66,20 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "virtualCircuit.h"
#include "db_access.h" // for dbr_short_t etc
// nill message alignment pad bytes
const char cacNillBytes [] =
{
const char cacNillBytes [] =
{
0, 0, 0, 0,
0, 0, 0, 0
};
comQueSend::comQueSend ( wireSendAdapter & wireIn,
comQueSend::comQueSend ( wireSendAdapter & wireIn,
comBufMemoryManager & comBufMemMgrIn ):
comBufMemMgr ( comBufMemMgrIn ), wire ( wireIn ),
comBufMemMgr ( comBufMemMgrIn ), wire ( wireIn ),
nBytesPending ( 0u )
{
}
@ -91,7 +89,7 @@ comQueSend::~comQueSend ()
this->clear ();
}
void comQueSend::clear ()
void comQueSend::clear ()
{
comBuf *pBuf;
@ -181,32 +179,32 @@ const comQueSend::copyScalarFunc_t comQueSend::dbrCopyScalar [39] = {
&comQueSend::copy_dbr_invalid // DBR_CLASS_NAME
};
void comQueSend::copy_dbr_string ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_string ( const void *pValue, unsigned nElem )
{
this->push ( static_cast < const char * > ( pValue ), nElem * MAX_STRING_SIZE );
}
void comQueSend::copy_dbr_short ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_short ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_short_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_float ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_float ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_float_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_char ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_char ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_char_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_long ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_long ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_long_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_double ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_double ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_double_t *> ( pValue ), nElem );
}
@ -258,7 +256,7 @@ const comQueSend::copyVectorFunc_t comQueSend::dbrCopyVector [39] = {
&comQueSend::copy_dbr_invalid // DBR_CLASS_NAME
};
comBuf * comQueSend::popNextComBufToSend ()
comBuf * comQueSend::popNextComBufToSend ()
{
comBuf *pBuf = this->bufs.get ();
if ( pBuf ) {
@ -279,9 +277,9 @@ comBuf * comQueSend::popNextComBufToSend ()
}
void comQueSend::insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok )
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok )
{
if ( payloadSize < 0xffff && nElem < 0xffff ) {
comBuf * pComBuf = this->bufs.last ();
@ -289,12 +287,12 @@ void comQueSend::insertRequestHeader (
pComBuf = newComBuf ();
this->pushComBuf ( *pComBuf );
}
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( payloadSize ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( nElem ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( payloadSize ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( nElem ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
}
else if ( v49Ok ) {
comBuf * pComBuf = this->bufs.last ();
@ -302,14 +300,14 @@ void comQueSend::insertRequestHeader (
pComBuf = newComBuf ();
this->pushComBuf ( *pComBuf );
}
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( 0xffff ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( 0u ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( payloadSize );
pComBuf->push ( nElem );
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( 0xffff ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( 0u ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( payloadSize );
pComBuf->push ( nElem );
}
else {
throw cacChannel::outOfBounds ();
@ -317,9 +315,9 @@ void comQueSend::insertRequestHeader (
}
void comQueSend::insertRequestWithPayLoad (
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok )
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok )
{
if ( INVALID_DB_REQ ( dataType ) ) {
throw cacChannel::badType ();
@ -337,16 +335,16 @@ void comQueSend::insertRequestWithPayLoad (
throw cacChannel::outOfBounds();
}
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
nElem, cid, requestDependent, v49Ok );
this->pushString ( pStr, size );
this->pushString ( pStr, size );
}
else {
size = dbr_size[dataType];
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
nElem, cid, requestDependent, v49Ok );
( this->*dbrCopyScalar [dataType] ) ( pPayload );
}
@ -357,22 +355,22 @@ void comQueSend::insertRequestWithPayLoad (
maxBytes = 0xffffffff;
}
else {
maxBytes = MAX_TCP - sizeof ( caHdr );
maxBytes = MAX_TCP - sizeof ( caHdr );
}
arrayElementCount maxElem =
( maxBytes - sizeof (dbr_double_t) - dbr_size[dataType] ) /
arrayElementCount maxElem =
( maxBytes - sizeof (dbr_double_t) - dbr_size[dataType] ) /
dbr_value_size[dataType];
if ( nElem >= maxElem ) {
throw cacChannel::outOfBounds();
}
// the above checks verify that the total size
// is lest that 0xffffffff
size = static_cast < ca_uint32_t >
size = static_cast < ca_uint32_t >
( dbr_size_n ( dataType, nElem ) );
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
static_cast < ca_uint32_t > ( nElem ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
static_cast < ca_uint32_t > ( nElem ),
cid, requestDependent, v49Ok );
( this->*dbrCopyVector [dataType] ) ( pPayload, nElem );
}
@ -383,7 +381,7 @@ void comQueSend::insertRequestWithPayLoad (
}
}
void comQueSend::commitMsg ()
void comQueSend::commitMsg ()
{
while ( this->pFirstUncommited.valid() ) {
this->nBytesPending += this->pFirstUncommited->uncommittedBytes ();

View File

@ -3,31 +3,30 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef comQueSendh
#define comQueSendh
#ifndef INC_comQueSend_H
#define INC_comQueSend_H
#include <new>
#include <new>
#include "tsDLList.h"
#include "comBuf.h"
@ -39,7 +38,7 @@ template < class T > class epicsGuard;
class comQueSendMsgMinder {
public:
comQueSendMsgMinder (
comQueSendMsgMinder (
class comQueSend &, epicsGuard < epicsMutex > & );
~comQueSendMsgMinder ();
void commit ();
@ -56,20 +55,20 @@ public:
comQueSend ( wireSendAdapter &, comBufMemoryManager & );
~comQueSend ();
void clear ();
unsigned occupiedBytes () const;
unsigned occupiedBytes () const;
bool flushEarlyThreshold ( unsigned nBytesThisMsg ) const;
bool flushBlockThreshold () const;
bool flushBlockThreshold () const;
void pushUInt16 ( const ca_uint16_t value );
void pushUInt32 ( const ca_uint32_t value );
void pushFloat32 ( const ca_float32_t value );
void pushString ( const char *pVal, unsigned nChar );
void insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
void insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok );
void insertRequestWithPayLoad (
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok );
comBuf * popNextComBufToSend ();
private:
@ -79,43 +78,43 @@ private:
wireSendAdapter & wire;
unsigned nBytesPending;
typedef void ( comQueSend::*copyScalarFunc_t ) (
typedef void ( comQueSend::*copyScalarFunc_t ) (
const void * pValue );
static const copyScalarFunc_t dbrCopyScalar [comQueSendCopyDispatchSize];
void copy_dbr_string ( const void * pValue );
void copy_dbr_short ( const void * pValue );
void copy_dbr_float ( const void * pValue );
void copy_dbr_char ( const void * pValue );
void copy_dbr_long ( const void * pValue );
void copy_dbr_double ( const void * pValue );
void copy_dbr_short ( const void * pValue );
void copy_dbr_float ( const void * pValue );
void copy_dbr_char ( const void * pValue );
void copy_dbr_long ( const void * pValue );
void copy_dbr_double ( const void * pValue );
void copy_dbr_invalid ( const void * pValue );
typedef void ( comQueSend::*copyVectorFunc_t ) (
typedef void ( comQueSend::*copyVectorFunc_t ) (
const void * pValue, unsigned nElem );
static const copyVectorFunc_t dbrCopyVector [comQueSendCopyDispatchSize];
void copy_dbr_string ( const void *pValue, unsigned nElem );
void copy_dbr_short ( const void *pValue, unsigned nElem );
void copy_dbr_float ( const void *pValue, unsigned nElem );
void copy_dbr_char ( const void *pValue, unsigned nElem );
void copy_dbr_long ( const void *pValue, unsigned nElem );
void copy_dbr_double ( const void *pValue, unsigned nElem );
void copy_dbr_short ( const void *pValue, unsigned nElem );
void copy_dbr_float ( const void *pValue, unsigned nElem );
void copy_dbr_char ( const void *pValue, unsigned nElem );
void copy_dbr_long ( const void *pValue, unsigned nElem );
void copy_dbr_double ( const void *pValue, unsigned nElem );
void copy_dbr_invalid ( const void * pValue, unsigned nElem );
void pushComBuf ( comBuf & );
comBuf * newComBuf ();
void pushComBuf ( comBuf & );
comBuf * newComBuf ();
void beginMsg ();
void commitMsg ();
void beginMsg ();
void commitMsg ();
void clearUncommitedMsg ();
friend class comQueSendMsgMinder;
//
// visual C++ versions 6 & 7 do not allow out of
// visual C++ versions 6 & 7 do not allow out of
// class member template function definition
//
template < class T >
inline void push ( const T *pVal, const unsigned nElem )
inline void push ( const T *pVal, const unsigned nElem )
{
comBuf * pLastBuf = this->bufs.last ();
unsigned nCopied;
@ -127,18 +126,18 @@ private:
}
while ( nElem > nCopied ) {
comBuf * pComBuf = newComBuf ();
nCopied += pComBuf->push
nCopied += pComBuf->push
( &pVal[nCopied], nElem - nCopied );
this->pushComBuf ( *pComBuf );
}
}
//
// visual C++ versions 6 and 7 do not allow out of
// visual C++ versions 6 and 7 do not allow out of
// class member template function definition
//
template < class T >
inline void push ( const T & val )
inline void push ( const T & val )
{
comBuf * pComBuf = this->bufs.last ();
if ( pComBuf && pComBuf->push ( val ) ) {
@ -159,8 +158,8 @@ private:
extern const char cacNillBytes[];
inline comQueSendMsgMinder::comQueSendMsgMinder (
class comQueSend & sendQueIn, epicsGuard < epicsMutex > & ) :
inline comQueSendMsgMinder::comQueSendMsgMinder (
class comQueSend & sendQueIn, epicsGuard < epicsMutex > & ) :
pSendQue ( & sendQueIn )
{
sendQueIn.beginMsg ();
@ -181,32 +180,32 @@ inline void comQueSendMsgMinder::commit ()
}
}
inline void comQueSend::beginMsg ()
inline void comQueSend::beginMsg ()
{
this->pFirstUncommited = this->bufs.lastIter ();
}
inline void comQueSend::pushUInt16 ( const ca_uint16_t value )
inline void comQueSend::pushUInt16 ( const ca_uint16_t value )
{
this->push ( value );
}
inline void comQueSend::pushUInt32 ( const ca_uint32_t value )
inline void comQueSend::pushUInt32 ( const ca_uint32_t value )
{
this->push ( value );
}
inline void comQueSend::pushFloat32 ( const ca_float32_t value )
inline void comQueSend::pushFloat32 ( const ca_float32_t value )
{
this->push ( value );
}
inline void comQueSend::pushString ( const char *pVal, unsigned nChar )
inline void comQueSend::pushString ( const char *pVal, unsigned nChar )
{
this->push ( pVal, nChar );
}
inline void comQueSend::pushComBuf ( comBuf & cb )
inline void comQueSend::pushComBuf ( comBuf & cb )
{
this->bufs.add ( cb );
if ( ! this->pFirstUncommited.valid() ) {
@ -214,7 +213,7 @@ inline void comQueSend::pushComBuf ( comBuf & cb )
}
}
inline unsigned comQueSend::occupiedBytes () const
inline unsigned comQueSend::occupiedBytes () const
{
return this->nBytesPending;
}
@ -235,4 +234,4 @@ inline comBuf * comQueSend::newComBuf ()
return new ( this->comBufMemMgr ) comBuf;
}
#endif // ifndef comQueSendh
#endif // ifndef INC_comQueSend_H

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* C O N V E R T . C
@ -13,11 +12,11 @@
* Author: D. Kersteins
*
*
* NOTES:
* NOTES:
*
* 1) All routines in this file have an encode argument which
* determines if we are converting from the standard format to
* the local format or vise versa. To date only float and double data
* the local format or vise versa. To date only float and double data
* types must be converted differently depending on the encode
* argument - joh
*
@ -29,7 +28,6 @@
#include "osiSock.h"
#include "osiWireFormat.h"
#define epicsExportSharedSymbols
#include "net_convert.h"
#include "iocinf.h"
#include "caProto.h"
@ -46,38 +44,38 @@
*
* net format: big endian and IEEE float
*/
typedef void ( * CACVRTFUNCPTR ) (
typedef void ( * CACVRTFUNCPTR ) (
const void *pSrc, void *pDest, int hton, arrayElementCount count );
inline void dbr_htond (
inline void dbr_htond (
const dbr_double_t * pHost, dbr_double_t * pNet )
{
AlignedWireRef < epicsFloat64 > tmp ( *pNet );
tmp = *pHost;
}
inline void dbr_ntohd (
inline void dbr_ntohd (
const dbr_double_t * pNet, dbr_double_t * pHost )
{
*pHost = AlignedWireRef < const epicsFloat64 > ( *pNet );
}
inline void dbr_htonf (
inline void dbr_htonf (
const dbr_float_t * pHost, dbr_float_t * pNet )
{
AlignedWireRef < epicsFloat32 > tmp ( *pNet );
tmp = *pHost;
}
inline void dbr_ntohf (
inline void dbr_ntohf (
const dbr_float_t * pNet, dbr_float_t * pHost )
{
*pHost = AlignedWireRef < const epicsFloat32 > ( *pNet );
}
inline epicsUInt16 dbr_ntohs( const epicsUInt16 & net )
inline epicsUInt16 dbr_ntohs( const epicsUInt16 & net )
{
return AlignedWireRef < const epicsUInt16 > ( net );
}
inline epicsUInt16 dbr_htons ( const epicsUInt16 & host )
inline epicsUInt16 dbr_htons ( const epicsUInt16 & host )
{
epicsUInt16 tmp;
AlignedWireRef < epicsUInt16 > awr ( tmp );
@ -103,7 +101,7 @@ inline epicsUInt32 dbr_htonl ( const epicsUInt32 & host )
* otherwise vise-versa
*
* net format: big endian and IEEE float
*
*
*/
/*
@ -122,7 +120,7 @@ arrayElementCount num /* number of values */
/* convert "in place" -> nothing to do */
if (s == d)
return;
memcpy ( pDest, pSrc, num*MAX_STRING_SIZE );
memcpy ( pDest, pSrc, num*MAX_STRING_SIZE );
}
/*
@ -234,7 +232,7 @@ arrayElementCount num /* number of values */
*
*
* NOTES:
* placing encode outside the loop results in more
* placing encode outside the loop results in more
* code but better performance.
*
*/
@ -291,10 +289,10 @@ arrayElementCount num /* number of values */
** struct dbr_sts_string *d pointer to destination struct
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -307,7 +305,7 @@ arrayElementCount num /* number of values */
{
struct dbr_sts_string *pSrc = (struct dbr_sts_string *) s;
struct dbr_sts_string *pDest = (struct dbr_sts_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@ -328,8 +326,8 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -361,10 +359,10 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -387,10 +385,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_sts_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -418,9 +416,9 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_sts_enum(
@ -446,9 +444,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_short()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_short(
@ -485,9 +483,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_char()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_char(
@ -526,9 +524,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_long()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_long(
@ -564,10 +562,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_gr_enum(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -599,10 +597,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_gr_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -663,10 +661,10 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -730,9 +728,9 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_short(
@ -772,9 +770,9 @@ arrayElementCount num /* number of values */
** cvrt_ctrl_long(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_long(
@ -814,9 +812,9 @@ arrayElementCount num /* number of values */
** cvrt_ctrl_short(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_char(
@ -833,7 +831,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
if ( s == d )
if ( s == d )
return;
pDest->upper_disp_limit = pSrc->upper_disp_limit;
@ -853,10 +851,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -919,10 +917,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_float(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -984,10 +982,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_enum(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -1003,7 +1001,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
pDest->no_str = dbr_ntohs(pSrc->no_str);
pDest->no_str = dbr_ntohs(pSrc->no_str);
if ( s != d ) {
memcpy((void *)pDest->strs,(void *)pSrc->strs,sizeof(pSrc->strs));
}
@ -1024,8 +1022,8 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -1043,7 +1041,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
if ( s == d )
if ( s == d )
return;
if (num == 1) /* single value */
@ -1058,8 +1056,8 @@ arrayElementCount num /* number of values */
** cvrt_sts_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -1088,10 +1086,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_string(s,d)
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -1104,7 +1102,7 @@ arrayElementCount num /* number of values */
{
struct dbr_time_string *pSrc = (struct dbr_time_string *) s;
struct dbr_time_string *pDest = (struct dbr_time_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@ -1120,8 +1118,8 @@ arrayElementCount num /* number of values */
** cvrt_time_short(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -1152,10 +1150,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_float(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -1180,10 +1178,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -1211,9 +1209,9 @@ arrayElementCount num /* number of values */
** cvrt_time_enum(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_time_enum(
@ -1241,8 +1239,8 @@ arrayElementCount num /* number of values */
** cvrt_sts_char(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -1262,7 +1260,7 @@ arrayElementCount num /* number of values */
pDest->stamp.secPastEpoch = dbr_ntohl(pSrc->stamp.secPastEpoch);
pDest->stamp.nsec = dbr_ntohl(pSrc->stamp.nsec);
if ( s == d )
if ( s == d )
return;
if (num == 1) /* single value */
@ -1276,8 +1274,8 @@ arrayElementCount num /* number of values */
** cvrt_time_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@ -1326,7 +1324,7 @@ arrayElementCount num /* number of values */
for(i=0; i<num; i++){
*pDest = dbr_ntohs( *pSrc );
/*
* dont increment these inside the MACRO
* dont increment these inside the MACRO
*/
pDest++;
pSrc++;
@ -1339,10 +1337,10 @@ arrayElementCount num /* number of values */
** struct dbr_stsack_string *d pointer to destination struct
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@ -1355,7 +1353,7 @@ arrayElementCount num /* number of values */
{
struct dbr_stsack_string *pSrc = (struct dbr_stsack_string *) s;
struct dbr_stsack_string *pDest = (struct dbr_stsack_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@ -1411,7 +1409,7 @@ static CACVRTFUNCPTR cac_dbr_cvrt[] = {
cvrt_ctrl_long,
cvrt_ctrl_double,
cvrt_put_ackt,
cvrt_put_ackt,
cvrt_put_ackt, /* DBR_PUT_ACKS identical to DBR_PUT_ACKT */
cvrt_stsack_string,
cvrt_string
@ -1419,18 +1417,18 @@ static CACVRTFUNCPTR cac_dbr_cvrt[] = {
#endif /* EPICS_CONVERSION_REQUIRED */
int caNetConvert ( unsigned type, const void *pSrc, void *pDest,
int caNetConvert ( unsigned type, const void *pSrc, void *pDest,
int hton, arrayElementCount count )
{
# ifdef EPICS_CONVERSION_REQUIRED
if ( type >= NELEMENTS ( cac_dbr_cvrt ) ) {
return ECA_BADTYPE;
}
}
( * cac_dbr_cvrt [ type ] ) ( pSrc, pDest, hton, count );
# else
if ( INVALID_DB_REQ ( type ) ) {
return ECA_BADTYPE;
}
}
if ( pSrc != pDest ) {
memcpy ( pDest, pSrc, dbr_size_n ( type, count ) );
}

File diff suppressed because it is too large Load Diff

View File

@ -3,11 +3,10 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
@ -20,16 +19,15 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "disconnectGovernorTimer.h"
#include "udpiiu.h"
#include "nciu.h"
static const double disconnectGovernorPeriod = 10.0; // sec
disconnectGovernorTimer::disconnectGovernorTimer (
disconnectGovernorNotify & iiuIn,
epicsTimerQueue & queueIn,
disconnectGovernorTimer::disconnectGovernorTimer (
disconnectGovernorNotify & iiuIn,
epicsTimerQueue & queueIn,
epicsMutex & mutexIn ) :
mutex ( mutexIn ), timer ( queueIn.createTimer () ),
iiu ( iiuIn )
@ -58,18 +56,18 @@ void disconnectGovernorTimer::shutdown (
}
}
while ( nciu * pChan = this->chanList.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
pChan->serviceShutdownNotify ( cbGuard, guard );
}
}
epicsTimerNotify::expireStatus disconnectGovernorTimer::expire (
epicsTimerNotify::expireStatus disconnectGovernorTimer::expire (
const epicsTime & /* currentTime */ )
{
epicsGuard < epicsMutex > guard ( this->mutex );
while ( nciu * pChan = chanList.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
this->iiu.govExpireNotify ( guard, *pChan );
}
@ -83,14 +81,14 @@ void disconnectGovernorTimer::show ( unsigned level ) const
this->chanList.count () );
if ( level > 0u ) {
tsDLIterConst < nciu > pChan = this->chanList.firstIter ();
while ( pChan.valid () ) {
while ( pChan.valid () ) {
pChan->show ( level - 1u );
pChan++;
}
}
}
void disconnectGovernorTimer::installChan (
void disconnectGovernorTimer::installChan (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
guard.assertIdenticalMutex ( this->mutex );

View File

@ -3,65 +3,55 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
// Los Alamos, New Mexico 87545
//
//
// Copyright, 1986, The Regents of the University of California.
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
#ifndef disconnectGovernorTimerh
#define disconnectGovernorTimerh
#ifdef epicsExportSharedSymbols
# define searchTimerh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_disconnectGovernorTimer_H
#define INC_disconnectGovernorTimer_H
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsTimer.h"
#ifdef searchTimerh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caProto.h"
#include "netiiu.h"
class disconnectGovernorNotify {
public:
virtual ~disconnectGovernorNotify () = 0;
virtual void govExpireNotify (
virtual void govExpireNotify (
epicsGuard < epicsMutex > &, nciu & ) = 0;
};
class disconnectGovernorTimer : private epicsTimerNotify {
public:
disconnectGovernorTimer (
disconnectGovernorTimer (
class disconnectGovernorNotify &, epicsTimerQueue &, epicsMutex & );
virtual ~disconnectGovernorTimer ();
void start ();
void shutdown (
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard );
void installChan (
void installChan (
epicsGuard < epicsMutex > &, nciu & );
void uninstallChan (
void uninstallChan (
epicsGuard < epicsMutex > &, nciu & );
void show ( unsigned level ) const;
private:
@ -70,8 +60,8 @@ private:
epicsTimer & timer;
class disconnectGovernorNotify & iiu;
epicsTimerNotify::expireStatus expire ( const epicsTime & currentTime );
disconnectGovernorTimer ( const disconnectGovernorTimer & );
disconnectGovernorTimer & operator = ( const disconnectGovernorTimer & );
disconnectGovernorTimer ( const disconnectGovernorTimer & );
disconnectGovernorTimer & operator = ( const disconnectGovernorTimer & );
};
#endif // ifdef disconnectGovernorTimerh
#endif // ifdef INC_disconnectGovernorTimer_H

View File

@ -5,7 +5,7 @@
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@ -17,8 +17,8 @@
void event_handler (struct event_handler_args args);
int evtime (char *pname);
static unsigned iteration_count;
static epicsUInt32 last_time;
static unsigned iteration_count;
static epicsUInt32 last_time;
#ifndef iocCore
int main(int argc, char **argv)
@ -32,7 +32,7 @@ int main(int argc, char **argv)
else{
printf("usage: %s <channel name>", argv[0]);
}
return(0);
return(0);
}
#endif
@ -41,28 +41,28 @@ int main(int argc, char **argv)
*/
int evtime(char *pname)
{
chid chan;
int status;
chid chan;
int status;
status = ca_search(pname, &chan);
SEVCHK(status, NULL);
status = ca_search(pname, &chan);
SEVCHK(status, NULL);
status = ca_pend_io(10.0);
if(status != ECA_NORMAL){
printf("%s not found\n", pname);
return 0;
}
status = ca_pend_io(10.0);
if(status != ECA_NORMAL){
printf("%s not found\n", pname);
return 0;
}
status = ca_add_event(
DBR_FLOAT,
chan,
event_handler,
NULL,
NULL);
SEVCHK(status, __FILE__);
status = ca_add_event(
DBR_FLOAT,
chan,
event_handler,
NULL,
NULL);
SEVCHK(status, __FILE__);
status = ca_pend_event(0.0);
SEVCHK(status, NULL);
status = ca_pend_event(0.0);
SEVCHK(status, NULL);
}
@ -72,24 +72,24 @@ int evtime(char *pname)
*/
void event_handler(struct event_handler_args args)
{
epicsUInt32 current_time;
# define COUNT 0x8000
double interval;
double delay;
epicsTimeStamp ts;
epicsUInt32 current_time;
# define COUNT 0x8000
double interval;
double delay;
epicsTimeStamp ts;
if(iteration_count%COUNT == 0){
epicsTimeGetCurrent(&ts);
current_time = ts.secPastEpoch;
if(last_time != 0){
interval = current_time - last_time;
delay = interval/COUNT;
printf("Delay = %f sec per event\n",
delay);
}
last_time = current_time;
}
if(iteration_count%COUNT == 0){
epicsTimeGetCurrent(&ts);
current_time = ts.secPastEpoch;
if(last_time != 0){
interval = current_time - last_time;
delay = interval/COUNT;
printf("Delay = %f sec per event\n",
delay);
}
last_time = current_time;
}
iteration_count++;
iteration_count++;
}

View File

@ -3,24 +3,23 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@ -28,11 +27,10 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
getCallback::getCallback ( oldChannelNotify & chanIn,
getCallback::getCallback ( oldChannelNotify & chanIn,
caEventCallBackFunc *pFuncIn, void *pPrivateIn ) :
chan ( chanIn ), pFunc ( pFuncIn ), pPrivate ( pPrivateIn )
{
@ -65,7 +63,7 @@ void getCallback::completion (
void getCallback::exception (
epicsGuard < epicsMutex > & guard,
int status, const char * /* pContext */,
int status, const char * /* pContext */,
unsigned type, arrayElementCount count )
{
if ( status != ECA_CHANDESTROY ) {

View File

@ -3,24 +3,23 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@ -30,23 +29,22 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
getCopy::getCopy (
epicsGuard < epicsMutex > & guard, ca_client_context & cacCtxIn,
oldChannelNotify & chanIn, unsigned typeIn,
getCopy::getCopy (
epicsGuard < epicsMutex > & guard, ca_client_context & cacCtxIn,
oldChannelNotify & chanIn, unsigned typeIn,
arrayElementCount countIn, void * pValueIn ) :
count ( countIn ), cacCtx ( cacCtxIn ), chan ( chanIn ), pValue ( pValueIn ),
count ( countIn ), cacCtx ( cacCtxIn ), chan ( chanIn ), pValue ( pValueIn ),
ioSeqNo ( 0 ), type ( typeIn )
{
this->ioSeqNo = cacCtxIn.sequenceNumberOfOutstandingIO ( guard );
cacCtxIn.incrementOutstandingIO ( guard, this->ioSeqNo );
}
getCopy::~getCopy ()
getCopy::~getCopy ()
{
}
@ -56,8 +54,8 @@ void getCopy::cancel ()
this->cacCtx.decrementOutstandingIO ( guard, this->ioSeqNo );
}
void getCopy::completion (
epicsGuard < epicsMutex > & guard, unsigned typeIn,
void getCopy::completion (
epicsGuard < epicsMutex > & guard, unsigned typeIn,
arrayElementCount countIn, const void *pDataIn )
{
if ( this->type == typeIn ) {
@ -68,7 +66,7 @@ void getCopy::completion (
// this object destroyed by preceding function call
}
else {
this->exception ( guard, ECA_INTERNAL,
this->exception ( guard, ECA_INTERNAL,
"bad data type match in get copy back response",
typeIn, countIn);
// this object destroyed by preceding function call
@ -77,7 +75,7 @@ void getCopy::completion (
void getCopy::exception (
epicsGuard < epicsMutex > & guard,
int status, const char *pContext,
int status, const char *pContext,
unsigned /* typeIn */, arrayElementCount /* countIn */ )
{
oldChannelNotify & chanTmp ( this->chan );
@ -88,8 +86,8 @@ void getCopy::exception (
// the lock and calling cb in case they destroy channel there
this->cacCtx.destroyGetCopy ( guard, *this );
if ( status != ECA_CHANDESTROY ) {
caClientCtx.exception ( guard, status, pContext,
__FILE__, __LINE__, chanTmp, typeTmp,
caClientCtx.exception ( guard, status, pContext,
__FILE__, __LINE__, chanTmp, typeTmp,
countTmp, CA_OP_GET );
}
}
@ -97,7 +95,7 @@ void getCopy::exception (
void getCopy::show ( unsigned level ) const
{
int tmpType = static_cast <int> ( this->type );
::printf ( "read copy IO at %p, type %s, element count %lu\n",
::printf ( "read copy IO at %p, type %s, element count %lu\n",
static_cast <const void *> ( this ), dbf_type_to_text ( tmpType ), this->count );
if ( level > 0u ) {
::printf ( "\tIO sequence number %u, user's storage %p\n",

View File

@ -3,23 +3,22 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#include <algorithm>
@ -29,7 +28,7 @@
#include "hostNameCache.h"
#include "epicsGuard.h"
hostNameCache::hostNameCache (
hostNameCache::hostNameCache (
const osiSockAddr & addr, ipAddrToAsciiEngine & engine ) :
dnsTransaction ( engine.createTransaction() ), nameLength ( 0 )
{
@ -65,7 +64,7 @@ void hostNameCache::transactionComplete ( const char * pHostNameIn )
this->nameLength = newNameLen;
}
unsigned hostNameCache::getName (
unsigned hostNameCache::getName (
char * pBuf, unsigned bufSize ) const
{
if ( bufSize == 0u ) {

View File

@ -3,41 +3,31 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef hostNameCacheh
#define hostNameCacheh
#ifdef epicsExportSharedSymbols
# define hostNameCache_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_hostNameCache_H
#define INC_hostNameCache_H
#include "ipAddrToAsciiAsynchronous.h"
#include "epicsMutex.h"
#ifdef hostNameCache_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class hostNameCache : public ipAddrToAsciiCallBack {
public:
hostNameCache ( const osiSockAddr & addr, ipAddrToAsciiEngine & engine );
@ -58,4 +48,4 @@ inline const char * hostNameCache::pointer () const
return this->hostNameBuf;
}
#endif // #ifndef hostNameCacheh
#endif // #ifndef INC_hostNameCache_H

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -19,8 +18,8 @@
* Author: Jeff Hill
*/
#ifndef inetAddrIDh
#define inetAddrIDh
#ifndef INC_inetAddrID_H
#define INC_inetAddrID_H
#include "osiSock.h"
#include "resourceLib.h"
@ -58,7 +57,7 @@ inline resTableIndex inetAddrID::hash () const
index = this->addr.sin_addr.s_addr;
index ^= this->addr.sin_port;
index ^= this->addr.sin_port >> 8u;
return integerHash ( inetAddrMinIndexBitWidth,
return integerHash ( inetAddrMinIndexBitWidth,
inetAddrMaxIndexBitWidth, index );
}
@ -67,6 +66,6 @@ inline void inetAddrID::name ( char *pBuf, unsigned bufSize ) const
ipAddrToDottedIP ( &this->addr, pBuf, bufSize );
}
#endif // ifdef inetAddrID
#endif // ifdef INC_inetAddrID_H

View File

@ -4,10 +4,10 @@
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -31,10 +31,7 @@
#include "errlog.h"
#include "osiWireFormat.h"
#define epicsExportSharedSymbols
#include "addrList.h"
#undef epicsExportSharedSymbols
#include "iocinf.h"
/*
@ -65,16 +62,16 @@ static char *getToken ( const char **ppString, char *pBuf, unsigned bufSIze )
if ( tokenFound ) {
pBuf[bufSIze-1] = '\0';
return pBuf;
}
return pBuf;
}
return NULL;
}
/*
* addAddrToChannelAccessAddressList ()
*/
extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
( ELLLIST *pList, const ENV_PARAM *pEnv,
extern "C" int epicsStdCall addAddrToChannelAccessAddressList
( ELLLIST *pList, const ENV_PARAM *pEnv,
unsigned short port, int ignoreNonDefaultPort )
{
osiSockAddrNode *pNewNode;
@ -109,9 +106,9 @@ extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
pNewNode->addr.ia = addr;
/*
* LOCK applied externally
*/
/*
* LOCK applied externally
*/
ellAdd (pList, &pNewNode->node);
ret = 0; /* success if anything is added to the list */
}
@ -122,14 +119,14 @@ extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
/*
* removeDuplicateAddresses ()
*/
extern "C" void epicsShareAPI removeDuplicateAddresses
extern "C" void epicsStdCall removeDuplicateAddresses
( ELLLIST *pDestList, ELLLIST *pSrcList, int silent )
{
ELLNODE *pRawNode;
while ( (pRawNode = ellGet ( pSrcList ) ) ) {
STATIC_ASSERT ( offsetof (osiSockAddrNode, node) == 0 );
osiSockAddrNode *pNode = reinterpret_cast <osiSockAddrNode *> ( pRawNode );
STATIC_ASSERT ( offsetof (osiSockAddrNode, node) == 0 );
osiSockAddrNode *pNode = reinterpret_cast <osiSockAddrNode *> ( pRawNode );
osiSockAddrNode *pTmpNode;
if ( pNode->addr.sa.sa_family == AF_INET ) {
@ -137,14 +134,14 @@ extern "C" void epicsShareAPI removeDuplicateAddresses
pTmpNode = (osiSockAddrNode *) ellFirst (pDestList);
while ( pTmpNode ) {
if (pTmpNode->addr.sa.sa_family == AF_INET) {
if ( pNode->addr.ia.sin_addr.s_addr == pTmpNode->addr.ia.sin_addr.s_addr &&
if ( pNode->addr.ia.sin_addr.s_addr == pTmpNode->addr.ia.sin_addr.s_addr &&
pNode->addr.ia.sin_port == pTmpNode->addr.ia.sin_port ) {
if ( ! silent ) {
if ( ! silent ) {
char buf[64];
ipAddrToDottedIP ( &pNode->addr.ia, buf, sizeof (buf) );
fprintf ( stderr,
"Warning: Duplicate EPICS CA Address list entry \"%s\" discarded\n", buf );
}
fprintf ( stderr,
"Warning: Duplicate EPICS CA Address list entry \"%s\" discarded\n", buf );
}
free (pNode);
pNode = NULL;
break;
@ -182,7 +179,7 @@ static void forcePort ( ELLLIST *pList, unsigned short port )
/*
* configureChannelAccessAddressList ()
*/
extern "C" void epicsShareAPI configureChannelAccessAddressList
extern "C" void epicsStdCall configureChannelAccessAddressList
( ELLLIST *pList, SOCKET sock, unsigned short port )
{
ELLLIST tmpList;
@ -203,7 +200,7 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
* from the interfaces found.
*/
yes = true;
pstr = envGetConfigParam ( &EPICS_CA_AUTO_ADDR_LIST,
pstr = envGetConfigParam ( &EPICS_CA_AUTO_ADDR_LIST,
sizeof (yesno), yesno );
if ( pstr ) {
if ( strstr ( pstr, "no" ) || strstr ( pstr, "NO" ) ) {
@ -216,19 +213,19 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
* (lock outside because this is used by the server also)
*/
if (yes) {
ELLLIST bcastList;
ELLLIST bcastList;
osiSockAddr addr;
ellInit ( &bcastList );
ellInit ( &bcastList );
addr.ia.sin_family = AF_UNSPEC;
osiSockDiscoverBroadcastAddresses ( &bcastList, sock, &addr );
forcePort ( &bcastList, port );
removeDuplicateAddresses ( &tmpList, &bcastList, 1 );
removeDuplicateAddresses ( &tmpList, &bcastList, 1 );
if ( ellCount ( &tmpList ) == 0 ) {
osiSockAddrNode *pNewNode;
pNewNode = (osiSockAddrNode *) calloc ( 1, sizeof (*pNewNode) );
if ( pNewNode ) {
/*
* if no interfaces found then look for local channels
/*
* if no interfaces found then look for local channels
* with the loop back interface
*/
pNewNode->addr.ia.sin_family = AF_INET;
@ -250,7 +247,7 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
/*
* printChannelAccessAddressList ()
*/
extern "C" void epicsShareAPI printChannelAccessAddressList ( const ELLLIST *pList )
extern "C" void epicsStdCall printChannelAccessAddressList ( const ELLLIST *pList )
{
osiSockAddrNode *pNode;

View File

@ -3,27 +3,26 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef INCiocinfh
#define INCiocinfh
#ifndef INC_iocinf_H
#define INC_iocinf_H
#ifdef DEBUG
# define debugPrintf(argsInParen) ::printf argsInParen
@ -47,17 +46,17 @@
* CA_CONN_VERIFY_PERIOD is normally obtained from an
* EPICS environment variable.
*/
static const double CA_ECHO_TIMEOUT = 5.0; /* (sec) disconn no echo reply tmo */
static const double CA_ECHO_TIMEOUT = 5.0; /* (sec) disconn no echo reply tmo */
static const double CA_CONN_VERIFY_PERIOD = 30.0; /* (sec) how often to request echo */
/*
* this determines the number of messages received
* without a delay in between before we go into
* without a delay in between before we go into
* monitor flow control
*
* turning this down effects maximum throughput
* because we dont get an optimal number of bytes
* per network frame
* because we dont get an optimal number of bytes
* per network frame
*/
static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u;
@ -67,4 +66,4 @@ static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u;
#define genLocalExcep( CBGUARD, GUARD, CAC, STAT, PCTX ) \
(CAC).exception ( CBGUARD, GUARD, STAT, PCTX, __FILE__, __LINE__ )
#endif // ifdef INCiocinfh
#endif // ifdef INC_iocinf_H

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -31,7 +30,7 @@ localHostName::localHostName () :
const char * pErrStr = "<unknown host>";
int status = -1;
if ( this->attachedToSockLib ) {
status = gethostname (
status = gethostname (
this->cache, sizeof ( this->cache ) );
}
if ( status ) {
@ -48,7 +47,7 @@ localHostName::~localHostName ()
}
}
unsigned localHostName::getName (
unsigned localHostName::getName (
char * pBuf, unsigned bufLength ) const
{
if ( bufLength ) {

View File

@ -3,12 +3,11 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@ -19,22 +18,13 @@
* Author: Jeff Hill
*/
#ifndef localHostNameh
#define localHostNameh
#ifndef INC_localHostName_H
#define INC_localHostName_H
#include <string.h>
#ifdef epicsExportSharedSymbols
# define localHostNameh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsSingleton.h"
#ifdef localHostNameh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class localHostName {
public:
localHostName ();
@ -60,6 +50,6 @@ inline const char * localHostName::pointer () const
return this->cache;
}
#endif // ifndef localHostNameh
#endif // ifndef INC_localHostName_H

View File

@ -3,24 +3,23 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@ -30,15 +29,14 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "msgForMultiplyDefinedPV.h"
#include "cac.h"
#include "caerr.h" // for ECA_DBLCHNL
msgForMultiplyDefinedPV::msgForMultiplyDefinedPV (
msgForMultiplyDefinedPV::msgForMultiplyDefinedPV (
ipAddrToAsciiEngine & engine,
callbackForMultiplyDefinedPV & cbIn,
callbackForMultiplyDefinedPV & cbIn,
const char * pChannelName, const char * pAcc ) :
dnsTransaction ( engine.createTransaction () ), cb ( cbIn )
{
@ -61,15 +59,15 @@ void msgForMultiplyDefinedPV::transactionComplete ( const char * pHostNameRej )
// !! dont touch 'this' pointer after this point because object has been deleted !!
}
void * msgForMultiplyDefinedPV::operator new ( size_t size,
void * msgForMultiplyDefinedPV::operator new ( size_t size,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
{
return freeList.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
void msgForMultiplyDefinedPV::operator delete ( void *pCadaver,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
void msgForMultiplyDefinedPV::operator delete ( void *pCadaver,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
{
freeList.release ( pCadaver, sizeof ( msgForMultiplyDefinedPV ) );
}

View File

@ -3,48 +3,38 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef msgForMultiplyDefinedPVh
#define msgForMultiplyDefinedPVh
#ifdef epicsExportSharedSymbols
# define msgForMultiplyDefinedPVh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_msgForMultiplyDefinedPV_H
#define INC_msgForMultiplyDefinedPV_H
#include "ipAddrToAsciiAsynchronous.h"
#include "tsFreeList.h"
#include "tsDLList.h"
#include "compilerDependencies.h"
#ifdef msgForMultiplyDefinedPVh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class callbackForMultiplyDefinedPV {
public:
virtual ~callbackForMultiplyDefinedPV () = 0;
virtual void pvMultiplyDefinedNotify (
class msgForMultiplyDefinedPV &, const char * pChannelName,
virtual void pvMultiplyDefinedNotify (
class msgForMultiplyDefinedPV &, const char * pChannelName,
const char * pAcc, const char * pRej ) = 0;
};
@ -53,7 +43,7 @@ class msgForMultiplyDefinedPV :
public tsDLNode < msgForMultiplyDefinedPV > {
public:
msgForMultiplyDefinedPV ( ipAddrToAsciiEngine & engine,
callbackForMultiplyDefinedPV &, const char * pChannelName,
callbackForMultiplyDefinedPV &, const char * pChannelName,
const char * pAcc );
virtual ~msgForMultiplyDefinedPV ();
void ioInitiate ( const osiSockAddr & rej );
@ -75,5 +65,5 @@ inline void msgForMultiplyDefinedPV::ioInitiate ( const osiSockAddr & rej )
this->dnsTransaction.ipAddrToAscii ( rej, *this );
}
#endif // ifdef msgForMultiplyDefinedPVh
#endif // ifdef INC_msgForMultiplyDefinedPV_H

View File

@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@ -29,7 +28,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "cac.h"
#include "osiWireFormat.h"
@ -51,7 +49,7 @@ nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
typeCode ( USHRT_MAX ),
priority ( static_cast <ca_uint8_t> ( pri ) )
{
size_t nameLengthTmp = strlen ( pNameIn ) + 1;
size_t nameLengthTmp = strlen ( pNameIn ) + 1;
// second constraint is imposed by size field in protocol header
if ( nameLengthTmp > MAX_UDP_SEND - sizeof ( caHdr ) || nameLengthTmp > USHRT_MAX ) {
@ -62,7 +60,7 @@ nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
throw cacChannel::badPriority ();
}
this->nameLength = static_cast <unsigned short> ( nameLengthTmp );
this->nameLength = static_cast <unsigned short> ( nameLengthTmp );
this->pNameStr = new char [ this->nameLength ];
strcpy ( this->pNameStr, pNameIn );
@ -114,7 +112,7 @@ void nciu::initiateConnect (
}
void nciu::connect ( unsigned nativeType,
unsigned nativeCount, unsigned sidIn,
unsigned nativeCount, unsigned sidIn,
epicsGuard < epicsMutex > & /* cbGuard */,
epicsGuard < epicsMutex > & guard )
{

View File

@ -3,8 +3,7 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@ -17,18 +16,13 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef nciuh
#define nciuh
#ifdef epicsExportSharedSymbols
# define nciuh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_nciu_H
#define INC_nciu_H
#include "resourceLib.h"
#include "tsDLList.h"
@ -36,10 +30,7 @@
#include "epicsMutex.h"
#include "compilerDependencies.h"
#ifdef nciuh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#define CA_MINOR_PROTOCOL_REVISION 13
#include "caProto.h"
@ -278,8 +269,8 @@ private:
epicsGuard < epicsMutex > &, class baseNMIU & );
const char * pHostName (
epicsGuard < epicsMutex > & guard ) const throw ();
nciu ( const nciu & );
nciu & operator = ( const nciu & );
nciu ( const nciu & );
nciu & operator = ( const nciu & );
void operator delete ( void * );
};
@ -382,4 +373,4 @@ inline bool channelNode::isInstalledInServer ( epicsGuard < epicsMutex > & ) con
this->listMember == cs_subscripUpdateReqPend;
}
#endif // ifdef nciuh
#endif // ifdef INC_nciu_H

View File

@ -3,35 +3,34 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef netIOh
#define netIOh
#ifndef INC_netIO_H
#define INC_netIO_H
#include "nciu.h"
#include "compilerDependencies.h"
// SUN PRO generates multiply defined symbols if the baseNMIU
// destructor is virtual (therefore it is protected).
// destructor is virtual (therefore it is protected).
// I assume that SUNPRO will fix this in future versions.
// With other compilers we get warnings (and
// With other compilers we get warnings (and
// potential problems) if we dont make the baseNMIU
// destructor virtual.
#if defined ( __SUNPRO_CC ) && ( __SUNPRO_CC <= 0x540 )
@ -45,42 +44,42 @@ class privateInterfaceForIO;
class baseNMIU : public tsDLNode < baseNMIU >,
public chronIntIdRes < baseNMIU > {
public:
virtual void destroy (
virtual void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & ) = 0; // only called by cac
virtual void completion (
virtual void completion (
epicsGuard < epicsMutex > &, cacRecycle & ) = 0;
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext ) = 0;
virtual void exception (
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count ) = 0;
virtual void completion (
virtual void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
unsigned type, arrayElementCount count,
const void * pData ) = 0;
virtual void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan ) = 0;
virtual class netSubscription * isSubscription () = 0;
virtual void show (
virtual void show (
unsigned level ) const = 0;
virtual void show (
epicsGuard < epicsMutex > &,
virtual void show (
epicsGuard < epicsMutex > &,
unsigned level ) const = 0;
protected:
NETIO_VIRTUAL_DESTRUCTOR ~baseNMIU ();
NETIO_VIRTUAL_DESTRUCTOR ~baseNMIU ();
};
class netSubscription : public baseNMIU {
public:
static netSubscription * factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &,
class privateInterfaceForIO &, unsigned type, arrayElementCount count,
static netSubscription * factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &,
class privateInterfaceForIO &, unsigned type, arrayElementCount count,
unsigned mask, cacStateNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
arrayElementCount getCount (
epicsGuard < epicsMutex > &, bool allow_zero ) const;
@ -90,12 +89,12 @@ public:
epicsGuard < epicsMutex > & ) const;
void subscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan );
void unsubscribeIfRequired (
void unsubscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan );
protected:
netSubscription (
class privateInterfaceForIO &, unsigned type,
arrayElementCount count,
netSubscription (
class privateInterfaceForIO &, unsigned type,
arrayElementCount count,
unsigned mask, cacStateNotify & );
~netSubscription ();
private:
@ -107,23 +106,23 @@ private:
bool subscribed;
class netSubscription * isSubscription ();
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & ))
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count, const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count );
void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan );
@ -133,12 +132,12 @@ private:
class netReadNotifyIO : public baseNMIU {
public:
static netReadNotifyIO * factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > &,
static netReadNotifyIO * factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > &,
privateInterfaceForIO &, cacReadNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
protected:
netReadNotifyIO ( privateInterfaceForIO &, cacReadNotify & );
@ -147,24 +146,24 @@ private:
cacReadNotify & notify;
class privateInterfaceForIO & privateChanForIO;
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & ))
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext,
int status, const char * pContext,
unsigned type, arrayElementCount count );
class netSubscription * isSubscription ();
void forceSubscriptionUpdate (
@ -175,12 +174,12 @@ private:
class netWriteNotifyIO : public baseNMIU {
public:
static netWriteNotifyIO * factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &,
static netWriteNotifyIO * factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &,
privateInterfaceForIO &, cacWriteNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
protected:
netWriteNotifyIO ( privateInterfaceForIO &, cacWriteNotify & );
@ -189,25 +188,25 @@ private:
cacWriteNotify & notify;
privateInterfaceForIO & privateChanForIO;
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & ))
class netSubscription * isSubscription ();
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count );
void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan );
@ -215,23 +214,23 @@ private:
netWriteNotifyIO & operator = ( const netWriteNotifyIO & );
};
inline void * netSubscription::operator new ( size_t size,
inline void * netSubscription::operator new ( size_t size,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netSubscription::operator delete ( void *pCadaver,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
inline void netSubscription::operator delete ( void *pCadaver,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
{
freeList.release ( pCadaver );
}
#endif
inline netSubscription * netSubscription::factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & freeList,
class privateInterfaceForIO & chan, unsigned type, arrayElementCount count,
inline netSubscription * netSubscription::factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & freeList,
class privateInterfaceForIO & chan, unsigned type, arrayElementCount count,
unsigned mask, cacStateNotify &notify )
{
return new ( freeList ) netSubscription ( chan, type,
@ -261,46 +260,46 @@ inline unsigned netSubscription::getMask ( epicsGuard < epicsMutex > & ) const
return this->mask;
}
inline netReadNotifyIO * netReadNotifyIO::factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList,
inline netReadNotifyIO * netReadNotifyIO::factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList,
privateInterfaceForIO & ioComplNotifIntf, cacReadNotify & notify )
{
return new ( freeList ) netReadNotifyIO ( ioComplNotifIntf, notify );
}
inline void * netReadNotifyIO::operator new ( size_t size,
inline void * netReadNotifyIO::operator new ( size_t size,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netReadNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
inline void netReadNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
freeList.release ( pCadaver );
}
#endif
inline netWriteNotifyIO * netWriteNotifyIO::factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList,
inline netWriteNotifyIO * netWriteNotifyIO::factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList,
privateInterfaceForIO & ioComplNotifyIntf, cacWriteNotify & notify )
{
return new ( freeList ) netWriteNotifyIO ( ioComplNotifyIntf, notify );
}
inline void * netWriteNotifyIO::operator new ( size_t size,
inline void * netWriteNotifyIO::operator new ( size_t size,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netWriteNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
inline void netWriteNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
freeList.release ( pCadaver );
}
#endif
#endif // ifdef netIOh
#endif // ifdef INC_netIO_H

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -29,8 +28,8 @@
#include "nciu.h"
#include "cac.h"
netReadNotifyIO::netReadNotifyIO (
privateInterfaceForIO & ioComplIntfIn,
netReadNotifyIO::netReadNotifyIO (
privateInterfaceForIO & ioComplIntfIn,
cacReadNotify & notify ) :
notify ( notify ), privateChanForIO ( ioComplIntfIn )
{
@ -42,26 +41,26 @@ netReadNotifyIO::~netReadNotifyIO ()
void netReadNotifyIO::show ( unsigned /* level */ ) const
{
::printf ( "netReadNotifyIO at %p\n",
::printf ( "netReadNotifyIO at %p\n",
static_cast < const void * > ( this ) );
}
void netReadNotifyIO::show (
void netReadNotifyIO::show (
epicsGuard < epicsMutex > &, unsigned level ) const
{
this->show ( level );
}
void netReadNotifyIO::destroy (
void netReadNotifyIO::destroy (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle )
{
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, unsigned type,
void netReadNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, unsigned type,
arrayElementCount count, const void * pData )
{
//guard.assertIdenticalMutex ( this->mutex );
@ -82,28 +81,28 @@ void netReadNotifyIO::completion (
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext )
{
//guard.assertIdenticalMutex ( this->mutex );
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0u );
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext,
int status, const char *pContext,
unsigned type, arrayElementCount count )
{
//guard.assertIdenticalMutex ( this->mutex )
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, type, count );
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -25,16 +24,15 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "nciu.h"
#include "cac.h"
#include "db_access.h" // for dbf_type_to_text
#include "caerr.h"
netSubscription::netSubscription (
privateInterfaceForIO & chanIn,
unsigned typeIn, arrayElementCount countIn,
netSubscription::netSubscription (
privateInterfaceForIO & chanIn,
unsigned typeIn, arrayElementCount countIn,
unsigned maskIn, cacStateNotify & notifyIn ) :
count ( countIn ), privateChanForIO ( chanIn ),
notify ( notifyIn ), type ( typeIn ), mask ( maskIn ),
@ -48,11 +46,11 @@ netSubscription::netSubscription (
}
}
netSubscription::~netSubscription ()
netSubscription::~netSubscription ()
{
}
void netSubscription::destroy (
void netSubscription::destroy (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle )
{
this->~netSubscription ();
@ -66,26 +64,26 @@ class netSubscription * netSubscription::isSubscription ()
void netSubscription::show ( unsigned /* level */ ) const
{
::printf ( "event subscription IO at %p, type %s, element count %lu, mask %u\n",
static_cast < const void * > ( this ),
dbf_type_to_text ( static_cast < int > ( this->type ) ),
::printf ( "event subscription IO at %p, type %s, element count %lu, mask %u\n",
static_cast < const void * > ( this ),
dbf_type_to_text ( static_cast < int > ( this->type ) ),
this->count, this->mask );
}
void netSubscription::show (
void netSubscription::show (
epicsGuard < epicsMutex > &, unsigned level ) const
{
this->show ( level );
}
void netSubscription::completion (
void netSubscription::completion (
epicsGuard < epicsMutex > &, cacRecycle & )
{
errlogPrintf ( "subscription update w/o data ?\n" );
}
void netSubscription::exception (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle,
void netSubscription::exception (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle,
int status, const char * pContext )
{
if ( status == ECA_DISCONN ) {
@ -93,7 +91,7 @@ void netSubscription::exception (
}
if ( status == ECA_CHANDESTROY ) {
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
this->~netSubscription ();
recycle.recycleSubscription ( guard, *this );
@ -101,15 +99,15 @@ void netSubscription::exception (
else {
// guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
}
}
}
void netSubscription::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, int status, const char * pContext,
void netSubscription::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, int status, const char * pContext,
unsigned typeIn, arrayElementCount countIn )
{
if ( status == ECA_DISCONN ) {
@ -117,7 +115,7 @@ void netSubscription::exception (
}
if ( status == ECA_CHANDESTROY ) {
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
this->~netSubscription ();
recycle.recycleSubscription ( guard, *this );
@ -125,20 +123,20 @@ void netSubscription::exception (
else {
//guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.exception (
this->notify.exception (
guard, status, pContext, typeIn, countIn );
}
}
}
void netSubscription::completion (
void netSubscription::completion (
epicsGuard < epicsMutex > & guard, cacRecycle &,
unsigned typeIn, arrayElementCount countIn,
unsigned typeIn, arrayElementCount countIn,
const void * pDataIn )
{
// guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.current (
this->notify.current (
guard, typeIn, countIn, pDataIn );
}
}
@ -147,17 +145,17 @@ void netSubscription::subscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
if ( ! this->subscribed ) {
chan.getPIIU(guard)->subscriptionRequest (
chan.getPIIU(guard)->subscriptionRequest (
guard, chan, *this );
this->subscribed = true;
}
}
void netSubscription::unsubscribeIfRequired (
void netSubscription::unsubscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
if ( this->subscribed ) {
chan.getPIIU(guard)->subscriptionCancelRequest (
chan.getPIIU(guard)->subscriptionCancelRequest (
guard, chan, *this );
this->subscribed = false;
}
@ -166,7 +164,7 @@ void netSubscription::unsubscribeIfRequired (
void netSubscription::forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
chan.getPIIU(guard)->subscriptionUpdateRequest (
chan.getPIIU(guard)->subscriptionUpdateRequest (
guard, chan, *this );
}

View File

@ -3,9 +3,8 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@ -29,7 +28,7 @@
#include "nciu.h"
#include "cac.h"
netWriteNotifyIO::netWriteNotifyIO (
netWriteNotifyIO::netWriteNotifyIO (
privateInterfaceForIO & ioComplIntf, cacWriteNotify & notifyIn ) :
notify ( notifyIn ), privateChanForIO ( ioComplIntf )
{
@ -41,19 +40,19 @@ netWriteNotifyIO::~netWriteNotifyIO ()
void netWriteNotifyIO::show ( unsigned /* level */ ) const
{
::printf ( "read write notify IO at %p\n",
::printf ( "read write notify IO at %p\n",
static_cast < const void * > ( this ) );
}
void netWriteNotifyIO::show (
epicsGuard < epicsMutex > &,
void netWriteNotifyIO::show (
epicsGuard < epicsMutex > &,
unsigned level ) const
{
this->show ( level );
}
void netWriteNotifyIO::destroy (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::destroy (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle )
{
this->~netWriteNotifyIO ();
@ -70,10 +69,10 @@ void netWriteNotifyIO::completion (
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
unsigned /* type */, arrayElementCount /* count */,
unsigned /* type */, arrayElementCount /* count */,
const void * /* pData */ )
{
//this->chan.getClient().printf ( "Write response with data ?\n" );
@ -82,26 +81,26 @@ void netWriteNotifyIO::completion (
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::exception (
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char * pContext )
{
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0u );
this->~netWriteNotifyIO ();
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext,
int status, const char *pContext,
unsigned type, arrayElementCount count )
{
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, type, count );
this->~netWriteNotifyIO ();
recycle.recycleWriteNotifyIO ( guard, *this );

View File

@ -3,21 +3,20 @@
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
* Author: J. Hill
* Author: J. Hill
*
*/
#ifndef _NET_CONVERT_H
#define _NET_CONVERT_H
#ifndef INC_net_convert_H
#define INC_net_convert_H
#include "db_access.h"
#include "shareLib.h"
#include "libCaAPI.h"
#ifdef __cplusplus
extern "C" {
@ -25,12 +24,12 @@ extern "C" {
typedef unsigned long arrayElementCount;
epicsShareFunc int caNetConvert (
unsigned type, const void *pSrc, void *pDest,
LIBCA_API int caNetConvert (
unsigned type, const void *pSrc, void *pDest,
int hton, arrayElementCount count );
#ifdef __cplusplus
}
#endif
#endif /* define _NET_CONVERT_H */
#endif /* ifndef INC_net_convert_H */

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