Compare commits
169 Commits
R3.12.0-be
...
R3.12.0-be
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7e17f07af | ||
|
|
8a23d381c4 | ||
|
|
46b9bb6e6a | ||
|
|
9ab85124d3 | ||
|
|
b8f07e873d | ||
|
|
0cfd58942f | ||
|
|
b75d3964d7 | ||
|
|
b9c8cd50e0 | ||
|
|
e7b8b42452 | ||
|
|
4cc62a1fce | ||
|
|
333c985399 | ||
|
|
f513681bc0 | ||
|
|
ddb459d08a | ||
|
|
6aa5ecfa0e | ||
|
|
9bdea89b06 | ||
|
|
3c8b4bf8c0 | ||
|
|
a912205614 | ||
|
|
3b094ac9ae | ||
|
|
13a7380a47 | ||
|
|
f1bc683bd4 | ||
|
|
5d3ded4397 | ||
|
|
4a5cb2a6e5 | ||
|
|
9300dded40 | ||
|
|
cb86cd03a7 | ||
|
|
cee91cb578 | ||
|
|
679e1b8a56 | ||
|
|
f6d91b8876 | ||
|
|
a86c813415 | ||
|
|
be2491bc51 | ||
|
|
1634c70c06 | ||
|
|
df876abf50 | ||
|
|
d5873d5e8a | ||
|
|
b6c87ce10e | ||
|
|
00d40d3e73 | ||
|
|
410e6d9c00 | ||
|
|
03944c94e3 | ||
|
|
b5f31b4b13 | ||
|
|
7bb7e8a884 | ||
|
|
d153387372 | ||
|
|
d4a4b23a55 | ||
|
|
14a152ba72 | ||
|
|
20b6539144 | ||
|
|
93b6da9b3c | ||
|
|
542c0115c5 | ||
|
|
15440b9b6c | ||
|
|
4cb9699c03 | ||
|
|
6460c2fc1d | ||
|
|
9b858b8a5f | ||
|
|
ed30327d93 | ||
|
|
35aba51c7f | ||
|
|
12fd359a3c | ||
|
|
e0b6ce3867 | ||
|
|
c5fce1bd6c | ||
|
|
2dfbf28c1b | ||
|
|
32add4c78f | ||
|
|
9ea5c86ab5 | ||
|
|
48efca8456 | ||
|
|
382c496b24 | ||
|
|
13173544a9 | ||
|
|
19bf9ec448 | ||
|
|
a08656090e | ||
|
|
7b03f77e30 | ||
|
|
80dbdf6814 | ||
|
|
103bd7492a | ||
|
|
e55693525c | ||
|
|
64bd8e03dc | ||
|
|
49b77d096f | ||
|
|
ae720e75af | ||
|
|
bca7b39ab6 | ||
|
|
3600bb9513 | ||
|
|
339d08b71d | ||
|
|
687e1a2c16 | ||
|
|
a53bffb128 | ||
|
|
4a7c1b1715 | ||
|
|
e75c3729b8 | ||
|
|
7cc6c1993d | ||
|
|
63a3b6827c | ||
|
|
b1f570f66d | ||
|
|
239e6cfa2e | ||
|
|
e783ec0de9 | ||
|
|
23f970b821 | ||
|
|
7ff04ea451 | ||
|
|
fd9d79f445 | ||
|
|
a12e94cffb | ||
|
|
d38eaf82cd | ||
|
|
b1382c3f19 | ||
|
|
7eaeac2075 | ||
|
|
96defa3afa | ||
|
|
4b2f0c1d74 | ||
|
|
53bfe9888a | ||
|
|
2c82e2976c | ||
|
|
ea2efa0e47 | ||
|
|
bd5b7b61a0 | ||
|
|
6d2eafd2ca | ||
|
|
67b4dc7064 | ||
|
|
f3ad1f4d4e | ||
|
|
0eb9331f88 | ||
|
|
35b0e4aaba | ||
|
|
1ea57db276 | ||
|
|
062e3d6d32 | ||
|
|
6937834dee | ||
|
|
f9793ec277 | ||
|
|
a93e2e8b26 | ||
|
|
d7275641dc | ||
|
|
9dc64d0063 | ||
|
|
afd124a431 | ||
|
|
a2952bdd75 | ||
|
|
5003f11977 | ||
|
|
8e12035e4a | ||
|
|
294c6778ec | ||
|
|
3178294f08 | ||
|
|
aa9222e276 | ||
|
|
fc18b7d4fb | ||
|
|
d4c7e14fd5 | ||
|
|
76dfa54089 | ||
|
|
24bc06d5ff | ||
|
|
e19085e380 | ||
|
|
69fc84d4a6 | ||
|
|
415ac1f797 | ||
|
|
e4c383cfb5 | ||
|
|
c89e742e67 | ||
|
|
ab11ca0407 | ||
|
|
78f3b493ea | ||
|
|
cdf7a99013 | ||
|
|
47e4ce63b1 | ||
|
|
48cfc5ee15 | ||
|
|
8746390dda | ||
|
|
cbe1a0b970 | ||
|
|
273f7aa5e3 | ||
|
|
e74acbc234 | ||
|
|
b30c979b0b | ||
|
|
68a0f7a00b | ||
|
|
0c9de2c129 | ||
|
|
e3f3d9c87b | ||
|
|
45c5f93950 | ||
|
|
c0e1c071bb | ||
|
|
e95156d29b | ||
|
|
a437b010b3 | ||
|
|
7d3ed265a5 | ||
|
|
85e899484d | ||
|
|
8bb3067b90 | ||
|
|
1b5d92daf1 | ||
|
|
22336dce1b | ||
|
|
1ecdaff1b5 | ||
|
|
de878747c6 | ||
|
|
3cc8bec710 | ||
|
|
2a87278529 | ||
|
|
9bbf6fe17e | ||
|
|
1c4adbf2ce | ||
|
|
0170e0c88a | ||
|
|
7b1c33aa63 | ||
|
|
faf07df760 | ||
|
|
9594f7d245 | ||
|
|
61d8593e66 | ||
|
|
363bf2a47c | ||
|
|
ba5d364469 | ||
|
|
1ea888e720 | ||
|
|
2f4992ceb7 | ||
|
|
3186db5576 | ||
|
|
e7e77e415f | ||
|
|
8bbe24525b | ||
|
|
33074d31f4 | ||
|
|
16c09ec67c | ||
|
|
a79e478a32 | ||
|
|
3941fb3ead | ||
|
|
1eb71e24b6 | ||
|
|
dacd2a6cc5 | ||
|
|
e5dae1d675 | ||
|
|
5f24768671 |
5
Makefile
5
Makefile
@@ -12,6 +12,9 @@
|
||||
# install because the release.% syntax is illegal.
|
||||
#
|
||||
# $Log$
|
||||
# Revision 1.22 1994/11/14 23:12:17 tang
|
||||
# Replace ARCH_TYPE with .
|
||||
#
|
||||
# Revision 1.1.1.1 1994/11/09 01:08:53 epics
|
||||
# Import of R3.12.0Beta
|
||||
#
|
||||
@@ -46,7 +49,7 @@
|
||||
#
|
||||
|
||||
EPICS=..
|
||||
include $(EPICS)/config/CONFIG_SITE
|
||||
include $(EPICS)/config/CONFIG
|
||||
|
||||
all: install
|
||||
|
||||
|
||||
71
README
71
README
@@ -10,20 +10,20 @@ Notes:
|
||||
1. Before you can build or really use EPICS, you must set your
|
||||
path properly:
|
||||
|
||||
set path = ( $path EPICS/base/tools EPICS/base/bin/HOST_ARCH )
|
||||
set path = ( $path EPICS/base/tools EPICS/base/bin/HOST_ARCH \
|
||||
EPICS/extensions/bin HOST_ARCH )
|
||||
|
||||
e.g.:
|
||||
|
||||
set path = ( $path /home/epics/base/tools /home/epics/base/bin/sun4 )
|
||||
set path = ( $path /home/epics/base/tools /home/epics/base/bin/sun4 \
|
||||
/home/epics/extensions/bin/sun4 )
|
||||
|
||||
2. If you are using GNU make (which is now THE supported make utility
|
||||
for the build), you probably want to invoke it with the
|
||||
--no-print-directory option when you are building at the TOP level:
|
||||
2. You must use GNU make (which is now THE supported make utility) for
|
||||
the build. A script, gmake, exists in the base/tools directory to invoke
|
||||
it with the --no-print-directory option. This option will turn off the
|
||||
annoying messages GNU make produces upon entering a directory.
|
||||
|
||||
make --no-print-directory
|
||||
|
||||
This is to turn off the annoying messages GNU make produces upon
|
||||
entering a directory.
|
||||
gmake
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
Part 1 - Configuring and Building EPICS Base
|
||||
@@ -31,13 +31,13 @@ This is to turn off the annoying messages GNU make produces upon
|
||||
|
||||
1.1 To configure EPICS, edit the following files:
|
||||
|
||||
base/config/CONFIG_SITE - Build choices/HOST_ARCH/Vx location.
|
||||
base/config/CONFIG_SITE.* - Location of X, etc.
|
||||
base/config/CONFIG - For overriding specific variables.
|
||||
config/CONFIG_SITE - Build choices/HOST_ARCH/Vx location.
|
||||
config/CONFIG_SITE.* - Location of X, etc.
|
||||
config/CONFIG - For overriding specific variables.
|
||||
|
||||
1.2 To add a target architecture to EPICS:
|
||||
|
||||
cd epics/base/config
|
||||
cd epics/config
|
||||
cp CONFIG_ARCH.mv167 CONFIG_ARCH.YOUR_ARCH
|
||||
edit CONFIG_ARCH.YOUR_ARCH - For compiler flags / etc.
|
||||
|
||||
@@ -50,25 +50,27 @@ This is to turn off the annoying messages GNU make produces upon
|
||||
|
||||
1.3 To build EPICS:
|
||||
|
||||
make - To build and install EPICS.
|
||||
make clean - To clean temporary object files. Clean will
|
||||
remove files from ALL O.ARCH dirs, not
|
||||
only those specified in BUILD_ARCHS.
|
||||
cd epics/base
|
||||
gmake - To build and install EPICS.
|
||||
gmake clean - To clean temporary object files. Clean will
|
||||
remove files from ALL O.ARCH dirs, not
|
||||
only those specified in BUILD_ARCHS.
|
||||
|
||||
1.4 To create an EPICS release:
|
||||
|
||||
edit include/version.h - ONLY IF you need to change the EPICS
|
||||
edit base/include/version.h - ONLY IF you need to change the EPICS
|
||||
version number.
|
||||
|
||||
make release - Will create Tar file, but only after
|
||||
generating dependencies.
|
||||
make built_release - Same as above, but INCLUDING BINARIES.
|
||||
gmake release - Will create Tar file
|
||||
|
||||
gmake built_release - Will create Tar file, after generating
|
||||
dependencies, INCLUDING BINARIES.
|
||||
|
||||
1.5 "Partial" build commands:
|
||||
|
||||
make clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
|
||||
make install.sun4 - Builds sun4 only.
|
||||
make install.mv167 - Builds mv167 only (a HOST_ARCH build must
|
||||
gmake clean.sun4 - Cleans sun4 binaries in O.sun4 dirs only.
|
||||
gmake install.sun4 - Builds sun4 only.
|
||||
gmake install.mv167 - Builds mv167 only (a HOST_ARCH build must
|
||||
be complete before this can be issued).
|
||||
|
||||
NOTES:
|
||||
@@ -81,8 +83,8 @@ NOTES:
|
||||
|
||||
3. During a normal build (a "make" or "make install"), the "depends"
|
||||
dependency will NOT be invoked. Only if "make depends" is run
|
||||
explicitly, or a "make release" is performed will dependencies be
|
||||
generated automatically.
|
||||
explicitly, or a "make built_release" is performed will dependencies
|
||||
be generated automatically.
|
||||
|
||||
4. Temporary objects are stored in src/DIR/O.ARCH, This allows objects
|
||||
for multiple architectures to be maintained at the same time.
|
||||
@@ -130,11 +132,16 @@ define compile and link flags.
|
||||
----------------------------------------------------------------------------
|
||||
CONFIG_COMMON - Contains definitions describing the layout of base.
|
||||
----------------------------------------------------------------------------
|
||||
HRULES - Rules for traversing hierarchical directories.
|
||||
CONFIG_BASE
|
||||
CONFIG_EXTENSIONS - Defines what subdirectories get built by default under
|
||||
base and extensions.
|
||||
----------------------------------------------------------------------------
|
||||
RULES.Vx - Rules for building with VxWorks makefiles.
|
||||
----------------------------------------------------------------------------
|
||||
RULES.Unix - Rules for building with Unix makefiles.
|
||||
----------------------------------------------------------------------------
|
||||
RULES_ARCHS
|
||||
RULES_DIRS - Allows top-level type command syntax in low-level directories.
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Table of files to change when building and adding architectures.
|
||||
@@ -149,10 +156,13 @@ CONFIG_SITE.Unix.ARCH_CLASS m - c* -
|
||||
CONFIG_SITE.Vx.ARCH_CLASS m c* - -
|
||||
CONFIG.Unix.ARCH_CLASS - - c* -
|
||||
CONFIG.Vx.ARCH_CLASS - c* - -
|
||||
CONFIG_COMMON - - - -
|
||||
HRULES - - - -
|
||||
RULES.Vx - - - -
|
||||
RULES.Unix - - - -
|
||||
CONFIG_BASE - - - -
|
||||
CONFIG_EXTENSIONS - - - -
|
||||
CONFIG_COMMON - - - -
|
||||
RULES_ARCHS - - - -
|
||||
RULES_DIRS - - - -
|
||||
|
||||
m - Modify an existing file.
|
||||
c - Create a new file.
|
||||
@@ -229,9 +239,6 @@ RULES.Unix - - - -
|
||||
Dependencies supported by lower level Makefiles:
|
||||
|
||||
depends - Generate include dependencies
|
||||
pre_build - Build e_flex / antelope
|
||||
build_libs - Builds libraries for use in "build"
|
||||
install_libs - Installs these libraries in lib/ARCH
|
||||
build - Builds objects, using libraries from "build_libs"
|
||||
install - Installs executables in bin/ARCH
|
||||
clean - Cleans objects
|
||||
|
||||
29
README.solaris
Normal file
29
README.solaris
Normal file
@@ -0,0 +1,29 @@
|
||||
----------------------------------------------------------------------------
|
||||
EPICS R3.12 Notes for Solaris 2.3
|
||||
- By Andrew Johnson
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Notes:
|
||||
|
||||
1. In order to build and use EPICS under Solaris 2, you must include
|
||||
various directories in your path in the order given below, in addition
|
||||
to those named in base/README. Some of these directories may already be
|
||||
included in your path from your .login script or .cshrc file, so be
|
||||
careful that the ordering is correct.
|
||||
|
||||
setenv PATH /usr/ucb:/usr/bin:/usr/ccs/bin:$PATH
|
||||
|
||||
2. It is not possible to compile the whole of EPICS under Solaris 2
|
||||
using only the GNU gcc compiler - some routines which are needed (for
|
||||
example quiet_nan()) have been unbundled by Sun and are provided with
|
||||
their ANSI C compiler. The path to the Sun compiler is explicitly set
|
||||
using the SPARCWORKS definition in the file CONFIG_SITE.Unix.solaris
|
||||
|
||||
3. EPICS must be compiled and linked using the UCB compatability
|
||||
libraries. The definitions UCB_LIB and UCB_INCLUDE are used here to
|
||||
refer to these libraries and their header files, and the tools provided
|
||||
within /usr/ucb must be used in preference to the System V ones, hence
|
||||
the above path ordering.
|
||||
|
||||
--
|
||||
anj@mail.ast.cam.ac.uk
|
||||
@@ -3,7 +3,7 @@ include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -D_NO_PROTO
|
||||
USR_LDLIBS = -lAs -lCom -lDb -lCom -s
|
||||
USR_LDLIBS = -lAs -lCom -lDb -lCom -lm -s
|
||||
USR_LDFLAGS = -L.
|
||||
|
||||
DEPLIBS_BASE = $(EPICS_BASE_LIB)
|
||||
|
||||
@@ -52,6 +52,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
* .01 10-15-93 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
#endif
|
||||
#include <dbDefs.h>
|
||||
#include <asLib.h>
|
||||
#include <string.h>
|
||||
@@ -60,9 +64,6 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
#include <stdio.h>
|
||||
#include <gpHash.h>
|
||||
#include <freeList.h>
|
||||
#ifdef vxWorks
|
||||
#include <taskLib.h>
|
||||
#endif
|
||||
|
||||
/*Declare storage for Global Variables */
|
||||
ASBASE *pasbase=NULL;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
integer [0-9]
|
||||
name [a-zA-Z0-9_\.]
|
||||
pvname [a-zA-Z0-9_:\.\[\]<>]
|
||||
pvname [a-zA-Z0-9_:\.\[\]<>;]
|
||||
string [a-zA-Z0-9_\,\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$]
|
||||
|
||||
%{
|
||||
|
||||
@@ -15,13 +15,31 @@ $! - You are using Multinet for TCP/IP access. If not, the logical
|
||||
$! name definitions below will need to be changed
|
||||
$!
|
||||
$!
|
||||
$! Arguments : None
|
||||
$! Arguments : optional source file name
|
||||
$!
|
||||
$! Created 16-NOV-1993 Mark L. Rivers
|
||||
$! 05-MAY-1994 Jeff O. Hill Updated for EPICS 3.12
|
||||
$! 07-MAR-1995 Jeff O. Hill Added FTP script
|
||||
$!
|
||||
$!========================================================================
|
||||
$!
|
||||
$! Example FTP script moves sources from UNIX to VMS
|
||||
$! (remove "$!" comment delimeters)
|
||||
$!
|
||||
$! user XXXXXXX
|
||||
$! cd [.ca]
|
||||
$! prompt
|
||||
$! lcd ~/epics/base/src/ca
|
||||
$! mput *.c
|
||||
$! mput *.h
|
||||
$! put BUILD_VMS.COM
|
||||
$! lcd ../libCom
|
||||
$! mput *.c
|
||||
$! mput *.h
|
||||
$! lcd ../../include
|
||||
$! mput *.h
|
||||
$!========================================================================
|
||||
$!
|
||||
$ define /nolog sys multinet_root:[multinet.include.sys]
|
||||
$ define /nolog vms multinet_root:[multinet.include.vms]
|
||||
$ define /nolog net multinet_root:[multinet.include.net]
|
||||
@@ -30,11 +48,13 @@ $ define /nolog arpa multinet_root:[multinet.include.arpa]
|
||||
$ define /nolog tcp multinet_root:[multinet.include]
|
||||
$!
|
||||
$! Compile the functions and test programs
|
||||
$! Define symbol for the CC command
|
||||
$ call set_cc_command
|
||||
$ if (p1 .nes. "")
|
||||
$ then
|
||||
$ cc /defines=(__STDC__)/include=([]) 'p1'
|
||||
$ cc_command 'p1'
|
||||
$ else
|
||||
$ cc /defines=(__STDC__)/include=([]) -
|
||||
$ cc_command -
|
||||
ACCESS, -
|
||||
CONN, -
|
||||
CONVERT, -
|
||||
@@ -51,6 +71,8 @@ VMS_DEPEN, -
|
||||
ELLLIB, -
|
||||
BUCKETLIB, -
|
||||
ENVSUBR, -
|
||||
TSSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
CATIME, -
|
||||
ACCTST
|
||||
$ endif
|
||||
@@ -71,7 +93,9 @@ IF_DEPEN, -
|
||||
VMS_DEPEN, -
|
||||
BSD_DEPEN, -
|
||||
BUCKETLIB, -
|
||||
TSSUBR, -
|
||||
ENVSUBR, -
|
||||
NEXTFIELDSUBR, -
|
||||
ELLLIB
|
||||
$! Link the test programs
|
||||
$ call link acctst
|
||||
@@ -84,10 +108,32 @@ $ catime == "$ EPICS_EXE:catime.exe"
|
||||
$
|
||||
$!
|
||||
$ link: subroutine
|
||||
$ link 'p1', sys$input/options
|
||||
channel_access/lib
|
||||
multinet_socket_library/share
|
||||
sys$share:vaxcrtl/share
|
||||
$! Link differently for VAX and AXP
|
||||
$ if f$getsyi("HW_MODEL") .ge. 1024
|
||||
$ then
|
||||
$ link 'p1', sys$input/options
|
||||
channel_access/lib
|
||||
multinet_socket_library/share
|
||||
$ else
|
||||
$ link 'p1', sys$input/options
|
||||
channel_access/lib
|
||||
multinet_socket_library/share
|
||||
sys$share:vaxcrtl/share
|
||||
$ endif
|
||||
$ endsubroutine
|
||||
$
|
||||
$
|
||||
$! This subroutine sets up "cc_command" to use different switches for
|
||||
$! VAX (assumes VAX C compiler) and AXP (DEC C compiler).
|
||||
$ set_cc_command : subroutine
|
||||
$ if f$getsyi("HW_MODEL") .ge. 1024
|
||||
$ then
|
||||
$! turn of no prototype messages because MULTINET does not
|
||||
$! supply prototypes.
|
||||
$ cc_command:== cc /warn=(disable=IMPLICITFUNC)/float=d_float /include=([], [-.include], [-.libcom])
|
||||
$ else
|
||||
$ cc_command:== cc /include=([], [-.include], [-.libcom])
|
||||
$ endif
|
||||
$ endsubroutine
|
||||
$! ************************************************************
|
||||
|
||||
|
||||
@@ -2,26 +2,27 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
|
||||
USR_LDLIBS = -lca -lCom
|
||||
USR_LDLIBS = -lca -lCom -lm
|
||||
USR_LDFLAGS = -L.
|
||||
|
||||
DEPLIBS_BASE = $(EPICS_BASE_LIB)
|
||||
DEPLIBS = ./libca.a\
|
||||
$(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
|
||||
SRCS.c = \
|
||||
../iocinf.c ../access.c ../test_event.c ../service.c \
|
||||
../flow_control.c ../repeater.c ../conn.c ../acctst.c \
|
||||
../flow_control.c ../repeater.c ../conn.c \
|
||||
../syncgrp.c ../if_depen.c ../netdb_depen.c ../bsd_depen.c \
|
||||
../posix_depen.c ../caRepeater.c ../acctst.c
|
||||
../posix_depen.c ../caRepeater.c ../acctst.c ../catime.c \
|
||||
../convert.c
|
||||
|
||||
OBJS = caRepeater.o
|
||||
|
||||
LIBOBJS = \
|
||||
iocinf.o access.o test_event.o service.o flow_control.o repeater.o \
|
||||
conn.o syncgrp.o if_depen.o netdb_depen.o \
|
||||
bsd_depen.o posix_depen.o
|
||||
bsd_depen.o posix_depen.o convert.o
|
||||
|
||||
LIBNAME = libca.a
|
||||
|
||||
@@ -30,8 +31,16 @@ PROD = caRepeater
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
|
||||
acctst: acctst.o $(DEPLIBS_BASE)/libCom.a libca.a
|
||||
acctst: acctst.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
acctst.o: ../acctst.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
catime: catime.o $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
$(LINK.c) -o $@ $< $(LIBOBJS) $(DEPLIBS_BASE)/libCom.a
|
||||
|
||||
catime.o: ../catime.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
|
||||
|
||||
@@ -2,12 +2,11 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -DACCESS_SECURITY -D_NO_PROTO
|
||||
|
||||
SRCS.c = \
|
||||
../iocinf.c ../access.c ../test_event.c ../service.c \
|
||||
../flow_control.c ../repeater.c ../conn.c ../syncgrp.c \
|
||||
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c
|
||||
../if_depen.c ../bsd_depen.c ../vxWorks_depen.c ../acctst.c \
|
||||
../catime.c
|
||||
|
||||
OBJS = \
|
||||
iocinf.o access.o test_event.o service.o flow_control.o \
|
||||
@@ -20,3 +19,10 @@ include $(EPICS)/config/RULES.Vx
|
||||
caLib: $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
acctst.o: ../acctst.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
catime.o: ../catime.c
|
||||
$(COMPILE.c) $<
|
||||
|
||||
|
||||
344
src/ca/access.c
344
src/ca/access.c
@@ -134,6 +134,8 @@ static char *sccsId = "@(#) $Id$";
|
||||
|
||||
#include "iocinf.h"
|
||||
#include "net_convert.h"
|
||||
#include <epicsPrint.h>
|
||||
#include <stdarg.h> /* for VMS old CC include order madness */
|
||||
|
||||
|
||||
/****************************************************************/
|
||||
@@ -142,19 +144,6 @@ static char *sccsId = "@(#) $Id$";
|
||||
#define EXTMSGPTR(PIIU)\
|
||||
((struct extmsg *) &(PIIU)->send.buf[(PIIU)->send.wtix])
|
||||
|
||||
/*
|
||||
* Performs worst case message alignment
|
||||
*/
|
||||
#define CAC_ADD_MSG(PIIU) \
|
||||
{ \
|
||||
unsigned long size; \
|
||||
struct extmsg *mp = EXTMSGPTR(PIIU); \
|
||||
size = mp->m_postsize = CA_MESSAGE_ALIGN(mp->m_postsize); \
|
||||
mp->m_postsize = htons(mp->m_postsize); \
|
||||
CAC_RING_BUFFER_WRITE_ADVANCE( \
|
||||
&(PIIU)->send, sizeof(struct extmsg) + size); \
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -189,12 +178,14 @@ static struct extmsg nullmsg;
|
||||
/*
|
||||
* local functions
|
||||
*/
|
||||
|
||||
#if 0
|
||||
LOCAL int cac_alloc_msg(
|
||||
struct ioc_in_use *piiu,
|
||||
unsigned extsize,
|
||||
struct extmsg **ppMsg
|
||||
);
|
||||
#endif
|
||||
|
||||
LOCAL int cac_alloc_msg_no_flush(
|
||||
struct ioc_in_use *piiu,
|
||||
unsigned extsize,
|
||||
@@ -230,6 +221,8 @@ struct extmsg *pmsg,
|
||||
void *pext
|
||||
);
|
||||
|
||||
LOCAL void cac_add_msg (IIU *piiu);
|
||||
|
||||
#ifdef CONVERSION_REQUIRED
|
||||
LOCAL void *malloc_put_convert(unsigned long size);
|
||||
LOCAL void free_put_convert(void *pBuf);
|
||||
@@ -253,15 +246,17 @@ void *pext
|
||||
)
|
||||
{
|
||||
struct extmsg msg;
|
||||
unsigned long bytesAvailable;
|
||||
unsigned long actualextsize;
|
||||
unsigned long extsize;
|
||||
unsigned long bytesSent;
|
||||
unsigned bytesAvailable;
|
||||
unsigned actualextsize;
|
||||
unsigned extsize;
|
||||
unsigned msgsize;
|
||||
unsigned bytesSent;
|
||||
|
||||
msg = *pmsg;
|
||||
actualextsize = pmsg->m_postsize;
|
||||
extsize = CA_MESSAGE_ALIGN(pmsg->m_postsize);
|
||||
msg.m_postsize = htons(extsize);
|
||||
msg.m_postsize = htons((ca_uint16_t)extsize);
|
||||
msgsize = extsize+sizeof(msg);
|
||||
|
||||
|
||||
LOCK;
|
||||
@@ -278,13 +273,13 @@ void *pext
|
||||
* o Does not allow for messages larger than the
|
||||
* ring buffer size.
|
||||
*/
|
||||
if(extsize+sizeof(msg)>piiu->send.max_msg){
|
||||
if(msgsize>piiu->send.max_msg){
|
||||
return ECA_TOLARGE;
|
||||
}
|
||||
|
||||
bytesAvailable = cacRingBufferWriteSize(&piiu->send, FALSE);
|
||||
|
||||
if (bytesAvailable<extsize+sizeof(msg)) {
|
||||
if (bytesAvailable<msgsize) {
|
||||
/*
|
||||
* try to send first so that we avoid the
|
||||
* overhead of select() in high throughput
|
||||
@@ -294,7 +289,7 @@ void *pext
|
||||
bytesAvailable =
|
||||
cacRingBufferWriteSize(&piiu->send, FALSE);
|
||||
|
||||
while(bytesAvailable<extsize+sizeof(msg)){
|
||||
while(TRUE){
|
||||
struct timeval itimeout;
|
||||
|
||||
/*
|
||||
@@ -309,16 +304,35 @@ void *pext
|
||||
UNLOCK;
|
||||
|
||||
LD_CA_TIME (SELECT_POLL, &itimeout);
|
||||
cac_mux_io(&itimeout);
|
||||
cac_mux_io (&itimeout);
|
||||
|
||||
LOCK;
|
||||
|
||||
bytesAvailable = cacRingBufferWriteSize(
|
||||
&piiu->send,
|
||||
FALSE);
|
||||
if(bytesAvailable>=extsize+sizeof(msg)){
|
||||
/*
|
||||
* record the time if we end up blocking so that
|
||||
* we can time out
|
||||
*/
|
||||
if (bytesAvailable>=extsize+sizeof(msg)) {
|
||||
# if DEBUG
|
||||
If (piiu->sendPending) {
|
||||
printf ("-Unblocked-\n");
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
piiu->sendPending = FALSE;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
if (!piiu->sendPending) {
|
||||
# if DEBUG
|
||||
printf ("-Blocked-\n");
|
||||
# endif /* DEBUG */
|
||||
piiu->timeAtSendBlock = ca_static->currentTime;
|
||||
piiu->sendPending = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -347,8 +361,8 @@ void *pext
|
||||
* if present
|
||||
*/
|
||||
{
|
||||
static nullBuff[32];
|
||||
int n;
|
||||
static nullBuff[32];
|
||||
unsigned n;
|
||||
|
||||
n = extsize-actualextsize;
|
||||
if(n){
|
||||
@@ -412,81 +426,29 @@ struct extmsg **ppMsg
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* cac_alloc_msg()
|
||||
*
|
||||
* return a pointer to reserved message buffer space or
|
||||
* nill if the message will not fit
|
||||
*
|
||||
* LOCK should be on
|
||||
*
|
||||
*/
|
||||
LOCAL int cac_alloc_msg(
|
||||
struct ioc_in_use *piiu,
|
||||
unsigned extsize,
|
||||
struct extmsg **ppMsg
|
||||
)
|
||||
* cac_add_msg ()
|
||||
*/
|
||||
LOCAL void cac_add_msg (IIU *piiu)
|
||||
{
|
||||
unsigned msgsize;
|
||||
unsigned long bytesAvailable;
|
||||
struct extmsg *pmsg;
|
||||
|
||||
msgsize = sizeof(struct extmsg)+extsize;
|
||||
unsigned long size;
|
||||
struct extmsg *mp = EXTMSGPTR(piiu);
|
||||
|
||||
/*
|
||||
* fail if max message size exceeded
|
||||
* Performs worst case message alignment
|
||||
*/
|
||||
if(msgsize>=piiu->send.max_msg){
|
||||
return ECA_TOLARGE;
|
||||
}
|
||||
|
||||
bytesAvailable = cacRingBufferWriteSize(&piiu->send, TRUE);
|
||||
if (bytesAvailable<msgsize) {
|
||||
/*
|
||||
* try to send first so that we avoid the
|
||||
* overhead of select() in high throughput
|
||||
* situations
|
||||
*/
|
||||
(*piiu->sendBytes)(piiu);
|
||||
bytesAvailable = cacRingBufferWriteSize(
|
||||
&piiu->send,
|
||||
TRUE);
|
||||
|
||||
while (bytesAvailable<msgsize) {
|
||||
struct timeval itimeout;
|
||||
|
||||
/*
|
||||
* if connection drops request
|
||||
* cant be completed
|
||||
*/
|
||||
if(!piiu->conn_up){
|
||||
return ECA_BADCHID;
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
LD_CA_TIME (SELECT_POLL, &itimeout);
|
||||
cac_mux_io(&itimeout);
|
||||
LOCK;
|
||||
|
||||
bytesAvailable = cacRingBufferWriteSize(
|
||||
&piiu->send,
|
||||
TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
pmsg = (struct extmsg *) &piiu->send.buf[piiu->send.wtix];
|
||||
pmsg->m_postsize = extsize;
|
||||
*ppMsg = pmsg;
|
||||
|
||||
return ECA_NORMAL;
|
||||
mp->m_postsize = (unsigned short)
|
||||
CA_MESSAGE_ALIGN(mp->m_postsize);
|
||||
size = mp->m_postsize;
|
||||
mp->m_postsize = htons(mp->m_postsize);
|
||||
CAC_RING_BUFFER_WRITE_ADVANCE(
|
||||
&piiu->send,
|
||||
sizeof(struct extmsg) + size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* CA_TASK_INITIALIZE
|
||||
*
|
||||
*
|
||||
*/
|
||||
int APIENTRY ca_task_initialize(void)
|
||||
{
|
||||
@@ -518,6 +480,8 @@ int ca_os_independent_init (void)
|
||||
ca_static->ca_exception_func = ca_default_exception_handler;
|
||||
ca_static->ca_exception_arg = NULL;
|
||||
|
||||
caSetDefaultPrintfHandler();
|
||||
|
||||
/* record a default user name */
|
||||
ca_static->ca_pUserName = localUserName();
|
||||
if(!ca_static->ca_pUserName){
|
||||
@@ -533,6 +497,8 @@ int ca_os_independent_init (void)
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
|
||||
/* init sync group facility */
|
||||
ca_sg_init();
|
||||
|
||||
@@ -541,10 +507,10 @@ int ca_os_independent_init (void)
|
||||
*/
|
||||
ca_static->ca_search_retry = 0;
|
||||
ca_static->ca_conn_next_retry = CA_CURRENT_TIME;
|
||||
sec = CA_RECAST_DELAY;
|
||||
sec = (unsigned) CA_RECAST_DELAY;
|
||||
ca_static->ca_conn_retry_delay.tv_sec = sec;
|
||||
ca_static->ca_conn_retry_delay.tv_usec =
|
||||
(CA_RECAST_DELAY-sec)*USEC_PER_SEC;
|
||||
(long) ((CA_RECAST_DELAY-sec)*USEC_PER_SEC);
|
||||
|
||||
ellInit(&ca_static->ca_iiuList);
|
||||
ellInit(&ca_static->ca_ioeventlist);
|
||||
@@ -597,8 +563,6 @@ int ca_os_independent_init (void)
|
||||
*/
|
||||
LOCAL void create_udp_fd()
|
||||
{
|
||||
int pri;
|
||||
char name[64];
|
||||
int status;
|
||||
|
||||
if(ca_static->ca_piiuCast){
|
||||
@@ -615,38 +579,43 @@ LOCAL void create_udp_fd()
|
||||
}
|
||||
|
||||
#ifdef vxWorks
|
||||
status = taskPriorityGet(VXTASKIDSELF, &pri);
|
||||
if(status<0)
|
||||
ca_signal(ECA_INTERNAL,NULL);
|
||||
{
|
||||
int pri;
|
||||
char name[64];
|
||||
|
||||
strcpy(name,"RD ");
|
||||
strncat(
|
||||
name,
|
||||
taskName(VXTHISTASKID),
|
||||
sizeof(name)-strlen(name)-1);
|
||||
status = taskPriorityGet(VXTASKIDSELF, &pri);
|
||||
if(status<0)
|
||||
ca_signal(ECA_INTERNAL,NULL);
|
||||
|
||||
strcpy(name,"RD ");
|
||||
strncat(
|
||||
name,
|
||||
taskName(VXTHISTASKID),
|
||||
sizeof(name)-strlen(name)-1);
|
||||
|
||||
status = taskSpawn(
|
||||
name,
|
||||
pri-1,
|
||||
VX_FP_TASK,
|
||||
4096,
|
||||
(FUNCPTR)cac_recv_task,
|
||||
(int)taskIdCurrent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
if (status<0) {
|
||||
ca_signal(ECA_INTERNAL,NULL);
|
||||
}
|
||||
|
||||
ca_static->recv_tid = status;
|
||||
|
||||
status = taskSpawn(
|
||||
name,
|
||||
pri-1,
|
||||
VX_FP_TASK,
|
||||
4096,
|
||||
(FUNCPTR)cac_recv_task,
|
||||
(int)taskIdCurrent,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
if (status<0) {
|
||||
ca_signal(ECA_INTERNAL,NULL);
|
||||
}
|
||||
|
||||
ca_static->recv_tid = status;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1072,7 +1041,7 @@ int APIENTRY ca_search_and_connect
|
||||
chix->pConnFunc = conn_func;
|
||||
chix->type = TYPENOTCONN; /* invalid initial type */
|
||||
chix->count = 0; /* invalid initial count */
|
||||
chix->id.sid = ~0L; /* invalid initial server id */
|
||||
chix->id.sid = ~0U; /* invalid initial server id */
|
||||
|
||||
chix->state = cs_never_conn;
|
||||
ellInit(&chix->eventq);
|
||||
@@ -1088,10 +1057,10 @@ int APIENTRY ca_search_and_connect
|
||||
*/
|
||||
ca_static->ca_search_retry = 0;
|
||||
ca_static->ca_conn_next_retry = CA_CURRENT_TIME;
|
||||
sec = CA_RECAST_DELAY;
|
||||
sec = (int) CA_RECAST_DELAY;
|
||||
ca_static->ca_conn_retry_delay.tv_sec = sec;
|
||||
ca_static->ca_conn_retry_delay.tv_usec =
|
||||
(CA_RECAST_DELAY-sec)*USEC_PER_SEC;
|
||||
(long) ((CA_RECAST_DELAY-sec)*USEC_PER_SEC);
|
||||
|
||||
UNLOCK;
|
||||
|
||||
@@ -1152,7 +1121,7 @@ int reply_type
|
||||
mptr++;
|
||||
strncpy((char *)mptr, (char *)(chix + 1), size);
|
||||
|
||||
CAC_ADD_MSG(piiu);
|
||||
cac_add_msg(piiu);
|
||||
|
||||
/*
|
||||
* increment the number of times we have tried this
|
||||
@@ -1721,7 +1690,7 @@ void *pvalue
|
||||
struct extmsg hdr;
|
||||
int postcnt;
|
||||
unsigned size_of_one;
|
||||
int i;
|
||||
unsigned i;
|
||||
# ifdef CONVERSION_REQUIRED
|
||||
void *pCvrtBuf;
|
||||
void *pdest;
|
||||
@@ -1777,6 +1746,8 @@ void *pvalue
|
||||
|
||||
case DBR_ENUM:
|
||||
case DBR_SHORT:
|
||||
case DBR_PUT_ACKT:
|
||||
case DBR_PUT_ACKS:
|
||||
# if DBR_INT != DBR_SHORT
|
||||
case DBR_INT:
|
||||
# endif /*DBR_INT != DBR_SHORT*/
|
||||
@@ -1812,10 +1783,10 @@ void *pvalue
|
||||
|
||||
hdr.m_cmmd = htons(cmd);
|
||||
hdr.m_type = htons(type);
|
||||
hdr.m_count = htons(count);
|
||||
hdr.m_count = htons((ca_uint16_t)count);
|
||||
hdr.m_cid = chix->id.sid;
|
||||
hdr.m_available = id;
|
||||
hdr.m_postsize = postcnt;
|
||||
hdr.m_postsize = (ca_uint16_t) postcnt;
|
||||
|
||||
status = cac_push_msg(piiu, &hdr, pvalue);
|
||||
|
||||
@@ -2033,7 +2004,6 @@ long mask
|
||||
{
|
||||
evid monix;
|
||||
int status;
|
||||
int size;
|
||||
|
||||
INITCHK;
|
||||
LOOSECHIXCHK(chix);
|
||||
@@ -2063,7 +2033,8 @@ long mask
|
||||
|
||||
if (!chix->piiu) {
|
||||
# ifdef vxWorks
|
||||
static int dbevsize;
|
||||
int size;
|
||||
static int dbevsize;
|
||||
|
||||
if(!dbevsize){
|
||||
dbevsize = db_sizeof_event_block();
|
||||
@@ -2098,7 +2069,7 @@ long mask
|
||||
monix->p_delta = p_delta;
|
||||
monix->n_delta = n_delta;
|
||||
monix->timeout = timeout;
|
||||
monix->mask = mask;
|
||||
monix->mask = (unsigned short) mask;
|
||||
|
||||
# ifdef vxWorks
|
||||
if(!chix->piiu){
|
||||
@@ -2169,8 +2140,10 @@ int ca_request_event(evid monix)
|
||||
unsigned count;
|
||||
struct monops msg;
|
||||
struct ioc_in_use *piiu;
|
||||
ca_float32_t p_delta;
|
||||
ca_float32_t n_delta;
|
||||
ca_float32_t tmo;
|
||||
|
||||
|
||||
piiu = chix->piiu;
|
||||
|
||||
/*
|
||||
@@ -2201,10 +2174,14 @@ int ca_request_event(evid monix)
|
||||
msg.m_header.m_postsize = sizeof(msg.m_info);
|
||||
|
||||
/* msg body */
|
||||
htonf(&monix->p_delta, &msg.m_info.m_hval);
|
||||
htonf(&monix->n_delta, &msg.m_info.m_lval);
|
||||
htonf(&monix->timeout, &msg.m_info.m_toval);
|
||||
p_delta = (ca_float32_t) monix->p_delta;
|
||||
n_delta = (ca_float32_t) monix->n_delta;
|
||||
tmo = (ca_float32_t) monix->timeout;
|
||||
htonf(&p_delta, &msg.m_info.m_hval);
|
||||
htonf(&n_delta, &msg.m_info.m_lval);
|
||||
htonf(&tmo, &msg.m_info.m_toval);
|
||||
msg.m_info.m_mask = htons(monix->mask);
|
||||
msg.m_info.m_pad = 0; /* allow future use */
|
||||
|
||||
status = cac_push_msg(piiu, &msg.m_header, &msg.m_info);
|
||||
|
||||
@@ -2563,9 +2540,9 @@ int APIENTRY ca_clear_channel (chid chix)
|
||||
/* msg header */
|
||||
hdr.m_cmmd = htons(IOC_CLEAR_CHANNEL);
|
||||
hdr.m_available = chix->cid;
|
||||
hdr.m_cid = chix->id.sid;
|
||||
hdr.m_type = htons(0);
|
||||
hdr.m_count = htons(0);
|
||||
hdr.m_cid = chix->id.sid;
|
||||
hdr.m_postsize = 0;
|
||||
|
||||
status = cac_push_msg(piiu, &hdr, NULL);
|
||||
@@ -2645,7 +2622,6 @@ void clearChannelResources(unsigned id)
|
||||
int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
{
|
||||
struct timeval beg_time;
|
||||
struct timeval cur_time;
|
||||
ca_real delay;
|
||||
|
||||
INITCHK;
|
||||
@@ -2664,28 +2640,32 @@ int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
* Also takes care of outstanding recvs
|
||||
* for single threaded clients
|
||||
*/
|
||||
#if 0
|
||||
ca_flush_io();
|
||||
#endif
|
||||
|
||||
if(pndrecvcnt<1 && early){
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
cac_gettimeval(&beg_time);
|
||||
|
||||
/*
|
||||
* the current time set iderectly within ca_flush_io()
|
||||
* above.
|
||||
*/
|
||||
beg_time = ca_static->currentTime;
|
||||
delay = 0.0;
|
||||
while(TRUE){
|
||||
ca_real remaining;
|
||||
struct timeval tmo;
|
||||
|
||||
if(pndrecvcnt<1 && early)
|
||||
if (pndrecvcnt<1 && early) {
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
if(timeout == 0.0){
|
||||
remaining = SELECT_POLL;
|
||||
}
|
||||
else{
|
||||
|
||||
cac_gettimeval (&cur_time);
|
||||
delay = cac_time_diff (&cur_time, &beg_time);
|
||||
remaining = timeout-delay;
|
||||
if(remaining<=0.0){
|
||||
if(early){
|
||||
@@ -2700,9 +2680,17 @@ int APIENTRY ca_pend(ca_real timeout, int early)
|
||||
remaining = min(SELECT_POLL, remaining);
|
||||
}
|
||||
|
||||
tmo.tv_sec = remaining;
|
||||
tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC;
|
||||
tmo.tv_sec = (long) remaining;
|
||||
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
|
||||
cac_block_for_io_completion(&tmo);
|
||||
|
||||
/*
|
||||
* the current time set within cac_block_for_io_completion()
|
||||
* above.
|
||||
*/
|
||||
if (timeout != 0.0) {
|
||||
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2714,13 +2702,13 @@ ca_real cac_time_diff (ca_time *pTVA, ca_time *pTVB)
|
||||
{
|
||||
ca_real delay;
|
||||
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec;
|
||||
if(pTVA->tv_usec>pTVB->tv_usec){
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec;
|
||||
delay += (pTVA->tv_usec - pTVB->tv_usec) /
|
||||
(ca_real)(USEC_PER_SEC);
|
||||
}
|
||||
else{
|
||||
delay -= 1.0;
|
||||
delay = pTVA->tv_sec - pTVB->tv_sec - 1L;
|
||||
delay += (USEC_PER_SEC - pTVB->tv_usec + pTVA->tv_usec) /
|
||||
(ca_real)(USEC_PER_SEC);
|
||||
}
|
||||
@@ -3015,7 +3003,7 @@ int echo_request(struct ioc_in_use *piiu, ca_time *pCurrentTime)
|
||||
phdr->m_available = htons(0);
|
||||
phdr->m_postsize = 0;
|
||||
|
||||
CAC_ADD_MSG(piiu);
|
||||
cac_add_msg(piiu);
|
||||
|
||||
piiu->echoPending = TRUE;
|
||||
piiu->send_needed = TRUE;
|
||||
@@ -3214,7 +3202,7 @@ LOCAL void ca_default_exception_handler(struct exception_handler_args args)
|
||||
*/
|
||||
LOCK;
|
||||
sprintf(sprintf_buf,
|
||||
"%s - with request chan=%s op=%d data type=%s count=%d\n",
|
||||
"%s - with request chan=%s op=%d data type=%s count=%d",
|
||||
args.ctx,
|
||||
pName,
|
||||
args.op,
|
||||
@@ -3265,7 +3253,7 @@ int ca_defunct()
|
||||
* currently implemented as a function
|
||||
* (may be implemented as a MACRO in the future)
|
||||
*/
|
||||
char APIENTRY *ca_host_name_function(chid chix)
|
||||
char * APIENTRY ca_host_name_function(chid chix)
|
||||
{
|
||||
IIU *piiu;
|
||||
|
||||
@@ -3353,3 +3341,51 @@ int ca_channel_status(int tid)
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
#endif /*vxWorks*/
|
||||
|
||||
|
||||
/*
|
||||
* ca_replace_printf_handler ()
|
||||
*/
|
||||
int APIENTRY ca_replace_printf_handler (
|
||||
int (*ca_printf_func)(const char *pformat, va_list args)
|
||||
)
|
||||
{
|
||||
if (ca_printf_func) {
|
||||
ca_static->ca_printf_func = ca_printf_func;
|
||||
}
|
||||
else {
|
||||
/*
|
||||
* os dependent
|
||||
*/
|
||||
caSetDefaultPrintfHandler();
|
||||
}
|
||||
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* ca_printf()
|
||||
*/
|
||||
int ca_printf(char *pformat, ...)
|
||||
{
|
||||
int (*ca_printf_func)(const char *pformat, va_list args);
|
||||
va_list theArgs;
|
||||
int status;
|
||||
|
||||
va_start(theArgs, pformat);
|
||||
|
||||
ca_printf_func = epicsVprintf;
|
||||
if (ca_static) {
|
||||
if (ca_static->ca_printf_func) {
|
||||
ca_printf_func = ca_static->ca_printf_func;
|
||||
}
|
||||
}
|
||||
|
||||
status = (*ca_printf_func) (pformat, theArgs);
|
||||
|
||||
va_end(theArgs);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,11 +9,17 @@ static char *sccsId = "@(#) $Id$";
|
||||
#include <LIB$ROUTINES.H>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ANSI
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
#include "os_depen.h"
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <cadef.h>
|
||||
|
||||
#define EVENT_ROUTINE null_event
|
||||
@@ -218,22 +224,22 @@ int doacctst(char *pname)
|
||||
|
||||
double dval = 3.3;
|
||||
float fval = -8893.3;
|
||||
double dret;
|
||||
float fret;
|
||||
double dret = DBL_MAX;
|
||||
float fret = FLT_MAX;
|
||||
|
||||
status = ca_put(DBR_DOUBLE, chix1, &dval);
|
||||
SEVCHK(status, NULL);
|
||||
status = ca_get(DBR_DOUBLE, chix1, &dret);
|
||||
SEVCHK(status, NULL);
|
||||
ca_pend_io(30.0);
|
||||
assert(dval - dret < .000001);
|
||||
assert( fabs(dval-dret) < DBL_EPSILON*4);
|
||||
|
||||
status = ca_put(DBR_FLOAT, chix1, &fval);
|
||||
SEVCHK(status, NULL);
|
||||
status = ca_get(DBR_FLOAT, chix1, &fret);
|
||||
SEVCHK(status, NULL);
|
||||
ca_pend_io(30.0);
|
||||
assert(fval - fret < .0001);
|
||||
assert( fabs(fval-fret) < FLT_EPSILON*4);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -556,8 +562,8 @@ void conn_cb(struct event_handler_args args)
|
||||
void test_sync_groups(chid chix)
|
||||
{
|
||||
int status;
|
||||
CA_SYNC_GID gid1;
|
||||
CA_SYNC_GID gid2;
|
||||
CA_SYNC_GID gid1=0;
|
||||
CA_SYNC_GID gid2=0;
|
||||
|
||||
printf("Performing sync group test...");
|
||||
fflush(stdout);
|
||||
|
||||
@@ -18,8 +18,8 @@ void caAddConfiguredAddr(
|
||||
SOCKET socket,
|
||||
int port);
|
||||
|
||||
int local_addr(SOCKET socket, struct sockaddr_in *plcladdr);
|
||||
|
||||
int local_addr(SOCKET socket, struct sockaddr_in *plcladdr);
|
||||
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort);
|
||||
|
||||
union caAddr{
|
||||
struct sockaddr_in inetAddr;
|
||||
|
||||
@@ -42,13 +42,17 @@
|
||||
*/
|
||||
int cac_select_io(struct timeval *ptimeout, int flags)
|
||||
{
|
||||
/*
|
||||
* Use auto timeout so there is no chance of
|
||||
* recursive reuse of ptimeout
|
||||
*/
|
||||
struct timeval autoTimeOut = *ptimeout;
|
||||
long status;
|
||||
IIU *piiu;
|
||||
unsigned long freespace;
|
||||
int maxfd;
|
||||
SOCKET maxfd;
|
||||
caFDInfo *pfdi;
|
||||
|
||||
|
||||
LOCK;
|
||||
pfdi = (caFDInfo *) ellGet(&ca_static->fdInfoFreeList);
|
||||
|
||||
@@ -87,39 +91,59 @@ int cac_select_io(struct timeval *ptimeout, int flags)
|
||||
}
|
||||
|
||||
if (flags&CA_DO_SENDS) {
|
||||
if (cacRingBufferReadSize(&piiu->send, FALSE)>0) {
|
||||
if (cacRingBufferReadSize(&piiu->send, FALSE)>0) {
|
||||
maxfd = max (maxfd,piiu->sock_chan);
|
||||
FD_SET (piiu->sock_chan, &pfdi->writeMask);
|
||||
}
|
||||
FD_SET (piiu->sock_chan, &pfdi->writeMask);
|
||||
}
|
||||
}
|
||||
}
|
||||
UNLOCK;
|
||||
|
||||
#if 0
|
||||
printf( "max fd=%d tv_usec=%d tv_sec=%d\n",
|
||||
maxfd,
|
||||
ptimeout->tv_usec,
|
||||
ptimeout->tv_sec);
|
||||
#endif
|
||||
# if 0
|
||||
if (maxfd==0) {
|
||||
printf( "max fd=%d tv_usec=%d tv_sec=%d\n",
|
||||
maxfd,
|
||||
ptimeout->tv_usec,
|
||||
ptimeout->tv_sec);
|
||||
}
|
||||
# endif
|
||||
|
||||
#if defined(vxWorks) && 0
|
||||
if(client_lock->recurse>0){
|
||||
ca_printf("lock is on and we are going to sleep %d!",
|
||||
client_lock->recurse);
|
||||
taskSuspend(0);
|
||||
}
|
||||
#endif
|
||||
# if 0 && defined(vxWorks)
|
||||
if(client_lock->recurse>0){
|
||||
ca_printf("lock is on and we are going to sleep %d!",
|
||||
client_lock->recurse);
|
||||
taskSuspend(0);
|
||||
}
|
||||
# endif
|
||||
|
||||
status = select(
|
||||
maxfd+1,
|
||||
&pfdi->readMask,
|
||||
&pfdi->writeMask,
|
||||
NULL,
|
||||
ptimeout);
|
||||
# if defined(__hpux)
|
||||
status = select(
|
||||
maxfd+1,
|
||||
(int *)&pfdi->readMask,
|
||||
(int *)&pfdi->writeMask,
|
||||
(int *)NULL,
|
||||
&autoTimeOut);
|
||||
# else
|
||||
status = select(
|
||||
maxfd+1,
|
||||
&pfdi->readMask,
|
||||
&pfdi->writeMask,
|
||||
NULL,
|
||||
&autoTimeOut);
|
||||
# endif
|
||||
|
||||
# if 0
|
||||
if(status<0){
|
||||
printf("leaving select stat=%d - %s \n",
|
||||
status, strerror(MYERRNO) );
|
||||
}
|
||||
else if (status==0) {
|
||||
printf("tmo in select\n");
|
||||
}
|
||||
# endif
|
||||
|
||||
cac_gettimeval (&ca_static->currentTime);
|
||||
|
||||
#if 0
|
||||
printf("leaving select stat=%d errno=%d \n", status, MYERRNO);
|
||||
#endif
|
||||
if (status<0) {
|
||||
if (MYERRNO == EINTR) {
|
||||
}
|
||||
@@ -145,13 +169,13 @@ printf("leaving select stat=%d errno=%d \n", status, MYERRNO);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FD_ISSET(piiu->sock_chan,&pfdi->writeMask)) {
|
||||
(*piiu->sendBytes)(piiu);
|
||||
}
|
||||
|
||||
if (FD_ISSET(piiu->sock_chan,&pfdi->readMask)) {
|
||||
(*piiu->recvBytes)(piiu);
|
||||
}
|
||||
|
||||
if (FD_ISSET(piiu->sock_chan,&pfdi->writeMask)) {
|
||||
(*piiu->sendBytes)(piiu);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <iocinf.h>
|
||||
|
||||
main()
|
||||
{
|
||||
ca_repeater();
|
||||
assert(0);
|
||||
ca_repeater ();
|
||||
assert (0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
@@ -52,12 +52,7 @@ static char *sccsId = "@(#) $Id$";
|
||||
* Dump error messages to the appropriate place
|
||||
*
|
||||
*/
|
||||
#ifdef __STDC__
|
||||
int ca_printf(char *pformat, ...)
|
||||
#else
|
||||
int ca_printf(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list args;
|
||||
int status;
|
||||
@@ -65,29 +60,9 @@ va_dcl
|
||||
va_start(args, pformat);
|
||||
|
||||
#if defined(vxWorks)
|
||||
{
|
||||
int logMsgArgs[6];
|
||||
int i;
|
||||
|
||||
for(i=0; i< NELEMENTS(logMsgArgs); i++){
|
||||
logMsgArgs[i] = va_arg(args, int);
|
||||
}
|
||||
|
||||
status = logMsg(
|
||||
pformat,
|
||||
logMsgArgs[0],
|
||||
logMsgArgs[1],
|
||||
logMsgArgs[2],
|
||||
logMsgArgs[3],
|
||||
logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
|
||||
}
|
||||
status = mprintf(pformat, args);
|
||||
#else
|
||||
status = vfprintf(
|
||||
stderr,
|
||||
pformat,
|
||||
args);
|
||||
status = vfprintf(stderr, pformat, args);
|
||||
#endif
|
||||
|
||||
va_end(args);
|
||||
|
||||
507
src/ca/catime.c
507
src/ca/catime.c
@@ -1,30 +1,25 @@
|
||||
/*
|
||||
*
|
||||
* CA performance test
|
||||
*
|
||||
* History
|
||||
* joh 09-12-89 Initial release
|
||||
* joh 12-20-94 portability
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
CA performance test
|
||||
#include <epicsAssert.h>
|
||||
#include <cadef.h>
|
||||
|
||||
History
|
||||
joh 09-12-89 Initial release
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
#ifdef VMS
|
||||
#include <LIB$ROUTINES.H>
|
||||
#ifndef LOCAL
|
||||
#define LOCAL static
|
||||
#endif
|
||||
|
||||
|
||||
/* System includes */
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
#endif
|
||||
|
||||
#include <cadef.h>
|
||||
#include <caerr.h>
|
||||
#include <db_access.h>
|
||||
|
||||
#ifndef OK
|
||||
#define OK 0
|
||||
#endif
|
||||
@@ -41,17 +36,44 @@
|
||||
#define NELEMENTS(A) (sizeof (A) / sizeof ((A) [0]))
|
||||
#endif
|
||||
|
||||
#define NUM 1
|
||||
#define ITERATION_COUNT 10000
|
||||
#define ITERATION_COUNT 1000
|
||||
|
||||
#define WAIT_FOR_ACK
|
||||
|
||||
chid chan_list[min(10000,ITERATION_COUNT)];
|
||||
typedef struct testItem {
|
||||
chid chix;
|
||||
char name[40];
|
||||
int type;
|
||||
int count;
|
||||
union db_access_val val;
|
||||
}ti;
|
||||
|
||||
ti itemList[ITERATION_COUNT];
|
||||
|
||||
int catime (char *channelName);
|
||||
|
||||
typedef void tf (ti *pItems, unsigned iterations, unsigned *pInlineIter);
|
||||
|
||||
LOCAL void test (
|
||||
ti *pItems,
|
||||
unsigned iterations
|
||||
);
|
||||
|
||||
LOCAL tf test_search;
|
||||
LOCAL tf test_free;
|
||||
LOCAL tf test_wait;
|
||||
LOCAL tf test_put;
|
||||
LOCAL tf test_wait;
|
||||
LOCAL tf test_get;
|
||||
|
||||
void timeIt(
|
||||
tf *pfunc,
|
||||
ti *pItem,
|
||||
unsigned iterations
|
||||
);
|
||||
|
||||
#ifndef vxWorks
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
char *pname;
|
||||
|
||||
@@ -61,167 +83,358 @@ char **argv;
|
||||
}
|
||||
else{
|
||||
printf("usage: %s <channel name>", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
catime(channelName)
|
||||
char *channelName;
|
||||
|
||||
/*
|
||||
* catime ()
|
||||
*/
|
||||
int catime (char *channelName)
|
||||
{
|
||||
chid ai_1;
|
||||
long i;
|
||||
unsigned strsize;
|
||||
|
||||
long status;
|
||||
long i,j;
|
||||
void *ptr;
|
||||
int test_search(), test_free();
|
||||
SEVCHK (ca_task_initialize(),"Unable to initialize");
|
||||
|
||||
SEVCHK(ca_task_initialize(),"Unable to initialize");
|
||||
strsize = sizeof(itemList[i].name)-1;
|
||||
for (i=0; i<NELEMENTS(itemList); i++) {
|
||||
strncpy (
|
||||
itemList[i].name,
|
||||
channelName,
|
||||
strsize);
|
||||
itemList[i].name[strsize]= '\0';
|
||||
itemList[i].count = 1;
|
||||
}
|
||||
|
||||
printf ("search test\n");
|
||||
timeIt (test_search, itemList, NELEMENTS(itemList));
|
||||
|
||||
SEVCHK(ca_search(channelName,&ai_1),NULL);
|
||||
status = ca_pend_io(5.0);
|
||||
SEVCHK(status,NULL);
|
||||
if(status == ECA_TIMEOUT)
|
||||
exit(OK);
|
||||
printf (
|
||||
"channel name=%s, native type=%d, native count=%d\n",
|
||||
ca_name(itemList[0].chix),
|
||||
ca_field_type(itemList[0].chix),
|
||||
ca_element_count(itemList[0].chix));
|
||||
|
||||
ptr = (void *) malloc(NUM*sizeof(union db_access_val)+NUM*MAX_STRING_SIZE);
|
||||
if(!ptr)
|
||||
exit(OK);
|
||||
for (i=0; i<NELEMENTS(itemList); i++) {
|
||||
itemList[i].val.fltval = 0.0;
|
||||
itemList[i].type = DBR_FLOAT;
|
||||
}
|
||||
printf ("float test\n");
|
||||
test (itemList, NELEMENTS(itemList));
|
||||
|
||||
printf("channel name %s native type %d native count %d\n",ai_1+1,ai_1->type,ai_1->count);
|
||||
printf("search test\n");
|
||||
timex(test_search,channelName);
|
||||
printf("free test\n");
|
||||
timex(test_free,ai_1);
|
||||
for (i=0; i<NELEMENTS(itemList); i++) {
|
||||
strcpy(itemList[i].val.strval, "0.0");
|
||||
itemList[i].type = DBR_STRING;
|
||||
}
|
||||
printf ("string test\n");
|
||||
test (itemList, NELEMENTS(itemList));
|
||||
|
||||
for (i=0; i<NELEMENTS(itemList); i++) {
|
||||
itemList[i].val.intval = 0;
|
||||
itemList[i].type = DBR_INT;
|
||||
}
|
||||
printf ("interger test\n");
|
||||
test (itemList, NELEMENTS(itemList));
|
||||
|
||||
for(i=0;i<NUM;i++)
|
||||
((float *)ptr)[i] = 0.0;
|
||||
test(ai_1, "DBR_FLOAT", DBR_FLOAT, NUM, ptr);
|
||||
printf ("free test\n");
|
||||
timeIt (test_free, itemList, NELEMENTS(itemList));
|
||||
|
||||
for(i=0;i<NUM;i++)
|
||||
strcpy((char *)ptr+(MAX_STRING_SIZE*i),"0.0");
|
||||
test(ai_1, "DBR_STRING", DBR_STRING, NUM, ptr);
|
||||
SEVCHK (ca_task_exit (), "Unable to free resources at exit");
|
||||
|
||||
for(i=0;i<NUM;i++)
|
||||
((int *)ptr)[i]=0;
|
||||
test(ai_1, "DBR_INT", DBR_INT, NUM, ptr);
|
||||
|
||||
free(ptr);
|
||||
|
||||
exit(OK);
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
test(chix, name, type, count, ptr)
|
||||
chid chix;
|
||||
char *name;
|
||||
int type,count;
|
||||
void *ptr;
|
||||
|
||||
/*
|
||||
* test ()
|
||||
*/
|
||||
LOCAL void test (
|
||||
ti *pItems,
|
||||
unsigned iterations
|
||||
)
|
||||
{
|
||||
int test_put(), test_get(), test_wait();
|
||||
|
||||
printf("%s\n",name);
|
||||
timex(test_put,chix, name, type, count, ptr);
|
||||
timex(test_get,chix, name, type, count, ptr);
|
||||
timex(test_wait,chix, name, type, count, ptr);
|
||||
printf ("\tasync put test\n");
|
||||
timeIt (test_put, pItems, iterations);
|
||||
printf ("\tasync get test\n");
|
||||
timeIt (test_get, pItems, iterations);
|
||||
printf ("\tsynch get test\n");
|
||||
timeIt (test_wait, pItems, iterations);
|
||||
}
|
||||
|
||||
#ifndef vxWorks
|
||||
timex(pfunc, arg1, arg2, arg3, arg4, arg5, arg6, arg7)
|
||||
void (*pfunc)();
|
||||
int arg1;
|
||||
int arg2;
|
||||
int arg3;
|
||||
int arg4;
|
||||
int arg5;
|
||||
int arg6;
|
||||
int arg7;
|
||||
|
||||
/*
|
||||
* timeIt ()
|
||||
*/
|
||||
void timeIt(
|
||||
tf *pfunc,
|
||||
ti *pItems,
|
||||
unsigned iterations
|
||||
)
|
||||
{
|
||||
(*pfunc)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
|
||||
TS_STAMP end_time;
|
||||
TS_STAMP start_time;
|
||||
double delay;
|
||||
int status;
|
||||
unsigned inlineIter;
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
test_search(name)
|
||||
char *name;
|
||||
{
|
||||
int i;
|
||||
|
||||
for(i=0; i< NELEMENTS(chan_list);i++){
|
||||
SEVCHK(ca_search(name,&chan_list[i]),NULL);
|
||||
}
|
||||
SEVCHK(ca_pend_io(0.0),NULL);
|
||||
status = tsLocalTime(&start_time);
|
||||
assert (status == S_ts_OK);
|
||||
(*pfunc) (pItems, iterations, &inlineIter);
|
||||
status = tsLocalTime(&end_time);
|
||||
assert (status == S_ts_OK);
|
||||
TsDiffAsDouble(&delay,&end_time,&start_time);
|
||||
printf ("Elapsed Per Item = %f\n", delay/(iterations*inlineIter));
|
||||
}
|
||||
|
||||
test_free(chix)
|
||||
chid chix;
|
||||
|
||||
/*
|
||||
* test_search ()
|
||||
*/
|
||||
LOCAL void test_search(
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
int i;
|
||||
union db_access_val ival;
|
||||
ti *pi;
|
||||
int status;
|
||||
|
||||
for(i=0; i< NELEMENTS(chan_list);i++){
|
||||
SEVCHK(ca_clear_channel(chan_list[i]),NULL);
|
||||
}
|
||||
#ifdef WAIT_FOR_ACK
|
||||
SEVCHK(ca_array_get(DBR_INT,1,chix,&ival),NULL);
|
||||
SEVCHK(ca_pend_io(0.0),NULL);
|
||||
#else
|
||||
SEVCHK(ca_flush_io(),NULL);
|
||||
#endif
|
||||
for (pi=pItems; pi<&pItems[iterations]; pi++) {
|
||||
status = ca_search (
|
||||
pi->name,
|
||||
&pi->chix);
|
||||
SEVCHK (status, NULL);
|
||||
}
|
||||
status = ca_pend_io(0.0);
|
||||
SEVCHK (status, NULL);
|
||||
|
||||
*pInlineIter = 1;
|
||||
}
|
||||
|
||||
test_put(chix, name, type, count, ptr)
|
||||
chid chix;
|
||||
char *name;
|
||||
int type,count;
|
||||
void *ptr;
|
||||
|
||||
/*
|
||||
* test_free ()
|
||||
*/
|
||||
LOCAL void test_free(
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
int i;
|
||||
ti *pi;
|
||||
int status;
|
||||
|
||||
for (pi=pItems; pi<&pItems[iterations]; pi++) {
|
||||
status = ca_clear_channel (pi->chix);
|
||||
SEVCHK (status, NULL);
|
||||
}
|
||||
*pInlineIter = 1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* test_put ()
|
||||
*/
|
||||
LOCAL void test_put(
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
ti *pi;
|
||||
int status;
|
||||
dbr_int_t val;
|
||||
|
||||
for(i=0; i< ITERATION_COUNT;i++){
|
||||
SEVCHK(ca_array_put(type,count,chix,ptr),NULL);
|
||||
#if 0
|
||||
ca_flush_io();
|
||||
#endif
|
||||
}
|
||||
for (pi=pItems; pi<&pItems[iterations]; pi++) {
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_put(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
}
|
||||
#ifdef WAIT_FOR_ACK
|
||||
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
|
||||
SEVCHK(ca_pend_io(0.0),NULL);
|
||||
#else
|
||||
SEVCHK(ca_flush_io(),NULL);
|
||||
status = ca_array_get (DBR_INT, 1, pItems[0].chix, &val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_pend_io(100.0);
|
||||
#endif
|
||||
status = ca_array_put(
|
||||
pItems[0].type,
|
||||
pItems[0].count,
|
||||
pItems[0].chix,
|
||||
&pItems[0].val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_flush_io();
|
||||
SEVCHK (status, NULL);
|
||||
|
||||
*pInlineIter = 10;
|
||||
}
|
||||
|
||||
test_get(chix, name, type, count, ptr)
|
||||
chid chix;
|
||||
char *name;
|
||||
int type,count;
|
||||
void *ptr;
|
||||
|
||||
/*
|
||||
* test_get ()
|
||||
*/
|
||||
LOCAL void test_get(
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
int i;
|
||||
ti *pi;
|
||||
int status;
|
||||
|
||||
for (pi=pItems; pi<&pItems[iterations]; pi++) {
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
}
|
||||
status = ca_pend_io(100.0);
|
||||
SEVCHK (status, NULL);
|
||||
|
||||
for(i=0; i< ITERATION_COUNT;i++){
|
||||
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
|
||||
#if 0
|
||||
ca_flush_io();
|
||||
#endif
|
||||
}
|
||||
SEVCHK(ca_pend_io(0.0),NULL);
|
||||
*pInlineIter = 10;
|
||||
}
|
||||
|
||||
|
||||
test_wait(chix, name, type, count, ptr)
|
||||
chid chix;
|
||||
char *name;
|
||||
int type,count;
|
||||
void *ptr;
|
||||
|
||||
/*
|
||||
* test_wait ()
|
||||
*/
|
||||
LOCAL void test_wait (
|
||||
ti *pItems,
|
||||
unsigned iterations,
|
||||
unsigned *pInlineIter
|
||||
)
|
||||
{
|
||||
int i;
|
||||
ti *pi;
|
||||
int status;
|
||||
|
||||
for (pi=pItems; pi<&pItems[iterations]; pi++) {
|
||||
status = ca_array_get(
|
||||
pi->type,
|
||||
pi->count,
|
||||
pi->chix,
|
||||
&pi->val);
|
||||
SEVCHK (status, NULL);
|
||||
status = ca_pend_io(100.0);
|
||||
SEVCHK (status, NULL);
|
||||
}
|
||||
|
||||
for(i=0; i< ITERATION_COUNT;i++){
|
||||
SEVCHK(ca_array_get(type,count,chix,ptr),NULL);
|
||||
SEVCHK(ca_pend_io(0.0),NULL);
|
||||
}
|
||||
*pInlineIter = 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,9 +66,8 @@ LOCAL void retrySearchRequest(int silent);
|
||||
void manage_conn(int silent)
|
||||
{
|
||||
IIU *piiu;
|
||||
ca_time current;
|
||||
ca_real delay;
|
||||
unsigned long idelay;
|
||||
long idelay;
|
||||
|
||||
/*
|
||||
* prevent recursion
|
||||
@@ -79,8 +78,6 @@ void manage_conn(int silent)
|
||||
|
||||
ca_static->ca_manage_conn_active = TRUE;
|
||||
|
||||
cac_gettimeval(¤t);
|
||||
|
||||
/*
|
||||
* issue connection heartbeat
|
||||
* (if we dont see a beacon)
|
||||
@@ -100,7 +97,7 @@ void manage_conn(int silent)
|
||||
*/
|
||||
if (piiu->sendPending) {
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&piiu->timeAtSendBlock);
|
||||
if (delay>ca_static->ca_connectTMO) {
|
||||
TAG_CONN_DOWN(piiu);
|
||||
@@ -117,15 +114,15 @@ void manage_conn(int silent)
|
||||
int rtmo;
|
||||
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&piiu->timeAtEchoRequest);
|
||||
stmo = delay > CA_RETRY_PERIOD;
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&piiu->timeAtLastRecv);
|
||||
rtmo = delay > CA_RETRY_PERIOD;
|
||||
if(stmo && rtmo && !piiu->sendPending){
|
||||
piiu->timeAtEchoRequest = current;
|
||||
piiu->timeAtEchoRequest = ca_static->currentTime;
|
||||
noop_msg(piiu);
|
||||
}
|
||||
continue;
|
||||
@@ -133,7 +130,7 @@ void manage_conn(int silent)
|
||||
|
||||
if(piiu->echoPending){
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&piiu->timeAtEchoRequest);
|
||||
if (delay > CA_ECHO_TIMEOUT) {
|
||||
/*
|
||||
@@ -144,10 +141,10 @@ void manage_conn(int silent)
|
||||
}
|
||||
else{
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&piiu->timeAtLastRecv);
|
||||
if (delay>ca_static->ca_connectTMO) {
|
||||
echo_request(piiu, ¤t);
|
||||
echo_request(piiu, &ca_static->currentTime);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,10 +156,10 @@ void manage_conn(int silent)
|
||||
*/
|
||||
if (!ca_static->ca_repeater_contacted) {
|
||||
delay = cac_time_diff (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&ca_static->ca_last_repeater_try);
|
||||
if (delay > REPEATER_TRY_PERIOD) {
|
||||
ca_static->ca_last_repeater_try = current;
|
||||
ca_static->ca_last_repeater_try = ca_static->currentTime;
|
||||
notify_ca_repeater();
|
||||
}
|
||||
}
|
||||
@@ -181,13 +178,13 @@ void manage_conn(int silent)
|
||||
|
||||
if(ca_static->ca_conn_next_retry.tv_sec == CA_CURRENT_TIME.tv_sec &&
|
||||
ca_static->ca_conn_next_retry.tv_usec == CA_CURRENT_TIME.tv_usec){
|
||||
ca_static->ca_conn_next_retry = current;
|
||||
ca_static->ca_conn_next_retry = ca_static->currentTime;
|
||||
LOGRETRYINTERVAL
|
||||
}
|
||||
|
||||
delay = cac_time_diff (
|
||||
&ca_static->ca_conn_next_retry,
|
||||
¤t);
|
||||
&ca_static->currentTime);
|
||||
|
||||
if (delay > 0.0) {
|
||||
ca_static->ca_manage_conn_active = FALSE;
|
||||
@@ -214,13 +211,13 @@ void manage_conn(int silent)
|
||||
idelay = idelay << ca_static->ca_search_retry;
|
||||
delay = idelay * CA_RECAST_DELAY; /* sec */
|
||||
delay = min (CA_RECAST_PERIOD, delay);
|
||||
idelay = delay;
|
||||
idelay = (long) delay;
|
||||
ca_static->ca_conn_retry_delay.tv_sec = idelay;
|
||||
ca_static->ca_conn_retry_delay.tv_usec =
|
||||
(delay-idelay)*USEC_PER_SEC;
|
||||
(long) ((delay-idelay)*USEC_PER_SEC);
|
||||
ca_static->ca_conn_next_retry =
|
||||
cac_time_sum (
|
||||
¤t,
|
||||
&ca_static->currentTime,
|
||||
&ca_static->ca_conn_retry_delay);
|
||||
LOGRETRYINTERVAL
|
||||
|
||||
@@ -347,18 +344,12 @@ LOCAL void logRetryInterval(char *pFN, unsigned lineno)
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
*
|
||||
* MARK_SERVER_AVAILABLE
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
void mark_server_available(struct in_addr *pnet_addr)
|
||||
{
|
||||
chid chan;
|
||||
ca_real currentPeriod;
|
||||
ca_time currentTime;
|
||||
bhe *pBHE;
|
||||
unsigned port;
|
||||
int netChange = FALSE;
|
||||
@@ -373,8 +364,6 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
return;
|
||||
}
|
||||
|
||||
cac_gettimeval(¤tTime);
|
||||
|
||||
LOCK;
|
||||
/*
|
||||
* look for it in the hash table
|
||||
@@ -391,14 +380,14 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
* update time stamp and average period
|
||||
*/
|
||||
currentPeriod = cac_time_diff (
|
||||
¤tTime,
|
||||
&ca_static->currentTime,
|
||||
&pBHE->timeStamp);
|
||||
/*
|
||||
* update the average
|
||||
*/
|
||||
pBHE->averagePeriod += currentPeriod;
|
||||
pBHE->averagePeriod /= 2.0;
|
||||
pBHE->timeStamp = currentTime;
|
||||
pBHE->timeStamp = ca_static->currentTime;
|
||||
|
||||
if ((currentPeriod/4.0)>=pBHE->averagePeriod) {
|
||||
#ifdef DEBUG
|
||||
@@ -422,7 +411,7 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
netChange = TRUE;
|
||||
}
|
||||
if(pBHE->piiu){
|
||||
pBHE->piiu->timeAtLastRecv = currentTime;
|
||||
pBHE->piiu->timeAtLastRecv = ca_static->currentTime;
|
||||
}
|
||||
if(!netChange){
|
||||
UNLOCK;
|
||||
@@ -465,17 +454,17 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
{
|
||||
ca_real diff;
|
||||
ca_real delay;
|
||||
unsigned idelay;
|
||||
long idelay;
|
||||
ca_time ca_delay;
|
||||
ca_time next;
|
||||
|
||||
delay = (port&CA_RECAST_PORT_MASK);
|
||||
delay /= MSEC_PER_SEC;
|
||||
delay += CA_RECAST_DELAY;
|
||||
idelay = delay;
|
||||
idelay = (long) delay;
|
||||
ca_delay.tv_sec = idelay;
|
||||
ca_delay.tv_usec = (delay-idelay) * USEC_PER_SEC;
|
||||
next = cac_time_sum(¤tTime, &ca_delay);
|
||||
ca_delay.tv_usec = (long) ((delay-idelay) * USEC_PER_SEC);
|
||||
next = cac_time_sum(&ca_static->currentTime, &ca_delay);
|
||||
|
||||
diff = cac_time_diff(
|
||||
&ca_static->ca_conn_next_retry,
|
||||
@@ -484,10 +473,10 @@ void mark_server_available(struct in_addr *pnet_addr)
|
||||
ca_static->ca_conn_next_retry = next;
|
||||
LOGRETRYINTERVAL
|
||||
}
|
||||
idelay = CA_RECAST_DELAY;
|
||||
idelay = (long) CA_RECAST_DELAY;
|
||||
ca_static->ca_conn_retry_delay.tv_sec = idelay;
|
||||
ca_static->ca_conn_retry_delay.tv_usec =
|
||||
(CA_RECAST_DELAY-idelay) * USEC_PER_SEC;
|
||||
(long) ((CA_RECAST_DELAY-idelay) * USEC_PER_SEC);
|
||||
ca_static->ca_search_retry = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -35,11 +35,6 @@ static char *sccsId = "@(#) $Id$";
|
||||
#include "iocinf.h"
|
||||
#include "net_convert.h"
|
||||
|
||||
void htond(double *pHost, double *pNet);
|
||||
void ntohd(double *pNet, double *pHost);
|
||||
void htonf(float *pHost, float *pNet);
|
||||
void ntohf(float *pNet, float *pHost);
|
||||
|
||||
/*
|
||||
* if hton is true then it is a host to network conversion
|
||||
* otherwise vise-versa
|
||||
@@ -1374,7 +1369,7 @@ unsigned long num /* number of values */
|
||||
}
|
||||
|
||||
|
||||
#ifdef CA_FLOAT_MIT
|
||||
#if defined(CA_FLOAT_MIT)
|
||||
/************************************************************************/
|
||||
/* double convert */
|
||||
/* (THIS ASSUMES IEEE IS THE NETWORK FLOATING POINT FORMAT) */
|
||||
@@ -1383,7 +1378,7 @@ unsigned long num /* number of values */
|
||||
/* (this includes mapping of fringe reals to zero or infinity) */
|
||||
/* (byte swaps included in conversion */
|
||||
|
||||
struct ieeedbl{
|
||||
struct ieeedbl {
|
||||
unsigned int mant2 : 32;
|
||||
unsigned int mant1 : 20;
|
||||
unsigned int exp : 11;
|
||||
@@ -1396,7 +1391,7 @@ struct ieeedbl{
|
||||
/* -1022<exp<1024 with mantissa of form 1.mant */
|
||||
#define DBLEXPMINIEEE -1022 /* min for norm # IEEE exponent */
|
||||
|
||||
struct mitdbl{
|
||||
struct mitdbl {
|
||||
unsigned int mant1 : 7;
|
||||
unsigned int exp : 8;
|
||||
unsigned int sign : 1;
|
||||
@@ -1413,7 +1408,6 @@ struct mitdbl{
|
||||
#define DBLEXPMAXMIT 126 /* max MIT exponent */
|
||||
#define DBLEXPMINMIT -128 /* min MIT exponent */
|
||||
|
||||
|
||||
void htond(double *pHost, double *pNet)
|
||||
{
|
||||
double copyin;
|
||||
@@ -1538,19 +1532,19 @@ struct mitflt{
|
||||
|
||||
void htonf(float *pHost, float *pNet)
|
||||
{
|
||||
struct mitflt *pMIT = pHost;
|
||||
struct ieeeflt *pIEEE = pNet;
|
||||
struct mitflt *pMIT = (struct mitflt *) pHost;
|
||||
struct ieeeflt *pIEEE = (struct ieeeflt *) pNet;
|
||||
long exp,mant,sign;
|
||||
|
||||
sign = pHost->sign;
|
||||
sign = pMIT->sign;
|
||||
|
||||
if( (short)(pMIT->exp < EXPMINIEEE + MIT_SB){
|
||||
if( ((int)pMIT->exp) < EXPMINIEEE + MIT_SB){
|
||||
exp = 0;
|
||||
mant = 0;
|
||||
sign = 0;
|
||||
}
|
||||
else{
|
||||
exp = (short)pMIT->exp-MIT_SB+IEEE_SB;
|
||||
exp = ((int)pMIT->exp)-MIT_SB+IEEE_SB;
|
||||
mant = (pMIT->mant1<<16) | pMIT->mant2;
|
||||
}
|
||||
pIEEE->mant = mant;
|
||||
@@ -1566,12 +1560,12 @@ void htonf(float *pHost, float *pNet)
|
||||
*/
|
||||
void ntohf(float *pNet, float *pHost)
|
||||
{
|
||||
struct mitflt *pMIT = pHost;
|
||||
struct ieeeflt *pIEEE = pNet;
|
||||
struct mitflt *pMIT = (struct mitflt *) pHost;
|
||||
struct ieeeflt *pIEEE = (struct ieeeflt *) pNet;
|
||||
long exp,mant2,mant1,sign;
|
||||
|
||||
*(ca_uint32_t *)pIEEE = ntohl(*(ca_uint32_t *)pIEEE);
|
||||
if( (short) pIEEE->exp > EXPMAXMIT + IEEE_SB){
|
||||
if( ((int)pIEEE->exp) > EXPMAXMIT + IEEE_SB){
|
||||
sign = pIEEE->sign;
|
||||
exp = EXPMAXMIT + MIT_SB;
|
||||
mant2 = ~0;
|
||||
@@ -1598,7 +1592,7 @@ void ntohf(float *pNet, float *pHost)
|
||||
|
||||
#endif /*CA_FLOAT_MIT*/
|
||||
|
||||
#ifndef CA_FLOAT_MIT
|
||||
#if defined(CA_FLOAT_IEEE) && 0
|
||||
|
||||
/*
|
||||
* htond ()
|
||||
@@ -1606,6 +1600,7 @@ void ntohf(float *pNet, float *pHost)
|
||||
*/
|
||||
void htond (double *IEEEhost, double *IEEEnet)
|
||||
{
|
||||
#ifdef CA_LITTLE_ENDIAN
|
||||
ca_uint32_t *pHost = (ca_uint32_t *) IEEEhost;
|
||||
ca_uint32_t *pNet = (ca_uint32_t *) IEEEnet;
|
||||
ca_uint32_t tmp;
|
||||
@@ -1618,6 +1613,9 @@ void htond (double *IEEEhost, double *IEEEnet)
|
||||
tmp = pHost[0];
|
||||
pNet[0] = htonl (pHost[1]);
|
||||
pNet[1] = htonl (tmp);
|
||||
#else
|
||||
*IEEEnet = *IEEEhost;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1626,6 +1624,7 @@ void htond (double *IEEEhost, double *IEEEnet)
|
||||
*/
|
||||
void ntohd (double *IEEEnet, double *IEEEhost)
|
||||
{
|
||||
#ifdef CA_LITTLE_ENDIAN
|
||||
ca_uint32_t *pHost = (ca_uint32_t *) IEEEhost;
|
||||
ca_uint32_t *pNet = (ca_uint32_t *) IEEEnet;
|
||||
ca_uint32_t tmp;
|
||||
@@ -1638,6 +1637,9 @@ void ntohd (double *IEEEnet, double *IEEEhost)
|
||||
tmp = pNet[0];
|
||||
pHost[0] = ntohl (pNet[1]);
|
||||
pHost[1] = htonl (tmp);
|
||||
#else
|
||||
*IEEEhost = *IEEEnet;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1664,7 +1666,7 @@ void htonf (float *IEEEhost, float *IEEEnet)
|
||||
*pNet = htonl (*pHost);
|
||||
}
|
||||
|
||||
#endif /* not CA_MIT_FLOAT*/
|
||||
#endif /* IEEE float and little endian */
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -50,8 +50,8 @@ static char *sccsId = "@(#) $Id$";
|
||||
void flow_control(struct ioc_in_use *piiu)
|
||||
{
|
||||
unsigned nbytes;
|
||||
register int status;
|
||||
register int busy = piiu->client_busy;
|
||||
int status;
|
||||
int busy = piiu->client_busy;
|
||||
|
||||
LOCK;
|
||||
|
||||
@@ -95,6 +95,5 @@ void flow_control(struct ioc_in_use *piiu)
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,9 @@ int local_addr(int s, struct sockaddr_in *plcladdr)
|
||||
ifconf.ifc_req = ifreq;
|
||||
status = socket_ioctl(s, SIOCGIFCONF, &ifconf);
|
||||
if (status < 0 || ifconf.ifc_len == 0) {
|
||||
ca_printf("CAC: ioctl failed %s\n", strerror(MYERRNO));
|
||||
ca_printf(
|
||||
"CAC: ioctl failed because \"%s\"\n",
|
||||
strerror(MYERRNO));
|
||||
ifconf.ifc_len = 0;
|
||||
}
|
||||
|
||||
@@ -145,7 +147,7 @@ int local_addr(int s, struct sockaddr_in *plcladdr)
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* An alternate sloution
|
||||
* An alternate solution
|
||||
* for os without the if routines
|
||||
*/
|
||||
/*
|
||||
|
||||
397
src/ca/iocinf.c
397
src/ca/iocinf.c
@@ -73,7 +73,6 @@ static char *sccsId = "@(#) $Id$";
|
||||
#define CA_GLBLSOURCE
|
||||
#include "iocinf.h"
|
||||
#include "net_convert.h"
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
LOCAL void tcp_recv_msg(struct ioc_in_use *piiu);
|
||||
LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu);
|
||||
@@ -188,6 +187,7 @@ int net_proto
|
||||
UNLOCK;
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
memset((char *)&pNode->destAddr,0,sizeof(pNode->destAddr));
|
||||
pNode->destAddr.inetAddr.sin_family = AF_INET;
|
||||
pNode->destAddr.inetAddr.sin_addr = *pnet_addr;
|
||||
pNode->destAddr.inetAddr.sin_port =
|
||||
@@ -219,7 +219,7 @@ int net_proto
|
||||
IPPROTO_TCP,
|
||||
TCP_NODELAY,
|
||||
(char *)&true,
|
||||
sizeof true);
|
||||
sizeof(true));
|
||||
if(status < 0){
|
||||
free(piiu);
|
||||
status = socket_close(sock);
|
||||
@@ -270,57 +270,53 @@ int net_proto
|
||||
#endif
|
||||
|
||||
#ifdef CA_SET_TCP_BUFFER_SIZES
|
||||
/* set TCP buffer sizes */
|
||||
i = MAX_MSG_SIZE;
|
||||
status = setsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
&i,
|
||||
sizeof(i));
|
||||
if(status < 0){
|
||||
free(piiu);
|
||||
status = socket_close(sock);
|
||||
if(status<0){
|
||||
SEVCHK(ECA_INTERNAL,NULL);
|
||||
}
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
i = MAX_MSG_SIZE;
|
||||
status = setsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_RCVBUF,
|
||||
&i,
|
||||
sizeof(i));
|
||||
if(status < 0){
|
||||
free(piiu);
|
||||
status = socket_close(sock);
|
||||
if(status<0){
|
||||
SEVCHK(ECA_INTERNAL,NULL);
|
||||
}
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
{
|
||||
int i;
|
||||
int size;
|
||||
|
||||
/* fetch the TCP send buffer size */
|
||||
i = sizeof(piiu->tcp_send_buff_size);
|
||||
status = getsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
(char *)&piiu->tcp_send_buff_size,
|
||||
&i);
|
||||
if(status < 0 || i != sizeof(piiu->tcp_send_buff_size)){
|
||||
free(piiu);
|
||||
status = socket_close(sock);
|
||||
if(status<0){
|
||||
SEVCHK(ECA_INTERNAL,NULL);
|
||||
/* set TCP buffer sizes */
|
||||
i = MAX_MSG_SIZE;
|
||||
status = setsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
&i,
|
||||
sizeof(i));
|
||||
if(status < 0){
|
||||
free(piiu);
|
||||
socket_close(sock);
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
i = MAX_MSG_SIZE;
|
||||
status = setsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_RCVBUF,
|
||||
&i,
|
||||
sizeof(i));
|
||||
if(status < 0){
|
||||
free(piiu);
|
||||
socket_close(sock);
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
|
||||
/* fetch the TCP send buffer size */
|
||||
i = sizeof(size);
|
||||
status = getsockopt(
|
||||
sock,
|
||||
SOL_SOCKET,
|
||||
SO_SNDBUF,
|
||||
(char *)&size,
|
||||
&i);
|
||||
if(status < 0 || i != sizeof(size)){
|
||||
free(piiu);
|
||||
socket_close(sock);
|
||||
UNLOCK;
|
||||
return ECA_SOCK;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* connect */
|
||||
@@ -342,20 +338,6 @@ int net_proto
|
||||
cacRingBufferInit(&piiu->recv, sizeof(piiu->send.buf));
|
||||
cacRingBufferInit(&piiu->send, sizeof(piiu->send.buf));
|
||||
|
||||
/*
|
||||
* Set non blocking IO
|
||||
* to prevent dead locks
|
||||
*/
|
||||
status = socket_ioctl(
|
||||
piiu->sock_chan,
|
||||
FIONBIO,
|
||||
&true);
|
||||
if(status<0){
|
||||
ca_printf(
|
||||
"Error setting non-blocking io: %s\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
|
||||
/*
|
||||
* Save the Host name for efficient access in the
|
||||
* future.
|
||||
@@ -435,6 +417,7 @@ int net_proto
|
||||
sock,
|
||||
ca_static->ca_server_port);
|
||||
|
||||
|
||||
cacRingBufferInit(&piiu->recv, sizeof(piiu->send.buf));
|
||||
cacRingBufferInit(&piiu->send, min(MAX_UDP,
|
||||
sizeof(piiu->send.buf)));
|
||||
@@ -443,7 +426,6 @@ int net_proto
|
||||
piiu->host_name_str,
|
||||
"<<unknown host>>",
|
||||
sizeof(piiu->host_name_str)-1);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -456,6 +438,20 @@ int net_proto
|
||||
return ECA_INTERNAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set non blocking IO
|
||||
* to prevent dead locks
|
||||
*/
|
||||
status = socket_ioctl(
|
||||
piiu->sock_chan,
|
||||
FIONBIO,
|
||||
&true);
|
||||
if(status<0){
|
||||
ca_printf(
|
||||
"Error setting non-blocking io: %s\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
|
||||
if(fd_register_func){
|
||||
LOCKEVENTS;
|
||||
(*fd_register_func)(fd_register_arg, sock, TRUE);
|
||||
@@ -571,21 +567,34 @@ void notify_ca_repeater()
|
||||
LOCK; /*MULTINET TCP/IP routines are not reentrant*/
|
||||
status = local_addr(piiuCast->sock_chan, &saddr);
|
||||
if (status == OK) {
|
||||
int len;
|
||||
|
||||
memset((char *)&msg, 0, sizeof(msg));
|
||||
msg.m_cmmd = htons(REPEATER_REGISTER);
|
||||
msg.m_available = saddr.sin_addr.s_addr;
|
||||
saddr.sin_port = htons(ca_static->ca_repeater_port);
|
||||
|
||||
/*
|
||||
* Intentionally sending a zero length message here
|
||||
* until most CA repeater daemons have been restarted
|
||||
* (and only then will accept the above protocol)
|
||||
* (repeaters began accepting this protocol
|
||||
* starting with EPICS 3.12)
|
||||
*
|
||||
* SOLARIS will not accept a zero length message
|
||||
* and we are just porting there for 3.12 so
|
||||
* we will use the new protocol for 3.12
|
||||
*/
|
||||
# ifdef SOLARIS
|
||||
len = sizeof(msg);
|
||||
# else /* SOLARIS */
|
||||
len = 0;
|
||||
# endif /* SOLARIS */
|
||||
|
||||
status = sendto(
|
||||
piiuCast->sock_chan,
|
||||
(char *)&msg, /* UCX requires a valid address here */
|
||||
0, /* <= sizeof(msg) ! see comment above ! */
|
||||
len,
|
||||
0,
|
||||
(struct sockaddr *)&saddr,
|
||||
sizeof(saddr));
|
||||
@@ -641,6 +650,8 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
|
||||
pNode = (caAddrNode *) piiu->destAddr.node.next;
|
||||
while(pNode){
|
||||
unsigned long actualSendCnt;
|
||||
|
||||
status = sendto(
|
||||
piiu->sock_chan,
|
||||
&piiu->send.buf[piiu->send.rdix],
|
||||
@@ -649,18 +660,27 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
&pNode->destAddr.sockAddr,
|
||||
sizeof(pNode->destAddr.sockAddr));
|
||||
if(status<0){
|
||||
if( MYERRNO != EWOULDBLOCK &&
|
||||
MYERRNO != ENOBUFS &&
|
||||
MYERRNO != EINTR){
|
||||
int localErrno;
|
||||
|
||||
localErrno = MYERRNO;
|
||||
|
||||
if( localErrno == EWOULDBLOCK &&
|
||||
localErrno == ENOBUFS &&
|
||||
localErrno == EINTR){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
ca_printf(
|
||||
"CAC: error on socket send() %s\n",
|
||||
strerror(MYERRNO));
|
||||
strerror(localErrno));
|
||||
}
|
||||
|
||||
TAG_CONN_DOWN(piiu);
|
||||
break;
|
||||
}
|
||||
assert(status == sendCnt);
|
||||
actualSendCnt = (unsigned long) status;
|
||||
assert (actualSendCnt == sendCnt);
|
||||
pNode = (caAddrNode *) pNode->node.next;
|
||||
}
|
||||
|
||||
@@ -687,6 +707,7 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
{
|
||||
unsigned long sendCnt;
|
||||
int status;
|
||||
int localError;
|
||||
|
||||
/*
|
||||
* check for shutdown in progress
|
||||
@@ -697,55 +718,69 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu)
|
||||
|
||||
LOCK;
|
||||
|
||||
sendCnt = cacRingBufferReadSize(&piiu->send, TRUE);
|
||||
|
||||
assert(sendCnt<=piiu->send.max_msg);
|
||||
|
||||
/*
|
||||
* return if nothing to send
|
||||
* Check at least twice to see if there is anything
|
||||
* in the ring buffer (in case the block of messages
|
||||
* isnt continuous). Always return if the send was
|
||||
* less bytes than requested.
|
||||
*/
|
||||
if(sendCnt == 0){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
while (TRUE) {
|
||||
sendCnt = cacRingBufferReadSize(&piiu->send, TRUE);
|
||||
assert(sendCnt<=piiu->send.max_msg);
|
||||
|
||||
status = send(
|
||||
piiu->sock_chan,
|
||||
&piiu->send.buf[piiu->send.rdix],
|
||||
sendCnt,
|
||||
0);
|
||||
if(status>=0){
|
||||
assert(status<=sendCnt);
|
||||
|
||||
piiu->sendPending = FALSE;
|
||||
CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status);
|
||||
|
||||
sendCnt = cacRingBufferReadSize(&piiu->send, FALSE);
|
||||
if(sendCnt==0){
|
||||
/*
|
||||
* return if nothing to send
|
||||
*/
|
||||
if(sendCnt == 0){
|
||||
# ifdef DEBUG
|
||||
if (piiu->sendPending) {
|
||||
printf ("-Unblocked-\n");
|
||||
}
|
||||
# endif /* DEBUG */
|
||||
piiu->sendPending = FALSE;
|
||||
piiu->send_needed = FALSE;
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
return;
|
||||
status = send(
|
||||
piiu->sock_chan,
|
||||
&piiu->send.buf[piiu->send.rdix],
|
||||
sendCnt,
|
||||
0);
|
||||
if (status<0) {
|
||||
break;
|
||||
}
|
||||
else if (status==0) {
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status);
|
||||
|
||||
if (status != sendCnt) {
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if( MYERRNO == EWOULDBLOCK ||
|
||||
MYERRNO == ENOBUFS ||
|
||||
MYERRNO == EINTR){
|
||||
localError = MYERRNO;
|
||||
|
||||
if( localError == EWOULDBLOCK ||
|
||||
localError == ENOBUFS ||
|
||||
localError == EINTR){
|
||||
UNLOCK;
|
||||
if(!piiu->sendPending){
|
||||
cac_gettimeval(&piiu->timeAtSendBlock);
|
||||
piiu->sendPending = TRUE;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if( MYERRNO != EPIPE &&
|
||||
MYERRNO != ECONNRESET &&
|
||||
MYERRNO != ETIMEDOUT){
|
||||
if( localError != EPIPE &&
|
||||
localError != ECONNRESET &&
|
||||
localError != ETIMEDOUT){
|
||||
ca_printf(
|
||||
"CAC: error on socket send() %s\n",
|
||||
strerror(MYERRNO));
|
||||
strerror(localError));
|
||||
}
|
||||
|
||||
TAG_CONN_DOWN(piiu);
|
||||
@@ -781,7 +816,6 @@ void cac_flush_internal()
|
||||
UNLOCK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* cac_clean_iiu_list()
|
||||
@@ -816,14 +850,16 @@ void ca_process_input_queue()
|
||||
{
|
||||
struct ioc_in_use *piiu;
|
||||
|
||||
LOCK;
|
||||
|
||||
/*
|
||||
* dont allow recursion
|
||||
* dont allow recursion
|
||||
*/
|
||||
if(post_msg_active){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
LOCK;
|
||||
for( piiu=(IIU *)iiuList.node.next;
|
||||
piiu;
|
||||
piiu=(IIU *)piiu->node.next){
|
||||
@@ -834,9 +870,12 @@ void ca_process_input_queue()
|
||||
|
||||
(*piiu->procInput)(piiu);
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
|
||||
#if 0
|
||||
cac_flush_internal();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -856,56 +895,59 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu)
|
||||
|
||||
LOCK;
|
||||
|
||||
writeSpace = cacRingBufferWriteSize(&piiu->recv, TRUE);
|
||||
if(writeSpace == 0){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* Check at least twice to see if there is ana space left
|
||||
* in the ring buffer (in case the messages block
|
||||
* isnt continuous). Always return if the send was
|
||||
* less bytes than requested.
|
||||
*/
|
||||
while (TRUE) {
|
||||
|
||||
status = recv( piiu->sock_chan,
|
||||
&piiu->recv.buf[piiu->recv.wtix],
|
||||
writeSpace,
|
||||
0);
|
||||
if(status == 0){
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
else if(status <0){
|
||||
/* try again on status of -1 and no luck this time */
|
||||
if(MYERRNO == EWOULDBLOCK || MYERRNO == EINTR){
|
||||
UNLOCK;
|
||||
return;
|
||||
writeSpace = cacRingBufferWriteSize(&piiu->recv, TRUE);
|
||||
if(writeSpace == 0){
|
||||
break;
|
||||
}
|
||||
|
||||
if( MYERRNO != EPIPE &&
|
||||
MYERRNO != ECONNRESET &&
|
||||
MYERRNO != ETIMEDOUT){
|
||||
ca_printf(
|
||||
"CAC: unexpected recv error (err=%s)\n",
|
||||
strerror(MYERRNO));
|
||||
status = recv( piiu->sock_chan,
|
||||
&piiu->recv.buf[piiu->recv.wtix],
|
||||
writeSpace,
|
||||
0);
|
||||
if(status == 0){
|
||||
TAG_CONN_DOWN(piiu);
|
||||
break;
|
||||
}
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
else if(status <0){
|
||||
/* try again on status of -1 and no luck this time */
|
||||
if(MYERRNO == EWOULDBLOCK || MYERRNO == EINTR){
|
||||
break;
|
||||
}
|
||||
|
||||
if( MYERRNO != EPIPE &&
|
||||
MYERRNO != ECONNRESET &&
|
||||
MYERRNO != ETIMEDOUT){
|
||||
ca_printf(
|
||||
"CAC: unexpected recv error (err=%s)\n",
|
||||
strerror(MYERRNO));
|
||||
}
|
||||
TAG_CONN_DOWN(piiu);
|
||||
break;
|
||||
}
|
||||
|
||||
if(status>MAX_MSG_SIZE){
|
||||
ca_printf( "CAC: recv_msg(): message overflow %l\n",
|
||||
status-MAX_MSG_SIZE);
|
||||
TAG_CONN_DOWN(piiu);
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
assert (status<=writeSpace);
|
||||
|
||||
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
|
||||
CAC_RING_BUFFER_WRITE_ADVANCE(&piiu->recv, status);
|
||||
|
||||
/*
|
||||
* Record the time whenever we receive a message
|
||||
* from this IOC
|
||||
*/
|
||||
piiu->timeAtLastRecv = ca_static->currentTime;
|
||||
|
||||
if (status != writeSpace) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Record the time whenever we receive a message
|
||||
* from this IOC
|
||||
*/
|
||||
cac_gettimeval(&piiu->timeAtLastRecv);
|
||||
|
||||
UNLOCK;
|
||||
return;
|
||||
@@ -922,18 +964,20 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu)
|
||||
int status;
|
||||
long bytesToProcess;
|
||||
|
||||
LOCK;
|
||||
|
||||
/*
|
||||
* dont allow recursion
|
||||
*/
|
||||
if(post_msg_active){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
pNode = (caAddrNode *) piiu->destAddr.node.next;
|
||||
|
||||
post_msg_active = TRUE;
|
||||
|
||||
LOCK;
|
||||
pNode = (caAddrNode *) piiu->destAddr.node.next;
|
||||
|
||||
while(TRUE){
|
||||
bytesToProcess = cacRingBufferReadSize(&piiu->recv, TRUE);
|
||||
if(bytesToProcess == 0){
|
||||
@@ -956,9 +1000,9 @@ LOCAL void ca_process_tcp(struct ioc_in_use *piiu)
|
||||
&piiu->recv,
|
||||
bytesToProcess);
|
||||
}
|
||||
UNLOCK;
|
||||
|
||||
post_msg_active = FALSE;
|
||||
UNLOCK;
|
||||
|
||||
flow_control(piiu);
|
||||
|
||||
@@ -1059,17 +1103,18 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
|
||||
char *pBuf;
|
||||
unsigned long bytesAvailable;
|
||||
|
||||
LOCK;
|
||||
|
||||
/*
|
||||
* dont allow recursion
|
||||
*/
|
||||
if(post_msg_active){
|
||||
UNLOCK;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
post_msg_active = TRUE;
|
||||
|
||||
LOCK;
|
||||
while(TRUE){
|
||||
|
||||
bytesAvailable = cacRingBufferReadSize(&piiu->recv, TRUE);
|
||||
@@ -1117,9 +1162,8 @@ LOCAL void ca_process_udp(struct ioc_in_use *piiu)
|
||||
bytesAvailable);
|
||||
}
|
||||
|
||||
UNLOCK;
|
||||
|
||||
post_msg_active = FALSE;
|
||||
UNLOCK;
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -1174,15 +1218,15 @@ void close_ioc (struct ioc_in_use *piiu)
|
||||
chix = (chid) &piiu->chidlist.node.next;
|
||||
while (chix = (chid) chix->node.next) {
|
||||
chix->type = TYPENOTCONN;
|
||||
chix->count = 0;
|
||||
chix->count = 0U;
|
||||
chix->state = cs_prev_conn;
|
||||
chix->id.sid = ~0L;
|
||||
chix->id.sid = ~0U;
|
||||
chix->ar.read_access = FALSE;
|
||||
chix->ar.write_access = FALSE;
|
||||
/*
|
||||
* try to reconnect
|
||||
*/
|
||||
chix->retry = 0;
|
||||
chix->retry = 0U;
|
||||
}
|
||||
|
||||
if (piiu->chidlist.count) {
|
||||
@@ -1507,6 +1551,8 @@ unsigned long cacRingBufferWriteSize(struct ca_buffer *pBuf, int contiguous)
|
||||
* vxWorks user will need to configure a DNS format name for the
|
||||
* host name if they wish to be cnsistent with UNIX and VMS hosts.
|
||||
*
|
||||
* this needs to attempt to determine if the process is a remote
|
||||
* login - hard to do under UNIX
|
||||
*/
|
||||
char *localHostName()
|
||||
{
|
||||
@@ -1564,6 +1610,7 @@ void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv,
|
||||
}
|
||||
|
||||
while(pToken = getToken(&pStr)){
|
||||
memset((char *)&addr,0,sizeof(addr));
|
||||
addr.inetAddr.sin_family = AF_INET;
|
||||
addr.inetAddr.sin_port = htons(port);
|
||||
addr.inetAddr.sin_addr.s_addr = inet_addr(pToken);
|
||||
@@ -1654,32 +1701,38 @@ void caPrintAddrList(ELLLIST *pList)
|
||||
/*
|
||||
* caFetchPortConfig()
|
||||
*/
|
||||
unsigned caFetchPortConfig(ENV_PARAM *pEnv, unsigned defaultPort)
|
||||
int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort)
|
||||
{
|
||||
long longStatus;
|
||||
long port;
|
||||
long epicsParam;
|
||||
int port;
|
||||
|
||||
longStatus = envGetLongConfigParam(pEnv, &port);
|
||||
longStatus = envGetLongConfigParam(pEnv, &epicsParam);
|
||||
if (longStatus!=0) {
|
||||
port = defaultPort;
|
||||
epicsParam = defaultPort;
|
||||
ca_printf ("EPICS \"%s\" integer fetch failed\n", pEnv->name);
|
||||
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, port);
|
||||
ca_printf ("setting \"%s\" = %ld\n", pEnv->name, epicsParam);
|
||||
}
|
||||
|
||||
/*
|
||||
* Thus must be a server port that will fit in a signed
|
||||
* This must be a server port that will fit in a signed
|
||||
* short
|
||||
*/
|
||||
if (port <= IPPORT_USERRESERVED || port>SHRT_MAX) {
|
||||
if (epicsParam<=IPPORT_USERRESERVED || epicsParam>SHRT_MAX) {
|
||||
ca_printf ("EPICS \"%s\" out of range\n", pEnv->name);
|
||||
/*
|
||||
* Quit if the port is wrong due CA coding error
|
||||
*/
|
||||
assert (port != defaultPort);
|
||||
port = defaultPort;
|
||||
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, port);
|
||||
assert (epicsParam != defaultPort);
|
||||
epicsParam = defaultPort;
|
||||
ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, epicsParam);
|
||||
}
|
||||
|
||||
/*
|
||||
* ok to clip to int here because we checked the range
|
||||
*/
|
||||
port = (int) epicsParam;
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
|
||||
@@ -80,11 +80,11 @@ HDRVERSIONID(iocinfh, "$Id$")
|
||||
*/
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -95,10 +95,12 @@ HDRVERSIONID(iocinfh, "$Id$")
|
||||
/*
|
||||
* EPICS includes
|
||||
*/
|
||||
#include <epicsAssert.h>
|
||||
#include <cadef.h>
|
||||
#include <bucketLib.h>
|
||||
#include <ellLib.h>
|
||||
#include <envDefs.h>
|
||||
#include <epicsPrint.h>
|
||||
|
||||
/*
|
||||
* CA private includes
|
||||
@@ -118,8 +120,8 @@ HDRVERSIONID(iocinfh, "$Id$")
|
||||
# define NBBY 8 /* number of bits per byte */
|
||||
#endif
|
||||
|
||||
#define MSEC_PER_SEC 1000
|
||||
#define USEC_PER_SEC 1000000
|
||||
#define MSEC_PER_SEC 1000L
|
||||
#define USEC_PER_SEC 1000000L
|
||||
|
||||
/*
|
||||
* catch when they use really large strings
|
||||
@@ -168,8 +170,8 @@ struct pending_io_event{
|
||||
typedef struct timeval ca_time;
|
||||
|
||||
#define LD_CA_TIME(FLOAT_TIME,PCATIME) \
|
||||
((PCATIME)->tv_sec = (FLOAT_TIME), \
|
||||
(PCATIME)->tv_usec = ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC)
|
||||
((PCATIME)->tv_sec = (long) (FLOAT_TIME), \
|
||||
(PCATIME)->tv_usec = (long) ( ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC ))
|
||||
|
||||
/*
|
||||
* dont adjust
|
||||
@@ -188,8 +190,8 @@ extern const ca_time CA_CURRENT_TIME;
|
||||
*/
|
||||
#define MAXCONNTRIES 30 /* N conn retries on unchanged net */
|
||||
|
||||
#define SELECT_POLL (0.1) /* units sec - polls into recast */
|
||||
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
|
||||
#define SELECT_POLL (0.05) /* units sec - polls into recast */
|
||||
#define CA_RECAST_DELAY (0.1) /* initial delay to next recast (sec) */
|
||||
#define CA_RECAST_PORT_MASK 0xff /* random retry interval off port */
|
||||
#define CA_RECAST_PERIOD (5.0) /* ul on retry period long term (sec) */
|
||||
|
||||
@@ -212,7 +214,7 @@ extern const ca_time CA_CURRENT_TIME;
|
||||
#define CA_RETRY_PERIOD 5 /* int sec to next keepalive */
|
||||
|
||||
#define N_REPEATER_TRIES_PRIOR_TO_MSG 50
|
||||
#define REPEATER_TRY_PERIOD (0.1)
|
||||
#define REPEATER_TRY_PERIOD (1.0)
|
||||
|
||||
#ifdef vxWorks
|
||||
typedef struct caclient_put_notify{
|
||||
@@ -316,7 +318,7 @@ struct ca_buffer{
|
||||
|
||||
#define TAG_CONN_DOWN(PIIU) \
|
||||
( \
|
||||
/*ca_printf("Tagging connection down at %d in %s\n", __LINE__, __FILE__),*/ \
|
||||
/* ca_printf("Tagging connection down at %d in %s\n", __LINE__, __FILE__), */\
|
||||
(PIIU)->conn_up = FALSE \
|
||||
)
|
||||
|
||||
@@ -395,6 +397,7 @@ struct ca_static{
|
||||
ELLLIST putCvrtBuf;
|
||||
ELLLIST fdInfoFreeList;
|
||||
ELLLIST fdInfoList;
|
||||
ca_time currentTime;
|
||||
ca_time ca_conn_next_retry;
|
||||
ca_time ca_conn_retry_delay;
|
||||
ca_time ca_last_repeater_try;
|
||||
@@ -409,6 +412,7 @@ struct ca_static{
|
||||
void (*ca_connection_func)
|
||||
(struct connection_handler_args);
|
||||
void *ca_connection_arg;
|
||||
int (*ca_printf_func)(const char *pformat, va_list args);
|
||||
void (*ca_fd_register_func)
|
||||
(void *, SOCKET, int);
|
||||
void *ca_fd_register_arg;
|
||||
@@ -591,6 +595,7 @@ ca_real cac_time_diff(ca_time *pTVA, ca_time *pTVB);
|
||||
ca_time cac_time_sum(ca_time *pTVA, ca_time *pTVB);
|
||||
void caIOBlockFree(evid pIOBlock);
|
||||
void clearChannelResources(unsigned id);
|
||||
void caSetDefaultPrintfHandler ();
|
||||
|
||||
/*
|
||||
* !!KLUDGE!!
|
||||
|
||||
@@ -82,7 +82,7 @@ typedef float ca_float32_t;
|
||||
#define IOC_WRITE 4 /* write a channel value */
|
||||
#define IOC_SNAPSHOT 5 /* snapshot of the system */
|
||||
#define IOC_SEARCH 6 /* IOC channel search */
|
||||
/* 7 */
|
||||
#define IOC_BUILD 7 /* build - obsolete */
|
||||
#define IOC_EVENTS_OFF 8 /* flow control */
|
||||
#define IOC_EVENTS_ON 9 /* flow control */
|
||||
#define IOC_READ_SYNC 10 /* purge old reads */
|
||||
@@ -91,7 +91,7 @@ typedef float ca_float32_t;
|
||||
#define IOC_RSRV_IS_UP 13 /* CA server has joined the net */
|
||||
#define IOC_NOT_FOUND 14 /* channel not found */
|
||||
#define IOC_READ_NOTIFY 15 /* add a one shot event */
|
||||
/* 16 */
|
||||
#define IOC_READ_BUILD 16 /* read and build - obsolete */
|
||||
#define REPEATER_CONFIRM 17 /* registration confirmation */
|
||||
#define IOC_CLAIM_CIU 18 /* client claims resource in server */
|
||||
#define IOC_WRITE_NOTIFY 19 /* notify after write chan value */
|
||||
|
||||
@@ -63,10 +63,30 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined(MIT_FLOAT) && !defined(CA_LITTLE_ENDIAN)
|
||||
#define htond(IEEEhost, IEEEnet) (*(double *)(IEEEnet) = *(double *)(IEEEhost))
|
||||
#define ntohd(IEEEnet, IEEEhost) (*(double *)(IEEEhost) = *(double *)(IEEEnet))
|
||||
#define htonf(IEEEhost, IEEEnet) (*(float *)(IEEEnet) = *(float *)(IEEEhost))
|
||||
#define ntohf(IEEEnet, IEEEhost) (*(float *)(IEEEhost) = *(float *)(IEEEnet))
|
||||
#if defined(CA_FLOAT_IEEE) && !defined(CA_LITTLE_ENDIAN)
|
||||
# define htond(IEEEhost, IEEEnet) \
|
||||
(*(double *)(IEEEnet) = *(double *)(IEEEhost))
|
||||
# define ntohd(IEEEnet, IEEEhost) \
|
||||
(*(double *)(IEEEhost) = *(double *)(IEEEnet))
|
||||
# define htonf(IEEEhost, IEEEnet) \
|
||||
(*(float *)(IEEEnet) = *(float *)(IEEEhost))
|
||||
# define ntohf(IEEEnet, IEEEhost) \
|
||||
(*(float *)(IEEEhost) = *(float *)(IEEEnet))
|
||||
#elif defined(CA_FLOAT_IEEE) && defined(CA_LITTLE_ENDIAN)
|
||||
# define ntohf(NET,HOST) \
|
||||
{*((u_long *)(HOST)) = ntohl(*((u_long *)(NET )));}
|
||||
# define htonf(HOST,NET) \
|
||||
{*((u_long *)(NET) ) = htonl(*((u_long *)(HOST)));}
|
||||
# define ntohd(NET,HOST) \
|
||||
{ ((u_long *)(HOST))[1] = ntohl(((u_long *)(NET))[0]) ; \
|
||||
((u_long *)(HOST))[0] = ntohl(((u_long *)(NET))[1]) ;}
|
||||
# define htond(HOST,NET) \
|
||||
{ ((u_long *)(NET))[1] = htonl(((u_long *)(HOST))[0]) ; \
|
||||
((u_long *)(NET))[0] = htonl(((u_long *)(HOST))[1]) ;}
|
||||
#else
|
||||
void htond(double *pHost, double *pNet);
|
||||
void ntohd(double *pNet, double *pHost);
|
||||
void htonf(float *pHost, float *pNet);
|
||||
void ntohf(float *pNet, float *pHost);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -37,13 +37,18 @@ static char *sccsId = "@(#) $Id$";
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#ifdef _WINDOWS
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <sys/types.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <arpa/inet.h>
|
||||
# include <netdb.h>
|
||||
#endif
|
||||
|
||||
#include <epicsAssert.h>
|
||||
|
||||
|
||||
/*
|
||||
@@ -55,7 +60,7 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
|
||||
struct hostent *ent;
|
||||
|
||||
ent = gethostbyaddr(
|
||||
pnet_addr,
|
||||
(char *) pnet_addr,
|
||||
sizeof(*pnet_addr),
|
||||
AF_INET);
|
||||
if(ent){
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
* pairs reside at the same C bracket level
|
||||
* .11 GeG 120992 support VMS/UCX
|
||||
* .12 CJM 130794 define MYERRNO properly for UCX
|
||||
* .13 CJM 311094 mods to support DEC C compiler
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -39,6 +40,7 @@ static char *os_depenhSccsId = "$Id$";
|
||||
* each socket library
|
||||
*/
|
||||
#ifdef UNIX
|
||||
# include <unistd.h>
|
||||
# include <errno.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/time.h>
|
||||
@@ -46,7 +48,9 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <sys/param.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <netinet/tcp.h>
|
||||
# include <net/if.h>
|
||||
# include <arpa/inet.h>
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif
|
||||
|
||||
@@ -57,6 +61,7 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <sys/ioctl.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# include <netinet/tcp.h>
|
||||
# include <net/if.h>
|
||||
|
||||
# include <systime.h>
|
||||
@@ -93,9 +98,13 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <sys/types.h>
|
||||
# include <sys/socket.h>
|
||||
# include <netinet/in.h>
|
||||
# define __TIME_LOADED /* dont include VMS CC time.h under MULTINET */
|
||||
# include <netinet/tcp.h>
|
||||
#if !defined(UCX)
|
||||
# include <sys/time.h>
|
||||
# include <tcp/errno.h>
|
||||
# include <tcp/errno.h>
|
||||
#else
|
||||
# include <errno>
|
||||
#endif
|
||||
# include <ssdef>
|
||||
# include <stsdef>
|
||||
# include <iodef.h>
|
||||
@@ -104,12 +113,12 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# include <descrip.h>
|
||||
# define MAXHOSTNAMELEN 75
|
||||
#ifdef UCX /* GeG 09-DEC-1992 */
|
||||
# include <sys/ucx$inetdef.h>
|
||||
# include <ucx.h>
|
||||
# include <sys/ucx$inetdef.h>
|
||||
# include <ucx.h>
|
||||
#else
|
||||
# include <net/if.h>
|
||||
# include <vms/inetiodef.h>
|
||||
# include <sys/ioctl.h>
|
||||
# include <net/if.h>
|
||||
# include <vms/inetiodef.h>
|
||||
# include <sys/ioctl.h>
|
||||
#endif
|
||||
# define CA_OS_CONFIGURED
|
||||
#endif /*VMS*/
|
||||
@@ -123,15 +132,12 @@ static char *os_depenhSccsId = "$Id$";
|
||||
#endif /*_WINDOWS*/
|
||||
|
||||
#ifndef CA_OS_CONFIGURED
|
||||
#error Please define one of vxWorks, UNIX or VMS
|
||||
#error Please define one of vxWorks, UNIX VMS, or _WINDOWS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Big endin architecture is assumed. Otherwise set "CA_LITTLE_ENDIAN".
|
||||
*
|
||||
* IEEE floating point architecture assumed. Set "CA_FLOAT_MIT" if
|
||||
* appropriate. No other floating point formats currently
|
||||
* supported.
|
||||
* Here are the definitions for architecture dependent byte ordering
|
||||
* and floating point format
|
||||
*/
|
||||
#if defined(VAX)
|
||||
# define CA_FLOAT_MIT
|
||||
@@ -139,10 +145,10 @@ static char *os_depenhSccsId = "$Id$";
|
||||
#elif defined(_X86_)
|
||||
# define CA_FLOAT_IEEE
|
||||
# define CA_LITTLE_ENDIAN
|
||||
#elif (defined(__ALPHA) || defined(__alpha)) && defined(VMS)
|
||||
#elif (defined(__ALPHA) && defined(VMS) || defined(__alpha)) && defined(VMS)
|
||||
# define CA_FLOAT_MIT
|
||||
# define CA_LITTLE_ENDIAN
|
||||
#elif (defined(__ALPHA) || defined(__alpha)) && defined(UNIX)
|
||||
#elif (defined(__ALPHA) && defined(UNIX) || defined(__alpha)) && defined(UNIX)
|
||||
# define CA_FLOAT_IEEE
|
||||
# define CA_LITTLE_ENDIAN
|
||||
#else
|
||||
@@ -269,7 +275,6 @@ static char *os_depenhSccsId = "$Id$";
|
||||
# else
|
||||
# ifdef UCX
|
||||
# define MYERRNO errno
|
||||
extern volatile int noshare errno ;
|
||||
# else
|
||||
# define MYERRNO socket_errno
|
||||
# endif
|
||||
@@ -286,6 +291,12 @@ static char *os_depenhSccsId = "$Id$";
|
||||
#endif
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# define LOCK
|
||||
# define UNLOCK
|
||||
# define LOCKEVENTS
|
||||
# define UNLOCKEVENTS
|
||||
# define EVENTLOCKTEST (post_msg_active)
|
||||
# define MAXHOSTNAMELEN 75
|
||||
# define IPPORT_USERRESERVED 5000
|
||||
# define EWOULDBLOCK WSAEWOULDBLOCK
|
||||
# define ENOBUFS WSAENOBUFS
|
||||
|
||||
@@ -31,14 +31,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI includes
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <pwd.h>
|
||||
#include <sys/param.h>
|
||||
@@ -74,52 +66,27 @@ void cac_gettimeval(struct timeval *pt)
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
int newInput;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
newInput = FALSE;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
if(count>0){
|
||||
newInput = TRUE;
|
||||
}
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(newInput);
|
||||
|
||||
}
|
||||
|
||||
log_time(char *pStr)
|
||||
{
|
||||
static struct timeval time;
|
||||
struct timeval newtime;
|
||||
struct timezone tz;
|
||||
ca_real diff;
|
||||
int status;
|
||||
|
||||
status = gettimeofday(&newtime, &tz);
|
||||
assert(status==0);
|
||||
|
||||
diff = cac_time_diff(&newtime, &time);
|
||||
printf("Expired %f - %s\n", diff, pStr);
|
||||
time = newtime;
|
||||
while(count>0);
|
||||
}
|
||||
|
||||
|
||||
@@ -220,7 +187,7 @@ char *localUserName()
|
||||
if(!pName){
|
||||
pName = getpwuid(getuid())->pw_name;
|
||||
if(!pName){
|
||||
return NULL;
|
||||
pName = "";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,7 +223,7 @@ void ca_spawn_repeater()
|
||||
|
||||
/*
|
||||
* return to the caller
|
||||
* if its the in the initiating process
|
||||
* if its in the initiating process
|
||||
*/
|
||||
if (status){
|
||||
return;
|
||||
@@ -270,7 +237,8 @@ void ca_spawn_repeater()
|
||||
status = execlp(pImageName, NULL);
|
||||
if(status<0){
|
||||
ca_printf("!!WARNING!!\n");
|
||||
ca_printf("The executable \"%s\" couldnt be located.\n", pImageName);
|
||||
ca_printf("The executable \"%s\" couldnt be located\n", pImageName);
|
||||
ca_printf("because - %s\n", strerror(MYERRNO));
|
||||
ca_printf("You may need to modify your PATH environment variable.\n");
|
||||
ca_printf("Creating CA repeater with fork() system call.\n");
|
||||
ca_printf("Repeater will inherit parents process name and resources.\n");
|
||||
@@ -281,25 +249,14 @@ void ca_spawn_repeater()
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ca_printf()
|
||||
* caSetDefaultPrintfHandler ()
|
||||
* use the normal default here
|
||||
* ( see access.c )
|
||||
*/
|
||||
int ca_printf(char *pformat, ...)
|
||||
void caSetDefaultPrintfHandler ()
|
||||
{
|
||||
va_list args;
|
||||
int status;
|
||||
|
||||
va_start(args, pformat);
|
||||
|
||||
status = vfprintf(
|
||||
stderr,
|
||||
pformat,
|
||||
args);
|
||||
|
||||
va_end(args);
|
||||
|
||||
return status;
|
||||
ca_static->ca_printf_func = epicsVprintf;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,11 +20,11 @@
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Direct inqueries to:
|
||||
* Andy Kozubal, AT-8, Mail Stop H820
|
||||
* Jeff HIll, AT-8, Mail Stop H820
|
||||
* Los Alamos National Laboratory
|
||||
* Los Alamos, New Mexico 87545
|
||||
* Phone: (505) 667-6508
|
||||
* E-mail: kozubal@k2.lanl.gov
|
||||
* Phone: (505) 665-1831
|
||||
* E-mail: johill@lanl.gov
|
||||
*
|
||||
* PURPOSE:
|
||||
* Broadcasts fan out over the LAN, but UDP does not allow
|
||||
@@ -141,8 +141,9 @@ void ca_repeater()
|
||||
|
||||
status = local_addr(sock, &local);
|
||||
if(status != OK){
|
||||
ca_printf("CA Repeater: no inet interfaces online?\n");
|
||||
assert(0);
|
||||
ca_printf(
|
||||
"CA Repeater: failed during initialization - no local IP address\n");
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -241,7 +242,7 @@ void ca_repeater()
|
||||
/*
|
||||
* register_new_client()
|
||||
*/
|
||||
void register_new_client(
|
||||
LOCAL void register_new_client(
|
||||
SOCKET sock,
|
||||
struct sockaddr_in *pLocal,
|
||||
struct sockaddr_in *pFrom)
|
||||
|
||||
@@ -129,6 +129,10 @@ unsigned long blockSize
|
||||
|
||||
piiu->curMsgBytes += size;
|
||||
if(piiu->curMsgBytes < sizeof(piiu->curMsg)){
|
||||
#if 0
|
||||
printf ("waiting for %d msg hdr bytes\n",
|
||||
sizeof(piiu->curMsg)-piiu->curMsgBytes);
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -174,10 +178,10 @@ unsigned long blockSize
|
||||
if(piiu->pCurData){
|
||||
free(piiu->pCurData);
|
||||
}
|
||||
piiu->curDataMax = 0;
|
||||
piiu->pCurData = (void *)
|
||||
malloc(piiu->curMsg.m_postsize);
|
||||
if(!piiu->pCurData){
|
||||
piiu->curDataMax = 0;
|
||||
piiu->curMsgBytes = 0;
|
||||
piiu->curDataBytes = 0;
|
||||
return ERROR;
|
||||
@@ -200,6 +204,10 @@ unsigned long blockSize
|
||||
size);
|
||||
piiu->curDataBytes += size;
|
||||
if(piiu->curDataBytes < piiu->curMsg.m_postsize){
|
||||
#if 0
|
||||
printf ("waiting for %d msg bdy bytes\n",
|
||||
piiu->curMsg.m_postsize-piiu->curDataBytes);
|
||||
#endif
|
||||
return OK;
|
||||
}
|
||||
pInBuf += size;
|
||||
@@ -466,7 +474,6 @@ struct in_addr *pnet_addr
|
||||
* read seq
|
||||
*/
|
||||
if (VALID_MSG(piiu)){
|
||||
|
||||
/*
|
||||
* convert the data buffer from net
|
||||
* format to host format
|
||||
@@ -478,11 +485,19 @@ struct in_addr *pnet_addr
|
||||
FALSE,
|
||||
piiu->curMsg.m_count);
|
||||
# else
|
||||
memcpy(
|
||||
(char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData,
|
||||
dbr_size_n(piiu->curMsg.m_type,
|
||||
piiu->curMsg.m_count));
|
||||
if (piiu->curMsg.m_type == DBR_STRING) {
|
||||
strcpy ((char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData);
|
||||
}
|
||||
else {
|
||||
memcpy(
|
||||
(char *)pIOBlock->usr_arg,
|
||||
piiu->pCurData,
|
||||
dbr_size_n (
|
||||
piiu->curMsg.m_type,
|
||||
piiu->curMsg.m_count)
|
||||
);
|
||||
}
|
||||
# endif
|
||||
|
||||
/*
|
||||
@@ -688,7 +703,7 @@ struct in_addr *pnet_addr
|
||||
}
|
||||
|
||||
if (CA_V44(CA_PROTOCOL_VERSION,piiu->minor_version_number)) {
|
||||
chan->id.sid = ntohl (piiu->curMsg.m_available);
|
||||
chan->id.sid = piiu->curMsg.m_available;
|
||||
}
|
||||
reconnect_channel(piiu, chan);
|
||||
break;
|
||||
|
||||
@@ -97,7 +97,7 @@ void ca_sg_shutdown(struct ca_static *ca_temp)
|
||||
/*
|
||||
* ca_sg_create()
|
||||
*/
|
||||
int ca_sg_create(CA_SYNC_GID *pgid)
|
||||
int APIENTRY ca_sg_create(CA_SYNC_GID *pgid)
|
||||
{
|
||||
int status;
|
||||
CASG *pcasg;
|
||||
@@ -162,7 +162,7 @@ int ca_sg_create(CA_SYNC_GID *pgid)
|
||||
/*
|
||||
* ca_sg_delete()
|
||||
*/
|
||||
int ca_sg_delete(CA_SYNC_GID gid)
|
||||
int APIENTRY ca_sg_delete(CA_SYNC_GID gid)
|
||||
{
|
||||
int status;
|
||||
CASG *pcasg;
|
||||
@@ -200,10 +200,9 @@ int ca_sg_delete(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_block()
|
||||
*/
|
||||
int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
{
|
||||
struct timeval beg_time;
|
||||
struct timeval cur_time;
|
||||
ca_real delay;
|
||||
int status;
|
||||
CASG *pcasg;
|
||||
@@ -244,7 +243,12 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
*/
|
||||
ca_flush_io();
|
||||
|
||||
cac_gettimeval(&beg_time);
|
||||
/*
|
||||
* the current time set within ca_flush_io()
|
||||
* above.
|
||||
*/
|
||||
beg_time = ca_static->currentTime;
|
||||
delay = 0.0;
|
||||
|
||||
status = ECA_NORMAL;
|
||||
while(pcasg->opPendCount){
|
||||
@@ -254,8 +258,6 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
/*
|
||||
* Exit if the timeout has expired
|
||||
*/
|
||||
cac_gettimeval (&cur_time);
|
||||
delay = cac_time_diff (&cur_time, &beg_time);
|
||||
remaining = timeout-delay;
|
||||
if (remaining<=0.0) {
|
||||
status = ECA_TIMEOUT;
|
||||
@@ -270,9 +272,15 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
/*
|
||||
* wait for asynch notification
|
||||
*/
|
||||
tmo.tv_sec = remaining;
|
||||
tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC;
|
||||
tmo.tv_sec = (long) remaining;
|
||||
tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC);
|
||||
cac_block_for_sg_completion (pcasg, &tmo);
|
||||
|
||||
/*
|
||||
* the current time set within cac_block_for_sg_completion()
|
||||
* above.
|
||||
*/
|
||||
delay = cac_time_diff (&ca_static->currentTime, &beg_time);
|
||||
}
|
||||
pcasg->opPendCount = 0;
|
||||
pcasg->seqNo++;
|
||||
@@ -283,7 +291,7 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout)
|
||||
/*
|
||||
* ca_sg_reset
|
||||
*/
|
||||
int ca_sg_reset(CA_SYNC_GID gid)
|
||||
int APIENTRY ca_sg_reset(CA_SYNC_GID gid)
|
||||
{
|
||||
CASG *pcasg;
|
||||
|
||||
@@ -305,7 +313,7 @@ int ca_sg_reset(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_test
|
||||
*/
|
||||
int ca_sg_test(CA_SYNC_GID gid)
|
||||
int APIENTRY ca_sg_test(CA_SYNC_GID gid)
|
||||
{
|
||||
CASG *pcasg;
|
||||
|
||||
@@ -331,7 +339,7 @@ int ca_sg_test(CA_SYNC_GID gid)
|
||||
/*
|
||||
* ca_sg_array_put()
|
||||
*/
|
||||
int ca_sg_array_put(
|
||||
int APIENTRY ca_sg_array_put(
|
||||
CA_SYNC_GID gid,
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
@@ -396,7 +404,7 @@ void *pvalue)
|
||||
/*
|
||||
* ca_sg_array_get()
|
||||
*/
|
||||
int ca_sg_array_get(
|
||||
int APIENTRY ca_sg_array_get(
|
||||
CA_SYNC_GID gid,
|
||||
chtype type,
|
||||
unsigned long count,
|
||||
|
||||
@@ -19,7 +19,7 @@ static char *sccsId = "$Id$";
|
||||
#include "iocinf.h"
|
||||
|
||||
|
||||
void ca_test_event(struct event_handler_args args)
|
||||
void APIENTRY ca_test_event(struct event_handler_args args)
|
||||
{
|
||||
ca_printf("CAC: ~~~### in test event for [%s] ###~~~\n",args.chid+1);
|
||||
ca_printf("CAC: User argument\t%x\n", args.usr);
|
||||
|
||||
15
src/ca/ucx.h
15
src/ca/ucx.h
@@ -6,6 +6,8 @@
|
||||
*
|
||||
* GeG 09-DEC-1992 initial edit
|
||||
* CJM 13-Jul-1994 add fd_set etc for R3.12
|
||||
* CJM 09-Dec-1994 define fd_set etc. so it will compile for
|
||||
* both DEC C and Vax C
|
||||
*
|
||||
*/
|
||||
#ifndef _UCX_H_
|
||||
@@ -70,13 +72,14 @@ typedef long fd_mask ;
|
||||
#define howmany(x, y) (((x)+((y)-1))/(y))
|
||||
#endif
|
||||
|
||||
typedef struct fd_set {
|
||||
fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)] ;
|
||||
} fd_set ;
|
||||
/*
|
||||
* Both DEC C and VAX C only allow 32 fd's at once
|
||||
*/
|
||||
typedef int fd_set ;
|
||||
|
||||
#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
|
||||
#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
|
||||
#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
|
||||
#define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS)))
|
||||
#define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS)))
|
||||
#define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS)))
|
||||
#define FD_ZERO(p) bzero((char *)(p), sizeof (*(p)))
|
||||
|
||||
#include <iodef.h>
|
||||
|
||||
@@ -31,15 +31,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI includes
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdLib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/*
|
||||
* VMS includes
|
||||
*/
|
||||
@@ -77,35 +68,27 @@ void cac_gettimeval(struct timeval *pt)
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
int newInput;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
newInput = FALSE;
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
if(count>0){
|
||||
newInput = TRUE;
|
||||
}
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(newInput);
|
||||
while(count>0);
|
||||
|
||||
}
|
||||
|
||||
@@ -147,7 +130,7 @@ void os_specific_sg_io_complete(CASG *pcasg)
|
||||
/*
|
||||
* cac_block_for_sg_completion()
|
||||
*/
|
||||
void cac_block_for_sg_completion(pTV)
|
||||
void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
{
|
||||
cac_mux_io(pTV);
|
||||
}
|
||||
@@ -183,11 +166,7 @@ void cac_os_depen_exit (struct ca_static *pcas)
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
* localUserName() - for VMS
|
||||
*
|
||||
* o Indicates failure by setting ptr to nill
|
||||
*
|
||||
*/
|
||||
char *localUserName()
|
||||
{
|
||||
@@ -230,24 +209,13 @@ char *localUserName()
|
||||
NULL,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if(status != SS$_NORMAL){
|
||||
return NULL;
|
||||
strcpy (pName, "");
|
||||
}
|
||||
|
||||
/*
|
||||
* test for remote login
|
||||
*/
|
||||
if(jobTypeSize != sizeof(jobType)){
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* This does not appear to change when it is
|
||||
* a remote login ??
|
||||
*/
|
||||
if(jobType != JPI$K_LOCAL && jobType != JPI$K_DETACHED){
|
||||
pTmp = "REMOTE";
|
||||
return pTmp;
|
||||
strcpy (pName, "");
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -335,19 +303,12 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size)
|
||||
|
||||
|
||||
/*
|
||||
* ca_printf()
|
||||
* caSetDefaultPrintfHandler ()
|
||||
* use the normal default here
|
||||
* ( see access.c )
|
||||
*/
|
||||
int ca_printf(char *pformat, ...)
|
||||
void caSetDefaultPrintfHandler ()
|
||||
{
|
||||
va_list args;
|
||||
int status;
|
||||
|
||||
va_start(args, pformat);
|
||||
|
||||
status = vfprintf(stderr, pformat, args);
|
||||
|
||||
va_end(args);
|
||||
|
||||
return status;
|
||||
ca_static->ca_printf_func = epicsVprintf;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <callback.h>
|
||||
#include "iocinf.h"
|
||||
#include "remLib.h"
|
||||
@@ -106,7 +104,6 @@ void cac_mux_io(struct timeval *ptimeout)
|
||||
|
||||
#if NOASYNCRECV
|
||||
cac_clean_iiu_list();
|
||||
manage_conn(TRUE);
|
||||
#endif
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
@@ -120,6 +117,7 @@ void cac_mux_io(struct timeval *ptimeout)
|
||||
|
||||
#if NOASYNCRECV
|
||||
ca_process_input_queue();
|
||||
manage_conn(TRUE);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -379,6 +377,7 @@ int cac_os_depen_init(struct ca_static *pcas)
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
evuser = (void *) db_init_events();
|
||||
assert(evuser);
|
||||
|
||||
@@ -757,7 +756,7 @@ void ca_spawn_repeater()
|
||||
/*
|
||||
* ca_repeater_task()
|
||||
*/
|
||||
void ca_repeater_task()
|
||||
LOCAL void ca_repeater_task()
|
||||
{
|
||||
taskwdInsert((int)taskIdCurrent, NULL, NULL);
|
||||
ca_repeater();
|
||||
@@ -848,6 +847,7 @@ void cac_recv_task(int tid)
|
||||
{
|
||||
struct timeval timeout;
|
||||
int status;
|
||||
int count;
|
||||
|
||||
taskwdInsert((int) taskIdCurrent, NULL, NULL);
|
||||
|
||||
@@ -862,18 +862,16 @@ void cac_recv_task(int tid)
|
||||
#if NOASYNCRECV
|
||||
taskDelay(60);
|
||||
#else
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 1;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS);
|
||||
timeout.tv_usec = 50000;
|
||||
timeout.tv_sec = 0;
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_SENDS | CA_DO_RECVS);
|
||||
|
||||
ca_process_input_queue();
|
||||
ca_process_input_queue();
|
||||
manage_conn(TRUE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -881,40 +879,17 @@ void cac_recv_task(int tid)
|
||||
|
||||
|
||||
/*
|
||||
* caSetDefaultPrintfHandler()
|
||||
*
|
||||
* replace the default printf handler with a
|
||||
* vxWorks specific one that calls logMsg ()
|
||||
* so that:
|
||||
*
|
||||
* ca_printf()
|
||||
*
|
||||
*
|
||||
* o messages go to the log file
|
||||
* o messages dont get intermixed
|
||||
*/
|
||||
int ca_printf(char *pformat, ...)
|
||||
void caSetDefaultPrintfHandler ()
|
||||
{
|
||||
va_list args;
|
||||
int status;
|
||||
|
||||
va_start(args, pformat);
|
||||
|
||||
{
|
||||
int logMsgArgs[6];
|
||||
int i;
|
||||
|
||||
for(i=0; i< NELEMENTS(logMsgArgs); i++){
|
||||
logMsgArgs[i] = va_arg(args, int);
|
||||
}
|
||||
|
||||
status = logMsg(
|
||||
pformat,
|
||||
logMsgArgs[0],
|
||||
logMsgArgs[1],
|
||||
logMsgArgs[2],
|
||||
logMsgArgs[3],
|
||||
logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
|
||||
return status;
|
||||
ca_static->ca_printf_func = epicsVprintf;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/*
|
||||
* $Id$
|
||||
* Author: Jeffrey O. Hill
|
||||
* Author: Jeffrey O. Hill, Chris Timossi
|
||||
* hill@luke.lanl.gov
|
||||
* CATimossi@lbl.gov
|
||||
* (505) 665 1831
|
||||
* Date: 9-93
|
||||
*
|
||||
@@ -32,12 +33,9 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI includes
|
||||
* Windows includes
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <process.h>
|
||||
|
||||
#include "iocinf.h"
|
||||
|
||||
@@ -45,6 +43,11 @@
|
||||
#error This source is specific to DOS/WINDOS
|
||||
#endif
|
||||
|
||||
static int get_subnet_mask ( char SubNetMaskStr[256]);
|
||||
static int RegTcpParams (char IpAddr[256], char SubNetMask[256]);
|
||||
static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
LPDWORD lpdwType, LPBYTE lpbData, LPDWORD lpcbData );
|
||||
|
||||
|
||||
/*
|
||||
* cac_gettimeval
|
||||
@@ -72,35 +75,27 @@ void cac_gettimeval(struct timeval *pt)
|
||||
void cac_mux_io(struct timeval *ptimeout)
|
||||
{
|
||||
int count;
|
||||
int newInput;
|
||||
struct timeval timeout;
|
||||
|
||||
cac_clean_iiu_list();
|
||||
|
||||
timeout = *ptimeout;
|
||||
do{
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE); newInput = FALSE;
|
||||
|
||||
do{
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
if(count>0){
|
||||
newInput = TRUE;
|
||||
}
|
||||
timeout.tv_usec = 0;
|
||||
timeout.tv_sec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
count = cac_select_io(
|
||||
&timeout,
|
||||
CA_DO_RECVS | CA_DO_SENDS);
|
||||
|
||||
ca_process_input_queue();
|
||||
|
||||
}
|
||||
while(newInput);
|
||||
/*
|
||||
* manage search timers and detect disconnects
|
||||
*/
|
||||
manage_conn(TRUE);
|
||||
|
||||
timeout.tv_sec = 0;
|
||||
timeout.tv_usec = 0;
|
||||
}
|
||||
while(count>0);
|
||||
}
|
||||
|
||||
|
||||
@@ -143,9 +138,10 @@ void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV)
|
||||
*/
|
||||
int cac_os_depen_init(struct ca_static *pcas)
|
||||
{
|
||||
int status;
|
||||
int status;
|
||||
WSADATA WsaData;
|
||||
|
||||
ca_static = ca_temp;
|
||||
ca_static = pcas;
|
||||
|
||||
/*
|
||||
* dont allow disconnect to terminate process
|
||||
@@ -154,16 +150,17 @@ int cac_os_depen_init(struct ca_static *pcas)
|
||||
* allow error to be returned to sendto()
|
||||
* instead of handling disconnect at interrupt
|
||||
*/
|
||||
signal(SIGPIPE,SIG_IGN);
|
||||
|
||||
/* signal(SIGPIPE,SIG_IGN); */
|
||||
|
||||
# ifdef _WINSOCKAPI_
|
||||
status = WSAStartup(MAKEWORD(1,1), &WsaData));
|
||||
status = WSAStartup(MAKEWORD(1,1), &WsaData);
|
||||
assert (status==0);
|
||||
# endif
|
||||
|
||||
status = ca_os_independent_init ();
|
||||
|
||||
return status;
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -188,12 +185,16 @@ void cac_os_depen_exit (struct ca_static *pcas)
|
||||
*/
|
||||
char *localUserName()
|
||||
{
|
||||
int length;
|
||||
char *pName;
|
||||
char *pTmp;
|
||||
int length;
|
||||
char *pName;
|
||||
char *pTmp;
|
||||
char Uname[] = "";
|
||||
|
||||
pName = "Joe PC";
|
||||
length = strlen(pName)+1;
|
||||
pName = getenv("USERNAME");
|
||||
if (!pName) {
|
||||
pName = Uname;
|
||||
}
|
||||
length = strlen(pName)+1;
|
||||
|
||||
pTmp = malloc(length);
|
||||
if(!pTmp){
|
||||
@@ -219,8 +220,13 @@ void ca_spawn_repeater()
|
||||
* running in the repeater process
|
||||
* if here
|
||||
*/
|
||||
pImageName = "caRepeater";
|
||||
status = system(pImageName);
|
||||
pImageName = "caRepeater.exe";
|
||||
//status = system(pImageName);
|
||||
//Need to check if repeater is already loaded
|
||||
//For now, start Repeater from a command line, not here
|
||||
status = 0;
|
||||
//status = _spawnlp(_P_DETACH,pImageName,"");
|
||||
|
||||
if(status<0){
|
||||
ca_printf("!!WARNING!!\n");
|
||||
ca_printf("Unable to locate the executable \"%s\".\n",
|
||||
@@ -229,26 +235,241 @@ void ca_spawn_repeater()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* caSetDefaultPrintfHandler ()
|
||||
* use the normal default here
|
||||
* ( see access.c )
|
||||
*/
|
||||
void caSetDefaultPrintfHandler ()
|
||||
{
|
||||
ca_static->ca_printf_func = epicsVprintf;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ca_printf()
|
||||
*
|
||||
* Network interface routines
|
||||
*
|
||||
*/
|
||||
int ca_printf(char *pformat, ...)
|
||||
|
||||
/*
|
||||
* local_addr()
|
||||
*
|
||||
* return 127.0.0.1
|
||||
* (the loop back address)
|
||||
*/
|
||||
int local_addr (SOCKET s, struct sockaddr_in *plcladdr)
|
||||
{
|
||||
va_list args;
|
||||
int status;
|
||||
ca_uint32_t loopBackAddress = 0x7f000001;
|
||||
|
||||
va_start(args, pformat);
|
||||
|
||||
status = vfprintf(
|
||||
stderr,
|
||||
pformat,
|
||||
args);
|
||||
|
||||
va_end(args);
|
||||
|
||||
return status;
|
||||
plcladdr->sin_family = AF_INET;
|
||||
plcladdr->sin_port = 0;
|
||||
plcladdr->sin_addr.s_addr = ntohl (loopBackAddress);
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* caDiscoverInterfaces()
|
||||
*
|
||||
* This routine is provided with the address of an ELLLIST a socket
|
||||
* and a destination port number. When the routine returns there
|
||||
* will be one additional inet address (a caAddrNode) in the list
|
||||
* for each inet interface found that is up and isnt a loop back
|
||||
* interface. If the interface supports broadcast then I add its
|
||||
* broadcast address to the list. If the interface is a point to
|
||||
* point link then I add the destination address of the point to
|
||||
* point link to the list. In either case I set the port number
|
||||
* in the address node to the port supplied in the argument
|
||||
* list.
|
||||
*
|
||||
* LOCK should be applied here for (pList)
|
||||
* (this is also called from the server)
|
||||
*/
|
||||
void caDiscoverInterfaces(ELLLIST *pList, SOCKET socket, int port)
|
||||
{
|
||||
struct sockaddr_in localAddr;
|
||||
struct sockaddr_in InetAddr;
|
||||
struct in_addr bcast_addr;
|
||||
caAddrNode *pNode;
|
||||
int status;
|
||||
|
||||
pNode = (caAddrNode *) calloc(1,sizeof(*pNode));
|
||||
if(!pNode){
|
||||
return;
|
||||
}
|
||||
broadcast_addr(&bcast_addr);
|
||||
pNode->destAddr.inetAddr.sin_addr.s_addr = bcast_addr.s_addr; //broadcast addr
|
||||
pNode->destAddr.inetAddr.sin_port = htons(port);
|
||||
pNode->destAddr.inetAddr.sin_family = AF_INET;
|
||||
//pNode->srcAddr.inetAddr = 0 ;//localAddr;
|
||||
|
||||
/*
|
||||
* LOCK applied externally
|
||||
*/
|
||||
ellAdd(pList, &pNode->node);
|
||||
}
|
||||
|
||||
int
|
||||
broadcast_addr( struct in_addr *pcastaddr )
|
||||
{
|
||||
char netmask[256], lhostname[80];
|
||||
static struct in_addr castaddr;
|
||||
int status;
|
||||
static char init = FALSE;
|
||||
struct hostent *phostent;
|
||||
unsigned long laddr;
|
||||
|
||||
if (init) {
|
||||
*pcastaddr = castaddr;
|
||||
return OK;
|
||||
}
|
||||
gethostname(lhostname,sizeof(lhostname));
|
||||
phostent = gethostbyname(lhostname);
|
||||
if (!phostent) {
|
||||
return MYERRNO;
|
||||
}
|
||||
|
||||
if (status = get_subnet_mask(netmask))
|
||||
return ERROR;
|
||||
|
||||
laddr = *( (unsigned long *) phostent->h_addr_list[0]);
|
||||
castaddr.s_addr = (laddr & inet_addr(netmask)) | ~inet_addr(netmask);
|
||||
|
||||
if (!init){
|
||||
init = TRUE;
|
||||
*pcastaddr = castaddr;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
static int get_subnet_mask ( char SubNetMaskStr[256])
|
||||
{
|
||||
char localadr[256];
|
||||
|
||||
return RegTcpParams (localadr, SubNetMaskStr);
|
||||
}
|
||||
|
||||
static int RegTcpParams (char IpAddrStr[256], char SubNetMaskStr[256])
|
||||
{
|
||||
#define MAX_VALUE_NAME 128
|
||||
static CHAR ValueName[MAX_VALUE_NAME];
|
||||
static CHAR RegPath[256];
|
||||
DWORD cbDataLen;
|
||||
CHAR cbData[256];
|
||||
DWORD dwType;
|
||||
int status;
|
||||
static char IpAddr[256], SubNetMask[256];
|
||||
|
||||
cbDataLen = sizeof(cbData);
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\1");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
|
||||
if (status) {
|
||||
strcpy(RegPath,"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\01");
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "ServiceName", &dwType, cbData, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
}
|
||||
|
||||
strcpy(RegPath,"SYSTEM\\CurrentControlSet\\Services\\");
|
||||
strcat(RegPath,cbData);
|
||||
strcat(RegPath,"\\Parameters\\Tcpip");
|
||||
|
||||
cbDataLen = sizeof(IpAddr);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "IPAddress", &dwType, IpAddr, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
strcpy(IpAddrStr,IpAddr);
|
||||
|
||||
cbDataLen = sizeof(SubNetMask);
|
||||
status = RegKeyData (RegPath, HKEY_LOCAL_MACHINE, "SubnetMask", &dwType, SubNetMask, &cbDataLen);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
strcpy(SubNetMaskStr,SubNetMask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int RegKeyData (CHAR *RegPath, HANDLE hKeyRoot, LPSTR lpzValueName,
|
||||
LPDWORD lpdwType, LPBYTE lpbData, LPDWORD lpcbData )
|
||||
{
|
||||
HKEY hKey;
|
||||
DWORD retCode;
|
||||
|
||||
DWORD dwcClassLen = MAX_PATH;
|
||||
|
||||
// OPEN THE KEY.
|
||||
|
||||
retCode = RegOpenKeyEx (hKeyRoot, // Key handle at root level.
|
||||
RegPath, // Path name of child key.
|
||||
0, // Reserved.
|
||||
KEY_QUERY_VALUE, // Requesting read access.
|
||||
&hKey); // Address of key to be returned.
|
||||
|
||||
if (retCode)
|
||||
{
|
||||
//wsprintf (Buf, "Error: RegOpenKeyEx = %d", retCode);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
retCode = RegQueryValueEx (hKey, // Key handle returned from RegOpenKeyEx.
|
||||
lpzValueName, // Name of value.
|
||||
NULL, // Reserved, dword = NULL.
|
||||
lpdwType, // Type of data.
|
||||
lpbData, // Data buffer.
|
||||
lpcbData); // Size of data buffer.
|
||||
|
||||
if (retCode)
|
||||
{
|
||||
//wsprintf (Buf, "Error: RegQIK = %d, %d", retCode, __LINE__);
|
||||
return -2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||
{
|
||||
int status;
|
||||
WSADATA WsaData;
|
||||
|
||||
switch (dwReason) {
|
||||
|
||||
case DLL_PROCESS_ATTACH:
|
||||
|
||||
if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0)
|
||||
return FALSE;
|
||||
if (AllocConsole()) {
|
||||
SetConsoleTitle("Channel Access Status");
|
||||
freopen( "CONOUT$", "a", stderr );
|
||||
fprintf(stderr, "Process attached to ca.dll R12\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case DLL_PROCESS_DETACH:
|
||||
|
||||
if ((status = WSACleanup()) !=0)
|
||||
return FALSE;
|
||||
break;
|
||||
|
||||
case DLL_THREAD_ATTACH:
|
||||
fprintf(stderr, "Thread attached to ca.dll R12\n");
|
||||
break;
|
||||
|
||||
case DLL_THREAD_DETACH:
|
||||
fprintf(stderr, "Thread detached from ca.dll R12\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_LDLIBS = -lDb -lCom
|
||||
USR_LDLIBS = -lDb -lCom -lm
|
||||
USR_LDFLAGS = -L.
|
||||
|
||||
LEX = $(ELEX)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
b [a-zA-Z0-9_]
|
||||
a [ \t]
|
||||
d [a-zA-Z0-9_\,\./\*#\[\]%:;!|\'\-&\(\)@\?\+<>=$]
|
||||
d [a-zA-Z0-9_\,\./\*#\[\]%:;!|\'\-&\(\)@\?\+<>=$\^\~]
|
||||
|
||||
%{
|
||||
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <callback.h>
|
||||
#include <dbAccess.h>
|
||||
#include <recSup.h>
|
||||
#include <taskwd.h>
|
||||
#include <errMdef.h>
|
||||
#include <task_params.h>
|
||||
@@ -164,3 +166,22 @@ static void wdCallback(long ind)
|
||||
rngDelete(callbackQ[ind]);
|
||||
start(ind);
|
||||
}
|
||||
|
||||
static void ProcessCallback(CALLBACK *pCallback)
|
||||
{
|
||||
struct dbCommon *pRec;
|
||||
|
||||
callbackGetUser(pRec, pCallback);
|
||||
dbScanLock(pRec);
|
||||
((struct rset*)(pRec->rset))->process(pRec);
|
||||
dbScanUnlock(pRec);
|
||||
}
|
||||
void callbackRequestProcessCallback(CALLBACK *pCallback, int Priority, void *pRec)
|
||||
{
|
||||
callbackSetCallback(ProcessCallback, pCallback);
|
||||
callbackSetPriority(Priority, pCallback);
|
||||
callbackSetUser(pRec, pCallback);
|
||||
callbackRequest(pCallback);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -117,12 +117,10 @@ long dbCommonInit();
|
||||
|
||||
/*
|
||||
* The lock structure for each database lock set. A lockset is the
|
||||
* connected graph of all adjacent nodes to a record. A record
|
||||
* is considered adjacent if the link connecting it to the lock
|
||||
* set causes that record to process. In other words, a record
|
||||
* is considered part of the lock set if the action of getting
|
||||
* or putting a value to that record (with a link) causes that
|
||||
* record to process.
|
||||
* connected graph of all adjacent nodes to a record (with one
|
||||
* exception, single-valued NPP NMS gets), where adjacent is defined
|
||||
* as a record connected by a get, put, or forward link to the current
|
||||
* record.
|
||||
*/
|
||||
struct scanLock {
|
||||
FAST_LOCK lock;
|
||||
@@ -190,8 +188,8 @@ void dbScanLock(struct dbCommon *precord)
|
||||
|
||||
/* Move range check to iocInit */
|
||||
if(lset < 0 || lset >= dbScanPvt.nset) {
|
||||
errMessage(S_db_badLset, "Lock Set out of range");
|
||||
exit(1);
|
||||
errMessage(S_db_badLset, "Lock Set out of range:dbScanLock");
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
pscanLock = dbScanPvt.pscanLock + lset;
|
||||
FASTLOCK(&pscanLock->lock);
|
||||
@@ -212,10 +210,9 @@ void dbScanUnlock(struct dbCommon *precord)
|
||||
|
||||
/* Put check in iocInit() */
|
||||
if(lset<0 || lset>=dbScanPvt.nset) {
|
||||
errMessage(S_db_badLset,"Lock Set out of range");
|
||||
return;
|
||||
errMessage(S_db_badLset,"Lock Set out of range:dbScanUnlock");
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
|
||||
pscanLock = dbScanPvt.pscanLock + lset;
|
||||
pscanLock->precord = NULL;
|
||||
FASTUNLOCK(&pscanLock->lock);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
* $Log$
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -64,7 +65,7 @@
|
||||
#include <vxLib.h>
|
||||
#include <tickLib.h>
|
||||
#include <sysLib.h>
|
||||
|
||||
|
||||
#include <fast_lock.h>
|
||||
#include <alarm.h>
|
||||
#include <choice.h>
|
||||
@@ -681,7 +682,15 @@ int dbBkpt(struct dbCommon *precord)
|
||||
* breakpoint handler will not work as expected.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Take and give a semaphore to check for breakpoints
|
||||
* every time a record is processed. Slow. Thank
|
||||
* goodness breakpoint checking is turned off during
|
||||
* normal operation.
|
||||
*/
|
||||
semTake(bkpt_stack_sem, WAIT_FOREVER);
|
||||
FIND_LOCKSET(precord, pnode);
|
||||
semGive(bkpt_stack_sem);
|
||||
|
||||
if (pnode == NULL) {
|
||||
/* no breakpoints in precord's lockset */
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
* joh 21 080393 added task watch dog
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <epicsAssert.h>
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <types.h>
|
||||
@@ -591,12 +591,12 @@ int db_post_single_event(struct event_block *pevent)
|
||||
ev_que->valque[putix].sevr = sevr;
|
||||
ev_que->valque[putix].time = precord->time;
|
||||
/*
|
||||
* use bcopy to avoid a bus error on
|
||||
* use memcpy to avoid a bus error on
|
||||
* union copy of char in the db at an odd
|
||||
* address
|
||||
*/
|
||||
bcopy( pevent->paddr->pfield,
|
||||
(char *)&ev_que->valque[putix].field,
|
||||
memcpy( (char *)&ev_que->valque[putix].field,
|
||||
pevent->paddr->pfield,
|
||||
dbr_size[pevent->paddr->field_type]);
|
||||
}
|
||||
/* notify the event handler */
|
||||
@@ -669,12 +669,12 @@ unsigned int select
|
||||
ev_que->valque[putix].time = precord->time;
|
||||
|
||||
/*
|
||||
* use bcopy to avoid a bus error on
|
||||
* use memcpy to avoid a bus error on
|
||||
* union copy of char in the db at an odd
|
||||
* address
|
||||
*/
|
||||
bcopy( (char *)event->paddr->pfield,
|
||||
(char *)&ev_que->valque[putix].field,
|
||||
memcpy( (char *)&ev_que->valque[putix].field,
|
||||
(char *)event->paddr->pfield,
|
||||
dbr_size[event->paddr->field_type]);
|
||||
|
||||
}
|
||||
|
||||
110
src/db/dbLink.c
110
src/db/dbLink.c
@@ -182,7 +182,6 @@ long dbPutField(
|
||||
}
|
||||
dbScanLock(precord);
|
||||
status=dbPut(paddr,dbrType,pbuffer,nRequest);
|
||||
if(status) recGblDbaddrError(status,paddr,"dbPutField");
|
||||
if(status==0){
|
||||
if((paddr->pfield==(void *)&precord->proc)
|
||||
||(pfldDes->process_passive && precord->scan==0 && dbrType<DBR_PUT_ACKT)) {
|
||||
@@ -266,7 +265,6 @@ long dbPutNotify(PUTNOTIFY *ppn)
|
||||
}
|
||||
dbScanLock(precord);
|
||||
status=dbPut(paddr,dbrType,pbuffer,nRequest);
|
||||
if(status) recGblDbaddrError(status,paddr,"dbPutField");
|
||||
ppn->status = status;
|
||||
if(status==0){
|
||||
if((paddr->pfield==(void *)&precord->proc)
|
||||
@@ -3530,7 +3528,7 @@ long offset;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
static long putStringEnum(paddr,pbuffer,nRequest,no_elements,offset)
|
||||
struct dbAddr *paddr;
|
||||
char *pbuffer;
|
||||
@@ -3538,15 +3536,41 @@ long nRequest;
|
||||
long no_elements;
|
||||
long offset;
|
||||
{
|
||||
struct rset *prset;
|
||||
short record_type=(paddr->record_type);
|
||||
long status;
|
||||
struct rset *prset;
|
||||
short record_type=(paddr->record_type);
|
||||
unsigned short *pfield= (unsigned short*)(paddr->pfield);
|
||||
long status;
|
||||
unsigned int nchoices,ind;
|
||||
int nargs,nchars;
|
||||
struct dbr_enumStrs enumStrs;
|
||||
|
||||
if((prset=GET_PRSET(pdbBase->precSup,record_type)) && (prset->put_enum_str))
|
||||
return( (*prset->put_enum_str)(paddr,pbuffer) );
|
||||
status=S_db_noRSET;
|
||||
recGblRecSupError(status,paddr,"dbPutField","put_enum_str");
|
||||
return(S_db_badDbrtype);
|
||||
if((prset=GET_PRSET(pdbBase->precSup,record_type))
|
||||
&& (prset->put_enum_str)) {
|
||||
status = (*prset->put_enum_str)(paddr,pbuffer);
|
||||
if(!status) return(0);
|
||||
if(prset->get_enum_strs) {
|
||||
status = (*prset->get_enum_strs)(paddr,&enumStrs);
|
||||
if(!status) {
|
||||
nchoices = enumStrs.no_str;
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
status = S_db_badChoice;
|
||||
}
|
||||
}else {
|
||||
status=S_db_noRSET;
|
||||
}
|
||||
} else {
|
||||
status=S_db_noRSET;
|
||||
}
|
||||
if(status == S_db_noRSET) {
|
||||
recGblRecSupError(status,paddr,"dbPutField","put_enum_str");
|
||||
} else {
|
||||
recGblDbaddrError(status,paddr,"dbPut(putStringEnum)");
|
||||
}
|
||||
return(status);
|
||||
}
|
||||
|
||||
static long putStringGchoice(paddr,pbuffer,nRequest,no_elements,offset)
|
||||
@@ -3560,20 +3584,27 @@ long offset;
|
||||
unsigned short *pfield= (unsigned short*)(paddr->pfield);
|
||||
char *pchoice;
|
||||
struct choiceSet *pchoiceSet;
|
||||
unsigned short i;
|
||||
unsigned int nchoices,ind;
|
||||
int nargs,nchars;
|
||||
|
||||
if(no_elements!=1){
|
||||
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringGchoice)");
|
||||
return(S_db_onlyOne);
|
||||
}
|
||||
if(pchoiceSet=GET_PCHOICE_SET(pdbBase->pchoiceGbl,choice_set)) {
|
||||
for(i=0; i<pchoiceSet->number; i++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
|
||||
nchoices = pchoiceSet->number;
|
||||
for(ind=0; ind<nchoices; ind++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
|
||||
if(strcmp(pchoice,pbuffer)==0) {
|
||||
*pfield=i;
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringGchoice)");
|
||||
return(S_db_badChoice);
|
||||
@@ -3589,20 +3620,27 @@ long offset;
|
||||
unsigned short *pfield= (unsigned short*)(paddr->pfield);
|
||||
char *pchoice;
|
||||
struct choiceSet *pchoiceSet;
|
||||
unsigned short i;
|
||||
unsigned int nchoices,ind;
|
||||
int nargs,nchars;
|
||||
|
||||
if(no_elements!=1){
|
||||
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringCchoice)");
|
||||
return(S_db_onlyOne);
|
||||
}
|
||||
if(pchoiceSet=pdbBase->pchoiceCvt) {
|
||||
for(i=0; i<pchoiceSet->number; i++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
|
||||
nchoices = pchoiceSet->number;
|
||||
for(ind=0; ind<nchoices; ind++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
|
||||
if(strcmp(pchoice,pbuffer)==0) {
|
||||
*pfield=i;
|
||||
*pfield=ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringCchoice)");
|
||||
return(S_db_badChoice);
|
||||
@@ -3620,7 +3658,8 @@ long offset;
|
||||
char *pchoice;
|
||||
struct choiceSet *pchoiceSet;
|
||||
struct arrChoiceSet *parrChoiceSet;
|
||||
unsigned short i;
|
||||
unsigned int nchoices,ind;
|
||||
int nargs,nchars;
|
||||
|
||||
if(no_elements!=1){
|
||||
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringRchoice)");
|
||||
@@ -3628,13 +3667,19 @@ long offset;
|
||||
}
|
||||
if((parrChoiceSet=GET_PARR_CHOICE_SET(pdbBase->pchoiceRec,(paddr->record_type)))
|
||||
&& (pchoiceSet=GET_PCHOICE_SET(parrChoiceSet,choice_set))) {
|
||||
for(i=0; i<pchoiceSet->number; i++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[i])) continue;
|
||||
nchoices = pchoiceSet->number;
|
||||
for(ind=0; ind<nchoices; ind++) {
|
||||
if(!(pchoice=pchoiceSet->papChoice[ind])) continue;
|
||||
if(strcmp(pchoice,pbuffer)==0) {
|
||||
*pfield=i;
|
||||
*pfield=ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringRchoice)");
|
||||
return(S_db_badChoice);
|
||||
@@ -3650,20 +3695,27 @@ long offset;
|
||||
unsigned short *pfield= (unsigned short*)(paddr->pfield);
|
||||
struct devChoiceSet *pdevChoiceSet;
|
||||
char *pchoice;
|
||||
unsigned short i;
|
||||
unsigned int nchoices,ind;
|
||||
int nargs,nchars;
|
||||
|
||||
if(no_elements!=1){
|
||||
recGblDbaddrError(S_db_onlyOne,paddr,"dbPut(putStringDchoice)");
|
||||
return(S_db_onlyOne);
|
||||
}
|
||||
if(pdevChoiceSet=GET_PDEV_CHOICE_SET(pdbBase->pchoiceDev,paddr->record_type)) {
|
||||
for(i=0; i<pdevChoiceSet->number; i++) {
|
||||
if(!(pchoice=pdevChoiceSet->papDevChoice[i]->pchoice)) continue;
|
||||
nchoices = pdevChoiceSet->number;
|
||||
for(ind=0; ind<nchoices; ind++) {
|
||||
if(!(pchoice=pdevChoiceSet->papDevChoice[ind]->pchoice)) continue;
|
||||
if(strcmp(pchoice,pbuffer)==0) {
|
||||
*pfield=i;
|
||||
*pfield=ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
nargs = sscanf(pbuffer," %u %n",&ind,&nchars);
|
||||
if(nargs==1 && nchars==strlen(pbuffer) && ind<nchoices) {
|
||||
*pfield = ind;
|
||||
return(0);
|
||||
}
|
||||
}
|
||||
recGblDbaddrError(S_db_badChoice,paddr,"dbPut(putStringDchoice)");
|
||||
return(S_db_badChoice);
|
||||
@@ -5875,7 +5927,9 @@ long dbPut(
|
||||
if(special) {
|
||||
if(special<100) { /*global processing*/
|
||||
if(special==SPC_NOMOD) {
|
||||
return(S_db_noMod);
|
||||
status = S_db_noMod;
|
||||
recGblDbaddrError(status,paddr,"dbPut");
|
||||
return(status);
|
||||
}else if(special==SPC_SCAN){
|
||||
scanDelete(precord);
|
||||
}
|
||||
|
||||
@@ -486,7 +486,7 @@ got_record:
|
||||
recGblDbaddrError(status,&dbAddr,"initPeriodic");
|
||||
exit(1);
|
||||
}
|
||||
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list));
|
||||
papPeriodic = dbCalloc(nPeriodic,sizeof(struct scan_list*));
|
||||
periodicTaskId = dbCalloc(nPeriodic,sizeof(int));
|
||||
for(i=0; i<nPeriodic; i++) {
|
||||
psl = dbCalloc(1,sizeof(struct scan_list));
|
||||
|
||||
@@ -97,6 +97,11 @@ static char *promptCAMAC_IO[] = {
|
||||
"subaddress:",
|
||||
" function:",
|
||||
" parameter:"};
|
||||
static char *promptRF_IO[] = {
|
||||
" cryo:",
|
||||
" micro:",
|
||||
" dataset:",
|
||||
" element:"};
|
||||
static char *promptAB_IO[] = {
|
||||
" link:",
|
||||
" adapter:",
|
||||
@@ -149,6 +154,7 @@ static void initForms()
|
||||
promptAddr[PV_LINK] = promptPV_LINK; formlines[PV_LINK] = 4;
|
||||
promptAddr[VME_IO] = promptVME_IO; formlines[VME_IO] = 3;
|
||||
promptAddr[CAMAC_IO] = promptCAMAC_IO; formlines[CAMAC_IO] = 6;
|
||||
promptAddr[RF_IO] = promptRF_IO; formlines[RF_IO] = 4;
|
||||
promptAddr[AB_IO] = promptAB_IO; formlines[AB_IO] = 6;
|
||||
promptAddr[GPIB_IO] = promptGPIB_IO; formlines[GPIB_IO] = 3;
|
||||
promptAddr[BITBUS_IO]= promptBITBUS_IO;formlines[BITBUS_IO]= 5;
|
||||
@@ -1338,6 +1344,13 @@ DBENTRY *pdbentry;
|
||||
plink->value.camacio.n,plink->value.camacio.a,
|
||||
plink->value.camacio.f,plink->value.camacio.parm);
|
||||
break;
|
||||
case RF_IO:
|
||||
sprintf(message,"#R%d M%d D%d E%d",
|
||||
plink->value.rfio.cryo,
|
||||
plink->value.rfio.micro,
|
||||
plink->value.rfio.dataset,
|
||||
plink->value.rfio.element);
|
||||
break;
|
||||
case AB_IO:
|
||||
sprintf(message,"#L%d A%d C%d S%d F%d @%s",
|
||||
plink->value.abio.link,plink->value.abio.adapter,
|
||||
@@ -1682,6 +1695,25 @@ char *pstring;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case RF_IO: {
|
||||
char *end;
|
||||
|
||||
if(!(end = strchr(pstr,'#'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
if(!(end = strchr(pstr,'R'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.rfio.cryo);
|
||||
if(!(end = strchr(pstr,'M'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.rfio.micro);
|
||||
if(!(end = strchr(pstr,'D'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.rfio.dataset);
|
||||
if(!(end = strchr(pstr,'E'))) return (S_dbLib_badField);
|
||||
pstr = end + 1;
|
||||
sscanf(pstr,"%hd",&plink->value.rfio.element);
|
||||
}
|
||||
break;
|
||||
case AB_IO: {
|
||||
char *end;
|
||||
|
||||
@@ -2459,6 +2491,15 @@ DBENTRY *pdbentry;
|
||||
value++;
|
||||
strcpy(*value,plink->value.camacio.parm);
|
||||
break;
|
||||
case RF_IO:
|
||||
cvtShortToString(plink->value.rfio.cryo,*value);
|
||||
value++;
|
||||
cvtShortToString(plink->value.rfio.micro,*value);
|
||||
value++;
|
||||
cvtShortToString(plink->value.rfio.dataset,*value);
|
||||
value++;
|
||||
cvtShortToString(plink->value.rfio.element,*value);
|
||||
break;
|
||||
case AB_IO:
|
||||
cvtShortToString(plink->value.abio.link,*value);
|
||||
value++;
|
||||
@@ -2627,6 +2668,35 @@ char **value;
|
||||
value++; verify++;
|
||||
strncpy(plink->value.camacio.parm,*value,CAMAC_PARAM_SZ-1);
|
||||
break;
|
||||
case RF_IO:
|
||||
lvalue = strtol(*value,&endp,0);
|
||||
if(*endp==0) {
|
||||
plink->value.rfio.cryo = lvalue; **verify = 0;
|
||||
} else {
|
||||
strcpy(*verify,"Illegal. Must be number");
|
||||
}
|
||||
value++; verify++;
|
||||
lvalue = strtol(*value,&endp,0);
|
||||
if(*endp==0) {
|
||||
plink->value.rfio.micro = lvalue; **verify = 0;
|
||||
} else {
|
||||
strcpy(*verify,"Illegal. Must be number");
|
||||
}
|
||||
value++; verify++;
|
||||
lvalue = strtol(*value,&endp,0);
|
||||
if(*endp==0) {
|
||||
plink->value.rfio.dataset = lvalue; **verify = 0;
|
||||
} else {
|
||||
strcpy(*verify,"Illegal. Must be number");
|
||||
}
|
||||
value++; verify++;
|
||||
lvalue = strtol(*value,&endp,0);
|
||||
if(*endp==0) {
|
||||
plink->value.rfio.element = lvalue; **verify = 0;
|
||||
} else {
|
||||
strcpy(*verify,"Illegal. Must be number");
|
||||
}
|
||||
break;
|
||||
case AB_IO:
|
||||
lvalue = strtol(*value,&endp,0);
|
||||
if(*endp==0) {
|
||||
|
||||
@@ -813,6 +813,7 @@ int dbhcr(void)
|
||||
return(0);
|
||||
}
|
||||
dbReportDeviceConfig(pdbBase,stdout);
|
||||
fflush(stdout);
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ char *filename;
|
||||
|
||||
/* load data base record name to pvName */
|
||||
str = pvName[0];
|
||||
bzero(str,1000*31);
|
||||
memset(str,0,1000*31);
|
||||
|
||||
pdbbase=dbAllocBase();
|
||||
pdbentry=dbAllocEntry(pdbbase);
|
||||
|
||||
160
src/db/devLib.c
160
src/db/devLib.c
@@ -1,5 +1,5 @@
|
||||
/* devLib.c - support for allocation of common device resources */
|
||||
/* @(#)devLib.c 1.2 3/30/94 */
|
||||
/* @(#)$Id$*/
|
||||
|
||||
/*
|
||||
* Original Author: Marty Kraimer
|
||||
@@ -45,12 +45,13 @@
|
||||
* .08 05-28-93 joh Added an argument to devRegisterAddress()
|
||||
* .09 05-28-93 joh Added devAddressMap()
|
||||
* .10 06-14-93 joh Added devAllocAddress()
|
||||
* .11 02-21-95 joh Fixed warning messages
|
||||
*
|
||||
* NOTES:
|
||||
* .01 06-14-93 joh needs devAllocInterruptVector() routine
|
||||
*/
|
||||
|
||||
static char *sccsID = "@(#)devLib.c 1.2\t3/30/94";
|
||||
static char *sccsID = "@(#) $Id$";
|
||||
|
||||
|
||||
#include <vxWorks.h>
|
||||
@@ -91,8 +92,8 @@ LOCAL char addrListInit;
|
||||
typedef struct{
|
||||
NODE node;
|
||||
const char *pOwnerName;
|
||||
void *pFirst;
|
||||
void *pLast;
|
||||
char *pFirst;
|
||||
char *pLast;
|
||||
}rangeItem;
|
||||
|
||||
/*
|
||||
@@ -103,7 +104,8 @@ LOCAL char *defaultHandlerNames[] = {
|
||||
"_excStub",
|
||||
"_excIntStub",
|
||||
"_unsolicitedHandlerEPICS"};
|
||||
LOCAL void *defaultHandlerAddr[NELEMENTS(defaultHandlerNames)];
|
||||
typedef void myISR (void *pParam);
|
||||
LOCAL myISR *defaultHandlerAddr[NELEMENTS(defaultHandlerNames)];
|
||||
|
||||
/*
|
||||
* These routines are not exported
|
||||
@@ -112,21 +114,21 @@ LOCAL void initHandlerAddrList(void);
|
||||
LOCAL int vectorInUse(unsigned vectorNumber);
|
||||
LOCAL long initAddrList(void);
|
||||
LOCAL long addrVerify(epicsAddressType addrType, void *address);
|
||||
LOCAL void (*isrFetch(unsigned vectorNumber))();
|
||||
LOCAL myISR *isrFetch(unsigned vectorNumber);
|
||||
LOCAL long blockFind(
|
||||
epicsAddressType addrType,
|
||||
void *pBlockFirst,
|
||||
void *pBlockLast,
|
||||
char *pBlockFirst,
|
||||
char *pBlockLast,
|
||||
/* size needed */
|
||||
unsigned long size,
|
||||
/* n ls bits zero in base addr */
|
||||
unsigned alignment,
|
||||
/* base address found */
|
||||
void **ppBase);
|
||||
char **ppBase);
|
||||
LOCAL long report_conflict(
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast,
|
||||
char *pFirst,
|
||||
char *pLast,
|
||||
const char *pOwnerName);
|
||||
LOCAL long devInsertAddress(
|
||||
LIST *pRangeList,
|
||||
@@ -140,25 +142,25 @@ LOCAL long devInstallAddr(
|
||||
rangeItem *pRange,
|
||||
const char *pOwnerName,
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast,
|
||||
char *pFirst,
|
||||
char *pLast,
|
||||
void **pLocalAddress);
|
||||
LOCAL long blockDivide(
|
||||
epicsAddressType addrType,
|
||||
void *pBlockFirst,
|
||||
void *pBlockLast,
|
||||
char *pBlockFirst,
|
||||
char *pBlockLast,
|
||||
/* base address found */
|
||||
void **ppBase,
|
||||
char **ppBase,
|
||||
unsigned long requestSize
|
||||
);
|
||||
LOCAL long blockProbe(
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast
|
||||
char *pFirst,
|
||||
char *pLast
|
||||
);
|
||||
long locationProbe(
|
||||
epicsAddressType addrType,
|
||||
void *pLocation
|
||||
char *pLocation
|
||||
);
|
||||
|
||||
/*
|
||||
@@ -336,8 +338,8 @@ void *baseAddress,
|
||||
unsigned long size,
|
||||
void **pLocalAddress)
|
||||
{
|
||||
void *pFirst;
|
||||
void *pLast;
|
||||
char *pFirst;
|
||||
char *pLast;
|
||||
rangeItem *pRange;
|
||||
long s;
|
||||
|
||||
@@ -357,7 +359,7 @@ void **pLocalAddress)
|
||||
return S_dev_lowValue;
|
||||
}
|
||||
|
||||
pFirst = baseAddress;
|
||||
pFirst = (char *) baseAddress;
|
||||
pLast = pFirst + size - 1;
|
||||
|
||||
FASTLOCK(&addrListLock);
|
||||
@@ -407,25 +409,26 @@ LOCAL long devInstallAddr(
|
||||
rangeItem *pRange, /* item on the free list to be split */
|
||||
const char *pOwnerName,
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast,
|
||||
void **pLocalAddress)
|
||||
char *pFirst,
|
||||
char *pLast,
|
||||
void **ppLocalAddress)
|
||||
{
|
||||
rangeItem *pNewRange;
|
||||
int s;
|
||||
|
||||
if(pLocalAddress){
|
||||
int s1;
|
||||
int s2;
|
||||
if(ppLocalAddress){
|
||||
char *pAddr;
|
||||
int s1;
|
||||
int s2;
|
||||
|
||||
s1 = sysBusToLocalAdrs(
|
||||
EPICStovxWorksAddrType[addrType],
|
||||
pLast,
|
||||
(char **)pLocalAddress);
|
||||
&pAddr);
|
||||
s2 = sysBusToLocalAdrs(
|
||||
EPICStovxWorksAddrType[addrType],
|
||||
pFirst,
|
||||
(char **)pLocalAddress);
|
||||
&pAddr);
|
||||
if(s1 || s2){
|
||||
errPrintf(
|
||||
S_dev_vxWorksAddrMapFail,
|
||||
@@ -437,6 +440,8 @@ void **pLocalAddress)
|
||||
pLast-pFirst+1);
|
||||
return S_dev_vxWorksAddrMapFail;
|
||||
}
|
||||
|
||||
*ppLocalAddress = (void *) pAddr;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -505,8 +510,8 @@ void **pLocalAddress)
|
||||
*/
|
||||
LOCAL long report_conflict(
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast,
|
||||
char *pFirst,
|
||||
char *pLast,
|
||||
const char *pOwnerName
|
||||
)
|
||||
{
|
||||
@@ -567,6 +572,7 @@ epicsAddressType addrType,
|
||||
void *baseAddress,
|
||||
const char *pOwnerName)
|
||||
{
|
||||
char *charAddress = (char *) baseAddress;
|
||||
rangeItem *pRange;
|
||||
int s;
|
||||
|
||||
@@ -577,7 +583,7 @@ const char *pOwnerName)
|
||||
}
|
||||
}
|
||||
|
||||
s = addrVerify(addrType, baseAddress);
|
||||
s = addrVerify(addrType, charAddress);
|
||||
if(s != SUCCESS){
|
||||
return s;
|
||||
}
|
||||
@@ -585,10 +591,10 @@ const char *pOwnerName)
|
||||
FASTLOCK(&addrListLock);
|
||||
pRange = (rangeItem *) addrAlloc[addrType].node.next;
|
||||
while(pRange){
|
||||
if(pRange->pFirst == baseAddress){
|
||||
if(pRange->pFirst == charAddress){
|
||||
break;
|
||||
}
|
||||
if(pRange->pFirst > baseAddress){
|
||||
if(pRange->pFirst > charAddress){
|
||||
pRange = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -608,7 +614,7 @@ const char *pOwnerName)
|
||||
__LINE__,
|
||||
"unregister address for %s at 0X %X failed because %s owns it",
|
||||
pOwnerName,
|
||||
baseAddress,
|
||||
charAddress,
|
||||
pRange->pOwnerName);
|
||||
return s;
|
||||
}
|
||||
@@ -730,7 +736,7 @@ void **pLocalAddress)
|
||||
{
|
||||
int s;
|
||||
rangeItem *pRange;
|
||||
void *pBase;
|
||||
char *pBase;
|
||||
|
||||
s = addrVerify(addrType, (void *)size);
|
||||
if(s){
|
||||
@@ -745,9 +751,6 @@ void **pLocalAddress)
|
||||
pRange = (rangeItem *) addrFree[addrType].node.next;
|
||||
while(pRange){
|
||||
if(pRange->pLast-pRange->pFirst>=size-1){
|
||||
void *pF;
|
||||
void *pL;
|
||||
|
||||
s = blockFind(
|
||||
addrType,
|
||||
pRange->pFirst,
|
||||
@@ -875,9 +878,11 @@ LOCAL long devListAddressMap(LIST *pRangeList)
|
||||
printf("%s Address Map\n", epicsAddressTypeName[i]);
|
||||
}
|
||||
while(pri){
|
||||
printf("0X %08X - %08X %s\n",
|
||||
pri->pFirst,
|
||||
pri->pLast,
|
||||
printf("0X %0*lX - %0*lX %s\n",
|
||||
(int) (sizeof (pri->pFirst) * 2U),
|
||||
(unsigned long) pri->pFirst,
|
||||
(int) (sizeof (pri->pFirst) * 2U),
|
||||
(unsigned long) pri->pLast,
|
||||
pri->pOwnerName);
|
||||
pri = (rangeItem *) lstNext(&pri->node);
|
||||
}
|
||||
@@ -923,9 +928,9 @@ void unsolicitedHandlerEPICS(int vectorNumber)
|
||||
LOCAL
|
||||
void initHandlerAddrList(void)
|
||||
{
|
||||
int i;
|
||||
UINT8 type;
|
||||
int status;
|
||||
int i;
|
||||
SYM_TYPE type;
|
||||
int status;
|
||||
|
||||
for(i=0; i<NELEMENTS(defaultHandlerNames); i++){
|
||||
status =
|
||||
@@ -951,18 +956,17 @@ void initHandlerAddrList(void)
|
||||
*
|
||||
*
|
||||
*/
|
||||
LOCAL
|
||||
void (*isrFetch(unsigned vectorNumber))()
|
||||
LOCAL myISR *isrFetch(unsigned vectorNumber)
|
||||
{
|
||||
void (*psub)();
|
||||
void (*pCISR)();
|
||||
myISR *psub;
|
||||
myISR *pCISR;
|
||||
void *pParam;
|
||||
int s;
|
||||
|
||||
/*
|
||||
* fetch the handler or C stub attached at this vector
|
||||
*/
|
||||
psub = (void (*)()) intVecGet((FUNCPTR *)INUM_TO_IVEC(vectorNumber));
|
||||
psub = (myISR *) intVecGet((FUNCPTR *)INUM_TO_IVEC(vectorNumber));
|
||||
|
||||
/*
|
||||
* from libvxWorks/veclist.c
|
||||
@@ -993,7 +997,7 @@ unsigned vectorNumber
|
||||
{
|
||||
static int init;
|
||||
int i;
|
||||
void (*psub)();
|
||||
myISR *psub;
|
||||
|
||||
if(!init){
|
||||
initHandlerAddrList();
|
||||
@@ -1026,11 +1030,11 @@ unsigned vectorNumber
|
||||
*/
|
||||
LOCAL long blockFind(
|
||||
epicsAddressType addrType,
|
||||
void *pBlockFirst,
|
||||
void *pBlockLast,
|
||||
char *pBlockFirst,
|
||||
char *pBlockLast,
|
||||
unsigned long size, /* size needed */
|
||||
unsigned alignment, /* n ls bits zero in base addr */
|
||||
void **ppBase /* base address found */
|
||||
char **ppBase /* base address found */
|
||||
)
|
||||
{
|
||||
int s;
|
||||
@@ -1041,7 +1045,7 @@ void **ppBase /* base address found */
|
||||
*/
|
||||
mask = devCreateMask(alignment);
|
||||
if(mask&(long)pBlockFirst){
|
||||
pBlockFirst = (void *) (mask | (unsigned long) pBlockFirst);
|
||||
pBlockFirst = (char *) (mask | (unsigned long) pBlockFirst);
|
||||
pBlockFirst++;
|
||||
}
|
||||
|
||||
@@ -1088,17 +1092,17 @@ void **ppBase /* base address found */
|
||||
*/
|
||||
LOCAL long blockDivide(
|
||||
epicsAddressType addrType,
|
||||
void *pBlockFirst,
|
||||
void *pBlockLast,
|
||||
void **ppBase, /* base address found */
|
||||
char *pBlockFirst,
|
||||
char *pBlockLast,
|
||||
char **ppBase, /* base address found */
|
||||
unsigned long requestSize
|
||||
)
|
||||
{
|
||||
void *pBlock;
|
||||
char *pBlock;
|
||||
unsigned long bs;
|
||||
int s;
|
||||
|
||||
s = blockProbe(addrType,pBlockFirst, pBlockFirst+(requestSize-1));
|
||||
s = blockProbe(addrType, pBlockFirst, pBlockFirst+(requestSize-1));
|
||||
if(!s){
|
||||
*ppBase = pBlockFirst;
|
||||
return SUCCESS;
|
||||
@@ -1137,11 +1141,11 @@ unsigned long requestSize
|
||||
*/
|
||||
LOCAL long blockProbe(
|
||||
epicsAddressType addrType,
|
||||
void *pFirst,
|
||||
void *pLast
|
||||
char *pFirst,
|
||||
char *pLast
|
||||
)
|
||||
{
|
||||
void *pProbe;
|
||||
char *pProbe;
|
||||
int s;
|
||||
|
||||
pProbe = pFirst;
|
||||
@@ -1161,10 +1165,10 @@ void *pLast
|
||||
*/
|
||||
long locationProbe(
|
||||
epicsAddressType addrType,
|
||||
void *pLocation
|
||||
char *pLocation
|
||||
)
|
||||
{
|
||||
void *pPhysical;
|
||||
char *pPhysical;
|
||||
int s;
|
||||
|
||||
/*
|
||||
@@ -1174,33 +1178,33 @@ void *pLocation
|
||||
s = sysBusToLocalAdrs(
|
||||
EPICStovxWorksAddrType[addrType],
|
||||
pLocation,
|
||||
(char **)&pPhysical);
|
||||
&pPhysical);
|
||||
if(s<0){
|
||||
return S_dev_vxWorksAddrMapFail;
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
char *pChar;
|
||||
char byte;
|
||||
int8_t *pChar;
|
||||
int8_t byte;
|
||||
|
||||
pChar = pPhysical;
|
||||
pChar = (int8_t *) pPhysical;
|
||||
if(devPtrAlignTest(pChar)){
|
||||
s = vxMemProbe(
|
||||
pChar,
|
||||
(char *) pChar,
|
||||
READ,
|
||||
sizeof(byte),
|
||||
&byte);
|
||||
(char *) &byte);
|
||||
if(s!=ERROR){
|
||||
return S_dev_addressOverlap;
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
short *pWord;
|
||||
short word;
|
||||
int16_t *pWord;
|
||||
int16_t word;
|
||||
|
||||
pWord = pPhysical;
|
||||
pWord = (int16_t *)pPhysical;
|
||||
if(devPtrAlignTest(pWord)){
|
||||
s = vxMemProbe(
|
||||
(char *)pWord,
|
||||
@@ -1213,10 +1217,10 @@ void *pLocation
|
||||
}
|
||||
}
|
||||
{
|
||||
long *pLongWord;
|
||||
long longWord;
|
||||
int32_t *pLongWord;
|
||||
int32_t longWord;
|
||||
|
||||
pLongWord = pPhysical;
|
||||
pLongWord = (int32_t *) pPhysical;
|
||||
if(devPtrAlignTest(pLongWord)){
|
||||
s = vxMemProbe(
|
||||
(char *)pLongWord,
|
||||
|
||||
110
src/db/drvTS.c
110
src/db/drvTS.c
@@ -1,6 +1,17 @@
|
||||
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.7 1995/02/02 17:15:55 jbk
|
||||
* Removed the stinking message "Cannot contact master timing IOC ".
|
||||
*
|
||||
* Revision 1.6 1995/02/01 15:29:54 winans
|
||||
* Added a type field to the configure command to disable the use of the event
|
||||
* system hardware if desired.
|
||||
*
|
||||
* Revision 1.5 1994/12/16 15:51:21 winans
|
||||
* Changed error message in the event system error handler & added a conditional
|
||||
* based on a debug flag to print it... defaults to off. (Per request from MRK.)
|
||||
*
|
||||
* Revision 1.4 1994/10/28 20:15:10 jbk
|
||||
* increased the USP packet time-out to 250ms, added a parm to the configure()
|
||||
* routine to let user specify it.
|
||||
@@ -66,7 +77,12 @@ LICENSING INQUIRIES MAY BE DIRECTED TO THE INDUSTRIAL TECHNOLOGY
|
||||
DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
*/
|
||||
|
||||
#if 1
|
||||
#define NODEBUG
|
||||
#define MAKE_DEBUG 0
|
||||
#else
|
||||
#define MAKE_DEBUG TSdriverDebug
|
||||
#endif
|
||||
#define TS_DRIVER
|
||||
|
||||
#include <vxWorks.h>
|
||||
@@ -103,8 +119,12 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
#include <drvTS.h>
|
||||
|
||||
/* #define FL M_drvSup,__FILE__,__LINE__ */
|
||||
#if 0
|
||||
#define FL stderr
|
||||
#define errPrintf fprintf
|
||||
#else
|
||||
#define FL M_drvSup,__FILE__,__LINE__
|
||||
#endif
|
||||
|
||||
/* functions used by this driver */
|
||||
static long TSgetUnixTime(struct timespec*);
|
||||
@@ -177,7 +197,7 @@ TSinfo TSdata = { TS_master_dead, TS_async_slave, TS_async_none,
|
||||
0,NULL,
|
||||
TS_SYNC_RATE_SEC,TS_CLOCK_RATE_HZ,0,TS_TIME_OUT_MS,0,
|
||||
TS_MASTER_PORT,TS_SLAVE_PORT,1,0,0,
|
||||
NULL, NULL,NULL };
|
||||
NULL, NULL,NULL, 0 };
|
||||
|
||||
extern char* sysBootLine;
|
||||
|
||||
@@ -248,9 +268,12 @@ long TSreport()
|
||||
TSconfigure() - This is the configuration routine which is meant to
|
||||
be called from the vxWorks startup.cmd script before iocInit.
|
||||
It's job is to set operating parameters for the time stamp support code.
|
||||
|
||||
JRW -- if type = 0, then try to config using event system
|
||||
if type = 1, then permanantly inhibit use of the event system
|
||||
*/
|
||||
void TSconfigure(int master, int sync_rate_sec, int clock_rate_hz,
|
||||
int master_port, int slave_port, unsigned long time_out)
|
||||
int master_port, int slave_port, unsigned long time_out, int type)
|
||||
{
|
||||
if(master) TSdata.master_timing_IOC=1;
|
||||
else TSdata.master_timing_IOC=0;
|
||||
@@ -272,6 +295,8 @@ void TSconfigure(int master, int sync_rate_sec, int clock_rate_hz,
|
||||
if(time_out) TSdata.time_out=time_out;
|
||||
else TSdata.time_out=TS_TIME_OUT_MS;
|
||||
|
||||
TSdata.UserRequestedType = type;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -346,39 +371,56 @@ long TSinit()
|
||||
SYM_TYPE stype;
|
||||
|
||||
Debug(5,"In TSinit()\n",0);
|
||||
/* ------------------------------------------------------------- */
|
||||
/* find the lower level event system functions */
|
||||
if(symFindByName(sysSymTbl,"_ErHaveReceiver",
|
||||
(char**)&TShaveReceiver,&stype)==ERROR)
|
||||
TShaveReceiver = TShaveReceiverError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErGetTicks",
|
||||
(char**)&TSgetTicks,&stype)==ERROR)
|
||||
TSgetTicks = TSgetTicksError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErRegisterEventHandler",
|
||||
(char**)&TSregisterEventHandler,&stype)==ERROR)
|
||||
TSregisterEventHandler = TSregisterEventHandlerError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErRegisterErrorHandler",
|
||||
(char**)&TSregisterErrorHandler,&stype)==ERROR)
|
||||
TSregisterErrorHandler = TSregisterErrorHandlerError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErForceSync",
|
||||
(char**)&TSforceSync,&stype)==ERROR)
|
||||
TSforceSync = TSforceSoftSync;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErGetTime",
|
||||
(char**)&TSgetTime,&stype)==ERROR)
|
||||
TSgetTime = TSgetCurrentTime;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErSyncEvent",
|
||||
(char**)&TSsyncEvent,&stype)==ERROR)
|
||||
TSdata.sync_event=ER_EVENT_RESET_TICK;
|
||||
if (TSdata.UserRequestedType == 0)
|
||||
{ /* default configuration probe */
|
||||
/* ------------------------------------------------------------- */
|
||||
/* find the lower level event system functions */
|
||||
if(symFindByName(sysSymTbl,"_ErHaveReceiver",
|
||||
(char**)&TShaveReceiver,&stype)==ERROR)
|
||||
TShaveReceiver = TShaveReceiverError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErGetTicks",
|
||||
(char**)&TSgetTicks,&stype)==ERROR)
|
||||
TSgetTicks = TSgetTicksError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErRegisterEventHandler",
|
||||
(char**)&TSregisterEventHandler,&stype)==ERROR)
|
||||
TSregisterEventHandler = TSregisterEventHandlerError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErRegisterErrorHandler",
|
||||
(char**)&TSregisterErrorHandler,&stype)==ERROR)
|
||||
TSregisterErrorHandler = TSregisterErrorHandlerError;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErForceSync",
|
||||
(char**)&TSforceSync,&stype)==ERROR)
|
||||
TSforceSync = TSforceSoftSync;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErGetTime",
|
||||
(char**)&TSgetTime,&stype)==ERROR)
|
||||
TSgetTime = TSgetCurrentTime;
|
||||
|
||||
if(symFindByName(sysSymTbl,"_ErSyncEvent",
|
||||
(char**)&TSsyncEvent,&stype)==ERROR)
|
||||
TSdata.sync_event=ER_EVENT_RESET_TICK;
|
||||
else
|
||||
TSdata.sync_event=TSsyncEvent();
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
}
|
||||
else
|
||||
TSdata.sync_event=TSsyncEvent();
|
||||
{ /* inhibit probe and use of the event system */
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
printf("WARNING: drvTS event hardware probe inhibited by user\n");
|
||||
|
||||
TShaveReceiver = TShaveReceiverError;
|
||||
TSgetTicks = TSgetTicksError;
|
||||
TSregisterEventHandler = TSregisterEventHandlerError;
|
||||
TSregisterErrorHandler = TSregisterErrorHandlerError;
|
||||
TSforceSync = TSforceSoftSync;
|
||||
TSgetTime = TSgetCurrentTime;
|
||||
TSdata.sync_event=ER_EVENT_RESET_TICK;
|
||||
}
|
||||
|
||||
/* set all the known information about the system */
|
||||
TSdata.event_table=NULL;
|
||||
@@ -488,12 +530,14 @@ long TSinit()
|
||||
{
|
||||
struct timespec tp;
|
||||
clock_gettime(CLOCK_REALTIME,&tp);
|
||||
/* this should work */
|
||||
errPrintf(FL,"Failed to set time from Unix server\n");
|
||||
}
|
||||
|
||||
if( TSsetClockFromMaster()<0 )
|
||||
{
|
||||
errPrintf(FL,"Could not contact a master timing IOC\n");
|
||||
/* do nothing here */
|
||||
/* errPrintf(FL,"Could not contact a master timing IOC\n"); */
|
||||
}
|
||||
else
|
||||
TSdata.state = TS_master_alive;
|
||||
|
||||
526
src/db/iocInit.c
526
src/db/iocInit.c
@@ -57,6 +57,8 @@
|
||||
* .27 03-18-94 mcn added comments
|
||||
* .28 03-23-94 mrk Added asInit
|
||||
* .29 04-04-94 mcn added code for uninitialized conversions (link conversion field)
|
||||
* .30 01-10-95 joh Fixed no quoted strings in resource.def problem
|
||||
* .31 02-10-95 joh static => LOCAL
|
||||
*/
|
||||
|
||||
#include <vxWorks.h>
|
||||
@@ -64,13 +66,17 @@
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <ellLib.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sysLib.h>
|
||||
#include <symLib.h>
|
||||
#include <sysSymTbl.h> /* for sysSymTbl*/
|
||||
#include <logLib.h>
|
||||
#include <taskLib.h>
|
||||
#include <envLib.h>
|
||||
#include <errnoLib.h>
|
||||
|
||||
#include <ellLib.h>
|
||||
#include <sdrHeader.h>
|
||||
#include <fast_lock.h>
|
||||
#include <choice.h>
|
||||
@@ -97,7 +103,7 @@
|
||||
#define MODULE_TYPES_INIT 1
|
||||
#include <module_types.h>
|
||||
|
||||
static initialized=FALSE;
|
||||
LOCAL int initialized=FALSE;
|
||||
|
||||
/* The following is for use by interrupt routines */
|
||||
int interruptAccept=FALSE;
|
||||
@@ -108,15 +114,18 @@ struct dbBase *pdbBase=NULL;
|
||||
long dbCommonInit();
|
||||
|
||||
/* define forward references*/
|
||||
static long initDrvSup(void);
|
||||
static long initRecSup(void);
|
||||
static long initDevSup(void);
|
||||
static long finishDevSup(void);
|
||||
static long initDatabase(void);
|
||||
static void createLockSets(void);
|
||||
static short makeSameSet(struct dbAddr *paddr,short set);
|
||||
static long initialProcess(void);
|
||||
static long getResources(char *fname);
|
||||
LOCAL long initDrvSup(void);
|
||||
LOCAL long initRecSup(void);
|
||||
LOCAL long initDevSup(void);
|
||||
LOCAL long finishDevSup(void);
|
||||
LOCAL long initDatabase(void);
|
||||
LOCAL void createLockSets(void);
|
||||
LOCAL short makeSameSet(struct dbAddr *paddr,short set);
|
||||
LOCAL long initialProcess(void);
|
||||
LOCAL long getResources(char *fname);
|
||||
LOCAL int getResourceToken(FILE *fp, char *pToken, unsigned maxToken);
|
||||
LOCAL int getResourceTokenInternal(FILE *fp, char *pToken, unsigned maxToken);
|
||||
|
||||
|
||||
/*
|
||||
* Initialize EPICS on the IOC.
|
||||
@@ -139,13 +148,7 @@ int iocInit(char * pResourceFilename)
|
||||
return(-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Build the data structure for error reporting
|
||||
*/
|
||||
if ((errSymBld()) != 0) {
|
||||
logMsg("iocInit aborting because errSymBld failed to initialize \n",0,0,0,0,0,0);
|
||||
return(-1);
|
||||
}
|
||||
errInit(); /*Initialize errPrintf task*/
|
||||
|
||||
/*
|
||||
* Setup initialization hooks, but only if an initHooks routine has been defined.
|
||||
@@ -316,7 +319,7 @@ int iocInit(char * pResourceFilename)
|
||||
* Call the initialization routine (init) for each
|
||||
* driver type.
|
||||
*/
|
||||
static long initDrvSup(void) /* Locate all driver support entry tables */
|
||||
LOCAL long initDrvSup(void) /* Locate all driver support entry tables */
|
||||
{
|
||||
char *pname;
|
||||
char name[40];
|
||||
@@ -335,7 +338,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
|
||||
|
||||
if (!(pdrvSup=pdbBase->pdrvSup)) {
|
||||
status = S_drv_noDrvSup;
|
||||
errMessage(status,"No device drivers are defined");
|
||||
errMessage(status,"");
|
||||
return(status);
|
||||
}
|
||||
|
||||
@@ -354,7 +357,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
|
||||
vxstatus = symFindByName(sysSymTbl, name, (void *) &(pdrvSup->papDrvet[i]), &type);
|
||||
|
||||
if (vxstatus != OK) {
|
||||
strcpy(message,"driver entry table not found for ");
|
||||
strcpy(message,": ");
|
||||
strcat(message,pname);
|
||||
status = S_drv_noDrvet;
|
||||
errMessage(status,message);
|
||||
@@ -383,7 +386,7 @@ static long initDrvSup(void) /* Locate all driver support entry tables */
|
||||
* Call the initialization routine (init) for each
|
||||
* record type.
|
||||
*/
|
||||
static long initRecSup(void)
|
||||
LOCAL long initRecSup(void)
|
||||
{
|
||||
char name[40];
|
||||
int i;
|
||||
@@ -398,7 +401,7 @@ static long initRecSup(void)
|
||||
|
||||
if(!(precType=pdbBase->precType)) {
|
||||
status = S_rectype_noRecs;
|
||||
errMessage(status,"No record types defined");
|
||||
errMessage(status,"");
|
||||
return(status);
|
||||
}
|
||||
|
||||
@@ -444,7 +447,7 @@ static long initRecSup(void)
|
||||
(void *) (&precSup->papRset[i]), &type);
|
||||
|
||||
if (vxstatus != OK) {
|
||||
strcpy(message,"record support entry table not found for ");
|
||||
strcpy(message,": ");
|
||||
strcat(message,name);
|
||||
status = S_rec_noRSET;
|
||||
errMessage(status,message);
|
||||
@@ -470,7 +473,7 @@ static long initRecSup(void)
|
||||
* Call the initialization routine (init) for each
|
||||
* device type (First Pass).
|
||||
*/
|
||||
static long initDevSup(void)
|
||||
LOCAL long initDevSup(void)
|
||||
{
|
||||
char *pname;
|
||||
char name[40];
|
||||
@@ -485,7 +488,7 @@ static long initDevSup(void)
|
||||
|
||||
if (!(precDevSup = pdbBase->precDevSup)) {
|
||||
status = S_dev_noDevSup;
|
||||
errMessage(status,"No device support is defined");
|
||||
errMessage(status,"");
|
||||
return(status);
|
||||
}
|
||||
|
||||
@@ -517,7 +520,7 @@ static long initDevSup(void)
|
||||
|
||||
if (vxstatus != OK) {
|
||||
pdevSup->papDset[j]=NULL;
|
||||
strcpy(message, "device support entry table not found for ");
|
||||
strcpy(message, ": ");
|
||||
strcat(message, pname);
|
||||
status = S_dev_noDSET;
|
||||
errMessage(status, message);
|
||||
@@ -543,7 +546,7 @@ static long initDevSup(void)
|
||||
* after the database records have been initialized and
|
||||
* placed into lock sets.
|
||||
*/
|
||||
static long finishDevSup(void)
|
||||
LOCAL long finishDevSup(void)
|
||||
{
|
||||
int i,j;
|
||||
struct recDevSup *precDevSup;
|
||||
@@ -575,7 +578,7 @@ static long finishDevSup(void)
|
||||
return(0);
|
||||
}
|
||||
|
||||
static long initDatabase(void)
|
||||
LOCAL long initDatabase(void)
|
||||
{
|
||||
char name[PVNAME_SZ+FLDNAME_SZ+2];
|
||||
short i,j;
|
||||
@@ -609,7 +612,7 @@ static long initDatabase(void)
|
||||
*/
|
||||
if (!(precHeader = pdbBase->precHeader)) {
|
||||
status = S_record_noRecords;
|
||||
errMessage(status,"No database records are defined");
|
||||
errMessage(status,"");
|
||||
return(status);
|
||||
}
|
||||
|
||||
@@ -654,7 +657,7 @@ static long initDatabase(void)
|
||||
if (!prset) {
|
||||
strcpy(name,precType->papName[i]);
|
||||
strcat(name,"RSET");
|
||||
strcpy(message,"record support entry table not found for ");
|
||||
strcpy(message,": ");
|
||||
strcat(message,name);
|
||||
status = S_rec_noRSET;
|
||||
errMessage(status,message);
|
||||
@@ -837,7 +840,7 @@ static long initDatabase(void)
|
||||
* lock set. Records connected by forward links are
|
||||
* definately considered part of the same lockset.
|
||||
*/
|
||||
static void createLockSets(void)
|
||||
LOCAL void createLockSets(void)
|
||||
{
|
||||
int i,link;
|
||||
struct recLoc *precLoc;
|
||||
@@ -930,7 +933,7 @@ static void createLockSets(void)
|
||||
dbScanLockInit(nset);
|
||||
}
|
||||
|
||||
static short makeSameSet(struct dbAddr *paddr, short lset)
|
||||
LOCAL short makeSameSet(struct dbAddr *paddr, short lset)
|
||||
{
|
||||
struct dbCommon *precord = paddr->precord;
|
||||
short link;
|
||||
@@ -1001,7 +1004,7 @@ static short makeSameSet(struct dbAddr *paddr, short lset)
|
||||
* Process database records at initialization if
|
||||
* their pini (process at init) field is set.
|
||||
*/
|
||||
static long initialProcess(void)
|
||||
LOCAL long initialProcess(void)
|
||||
{
|
||||
short i;
|
||||
struct recHeader *precHeader;
|
||||
@@ -1025,199 +1028,362 @@ static long initialProcess(void)
|
||||
return(0);
|
||||
}
|
||||
|
||||
#define MAX 128
|
||||
#define MAX 256
|
||||
#define SAME 0
|
||||
static char *cvt_str[] = {
|
||||
|
||||
enum resType {
|
||||
resDBF_STRING,
|
||||
resDBF_SHORT,
|
||||
resDBF_LONG,
|
||||
resDBF_FLOAT,
|
||||
resDBF_DOUBLE,
|
||||
resInvalid};
|
||||
LOCAL char *cvt_str[] = {
|
||||
"DBF_STRING",
|
||||
"DBF_SHORT",
|
||||
"DBF_LONG",
|
||||
"DBF_FLOAT",
|
||||
"DBF_DOUBLE"
|
||||
"DBF_DOUBLE",
|
||||
"Invalid",
|
||||
};
|
||||
#define CVT_COUNT (sizeof(cvt_str) / sizeof(char*))
|
||||
static long getResources(char *fname)
|
||||
|
||||
#define EPICS_ENV_PREFIX "EPICS_"
|
||||
|
||||
long getResources(char *fname)
|
||||
{
|
||||
FILE *fp;
|
||||
int len;
|
||||
int len2;
|
||||
int lineNum = 0;
|
||||
int i = 0;
|
||||
int found = 0;
|
||||
int cvType = 0;
|
||||
int epicsFlag;
|
||||
char buff[MAX + 1];
|
||||
char name[40];
|
||||
char s1[MAX];
|
||||
char s2[MAX];
|
||||
char s3[MAX];
|
||||
char message[100];
|
||||
long rtnval = 0;
|
||||
char name[40];
|
||||
FILE *fp;
|
||||
enum resType cvType = resInvalid;
|
||||
int epicsFlag;
|
||||
SYM_TYPE type;
|
||||
char *pSymAddr;
|
||||
char *pSymAddr;
|
||||
short n_short;
|
||||
long n_long;
|
||||
float n_float;
|
||||
double n_double;
|
||||
int status;
|
||||
|
||||
if (!fname) return (0);
|
||||
|
||||
if ((fp = fopen(fname, "r")) == 0) {
|
||||
errMessage(-1L, "getResources: No such Resource file");
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"No such Resource file - %s",
|
||||
fname);
|
||||
return (-1);
|
||||
}
|
||||
while ( fgets( buff, MAX, fp) != NULL) {
|
||||
len = strlen(buff);
|
||||
lineNum++;
|
||||
if (len < 2)
|
||||
goto CLEAR;
|
||||
if (len >= MAX) {
|
||||
sprintf(message,
|
||||
"getResources: Line too long - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
}
|
||||
for (i = 0; i < len; i++) {
|
||||
if (buff[i] == '!') {
|
||||
goto CLEAR;
|
||||
}
|
||||
}
|
||||
/* extract the 3 fields as strings */
|
||||
if ((sscanf(buff, "%s %s %s", s1, s2, s3)) != 3) {
|
||||
sprintf(message,
|
||||
"getResources: Not enough fields - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
}
|
||||
found = 0;
|
||||
len2 = strlen(s2);
|
||||
for (i = 0; i < CVT_COUNT; i++) {
|
||||
|
||||
while (TRUE) {
|
||||
status = getResourceToken (fp, s1, sizeof(s1));
|
||||
if (status<0) {
|
||||
/*
|
||||
* EOF
|
||||
*/
|
||||
break;
|
||||
}
|
||||
status = getResourceToken (fp, s2, sizeof(s2));
|
||||
if (status<0) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Missing resource data type field for resource=%s in file=%s",
|
||||
s1,
|
||||
fname);
|
||||
break;
|
||||
}
|
||||
status = getResourceToken (fp, s3, sizeof(s3));
|
||||
if (status<0) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Missing resource value field for resource=%s data type=%s file=%s",
|
||||
s1,
|
||||
s2,
|
||||
fname);
|
||||
break; /* EOF */
|
||||
}
|
||||
|
||||
if ((strncmp(s2, cvt_str[i], len2)) == SAME) {
|
||||
found = 1;
|
||||
cvType = i;
|
||||
for (cvType = 0; cvType < resInvalid; cvType++) {
|
||||
if (strcmp(s2, cvt_str[cvType]) == SAME) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
sprintf(message,
|
||||
"getResources: Field 2 not defined - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
strcpy(name, "_");
|
||||
strcat(name, s1);
|
||||
rtnval = symFindByName(sysSymTbl, name, &pSymAddr, &type);
|
||||
if (rtnval != OK) {
|
||||
sprintf(message,
|
||||
"getResources: Symbol name not found - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
status = symFindByName(sysSymTbl, name, &pSymAddr, &type);
|
||||
if (status!= OK) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Matching Symbol name not found for resource=%s",
|
||||
s1);
|
||||
continue;
|
||||
}
|
||||
if ( (strncmp(s1,"EPICS_",6)) == SAME)
|
||||
epicsFlag = 1;
|
||||
else
|
||||
epicsFlag = 0;
|
||||
|
||||
status = strncmp (
|
||||
s1,
|
||||
EPICS_ENV_PREFIX,
|
||||
strlen (EPICS_ENV_PREFIX));
|
||||
if (status == SAME) {
|
||||
epicsFlag = 1;
|
||||
if (cvType != resDBF_STRING) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"%s should be set with type DBF_STRING not type %s",
|
||||
s1,
|
||||
s2);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
epicsFlag = 0;
|
||||
}
|
||||
|
||||
switch (cvType) {
|
||||
case 0: /* DBF_STRING */
|
||||
len = strlen(s3);
|
||||
len2 = 20;
|
||||
if (len >= len2) {
|
||||
sprintf(message,
|
||||
"getResources: Warning, string might exceed previous reserved space - line=%d",
|
||||
lineNum);
|
||||
errMessage(-1L, message);
|
||||
}
|
||||
if ( epicsFlag )
|
||||
strncpy(pSymAddr+sizeof(void *), s3, len + 1);
|
||||
else
|
||||
strncpy(pSymAddr, s3, len + 1);
|
||||
break;
|
||||
case 1: /* DBF_SHORT */
|
||||
if ((sscanf(s3, "%hd", &n_short)) != 1) {
|
||||
sprintf(message,
|
||||
"getResources: conversion failed - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
}
|
||||
case resDBF_STRING:
|
||||
if ( epicsFlag ) {
|
||||
sprintf(message,
|
||||
"getResources: %s is of type DBF_STRING - line =%d",
|
||||
name,lineNum);
|
||||
errMessage(-1L, message);
|
||||
}
|
||||
else
|
||||
*(short *) pSymAddr = n_short;
|
||||
char *pEnv;
|
||||
|
||||
break;
|
||||
case 2: /* DBF_LONG */
|
||||
if ((sscanf(s3, "%ld", &n_long)) != 1) {
|
||||
sprintf(message,
|
||||
"getResources: conversion failed - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
/*
|
||||
* space for two strings, an '=' character,
|
||||
* and a null termination
|
||||
*/
|
||||
pEnv = malloc (strlen (s3) + strlen (s1) + 2);
|
||||
if (!pEnv) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
s1,
|
||||
s3,
|
||||
strerror (errnoGet()));
|
||||
break;
|
||||
}
|
||||
strcpy (pEnv, s1);
|
||||
strcat (pEnv, "=");
|
||||
strcat (pEnv, s3);
|
||||
status = putenv (pEnv);
|
||||
if (status<0) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
s1,
|
||||
s3,
|
||||
strerror (errnoGet()));
|
||||
}
|
||||
/*
|
||||
* vxWorks copies into a private buffer
|
||||
* (this does not match UNIX behavior)
|
||||
*/
|
||||
free (pEnv);
|
||||
}
|
||||
if ( epicsFlag ) {
|
||||
sprintf(message,
|
||||
"getResources: %s is of type DBF_STRING - line =%d",
|
||||
name,lineNum);
|
||||
errMessage(-1L, message);
|
||||
}
|
||||
else
|
||||
*(long *) pSymAddr = n_long;
|
||||
break;
|
||||
case 3: /* DBF_FLOAT */
|
||||
if ((sscanf(s3, "%e", &n_float)) != 1) {
|
||||
sprintf(message,
|
||||
"getResources: conversion failed - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
continue;
|
||||
else{
|
||||
strcpy(pSymAddr, s3);
|
||||
}
|
||||
if ( epicsFlag ) {
|
||||
sprintf(message,
|
||||
"getResources: %s is of type DBF_STRING - line =%d",
|
||||
name,lineNum);
|
||||
errMessage(-1L, message);
|
||||
}
|
||||
else
|
||||
*(float *) pSymAddr = n_float;
|
||||
break;
|
||||
|
||||
break;
|
||||
case 4: /* DBF_DOUBLE */
|
||||
if ((sscanf(s3, "%le", &n_double)) != 1) {
|
||||
sprintf(message,
|
||||
"getResources: conversion failed - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
case resDBF_SHORT:
|
||||
if (sscanf(s3, "%hd", &n_short) != 1) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Resource=%s value=%s conversion to %s failed",
|
||||
s1,
|
||||
s3,
|
||||
cvt_str[cvType]);
|
||||
continue;
|
||||
}
|
||||
if ( epicsFlag ) {
|
||||
sprintf(message,
|
||||
"getResources: %s is of type DBF_STRING - line =%d",
|
||||
name,lineNum);
|
||||
errMessage(-1L, message);
|
||||
}
|
||||
else
|
||||
*(double *) pSymAddr = n_double;
|
||||
|
||||
*(short *) pSymAddr = n_short;
|
||||
break;
|
||||
|
||||
case resDBF_LONG:
|
||||
if (sscanf(s3, "%ld", &n_long) != 1) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Resource=%s value=%s conversion to %s failed",
|
||||
s1,
|
||||
s3,
|
||||
cvt_str[cvType]);
|
||||
continue;
|
||||
}
|
||||
*(long *) pSymAddr = n_long;
|
||||
break;
|
||||
|
||||
case resDBF_FLOAT:
|
||||
if (sscanf(s3, "%e", &n_float) != 1) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Resource=%s value=%s conversion to %s failed",
|
||||
s1,
|
||||
s3,
|
||||
cvt_str[cvType]);
|
||||
continue;
|
||||
}
|
||||
*(float *) pSymAddr = n_float;
|
||||
break;
|
||||
|
||||
case resDBF_DOUBLE:
|
||||
if (sscanf(s3, "%le", &n_double) != 1) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Resource=%s value=%s conversion to %s failed",
|
||||
s1,
|
||||
s3,
|
||||
cvt_str[cvType]);
|
||||
continue;
|
||||
}
|
||||
*(double *) pSymAddr = n_double;
|
||||
break;
|
||||
|
||||
default:
|
||||
sprintf(message,
|
||||
"getResources: switch default reached - line=%d", lineNum);
|
||||
errMessage(-1L, message);
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Invalid data type field=%s for resource=%s",
|
||||
s2,
|
||||
s1);
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
CLEAR: memset(buff, '\0', MAX);
|
||||
memset(s1, '\0', MAX);
|
||||
memset(s2, '\0', MAX);
|
||||
memset(s3, '\0', MAX);
|
||||
}
|
||||
fclose(fp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static gotSdrSum=FALSE;
|
||||
static struct sdrSum sdrSum;
|
||||
/*
|
||||
* getResourceToken
|
||||
*/
|
||||
LOCAL int getResourceToken(FILE *fp, char *pToken, unsigned maxToken)
|
||||
{
|
||||
int status;
|
||||
|
||||
/*
|
||||
* keep reading until we get a token
|
||||
* (and comments have been stripped)
|
||||
*/
|
||||
while (TRUE) {
|
||||
status = getResourceTokenInternal (fp, pToken, maxToken);
|
||||
if (status < 0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
if (pToken[0] != '\0') {
|
||||
return status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* getResourceTokenInternal
|
||||
*/
|
||||
LOCAL int getResourceTokenInternal(FILE *fp, char *pToken, unsigned maxToken)
|
||||
{
|
||||
char formatString[32];
|
||||
char quoteCharString[2];
|
||||
int status;
|
||||
|
||||
quoteCharString[0] = '\0';
|
||||
status = fscanf (fp, " %1[\"`'!]", quoteCharString);
|
||||
if (status<0) {
|
||||
return status;
|
||||
}
|
||||
|
||||
switch (quoteCharString[0]) {
|
||||
/*
|
||||
* its a comment
|
||||
* (consume everything up to the next new line)
|
||||
*/
|
||||
case '!':
|
||||
{
|
||||
char tmp[MAX];
|
||||
|
||||
sprintf(formatString, "%%%d[^\n\r\v\f]", sizeof(tmp)-1);
|
||||
status = fscanf (fp, "%[^\n\r\v\f]",tmp);
|
||||
pToken[0] = '\0';
|
||||
if (status<0) {
|
||||
return status;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* its a plain token
|
||||
*/
|
||||
case '\0':
|
||||
sprintf(formatString, " %%%ds", maxToken-1);
|
||||
|
||||
status = fscanf (fp, formatString, pToken);
|
||||
if (status!=1) {
|
||||
if (status < 0){
|
||||
pToken[0] = '\0';
|
||||
return status;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
/*
|
||||
* it was a quoted string
|
||||
*/
|
||||
default:
|
||||
sprintf(
|
||||
formatString,
|
||||
"%%%d[^%c]",
|
||||
maxToken-1,
|
||||
quoteCharString[0]);
|
||||
status = fscanf (fp, formatString, pToken);
|
||||
if (status!=1) {
|
||||
if (status < 0){
|
||||
pToken[0] = '\0';
|
||||
return status;
|
||||
}
|
||||
}
|
||||
sprintf(formatString, "%%1[%c]", quoteCharString[0]);
|
||||
status = fscanf (fp, formatString, quoteCharString);
|
||||
if (status!=1) {
|
||||
errPrintf (
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Resource file syntax error: unterminated string \"%s\"",
|
||||
pToken);
|
||||
pToken[0] = '\0';
|
||||
if (status < 0){
|
||||
return status;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
LOCAL int gotSdrSum=FALSE;
|
||||
LOCAL struct sdrSum sdrSum;
|
||||
int dbLoad(char * pfilename)
|
||||
{
|
||||
long status;
|
||||
|
||||
@@ -259,13 +259,22 @@ int dbLoadRecords(char* pfilename, char* pattern, char* container)
|
||||
|
||||
if(is_not_inited)
|
||||
{
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"initing parser\n");
|
||||
#endif
|
||||
yyin=fp;
|
||||
is_not_inited=0;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"restarting parser\n");
|
||||
#endif
|
||||
yyrestart(fp);
|
||||
}
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"before parser startup\n");
|
||||
#endif
|
||||
yyparse();
|
||||
|
||||
#ifndef vxWorks
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
|
||||
pvname [a-zA-Z0-9_\-:\.\[\]<>]
|
||||
pvname [a-zA-Z0-9_\-:\.\[\]<>;]
|
||||
value [a-zA-Z0-9_\,\^~\./\*#\[\]%: ;!|\'\-&\(\)@\?\+<>=\$\{\}]
|
||||
|
||||
%{
|
||||
|
||||
@@ -105,11 +105,11 @@ subst: PATTERN pattern subs
|
||||
|
||||
pattern: O_BRACE vars C_BRACE
|
||||
{
|
||||
/*
|
||||
#ifdef ERROR_STUFF
|
||||
int i;
|
||||
for(i=0;i<var_count;i++) fprintf(stderr,"variable=(%s)\n",vars[i]);
|
||||
fprintf(stderr,"var_count=%d\n",var_count);
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
;
|
||||
|
||||
@@ -130,7 +130,9 @@ subs: subs sub
|
||||
sub: WORD O_BRACE vals C_BRACE
|
||||
{
|
||||
sub_collect[strlen(sub_collect)-1]='\0';
|
||||
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
|
||||
#endif
|
||||
#ifndef SUB_TOOL
|
||||
if(db_file_name)
|
||||
dbLoadRecords(db_file_name,sub_collect,$1);
|
||||
@@ -147,7 +149,9 @@ sub: WORD O_BRACE vals C_BRACE
|
||||
| O_BRACE vals C_BRACE
|
||||
{
|
||||
sub_collect[strlen(sub_collect)-1]='\0';
|
||||
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
|
||||
#endif
|
||||
#ifndef SUB_TOOL
|
||||
if(db_file_name)
|
||||
dbLoadRecords(db_file_name,sub_collect,NULL);
|
||||
@@ -199,7 +203,9 @@ var_subs: var_subs var_sub
|
||||
var_sub: WORD O_BRACE sub_pats C_BRACE
|
||||
{
|
||||
sub_collect[strlen(sub_collect)-1]='\0';
|
||||
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
|
||||
#endif
|
||||
#ifndef SUB_TOOL
|
||||
if(db_file_name)
|
||||
dbLoadRecords(db_file_name,sub_collect,$1);
|
||||
@@ -216,7 +222,9 @@ var_sub: WORD O_BRACE sub_pats C_BRACE
|
||||
| O_BRACE sub_pats C_BRACE
|
||||
{
|
||||
sub_collect[strlen(sub_collect)-1]='\0';
|
||||
/* fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"dbLoadRecords(%s)\n",sub_collect);
|
||||
#endif
|
||||
#ifndef SUB_TOOL
|
||||
if(db_file_name)
|
||||
dbLoadRecords(db_file_name,sub_collect,NULL);
|
||||
@@ -292,7 +300,10 @@ int dbLoadTemplate(char* sub_file)
|
||||
yyin=fp;
|
||||
is_not_inited=0;
|
||||
}
|
||||
else yyrestart(fp);
|
||||
else
|
||||
{
|
||||
yyrestart(fp);
|
||||
}
|
||||
|
||||
yyparse();
|
||||
|
||||
@@ -324,12 +335,22 @@ main(int argc, char** argv)
|
||||
}
|
||||
|
||||
/* use sub_collect and db_file_name to do work */
|
||||
int sub_it()
|
||||
static int sub_it()
|
||||
{
|
||||
FILE* fp;
|
||||
char var_buff[500];
|
||||
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"In sub_it()\n");
|
||||
#endif
|
||||
|
||||
if( *sub_collect )
|
||||
{
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr," dbInitSubst() calling\n");
|
||||
#endif
|
||||
dbInitSubst(sub_collect);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr,"No valid substitutions found in table\n");
|
||||
@@ -345,10 +366,16 @@ int sub_it()
|
||||
/* do the work here */
|
||||
while( fgets(var_buff,200,fp)!=(char*)NULL )
|
||||
{
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr," calling dbDoSubst()\n");
|
||||
#endif
|
||||
dbDoSubst(var_buff,500,NULL);
|
||||
fputs(var_buff,stdout);
|
||||
}
|
||||
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr," calling dbFreeSubst()\n");
|
||||
#endif
|
||||
dbFreeSubst();
|
||||
fclose(fp);
|
||||
return 0;
|
||||
|
||||
@@ -191,13 +191,18 @@ long dbInitSubst(char* parm_pattern)
|
||||
/* find vars and subs */
|
||||
switch(*pp)
|
||||
{
|
||||
case '\\': pp++; break;
|
||||
case '\\': pp++; break; /* skip the next character */
|
||||
case '=': subst_total++; break;
|
||||
case '\"': for(++pp;*pp!='\"';pp++) if(*pp=='\\') pp++; pp++; break;
|
||||
case '\"':
|
||||
for(++pp;*pp && *pp!='\"';pp++)
|
||||
if(*pp=='\\') pp++;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
/* fprintf(stderr,"total = %d\n",subst_total); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"total = %d\n",subst_total);
|
||||
#endif
|
||||
|
||||
/* allocate the substitution table */
|
||||
subst = (struct var_sub*)malloc( sizeof(struct var_sub)*subst_total );
|
||||
@@ -235,12 +240,12 @@ long dbInitSubst(char* parm_pattern)
|
||||
}
|
||||
|
||||
/* debug code */
|
||||
/*
|
||||
#ifdef ERROR_STUFF
|
||||
for(pi=0;pi<subst_total;pi++)
|
||||
{
|
||||
printf("table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
|
||||
fprintf(stderr,"table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* resolve the multiple substitutions now */
|
||||
for(pi=0;pi<subst_total;pi++)
|
||||
@@ -253,12 +258,12 @@ long dbInitSubst(char* parm_pattern)
|
||||
}
|
||||
|
||||
/* more debug code */
|
||||
/*
|
||||
#ifdef ERROR_STUFF
|
||||
for(pi=0;pi<subst_total;pi++)
|
||||
{
|
||||
printf("table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
|
||||
fprintf(stderr,"table[%d]=(%s,%s)\n",pi,subst[pi].var,subst[pi].sub);
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -276,7 +281,9 @@ static char* get_var(char** to, char* from)
|
||||
pp = strpbrk(from," \t=");
|
||||
*pp = '\0';
|
||||
pp++;
|
||||
/* fprintf(stderr,"get_var: (%s)\n",from); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"get_var: (%s)\n",from);
|
||||
#endif
|
||||
*to=from;
|
||||
return pp;
|
||||
}
|
||||
@@ -297,7 +304,9 @@ static char* get_sub(char* to, char* from)
|
||||
else *cp++ = *pp;
|
||||
}
|
||||
*cp='\0';
|
||||
/* fprintf(stderr,"get_sub: quote (%s)\n",to); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"get_sub: quote (%s)\n",to);
|
||||
#endif
|
||||
pp++;
|
||||
}
|
||||
else
|
||||
@@ -307,7 +316,9 @@ static char* get_sub(char* to, char* from)
|
||||
{
|
||||
*hold = '\0';
|
||||
hold++;
|
||||
/* fprintf(stderr,"get_sub: regular (%s)\n",pp); */
|
||||
#ifdef ERROR_STUFF
|
||||
fprintf(stderr,"get_sub: regular (%s)\n",pp);
|
||||
#endif
|
||||
}
|
||||
|
||||
strcpy(to,pp);
|
||||
|
||||
@@ -4,193 +4,191 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_INCLUDES = -I../../drv
|
||||
|
||||
SRCS.c = \
|
||||
../devAiDvx2502.c\
|
||||
../devAiSoft.c\
|
||||
../devAiSoftRaw.c\
|
||||
../devAiSymb.c\
|
||||
../devAiTestAsyn.c\
|
||||
../devAiXy566Di.c\
|
||||
../devAiXy566DiL.c\
|
||||
../devAiXy566Se.c\
|
||||
../devAoSoft.c\
|
||||
../devApsEg.c\
|
||||
../devApsEr.c\
|
||||
../devAoSoftRaw.c\
|
||||
../devAoSymb.c\
|
||||
../devAoTestAsyn.c\
|
||||
../devAoVmiVme4100.c\
|
||||
../devBiMpv910.c\
|
||||
../devBiSoft.c\
|
||||
../devBiSoftRaw.c\
|
||||
../devBiTestAsyn.c\
|
||||
../devBiXVme210.c\
|
||||
../devBoMpv902.c\
|
||||
../devBoSoft.c\
|
||||
../devBoSoftRaw.c\
|
||||
../devBoTestAsyn.c\
|
||||
../devBoXVme220.c\
|
||||
../devCommonGpib.c\
|
||||
../devEventSoft.c\
|
||||
../devEventTestIoEvent.c\
|
||||
../devHistogramSoft.c\
|
||||
../devHistogramTestAsyn.c\
|
||||
../devLiSoft.c\
|
||||
../devLiSymb.c\
|
||||
../devLoSoft.c\
|
||||
../devLoSymb.c\
|
||||
../devMbbiMpv910.c\
|
||||
../devMbbiSoft.c\
|
||||
../devMbbiSoftRaw.c\
|
||||
../devMbbiTestAsyn.c\
|
||||
../devMbbiXVme210.c\
|
||||
../devMbboMpv902.c\
|
||||
../devMbboSoft.c\
|
||||
../devMbboSoftRaw.c\
|
||||
../devMbboTestAsyn.c\
|
||||
../devMbboXVme220.c\
|
||||
../devMbbiDirectMpv910.c\
|
||||
../devMbbiDirectSoft.c\
|
||||
../devMbbiDirectSoftRaw.c\
|
||||
../devMbbiDirectXVme210.c\
|
||||
../devMbboDirectMpv902.c\
|
||||
../devMbboDirectSoft.c\
|
||||
../devMbboDirectSoftRaw.c\
|
||||
../devMbboDirectXVme220.c\
|
||||
../devPtSoft.c\
|
||||
../devSmCompumotor1830.c\
|
||||
../devSmOms6Axis.c\
|
||||
../devSiSoft.c\
|
||||
../devSiSymb.c\
|
||||
../devSiTestAsyn.c\
|
||||
../devSoSoft.c\
|
||||
../devSASoft.c\
|
||||
../devSoSymb.c\
|
||||
../devSoTestAsyn.c\
|
||||
../devWfSoft.c\
|
||||
../devWfTestAsyn.c\
|
||||
../devWfXy566Sc.c\
|
||||
../devAllenBradley.c\
|
||||
../devAt5Vxi.c\
|
||||
../devMz8310.c\
|
||||
../devTimerMz8310.c\
|
||||
../devVxiTDM.c\
|
||||
../devAiKscV215.c\
|
||||
../devXy240.c\
|
||||
../devHpe1368a.c\
|
||||
../devAt8Fp.c\
|
||||
../devWfComet.c\
|
||||
../devWfDvx2502.c\
|
||||
../devWfJoergerVtr1.c\
|
||||
../devAvme9440.c\
|
||||
../devSysmon.c
|
||||
# ../devAiCamac.c\
|
||||
# ../devAaiCamac.c\
|
||||
# ../devBiCamac.c\
|
||||
# ../devLiCamac.c\
|
||||
# ../devMbbiCamac.c\
|
||||
# ../devMbbiDirectCamac.c\
|
||||
# ../devWfCamac.c\
|
||||
# ../devAoCamac.c\
|
||||
# ../devAaoCamac.c\
|
||||
# ../devBoCamac.c\
|
||||
# ../devLoCamac.c\
|
||||
# ../devMbboCamac.c\
|
||||
# ../devMbboDirectCamac.c
|
||||
# SRCS.c += ../devAaiCamac.c
|
||||
# SRCS.c += ../devAiCamac.c
|
||||
SRCS.c += ../devAiDvx2502.c
|
||||
SRCS.c += ../devAiKscV215.c
|
||||
SRCS.c += ../devAiSoft.c
|
||||
SRCS.c += ../devAiSoftRaw.c
|
||||
SRCS.c += ../devAiSymb.c
|
||||
SRCS.c += ../devAiTestAsyn.c
|
||||
SRCS.c += ../devAiXy566Di.c
|
||||
SRCS.c += ../devAiXy566DiL.c
|
||||
SRCS.c += ../devAiXy566Se.c
|
||||
SRCS.c += ../devAllenBradley.c
|
||||
# SRCS.c += ../devAaoCamac.c
|
||||
# SRCS.c += ../devAoCamac.c
|
||||
SRCS.c += ../devAoSoft.c
|
||||
SRCS.c += ../devAoSoftRaw.c
|
||||
SRCS.c += ../devAoSymb.c
|
||||
SRCS.c += ../devAoTestAsyn.c
|
||||
SRCS.c += ../devAoVmiVme4100.c
|
||||
SRCS.c += ../devApsEg.c
|
||||
SRCS.c += ../devApsEr.c
|
||||
SRCS.c += ../devAt5Vxi.c
|
||||
SRCS.c += ../devAt8Fp.c
|
||||
SRCS.c += ../devAvme9440.c
|
||||
# SRCS.c += ../devBiCamac.c
|
||||
SRCS.c += ../devBiMpv910.c
|
||||
SRCS.c += ../devBiSoft.c
|
||||
SRCS.c += ../devBiSoftRaw.c
|
||||
SRCS.c += ../devBiTestAsyn.c
|
||||
SRCS.c += ../devBiXVme210.c
|
||||
# SRCS.c += ../devBoCamac.c
|
||||
SRCS.c += ../devBoMpv902.c
|
||||
SRCS.c += ../devBoSoft.c
|
||||
SRCS.c += ../devBoSoftRaw.c
|
||||
SRCS.c += ../devBoTestAsyn.c
|
||||
SRCS.c += ../devBoXVme220.c
|
||||
SRCS.c += ../devCommonGpib.c
|
||||
SRCS.c += ../devEventSoft.c
|
||||
SRCS.c += ../devEventTestIoEvent.c
|
||||
SRCS.c += ../devHistogramSoft.c
|
||||
SRCS.c += ../devHistogramTestAsyn.c
|
||||
SRCS.c += ../devHpe1368a.c
|
||||
# OBJS += devLiCamac.c
|
||||
SRCS.c += ../devLiSoft.c
|
||||
SRCS.c += ../devLiSymb.c
|
||||
# OBJS += devLoCamac.c
|
||||
SRCS.c += ../devLoSoft.c
|
||||
SRCS.c += ../devLoSymb.c
|
||||
# SRCS.c += ../devMbbiCamac.c
|
||||
# SRCS.c += ../devMbbiDirectCamac.c
|
||||
SRCS.c += ../devMbbiDirectMpv910.c
|
||||
SRCS.c += ../devMbbiDirectSoft.c
|
||||
SRCS.c += ../devMbbiDirectSoftRaw.c
|
||||
SRCS.c += ../devMbbiDirectXVme210.c
|
||||
SRCS.c += ../devMbbiMpv910.c
|
||||
SRCS.c += ../devMbbiSoft.c
|
||||
SRCS.c += ../devMbbiSoftRaw.c
|
||||
SRCS.c += ../devMbbiTestAsyn.c
|
||||
SRCS.c += ../devMbbiXVme210.c
|
||||
# SRCS.c += ../devMbboCamac.c
|
||||
# SRCS.c += ../devMbboDirectCamac.c
|
||||
SRCS.c += ../devMbboDirectMpv902.c
|
||||
SRCS.c += ../devMbboDirectSoft.c
|
||||
SRCS.c += ../devMbboDirectSoftRaw.c
|
||||
SRCS.c += ../devMbboDirectXVme220.c
|
||||
SRCS.c += ../devMbboMpv902.c
|
||||
SRCS.c += ../devMbboSoft.c
|
||||
SRCS.c += ../devMbboSoftRaw.c
|
||||
SRCS.c += ../devMbboTestAsyn.c
|
||||
SRCS.c += ../devMbboXVme220.c
|
||||
SRCS.c += ../devMz8310.c
|
||||
SRCS.c += ../devPtSoft.c
|
||||
SRCS.c += ../devSASoft.c
|
||||
SRCS.c += ../devSiSoft.c
|
||||
SRCS.c += ../devSiSymb.c
|
||||
SRCS.c += ../devSiTestAsyn.c
|
||||
SRCS.c += ../devSmCompumotor1830.c
|
||||
SRCS.c += ../devSmOms6Axis.c
|
||||
SRCS.c += ../devSoSoft.c
|
||||
SRCS.c += ../devSoSymb.c
|
||||
SRCS.c += ../devSoTestAsyn.c
|
||||
SRCS.c += ../devSysmon.c
|
||||
SRCS.c += ../devTimerMz8310.c
|
||||
SRCS.c += ../devVxiTDM.c
|
||||
# SRCS.c += ../devWfCamac.c
|
||||
SRCS.c += ../devWfComet.c
|
||||
SRCS.c += ../devWfDvx2502.c
|
||||
SRCS.c += ../devWfJoergerVtr1.c
|
||||
SRCS.c += ../devWfSoft.c
|
||||
SRCS.c += ../devWfTestAsyn.c
|
||||
SRCS.c += ../devWfXy566Sc.c
|
||||
SRCS.c += ../devXy240.c
|
||||
|
||||
OBJS = \
|
||||
devAiDvx2502.o\
|
||||
devAiSoft.o\
|
||||
devAiSoftRaw.o\
|
||||
devAiSymb.o\
|
||||
devAiTestAsyn.o\
|
||||
devAiXy566Di.o\
|
||||
devAiXy566DiL.o\
|
||||
devAiXy566Se.o\
|
||||
devAoSoft.o\
|
||||
devAoSoftRaw.o\
|
||||
devAoSymb.o\
|
||||
devAoTestAsyn.o\
|
||||
devAoVmiVme4100.o\
|
||||
devBiMpv910.o\
|
||||
devApsEg.o\
|
||||
devApsEr.o\
|
||||
devBiSoft.o\
|
||||
devBiSoftRaw.o\
|
||||
devBiTestAsyn.o\
|
||||
devBiXVme210.o\
|
||||
devBoMpv902.o\
|
||||
devBoSoft.o\
|
||||
devBoSoftRaw.o\
|
||||
devBoTestAsyn.o\
|
||||
devBoXVme220.o\
|
||||
devCommonGpib.o\
|
||||
devEventSoft.o\
|
||||
devEventTestIoEvent.o\
|
||||
devHistogramSoft.o\
|
||||
devHistogramTestAsyn.o\
|
||||
devLiSoft.o\
|
||||
devLiSymb.o\
|
||||
devLoSoft.o\
|
||||
devLoSymb.o\
|
||||
devMbbiMpv910.o\
|
||||
devMbbiSoft.o\
|
||||
devMbbiSoftRaw.o\
|
||||
devMbbiTestAsyn.o\
|
||||
devMbbiXVme210.o\
|
||||
devMbboMpv902.o\
|
||||
devMbboSoft.o\
|
||||
devMbboSoftRaw.o\
|
||||
devMbboTestAsyn.o\
|
||||
devMbboXVme220.o\
|
||||
devMbbiDirectMpv910.o\
|
||||
devMbbiDirectSoft.o\
|
||||
devMbbiDirectSoftRaw.o\
|
||||
devMbbiDirectXVme210.o\
|
||||
devMbboDirectMpv902.o\
|
||||
devMbboDirectSoft.o\
|
||||
devMbboDirectSoftRaw.o\
|
||||
devMbboDirectXVme220.o\
|
||||
devPtSoft.o\
|
||||
devSmCompumotor1830.o\
|
||||
devSmOms6Axis.o\
|
||||
devSASoft.o\
|
||||
devSiSoft.o\
|
||||
devSiSymb.o\
|
||||
devSiTestAsyn.o\
|
||||
devSoSoft.o\
|
||||
devSoSymb.o\
|
||||
devSoTestAsyn.o\
|
||||
devWfSoft.o\
|
||||
devWfTestAsyn.o\
|
||||
devWfXy566Sc.o\
|
||||
devAllenBradley.o\
|
||||
devAt5Vxi.o\
|
||||
devMz8310.o\
|
||||
devTimerMz8310.o\
|
||||
devVxiTDM.o\
|
||||
devAiKscV215.o\
|
||||
devXy240.o\
|
||||
devHpe1368a.o\
|
||||
devAt8Fp.o\
|
||||
devWfComet.o\
|
||||
devWfDvx2502.o\
|
||||
devWfJoergerVtr1.o\
|
||||
devAvme9440.o\
|
||||
devSysmon.o
|
||||
# devAiCamac.o\
|
||||
# devAaiCamac.o\
|
||||
# devBiCamac.o\
|
||||
# devLiCamac.o\
|
||||
# devMbbiCamac.o\
|
||||
# devMbbiDirectCamac.o\
|
||||
# devWfCamac.o\
|
||||
# devAoCamac.o\
|
||||
# devAaoCamac.o\
|
||||
# devBoCamac.o\
|
||||
# devLoCamac.o\
|
||||
# devMbboCamac.o\
|
||||
# devMbboDirectCamac.o
|
||||
# OBJS += devAaiCamac.o
|
||||
# OBJS += devAiCamac.o
|
||||
OBJS += devAiDvx2502.o
|
||||
OBJS += devAiKscV215.o
|
||||
OBJS += devAiSoft.o
|
||||
OBJS += devAiSoftRaw.o
|
||||
OBJS += devAiSymb.o
|
||||
OBJS += devAiTestAsyn.o
|
||||
OBJS += devAiXy566Di.o
|
||||
OBJS += devAiXy566DiL.o
|
||||
OBJS += devAiXy566Se.o
|
||||
OBJS += devAllenBradley.o
|
||||
# OBJS += devAaoCamac.o
|
||||
# OBJS += devAoCamac.o
|
||||
OBJS += devAoSoft.o
|
||||
OBJS += devAoSoftRaw.o
|
||||
OBJS += devAoSymb.o
|
||||
OBJS += devAoTestAsyn.o
|
||||
OBJS += devAoVmiVme4100.o
|
||||
OBJS += devApsEg.o
|
||||
OBJS += devApsEr.o
|
||||
OBJS += devAt5Vxi.o
|
||||
OBJS += devAt8Fp.o
|
||||
OBJS += devAvme9440.o
|
||||
# OBJS += devBiCamac.o
|
||||
OBJS += devBiMpv910.o
|
||||
OBJS += devBiSoft.o
|
||||
OBJS += devBiSoftRaw.o
|
||||
OBJS += devBiTestAsyn.o
|
||||
OBJS += devBiXVme210.o
|
||||
# OBJS += devBoCamac.o
|
||||
OBJS += devBoMpv902.o
|
||||
OBJS += devBoSoft.o
|
||||
OBJS += devBoSoftRaw.o
|
||||
OBJS += devBoTestAsyn.o
|
||||
OBJS += devBoXVme220.o
|
||||
OBJS += devCommonGpib.o
|
||||
OBJS += devEventSoft.o
|
||||
OBJS += devEventTestIoEvent.o
|
||||
OBJS += devHistogramSoft.o
|
||||
OBJS += devHistogramTestAsyn.o
|
||||
OBJS += devHpe1368a.o
|
||||
# OBJS += devLiCamac.o
|
||||
OBJS += devLiSoft.o
|
||||
OBJS += devLiSymb.o
|
||||
# OBJS += devLoCamac.o
|
||||
OBJS += devLoSoft.o
|
||||
OBJS += devLoSymb.o
|
||||
# OBJS += devMbbiCamac.o
|
||||
# OBJS += devMbbiDirectCamac.o
|
||||
OBJS += devMbbiDirectMpv910.o
|
||||
OBJS += devMbbiDirectSoft.o
|
||||
OBJS += devMbbiDirectSoftRaw.o
|
||||
OBJS += devMbbiDirectXVme210.o
|
||||
OBJS += devMbbiMpv910.o
|
||||
OBJS += devMbbiSoft.o
|
||||
OBJS += devMbbiSoftRaw.o
|
||||
OBJS += devMbbiTestAsyn.o
|
||||
OBJS += devMbbiXVme210.o
|
||||
# OBJS += devMbboCamac.o
|
||||
# OBJS += devMbboDirectCamac.o
|
||||
OBJS += devMbboDirectMpv902.o
|
||||
OBJS += devMbboDirectSoft.o
|
||||
OBJS += devMbboDirectSoftRaw.o
|
||||
OBJS += devMbboDirectXVme220.o
|
||||
OBJS += devMbboMpv902.o
|
||||
OBJS += devMbboSoft.o
|
||||
OBJS += devMbboSoftRaw.o
|
||||
OBJS += devMbboTestAsyn.o
|
||||
OBJS += devMbboXVme220.o
|
||||
OBJS += devMz8310.o
|
||||
OBJS += devPtSoft.o
|
||||
OBJS += devSASoft.o
|
||||
OBJS += devSiSoft.o
|
||||
OBJS += devSiSymb.o
|
||||
OBJS += devSiTestAsyn.o
|
||||
OBJS += devSmCompumotor1830.o
|
||||
OBJS += devSmOms6Axis.o
|
||||
OBJS += devSoSoft.o
|
||||
OBJS += devSoSymb.o
|
||||
OBJS += devSoTestAsyn.o
|
||||
OBJS += devSysmon.o
|
||||
OBJS += devTimerMz8310.o
|
||||
OBJS += devVxiTDM.o
|
||||
# OBJS += devWfCamac.o
|
||||
OBJS += devWfComet.o
|
||||
OBJS += devWfDvx2502.o
|
||||
OBJS += devWfJoergerVtr1.o
|
||||
OBJS += devWfSoft.o
|
||||
OBJS += devWfTestAsyn.o
|
||||
OBJS += devWfXy566Sc.o
|
||||
OBJS += devXy240.o
|
||||
|
||||
PROD = devSup
|
||||
|
||||
@@ -200,3 +198,7 @@ $(PROD): $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -774,6 +774,9 @@ STATIC int ErResetAll(ApsErStruct *pParm)
|
||||
*
|
||||
* Receive a hardware IRQ from an ER board.
|
||||
*
|
||||
* BUG -- should add errMessage calls for problem events & include storm
|
||||
* control on them.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC void ErIrqHandler(ErLinkStruct *pLink)
|
||||
{
|
||||
|
||||
@@ -181,6 +181,8 @@ struct ioCard {
|
||||
#define CONST_NUM_LINKS 6
|
||||
#define STATIC
|
||||
|
||||
STATIC int devAvme9440Report();
|
||||
|
||||
static unsigned short BASEADD;
|
||||
#define LED_INIT 0x02
|
||||
#define LED_OKRUN 0x03
|
||||
@@ -206,7 +208,7 @@ struct {
|
||||
DEVSUPFUN write_bo; /* output command goes here */
|
||||
}devBoAvme9440={
|
||||
5,
|
||||
NULL,
|
||||
(DEVSUPFUN) devAvme9440Report,
|
||||
init,
|
||||
init_bo_record,
|
||||
NULL,
|
||||
@@ -263,7 +265,36 @@ struct {
|
||||
NULL,
|
||||
read_mbbi
|
||||
};
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
* Ultra groovy and useful reporting function called from 'dbior'.
|
||||
*
|
||||
**************************************************************************/
|
||||
STATIC int devAvme9440Report()
|
||||
{
|
||||
int LinkNum = 0;
|
||||
int CardBase = BASEADD;
|
||||
int IntVec = INT_VEC_BASE;
|
||||
|
||||
while (LinkNum < avme9440_num_links)
|
||||
{
|
||||
if (cards[LinkNum].card != NULL)
|
||||
{
|
||||
printf(" Link %02.2d at 0x%4.4X, IRQ 0x%2.2X, input 0x%04.4X, output 0x%04.4X\n",
|
||||
LinkNum,
|
||||
CardBase,
|
||||
IntVec,
|
||||
cards[LinkNum].card->inputData,
|
||||
cards[LinkNum].card->outputData);
|
||||
|
||||
}
|
||||
LinkNum++;
|
||||
CardBase += sizeof(struct avme9440);
|
||||
IntVec++;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
*
|
||||
|
||||
@@ -77,10 +77,7 @@ struct boRecord *pbo;
|
||||
long status;
|
||||
|
||||
status = recGblInitFastOutLink(&(pbo->out), (void *) pbo, DBR_LONG, "RVAL");
|
||||
|
||||
if (pbo->out.type != CA_LINK)
|
||||
status = 2;
|
||||
|
||||
status = 2;
|
||||
return status;
|
||||
|
||||
} /* end init_record() */
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
/* base/src/dev $Id$ */
|
||||
|
||||
/*
|
||||
* $Log$
|
||||
* Revision 1.23 1995/01/06 16:55:52 winans
|
||||
* Added the log parameter to the doc
|
||||
*
|
||||
*
|
||||
* Author: John Winans
|
||||
* Origional Author: Ned D. Arnold
|
||||
* Date: 11-20-91
|
||||
@@ -2462,6 +2467,7 @@ void (*process)();
|
||||
/* make sure the command type makes sendse for the record type */
|
||||
|
||||
if (parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBREAD &&
|
||||
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBWRITE &&
|
||||
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBSOFT &&
|
||||
parmBlock->gpibCmds[((struct gpibDpvt *)pwf->dpvt)->parm].type != GPIBREADW)
|
||||
{
|
||||
@@ -2538,9 +2544,11 @@ int
|
||||
devGpibLib_wfGpibWork(pdpvt)
|
||||
struct gpibDpvt *pdpvt;
|
||||
{
|
||||
int OperationStatus;
|
||||
struct waveformRecord *pwf= ((struct waveformRecord *)(pdpvt->precord));
|
||||
struct gpibCmd *pCmd;
|
||||
struct devGpibParmBlock *parmBlock;
|
||||
short ibnode = pdpvt->head.device;
|
||||
|
||||
parmBlock = (struct devGpibParmBlock *)(((gDset*)(pwf->dset))->funPtr[pwf->dset->number]);
|
||||
|
||||
@@ -2551,31 +2559,60 @@ struct gpibDpvt *pdpvt;
|
||||
if(*(parmBlock->debugFlag))
|
||||
printf("devGpibLib_wfGpibWork: starting ...command type = %d\n",pCmd->type);
|
||||
|
||||
if (devGpibLib_xxGpibWork(pdpvt, pCmd->type, -1) == ERROR)
|
||||
{
|
||||
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
|
||||
|
||||
#if 1
|
||||
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
|
||||
#else
|
||||
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
|
||||
pdpvt->head.header.callback.priority = priorityLow;
|
||||
callbackRequest(&pdpvt->head.header.callback);
|
||||
#endif
|
||||
/**** Handle writes internally... the generic routine will not work ****/
|
||||
if (pCmd->type == GPIBWRITE)
|
||||
{
|
||||
/*
|
||||
* check to see if this node has timed out within last 10 sec
|
||||
*/
|
||||
if(tickGet() < (pdpvt->phwpvt->tmoVal + parmBlock->timeWindow) )
|
||||
{
|
||||
if (*parmBlock->debugFlag)
|
||||
printf("devGpibLib_xxGpibWork(): timeout flush\n");
|
||||
|
||||
OperationStatus = ERROR;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
OperationStatus = (*(drvGpib.writeIb))(pdpvt->head.pibLink,
|
||||
ibnode, pdpvt->msg, pCmd->msgLen, pdpvt->head.dmaTimeout);
|
||||
|
||||
if(*parmBlock->debugFlag)
|
||||
printf("devGpibLib_xxGpibWork : done, status = %d\n",OperationStatus);
|
||||
|
||||
/* if error occurrs then mark it with time */
|
||||
if(OperationStatus == ERROR)
|
||||
{
|
||||
(pdpvt->phwpvt->tmoCount)++; /* count timeouts */
|
||||
pdpvt->phwpvt->tmoVal = tickGet(); /* set last timeout time */
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
OperationStatus = devGpibLib_xxGpibWork(pdpvt, pCmd->type, -1);
|
||||
}
|
||||
|
||||
if (OperationStatus == ERROR)
|
||||
{
|
||||
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
|
||||
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pCmd->type != GPIBREADW)
|
||||
devGpibLib_wfGpibFinish(pdpvt); /* If not waiting on SRQ, finish */
|
||||
else
|
||||
{
|
||||
if (*(parmBlock->debugFlag) || ibSrqDebug)
|
||||
printf("%s: marking srq Handler for READW operation\n", parmBlock->name);
|
||||
pdpvt->phwpvt->srqCallback = (int (*)())(((gDset*)(pwf->dset))->funPtr[pwf->dset->number + 2]);
|
||||
pdpvt->phwpvt->parm = (caddr_t)pdpvt; /* mark the handler */
|
||||
return(BUSY); /* indicate device still in use */
|
||||
else
|
||||
{
|
||||
if (*(parmBlock->debugFlag) || ibSrqDebug)
|
||||
printf("%s: marking srq Handler for READW operation\n", parmBlock->name);
|
||||
pdpvt->phwpvt->srqCallback = (int (*)())(((gDset*)(pwf->dset))->funPtr[pwf->dset->number + 2]);
|
||||
pdpvt->phwpvt->parm = (caddr_t)pdpvt; /* mark the handler */
|
||||
return(BUSY); /* indicate device still in use */
|
||||
}
|
||||
}
|
||||
}
|
||||
return(IDLE); /* indicate device is now idle */
|
||||
}
|
||||
|
||||
@@ -2606,13 +2643,7 @@ int srqStatus;
|
||||
{
|
||||
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
|
||||
|
||||
#if 1
|
||||
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
|
||||
#else
|
||||
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
|
||||
pdpvt->head.header.callback.priority = priorityLow;
|
||||
callbackRequest(&pdpvt->head.header.callback);
|
||||
#endif
|
||||
}
|
||||
|
||||
devGpibLib_wfGpibFinish(pdpvt); /* and finish the processing */
|
||||
@@ -2649,13 +2680,7 @@ struct gpibDpvt *pdpvt;
|
||||
devGpibLib_setPvSevr(pwf,READ_ALARM,VALID_ALARM);
|
||||
}
|
||||
|
||||
#if 1
|
||||
RegisterProcessCallback(&pdpvt->head.callback, priorityLow, pdpvt);
|
||||
#else
|
||||
pdpvt->head.header.callback.callback = devGpibLib_processCallback;
|
||||
pdpvt->head.header.callback.priority = priorityLow;
|
||||
callbackRequest(&pdpvt->head.header.callback);
|
||||
#endif
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -77,10 +77,7 @@ struct mbboRecord *pmbbo;
|
||||
long status;
|
||||
|
||||
status = recGblInitFastOutLink(&(pmbbo->out), (void *) pmbbo, DBR_ULONG, "RVAL");
|
||||
|
||||
if (pmbbo->out.type == CA_LINK)
|
||||
status = 2;
|
||||
|
||||
status = 2;
|
||||
return status;
|
||||
|
||||
} /* end init_record() */
|
||||
|
||||
1032
src/dev/devSysmon.c
1032
src/dev/devSysmon.c
File diff suppressed because it is too large
Load Diff
@@ -4,17 +4,27 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_INCLUDES = -I../../drv
|
||||
|
||||
SRCS.c = \
|
||||
../devAnalytekGpib.c ../devXxDg535Gpib.c ../devBBInteract.c \
|
||||
../devGpibInteract.c ../devXxSr620Gpib.c ../devK486Gpib.c \
|
||||
../devXxK196Gpib.c ../devXxDc5009Gpib.c ../devXxK263Gpib.c \
|
||||
../devXxSkeletonGpib.c
|
||||
SRCS.c += ../devAnalytekGpib.c
|
||||
SRCS.c += ../devXxDg535Gpib.c
|
||||
SRCS.c += ../devBBInteract.c
|
||||
SRCS.c += ../devGpibInteract.c
|
||||
SRCS.c += ../devXxSr620Gpib.c
|
||||
SRCS.c += ../devK486Gpib.c
|
||||
SRCS.c += ../devXxK196Gpib.c
|
||||
SRCS.c += ../devXxDc5009Gpib.c
|
||||
SRCS.c += ../devXxK263Gpib.c
|
||||
SRCS.c += ../devXxSkeletonGpib.c
|
||||
|
||||
OBJS = \
|
||||
devAnalytekGpib.o devXxDg535Gpib.o devBBInteract.o \
|
||||
devGpibInteract.o devXxSr620Gpib.o devK486Gpib.o \
|
||||
devXxK196Gpib.o devXxDc5009Gpib.o devXxK263Gpib.o \
|
||||
devXxSkeletonGpib.o
|
||||
OBJS += devAnalytekGpib.o
|
||||
OBJS += devXxDg535Gpib.o
|
||||
OBJS += devBBInteract.o
|
||||
OBJS += devGpibInteract.o
|
||||
OBJS += devXxSr620Gpib.o
|
||||
OBJS += devK486Gpib.o
|
||||
OBJS += devXxK196Gpib.o
|
||||
OBJS += devXxDc5009Gpib.o
|
||||
OBJS += devXxK263Gpib.o
|
||||
OBJS += devXxSkeletonGpib.o
|
||||
|
||||
PROD = devLibOpt $(OBJS)
|
||||
|
||||
|
||||
@@ -246,16 +246,20 @@ static int timingStudy(void)
|
||||
pCmd[i]->busy = 0; /* mark message 'not in queue' */
|
||||
pCmd[i]->count = 0;
|
||||
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd[i]->linkId < MVME162_LINK_NUM_BASE)
|
||||
{
|
||||
#endif
|
||||
(*(drvGpib.ioctl))(pCmd[i]->linkType, pCmd[i]->linkId, pCmd[i]->bug, IBGENLINK, 0, NULL);
|
||||
(*(drvGpib.ioctl))(pCmd[i]->linkType, pCmd[i]->linkId, pCmd[i]->bug, IBGETLINK, 0, &(pCmd[i]->head.pibLink));
|
||||
#ifdef USE_162_STUFF
|
||||
}
|
||||
else
|
||||
{
|
||||
drv162IB_InitLink(pCmd[i]->linkId);
|
||||
drv162IB_GetLink(pCmd[i]->linkId, &(pCmd[i]->head.pibLink));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -291,11 +295,14 @@ static int timingStudy(void)
|
||||
pCmd[i]->count++;
|
||||
pCmd[i]->busy = 1; /* mark the xact as busy */
|
||||
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd[i]->linkId < MVME162_LINK_NUM_BASE)
|
||||
#endif
|
||||
(*(drvGpib.qGpibReq))(pCmd[i], IB_Q_LOW);
|
||||
#ifdef USE_162_STUFF
|
||||
else
|
||||
drv162IB_QueueReq(pCmd[i], IB_Q_LOW);
|
||||
|
||||
#endif
|
||||
reps--;
|
||||
if (reps%10000 == 0)
|
||||
{
|
||||
@@ -361,11 +368,16 @@ static int sendMsg(void)
|
||||
replyIsBack = FALSE;
|
||||
ticks = 0;
|
||||
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
|
||||
{
|
||||
#endif
|
||||
|
||||
(*(drvGpib.ioctl))(pCmd->linkType, pCmd->linkId, pCmd->bug, IBGENLINK, 0, NULL);
|
||||
(*(drvGpib.ioctl))(pCmd->linkType, pCmd->linkId, pCmd->bug, IBGETLINK, 0, &(pCmd->head.pibLink));
|
||||
(*(drvGpib.qGpibReq))(pCmd, IB_Q_LOW); /* queue the msg */
|
||||
|
||||
#ifdef USE_162_STUFF
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -373,6 +385,7 @@ static int sendMsg(void)
|
||||
drv162IB_GetLink(pCmd->linkId, &(pCmd->head.pibLink));
|
||||
drv162IB_QueueReq(pCmd, IB_Q_LOW);
|
||||
}
|
||||
#endif
|
||||
|
||||
while (!replyIsBack && (ticks < maxTicks)) /* wait for reply msg */
|
||||
{
|
||||
@@ -403,10 +416,15 @@ static int gpibWork(struct gpibIntCmd *pCmd)
|
||||
switch (pCmd->type) {
|
||||
case 'w':
|
||||
case 'W': /* write the message to the GPIB listen adrs */
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
|
||||
#endif
|
||||
status =(*(drvGpib.writeIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
|
||||
|
||||
#ifdef USE_162_STUFF
|
||||
else
|
||||
status = drv162IB_write(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
|
||||
#endif
|
||||
|
||||
if (status == ERROR)
|
||||
strcpy(pCmd->resp, "GPIB TIMEOUT (while talking)");
|
||||
@@ -415,10 +433,14 @@ static int gpibWork(struct gpibIntCmd *pCmd)
|
||||
break;
|
||||
case 'r':
|
||||
case 'R': /* write the command string */
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
|
||||
#endif
|
||||
status = (*(drvGpib.writeIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
|
||||
#ifdef USE_162_STUFF
|
||||
else
|
||||
status = drv162IB_write(pCmd->head.pibLink, pCmd->head.device, pCmd->cmd, strlen(pCmd->cmd), GITime);
|
||||
#endif
|
||||
|
||||
if (status == ERROR)
|
||||
{
|
||||
@@ -430,10 +452,14 @@ static int gpibWork(struct gpibIntCmd *pCmd)
|
||||
case 'i':
|
||||
/* read the instrument */
|
||||
pCmd->resp[0] = 0; /* clear response string */
|
||||
#ifdef USE_162_STUFF
|
||||
if (pCmd->linkId < MVME162_LINK_NUM_BASE)
|
||||
#endif
|
||||
status = (*(drvGpib.readIb))(pCmd->head.pibLink, pCmd->head.device, pCmd->resp, MAX_MSG_LENGTH, GITime);
|
||||
#ifdef USE_162_STUFF
|
||||
else
|
||||
status = drv162IB_read(pCmd->head.pibLink, pCmd->head.device, pCmd->resp, MAX_MSG_LENGTH, GITime);
|
||||
#endif
|
||||
|
||||
if (status == ERROR)
|
||||
{
|
||||
|
||||
@@ -4,73 +4,74 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -fshared-data -fvolatile -mnobitfield -traditional
|
||||
|
||||
SRCS.c = \
|
||||
../module_types.c\
|
||||
../drvXy010.c\
|
||||
../drvAb.c\
|
||||
../drvBb902.c\
|
||||
../drvBb910.c\
|
||||
../drvCompuSm.c\
|
||||
../drvDvx.c\
|
||||
../drvMz8310.c\
|
||||
../drvOms.c\
|
||||
../drvStc.c\
|
||||
../drvTime.c\
|
||||
../drvVmi4100.c\
|
||||
../drvXy210.c\
|
||||
../drvXy220.c\
|
||||
../drvXy240.c\
|
||||
../drvXy566.c\
|
||||
../drvAt5Vxi.c\
|
||||
../drvHp1404a.c\
|
||||
../drvEpvxi.c\
|
||||
../drvEpvxiMsg.c\
|
||||
../drvBitBus.c\
|
||||
../drvGpib.c\
|
||||
../drvMsg.c\
|
||||
../drvBB232.c\
|
||||
../drvHpe1368a.c\
|
||||
../drvHpe1445a.c\
|
||||
../drvKscV215.c\
|
||||
../drvComet.c\
|
||||
../drvJgvtr1.c\
|
||||
../drvFp.c\
|
||||
../drvMvme162.c\
|
||||
../drvFpm.c
|
||||
SRCS.c += ../module_types.c
|
||||
SRCS.c += ../drvAb.c
|
||||
SRCS.c += ../drvAt5Vxi.c
|
||||
SRCS.c += ../drvBB232.c
|
||||
SRCS.c += ../drvBb902.c
|
||||
SRCS.c += ../drvBb910.c
|
||||
SRCS.c += ../drvBitBus.c
|
||||
# SRCS.c += ../drvCaenV265.c
|
||||
SRCS.c += ../drvComet.c
|
||||
SRCS.c += ../drvCompuSm.c
|
||||
SRCS.c += ../drvDvx.c
|
||||
SRCS.c += ../drvEpvxi.c
|
||||
SRCS.c += ../drvEpvxiMsg.c
|
||||
SRCS.c += ../drvFp.c
|
||||
SRCS.c += ../drvFpm.c
|
||||
SRCS.c += ../drvGpib.c
|
||||
SRCS.c += ../drvHp1404a.c
|
||||
SRCS.c += ../drvHpe1368a.c
|
||||
SRCS.c += ../drvHpe1445a.c
|
||||
SRCS.c += ../drvJgvtr1.c
|
||||
SRCS.c += ../drvKscV215.c
|
||||
SRCS.c += ../drvMsg.c
|
||||
SRCS.c += ../drvMz8310.c
|
||||
SRCS.c += ../drvOms.c
|
||||
SRCS.c += ../drvStc.c
|
||||
SRCS.c += ../drvTime.c
|
||||
# SRCS.c += ../drvTranServ.c
|
||||
SRCS.c += ../drvVmi4100.c
|
||||
SRCS.c += ../drvXy010.c
|
||||
SRCS.c += ../drvXy210.c
|
||||
SRCS.c += ../drvXy220.c
|
||||
SRCS.c += ../drvXy240.c
|
||||
SRCS.c += ../drvXy566.c
|
||||
|
||||
OBJS += module_types.o
|
||||
OBJS += drvAb.o
|
||||
OBJS += drvAt5Vxi.o
|
||||
OBJS += drvBB232.o
|
||||
OBJS += drvBb902.o
|
||||
OBJS += drvBb910.o
|
||||
OBJS += drvBitBus.o
|
||||
# OBJS += drvCaenV265.o
|
||||
OBJS += drvComet.o
|
||||
OBJS += drvCompuSm.o
|
||||
OBJS += drvDvx.o
|
||||
OBJS += drvEpvxi.o
|
||||
OBJS += drvEpvxiMsg.o
|
||||
OBJS += drvFp.o
|
||||
OBJS += drvFpm.o
|
||||
OBJS += drvGpib.o
|
||||
OBJS += drvHp1404a.o
|
||||
OBJS += drvHpe1368a.o
|
||||
OBJS += drvHpe1445a.o
|
||||
OBJS += drvJgvtr1.o
|
||||
OBJS += drvKscV215.o
|
||||
OBJS += drvMsg.o
|
||||
OBJS += drvMz8310.o
|
||||
OBJS += drvOms.o
|
||||
OBJS += drvStc.o
|
||||
OBJS += drvTime.o
|
||||
# OBJS += drvTranServ.o
|
||||
OBJS += drvVmi4100.o
|
||||
OBJS += drvXy010.o
|
||||
OBJS += drvXy210.o
|
||||
OBJS += drvXy220.o
|
||||
OBJS += drvXy240.o
|
||||
OBJS += drvXy566.o
|
||||
|
||||
OBJS = \
|
||||
module_types.o\
|
||||
drvXy010.o\
|
||||
drvAb.o\
|
||||
drvBb902.o\
|
||||
drvBb910.o\
|
||||
drvCompuSm.o\
|
||||
drvDvx.o\
|
||||
drvMz8310.o\
|
||||
drvOms.o\
|
||||
drvStc.o\
|
||||
drvTime.o\
|
||||
drvVmi4100.o\
|
||||
drvXy210.o\
|
||||
drvXy220.o\
|
||||
drvXy240.o\
|
||||
drvXy566.o\
|
||||
drvAt5Vxi.o\
|
||||
drvHp1404a.o\
|
||||
drvEpvxi.o\
|
||||
drvEpvxiMsg.o\
|
||||
drvBitBus.o\
|
||||
drvGpib.o\
|
||||
drvMsg.o\
|
||||
drvBB232.o\
|
||||
drvHpe1368a.o\
|
||||
drvHpe1445a.o\
|
||||
drvKscV215.o\
|
||||
drvComet.o\
|
||||
drvJgvtr1.o\
|
||||
drvFp.o\
|
||||
drvMvme162.o\
|
||||
drvFpm.o
|
||||
|
||||
PROD = drvSup
|
||||
|
||||
@@ -81,5 +82,4 @@ $(PROD): $(OBJS)
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
|
||||
# ../drvCaenV265.c\
|
||||
# drvCaenV265.o\
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
|
||||
The CPU030 may need to have the nivxi path set correctly:
|
||||
From the vxWorks shell type vxitedit
|
||||
From the vxWorks shell type "vxitedit"
|
||||
take option 2
|
||||
take option 3
|
||||
type list
|
||||
@@ -8,6 +9,7 @@ The CPU030 may need to have the nivxi path set correctly:
|
||||
(the path should end in nivxi
|
||||
and should traverse the niCpu030
|
||||
directories shipped with the 030
|
||||
ie somethin of the form "???/config/niCPU030/nivxi"
|
||||
type save
|
||||
type exit
|
||||
.
|
||||
|
||||
@@ -551,10 +551,10 @@ unsigned short card;
|
||||
printf("Allen Bradley: abBtCallback Logic Error");
|
||||
return;
|
||||
}
|
||||
(preq->callback)(preq);
|
||||
pabbtrequest[link][adapter][card] = NULL;
|
||||
pcard = &ab_config[link][adapter][card];
|
||||
*pcard &= ~(AB_INTERFACE_TYPE|AB_INIT_BIT|AB_SENT_INIT);
|
||||
pabbtrequest[link][adapter][card] = NULL;
|
||||
(preq->callback)(preq);
|
||||
}
|
||||
|
||||
int ab_bt_read(link,adapter,card,preq)
|
||||
@@ -1304,13 +1304,14 @@ abDoneTask(){
|
||||
*
|
||||
* simulate a change of state interrupt from the Allen-Bradley
|
||||
*/
|
||||
unsigned char ab_old_binary_ins[AB_MAX_LINKS*AB_MAX_ADAPTERS*AB_MAX_CARDS];
|
||||
unsigned short ab_old_binary_ins[AB_MAX_LINKS][AB_MAX_ADAPTERS][AB_MAX_CARDS];
|
||||
ab_bi_cos_simulator()
|
||||
{
|
||||
register struct ab_region *p6008;
|
||||
register unsigned short link;
|
||||
register unsigned short *pcard;
|
||||
unsigned short *ps_input,*ps_oldval;
|
||||
unsigned short new;
|
||||
unsigned short *pold;
|
||||
short adapter,card,inpinx;
|
||||
short first_scan,first_scan_complete;
|
||||
short adapter_status_change;
|
||||
@@ -1323,8 +1324,6 @@ ab_bi_cos_simulator()
|
||||
first_scan_complete = FALSE;
|
||||
first_scan = TRUE;
|
||||
for(;;){
|
||||
/* check each link */
|
||||
link = 0;
|
||||
for (link = 0; link < AB_MAX_LINKS; link++){
|
||||
if ((p6008 = p6008s[link]) == 0) continue;
|
||||
for (adapter = 0; adapter < AB_MAX_ADAPTERS; adapter++){
|
||||
@@ -1335,28 +1334,24 @@ ab_bi_cos_simulator()
|
||||
for (card = 0; card < AB_MAX_CARDS; card++){
|
||||
pcard = &ab_config[link][adapter][card];
|
||||
inpinx = (adapter * AB_CARD_ADAPTER) + card;
|
||||
pold = &ab_old_binary_ins[link][adapter][card];
|
||||
if ((*pcard & AB_INTERFACE_TYPE) != AB_BI_INTERFACE) continue;
|
||||
|
||||
if ((*pcard & AB_CARD_TYPE) == ABBI_16_BIT){
|
||||
/* sixteen bit byte ordering in dual ported memory */
|
||||
/* byte 0011 2233 4455 6677 8899 AABB */
|
||||
/* card 0000 2222 4444 6666 8888 AAAA */
|
||||
if (inpinx & 0x1) continue;
|
||||
ps_input = (unsigned short *)&(p6008->iit[inpinx]);
|
||||
ps_oldval = (unsigned short *)&(ab_old_binary_ins[inpinx]);
|
||||
if ((*ps_input != *ps_oldval) || first_scan || adapter_status_change){
|
||||
scanIoRequest(ioscanpvt[link][adapter][card]);
|
||||
*ps_oldval = *ps_input;
|
||||
}
|
||||
new = *(unsigned short *)&(p6008->iit[inpinx]);
|
||||
}else{
|
||||
/* eight bit byte ordering in dual ported memory */
|
||||
/* 1100 3322 5544 7766 9988 BBAA */
|
||||
if (inpinx & 0x1) inpinx--; /* shuffle those bytes */
|
||||
else inpinx++;
|
||||
if ((p6008->iit[inpinx] != ab_old_binary_ins[inpinx]) || first_scan || adapter_status_change){
|
||||
scanIoRequest(ioscanpvt[link][adapter][card]);
|
||||
ab_old_binary_ins[inpinx] = p6008->iit[inpinx];
|
||||
}
|
||||
new = (unsigned short)(p6008->iit[inpinx]);
|
||||
}
|
||||
if((new!=*pold) || first_scan || adapter_status_change){
|
||||
scanIoRequest(ioscanpvt[link][adapter][card]);
|
||||
*pold = new;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -450,10 +450,10 @@ struct at5vxi_model{
|
||||
#define AT5VXI_MODEL_FROM_INDEX(INDEX) ((unsigned)((INDEX)|0xf00))
|
||||
|
||||
/*
|
||||
NOTE: The macro AT5VXI_INDEX_FROM_MODEL(MODEL) defined above
|
||||
should return an index into the correct data given the
|
||||
VXI device's model code.
|
||||
*/
|
||||
* NOTE: The macro AT5VXI_INDEX_FROM_MODEL(MODEL) defined above
|
||||
* should return an index into the correct data given the
|
||||
* VXI device's model code.
|
||||
*/
|
||||
struct at5vxi_model at5vxi_models[] = {
|
||||
{"INTERFACE SIMULATOR", "112Y-280158"},
|
||||
{"I CONTROLLER", "112Y-280176"},
|
||||
@@ -477,6 +477,16 @@ struct at5vxi_model at5vxi_models[] = {
|
||||
{"DOWNCONVERTER", "112Y-280456"},
|
||||
{"COAX MONITOR TRANSMITTER", "112Y-280587"},
|
||||
{"CAVITY SIMULATOR", "112Y-280232"},
|
||||
{"CABLE CONTROLLER (2 CHANNEL)","112Y-280539"},
|
||||
{"BREADBOARD", "112Y-280358"},
|
||||
{"I/O INTERFACE", "112Y-280359"},
|
||||
{"DIAGNOSTIC - BPM", "112Y-280422-1"},
|
||||
{"FAST ENVELOPE DETECTOR", "112Y-280421"},
|
||||
{"DIAGNOSTIC - CM", "112Y-280422-2"},
|
||||
{"DIAGNOSTIC - MISC", "112Y-280422-3"},
|
||||
{"FAST VECTOR DETECTOR", "112Y-280651"},
|
||||
{"SINGLE-WIDE VECTOR DETECTOR", "112Y-280672"},
|
||||
{"FM / AM", "112Y-280xxx"}
|
||||
};
|
||||
|
||||
#define AT5VXI_VALID_MODEL(MODEL) \
|
||||
|
||||
@@ -65,6 +65,10 @@
|
||||
* This driver currently needs work on error message generation.
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.36 1994/12/16 16:11:26 winans
|
||||
* Added debug flag guards to ALL printing. The default debug level is set
|
||||
* to 1 -- this provides the same output as the old version.
|
||||
*
|
||||
* Revision 1.35 1994/12/12 16:02:57 winans
|
||||
* Rewrote the init code so that it always returns a zero (don't kill the
|
||||
* startup.cmd file.) It is possible that this could cause some confusion
|
||||
@@ -2459,10 +2463,13 @@ STATIC int pepTxTask(int link)
|
||||
|
||||
/* Send the message in polled mode */
|
||||
txTCount = pnode->txMsg.length;
|
||||
|
||||
/* BUG -- would be nice if we verify the length >6 here */
|
||||
|
||||
txCCount = 0;
|
||||
txMsg = &(pnode->txMsg.length);
|
||||
|
||||
while ((txCCount < txTCount) && (pBBLink[link]->abortFlag == 0)) {
|
||||
while ((txCCount < txTCount -1) && (pBBLink[link]->abortFlag == 0)) {
|
||||
|
||||
stuck = 1000;
|
||||
while (((pBBLink[link]->l.PepLink.bbRegs->stat_ctl & PEP_BB_TFNF)
|
||||
@@ -2487,12 +2494,13 @@ STATIC int pepTxTask(int link)
|
||||
if (bbDebug>30)
|
||||
printf("pepTxTask(%d): outputting %2.2X\n",link,0x00);
|
||||
pBBLink[link]->l.PepLink.bbRegs->data = 0x00;
|
||||
}
|
||||
else if (txCCount == (txTCount -1)) { /* last byte of package */
|
||||
#if 0
|
||||
} else if (txCCount == (txTCount -1)) { /* last byte of package */
|
||||
pBBLink[link]->l.PepLink.bbRegs->stat_ctl = *txMsg;
|
||||
if (bbDebug>30)
|
||||
printf("pepTxTask(%d): outputting last byte %2.2X\n",
|
||||
link,*txMsg);
|
||||
#endif
|
||||
} else { /* regular ol' message byte */
|
||||
pBBLink[link]->l.PepLink.bbRegs->data = *txMsg;
|
||||
if (bbDebug>30)
|
||||
@@ -2536,6 +2544,11 @@ STATIC int pepTxTask(int link)
|
||||
{
|
||||
/* Lock the busy list */
|
||||
semTake(pBBLink[link]->busyList.sem, WAIT_FOREVER);
|
||||
|
||||
pBBLink[link]->l.PepLink.bbRegs->stat_ctl = *txMsg;
|
||||
if (bbDebug>30)
|
||||
printf("pepTxTask(%d): outputting last byte %2.2X\n",
|
||||
link,*txMsg);
|
||||
|
||||
/* set the retire time */
|
||||
pnode->retire = tickGet();
|
||||
|
||||
@@ -120,6 +120,9 @@
|
||||
* BUGS:
|
||||
* The driver should inspect the VXI make and model codes and use a data type
|
||||
* for the DMA buffer that is appropriate.
|
||||
*
|
||||
* $Log$
|
||||
*
|
||||
*/
|
||||
|
||||
static char *SccsId = "$Id$";
|
||||
@@ -884,14 +887,13 @@ int sramld(int card)
|
||||
if (dvxDebug)
|
||||
printf("Total channels read in %d\n", dvx[card].numChan);
|
||||
|
||||
#if 0 /* Force the user to reference board 7 on their own */
|
||||
/* Make the extender system reset by referencing board 7 (No sample taken) */
|
||||
*ramptr++ = GAIN_CHANNEL | ((0xF0 >> 3) & 3);
|
||||
*ramptr++ = (((0xF0 & 7) << 3) | ((0xF0 & 0xE0) >> 5));
|
||||
#endif
|
||||
|
||||
#if 1 /* This causes an extra sample to be taken at the end of the scan */
|
||||
*ramptr++ = 0; /* mark the end of the sequence program */
|
||||
*ramptr++ = 0;
|
||||
#else /* This was supposed to get rid of the extra one, but does not work */
|
||||
*(ramptr-1) &= 0xff3f;
|
||||
*ramptr = *(ramptr-1);
|
||||
#endif
|
||||
|
||||
/* set scan rate and run it once */
|
||||
dvx[card].pdvx2502->samp_rate = DVX_DRATE;
|
||||
|
||||
@@ -62,6 +62,12 @@
|
||||
*
|
||||
*
|
||||
* $Log$
|
||||
* Revision 1.27 1994/12/14 22:29:14 winans
|
||||
* Removed DMAC command chaining structure(s) from the ibLink
|
||||
* structure so they can be malloc'd seperately. This keeps
|
||||
* the usage of A24 space restricted to ONLY those structures
|
||||
* that have to be there.
|
||||
*
|
||||
* Revision 1.26 1994/12/12 16:03:00 winans
|
||||
* Rewrote the init code so that it always returns a zero (don't kill the
|
||||
* startup.cmd file.) It is possible that this could cause some confusion
|
||||
@@ -151,11 +157,11 @@ STATIC char *ram_base; /* Base of the ram on the CPU board */
|
||||
STATIC int timeoutSquelch = 0; /* Used to quiet timeout msgs during polling */
|
||||
|
||||
/* DMA timing bus error problem debugging in niPhysIo */
|
||||
int ibDmaDebug = 0; /* Turns on DMA debug messages from this driver */
|
||||
int ibDmaTimingError = 0; /* count "bad memProbes"/call of niPhysIo */
|
||||
int ibDmaTimingErrorTotal = 0; /* count total "bad memProbes" in niPhysIo */
|
||||
int ibDmaMaxError = 0 ; /* max # bad calls per call of niPhysIo */
|
||||
STATIC char testWrite; /* test char to write to 1014 card */
|
||||
int ibDmaDebug = 0; /* Turns on DMA debug messages from this driver */
|
||||
int ibDmaTimingError = 0; /* count "bad memProbes"/call of niPhysIo */
|
||||
int ibDmaTimingErrorTotal = 0; /* count total "bad memProbes" in niPhysIo */
|
||||
int ibDmaMaxError = 0; /* max # bad calls per call of niPhysIo */
|
||||
STATIC char testWrite; /* test char to write to 1014 card */
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
@@ -221,12 +227,7 @@ struct niLink {
|
||||
WDOG_ID watchDogId; /* watchdog for timeouts */
|
||||
struct ibregs *ibregs;/* pointer to board registers */
|
||||
|
||||
#if 0
|
||||
char cc_byte;
|
||||
struct cc_ary cc_array;
|
||||
#else
|
||||
DmaStuffStruct *DmaStuff;
|
||||
#endif
|
||||
|
||||
char r_isr1;
|
||||
char r_isr2;
|
||||
@@ -1094,6 +1095,7 @@ int time; /* time to wait on the DMA operation */
|
||||
else
|
||||
b->ch1.ccr = D_EINT;
|
||||
|
||||
#ifdef INCLUDE_LANL_DMA_TIMING_CHECKER
|
||||
/*************************************************************************
|
||||
* DMAC BUS ERROR CATCH
|
||||
* The following lines are included because of a possible VME protocol
|
||||
@@ -1115,9 +1117,11 @@ int time; /* time to wait on the DMA operation */
|
||||
logMsg("DMA timing: error = %d, total = %d, max = %d\n",
|
||||
ibDmaTimingError, ibDmaTimingErrorTotal, ibDmaMaxError);
|
||||
/***************************************************************************/
|
||||
#endif
|
||||
|
||||
b->ch0.ccr = D_SRT;
|
||||
|
||||
#ifdef INCLUDE_LANL_DMA_TIMING_CHECKER
|
||||
/****************************
|
||||
* DMAC BUS ERROR CATCH
|
||||
*****************************/
|
||||
@@ -1131,6 +1135,7 @@ int time; /* time to wait on the DMA operation */
|
||||
logMsg("DMA timing: error = %d, total = %d, max = %d\n",
|
||||
ibDmaTimingError, ibDmaTimingErrorTotal, ibDmaMaxError);
|
||||
/***************************************************************************/
|
||||
#endif
|
||||
|
||||
b->imr2 = w_imr2; /* this must be done last */
|
||||
|
||||
@@ -2041,102 +2046,6 @@ int length; /* number of bytes to write out from the data buffer */
|
||||
return(ERROR);
|
||||
}
|
||||
|
||||
#ifdef INCLUDE_HIDEOS_INTERFACE
|
||||
/******************************************************************************
|
||||
*
|
||||
* Interface functions for HiDEOS access.
|
||||
*
|
||||
******************************************************************************/
|
||||
/******************************************************************************
|
||||
*
|
||||
* Read up to <length> bytes into <*buffer>.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibRead(struct ibLink *pibLink, int device, char *buffer, int length, int time)
|
||||
{
|
||||
logMsg("HideosGpibRead() entered\n");
|
||||
return(bytes read | error);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Write <length> bytes from <*buffer> in data mode.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibWrite(struct ibLink *pibLink, int device, char *buffer, int length, int time)
|
||||
{
|
||||
logMsg("HideosGpibWrite() entered\n");
|
||||
return(bytes sent | error);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Write <length> bytes from <*buffer> in command mode.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibCmd(struct ibLink *pibLink, char *buffer, int length)
|
||||
{
|
||||
logMsg("HideosGpibCmd() entered\n");
|
||||
return(bytes sent | error);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Verify that the given GPIB port exists.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibCheckLink(int link, int bug)
|
||||
{
|
||||
logMsg("HideosGpibCheckLink() entered\n");
|
||||
return(OK | ERROR);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Prevent SRQs from being polled on a given GPIB port.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibSrqPollInhibit(int link, int bug, int gpibAddr)
|
||||
{
|
||||
logMsg("HideosGpibSrqPollInhibit() entered -- NOT SUPPORTED YET\n");
|
||||
return(ERROR);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Generate a GPIB link for a HiDEOS port.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibGenLink(int link, int bug)
|
||||
{
|
||||
logMsg("HideosGpibGenLink() entered\n");
|
||||
return(ibLinkStart() | ERROR);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Handle a GPIB IOCTL call.
|
||||
*
|
||||
******************************************************************************/
|
||||
STATIC int
|
||||
HideosGpibIoctl(int link, int bug, int cmd, int v, caddr_t p)
|
||||
{
|
||||
logMsg("HideosGpibIoctl() entered\n");
|
||||
return(OK | ERROR);
|
||||
}
|
||||
/******************************************************************************
|
||||
*
|
||||
* Given the port information, return a link structure.
|
||||
*
|
||||
******************************************************************************/
|
||||
struct bbIbLink *
|
||||
HideosGpibFindLink(int link, int bug)
|
||||
{
|
||||
logMsg("HideosGpibFindLink() entered\n");
|
||||
return(bbIbLink* | NULL);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* These are the BitBus architecture specific functions.
|
||||
@@ -2674,9 +2583,9 @@ IBHistDump(int type, int link, int bug)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
/* A way to stop the CPU when idle... run from shell at prio 250 */
|
||||
BigFFT()
|
||||
cpuStopperThingy()
|
||||
{
|
||||
while (1)
|
||||
asm(" stop #0x3000");
|
||||
|
||||
@@ -338,8 +338,8 @@ register unsigned int val;
|
||||
/* use structure to handle high and low short swap */
|
||||
/* get current output */
|
||||
|
||||
work = (dio[card].dptr->port4_5 << 16)
|
||||
+ dio[card].dptr->port6_7;
|
||||
work = (dio[card].dptr->port6_7 << 16)
|
||||
+ dio[card].dptr->port4_5;
|
||||
|
||||
work = (work & ~mask) | (val & mask);
|
||||
|
||||
|
||||
@@ -237,8 +237,5 @@ NIGPIB_SHORT_OFF = 0x5000;
|
||||
NIGPIB_IVEC_BASE = 100;
|
||||
NIGPIB_IRQ_LEVEL = 5;
|
||||
|
||||
MVME162_EXT_OFF = 0x40000000;
|
||||
MVME162_IVEC_BASE = 104;
|
||||
MVME162_IRQ_LEVEL = 5;
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -22,12 +22,12 @@ PROD = iocCore vxWorks vxWorks.sym
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
vxWorks: $(VX_IMAGE)
|
||||
$(RM) $@
|
||||
cp $< .
|
||||
@$(RM) $@
|
||||
@cp -p $< .
|
||||
|
||||
vxWorks.sym: $(VX_IMAGE_SYM)
|
||||
$(RM) $@
|
||||
cp $< .
|
||||
@$(RM) $@
|
||||
@cp -p $< .
|
||||
|
||||
iocCore: $(IOC_CORE_OBJS)
|
||||
$(LINK.c) $@ $(IOC_CORE_OBJS)
|
||||
|
||||
@@ -4,27 +4,48 @@ include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
USR_CFLAGS = -D_NO_PROTO
|
||||
|
||||
SRCS.c = \
|
||||
../arAccessLib.c ../arCSCheck.c ../arChanIO.c ../bfSubr.c \
|
||||
../bucketLib.c ../calcPerform.c ../cmdSubr.c ../cvtFast.c \
|
||||
../cvtNumbers.c ../ellLib.c ../envSubr.c ../errMtst.c ../errSymLib.c \
|
||||
../ezsSockSubr.c ../fdmgr.c ../freeListLib.c ../genSubr.c \
|
||||
../genTaskSubr.c ../gpHashLib.c ../helpSubr.c ../memDebugLib.c \
|
||||
../nextFieldSubr.c ../postfix.c ../sydSubr.c ../sydSubrCA.c \
|
||||
../sydSubrCF.c ../sydSubrSSF.c ../tsSubr.c errSymTbl.c ../errInc.c \
|
||||
../realpath.c
|
||||
SRCS.c += ../bucketLib.c
|
||||
SRCS.c += ../calcPerform.c
|
||||
SRCS.c += ../cvtFast.c
|
||||
SRCS.c += ../ellLib.c
|
||||
SRCS.c += ../envSubr.c
|
||||
SRCS.c += ../errInc.c
|
||||
SRCS.c += ../errMtst.c
|
||||
SRCS.c += ../errPrintfUNIX.c
|
||||
SRCS.c += ../errSymLib.c
|
||||
SRCS.c += errSymTbl.c
|
||||
SRCS.c += ../fdmgr.c
|
||||
SRCS.c += ../freeListLib.c
|
||||
SRCS.c += ../gpHashLib.c
|
||||
SRCS.c += ../memDebugLib.c
|
||||
SRCS.c += ../nextFieldSubr.c
|
||||
SRCS.c += ../postfix.c
|
||||
SRCS.c += ../realpath.c
|
||||
SRCS.c += ../tsSubr.c
|
||||
SRCS.c += ../assertUNIX.c
|
||||
|
||||
LIBOBJS = \
|
||||
tsSubr.o arAccessLib.o arCSCheck.o arChanIO.o bfSubr.o bucketLib.o \
|
||||
calcPerform.o cmdSubr.o cvtFast.o cvtNumbers.o ellLib.o \
|
||||
envSubr.o errMtst.o errSymLib.o errSymTbl.o ezsSockSubr.o fdmgr.o \
|
||||
freeListLib.o genSubr.o genTaskSubr.o gpHashLib.o helpSubr.o \
|
||||
memDebugLib.o nextFieldSubr.o postfix.o sydSubr.o sydSubrCA.o \
|
||||
sydSubrCF.o sydSubrSSF.o realpath.o
|
||||
LIBOBJS += bucketLib.o
|
||||
LIBOBJS += calcPerform.o
|
||||
LIBOBJS += cvtFast.o
|
||||
LIBOBJS += ellLib.o
|
||||
LIBOBJS += envSubr.o
|
||||
LIBOBJS += errMtst.o
|
||||
LIBOBJS += errPrintfUNIX.o
|
||||
LIBOBJS += errSymLib.o
|
||||
LIBOBJS += errSymTbl.o
|
||||
LIBOBJS += fdmgr.o
|
||||
LIBOBJS += freeListLib.o
|
||||
LIBOBJS += gpHashLib.o
|
||||
LIBOBJS += memDebugLib.o
|
||||
LIBOBJS += nextFieldSubr.o
|
||||
LIBOBJS += postfix.o
|
||||
LIBOBJS += realpath.o
|
||||
LIBOBJS += tsSubr.o
|
||||
LIBOBJS += assertUNIX.o
|
||||
|
||||
LIBNAME = libCom.a
|
||||
|
||||
#TARGETS = cvtTest tsTest sydTest
|
||||
#TARGETS = tsTest
|
||||
|
||||
include $(EPICS)/config/RULES.Unix
|
||||
|
||||
@@ -38,15 +59,9 @@ errSymTbl.c errInc.o: errInc.c
|
||||
pre_build:
|
||||
@test -f errInc.c || ln -s ../errInc.c errInc.c
|
||||
|
||||
cvtTest: cvtNumbers.o
|
||||
$(LINK.c) -o $@ cvtNumbers.o -lCom -lDb -lCom -lm -s
|
||||
|
||||
tsTest: tsSubr.o
|
||||
$(LINK.c) -o $@ tsSubr.o -lCom -lDb -lCom -lm -s
|
||||
|
||||
sydTest: sydSubr.o
|
||||
$(LINK.c) -o $@ sydSubr.o -lCom -lca -lDb -lCom -lm -s
|
||||
|
||||
clean::
|
||||
@$(RM) errInc.c errSymTbl.c
|
||||
|
||||
|
||||
@@ -2,28 +2,44 @@ EPICS = ../../../..
|
||||
include Target.include
|
||||
include $(EPICS)/config/CONFIG_BASE
|
||||
|
||||
SRCS.c = \
|
||||
../calcPerform.c ../cmdSubr.c ../cvtBpt.c ../cvtFast.c \
|
||||
../cvtNumbers.c ../gpHashLib.c ../freeListLib.c ../ellLib.c \
|
||||
../envSubr.c ../errSymLib.c ../ezsSockSubr.c ../genSubr.c \
|
||||
../genTaskSubr.c ../helpSubr.c ../nextFieldSubr.c ../postfix.c \
|
||||
../sydSubr.c ../sydSubrCA.c ../sydSubrCF.c ../sydSubrSSF.c \
|
||||
../bucketLib.c ../memDebugLib.c ../tsSubr.c ../pal.c \
|
||||
../paldef.c errSymTbl.c
|
||||
SRCS.c += ../calcPerform.c
|
||||
SRCS.c += ../cvtBpt.c
|
||||
SRCS.c += ../cvtFast.c
|
||||
SRCS.c += ../gpHashLib.c
|
||||
SRCS.c += ../freeListLib.c
|
||||
SRCS.c += ../ellLib.c
|
||||
SRCS.c += ../envSubr.c
|
||||
SRCS.c += ../errSymLib.c
|
||||
SRCS.c += ../nextFieldSubr.c
|
||||
SRCS.c += ../postfix.c
|
||||
SRCS.c += ../bucketLib.c
|
||||
SRCS.c += ../memDebugLib.c
|
||||
SRCS.c += ../tsSubr.c
|
||||
SRCS.c += ../pal.c
|
||||
SRCS.c += ../paldef.c
|
||||
SRCS.c += errSymTbl.c
|
||||
SRCS.c += ../errPrintfVX.c
|
||||
SRCS.c += ../assertVX.c
|
||||
|
||||
OBJS += calcPerform.o
|
||||
OBJS += cvtBpt.o
|
||||
OBJS += cvtFast.o
|
||||
OBJS += ellLib.o
|
||||
OBJS += envSubr.o
|
||||
OBJS += errSymLib.o
|
||||
OBJS += errSymTbl.o
|
||||
OBJS += nextFieldSubr.o
|
||||
OBJS += postfix.o
|
||||
OBJS += bucketLib.o
|
||||
OBJS += tsSubr.o
|
||||
OBJS += gpHashLib.o
|
||||
OBJS += freeListLib.o
|
||||
OBJS += pal.o
|
||||
OBJS += paldef.o
|
||||
OBJS += errPrintfVX.o
|
||||
OBJS += assertVX.o
|
||||
|
||||
OBJS = \
|
||||
calcPerform.o cvtBpt.o cvtFast.o ellLib.o envSubr.o errSymLib.o \
|
||||
errSymTbl.o genSubr.o genTaskSubr.o nextFieldSubr.o postfix.o \
|
||||
bucketLib.o tsSubr.o gpHashLib.o freeListLib.o pal.o paldef.o
|
||||
|
||||
OBJS1 = \
|
||||
cmdSubr.o cvtNumbers.o cvtFast.o ezsSockSubr.o helpSubr.o
|
||||
|
||||
OBJS2 = \
|
||||
sydSubr.o sydSubrCA.o sydSubrCF.o sydSubrSSF.o
|
||||
|
||||
PROD = libCom libCom1 libCom2
|
||||
PROD = libCom
|
||||
|
||||
include $(EPICS)/config/RULES.Vx
|
||||
|
||||
@@ -43,10 +59,3 @@ libCom: $(OBJS)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS) $(LDLIBS)
|
||||
|
||||
libCom1: $(OBJS1)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS1) $(LDLIBS)
|
||||
|
||||
libCom2: $(OBJS2)
|
||||
$(RM) $@
|
||||
$(LINK.c) $@ $(OBJS2) $(LDLIBS)
|
||||
|
||||
65
src/libCom/assertUNIX.c
Normal file
65
src/libCom/assertUNIX.c
Normal file
@@ -0,0 +1,65 @@
|
||||
/* $Id$
|
||||
* assertUNIX.c
|
||||
* Author: Jeffrey Hill
|
||||
* Date: 02-27-95
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <epicsPrint.h>
|
||||
|
||||
|
||||
/*
|
||||
* epicsAssert ()
|
||||
*/
|
||||
void epicsAssert (const char *pFile, const unsigned line, const char *pMsg)
|
||||
{
|
||||
epicsPrintf (
|
||||
"\n\n\nA call to \"assert (%s)\" failed in %s line %d.\n", pMsg, pFile, line);
|
||||
|
||||
epicsPrintf (
|
||||
"The file \"core\" will be created in the current working directory.\n");
|
||||
|
||||
epicsPrintf (
|
||||
"Please save this file and the text of this message in order to assist\n");
|
||||
|
||||
epicsPrintf (
|
||||
"in diagnosing this problem.\n");
|
||||
|
||||
epicsPrintf (
|
||||
"Please contact the author of this software or else send the text of\n");
|
||||
|
||||
epicsPrintf (
|
||||
"this message to \"tech_talk@aps.anl.gov\"\n");
|
||||
|
||||
abort ();
|
||||
}
|
||||
|
||||
71
src/libCom/assertVX.c
Normal file
71
src/libCom/assertVX.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/* $Id$
|
||||
* assertVX.c
|
||||
* Author: Jeff Hill
|
||||
* Date: 02-27-95
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <epicsPrint.h>
|
||||
|
||||
|
||||
/*
|
||||
* epicsAssert ()
|
||||
*
|
||||
* This forces assert failures into the log file and then
|
||||
* calls taskSuspend() instead of exit() so that we can debug
|
||||
* the problem.
|
||||
*/
|
||||
void epicsAssert (const char *pFile, const unsigned line, const char *pMsg)
|
||||
{
|
||||
int taskId = taskIdSelf();
|
||||
|
||||
epicsPrintf (
|
||||
"\n\n\n%s: A call to \"assert (%s)\" failed in %s at %d\n",
|
||||
taskName (taskId),
|
||||
pMsg,
|
||||
pFile,
|
||||
line);
|
||||
|
||||
epicsPrintf (
|
||||
"Please send a copy of the output from \"tt (0x%x)\" and a copy of this message\n",
|
||||
taskId);
|
||||
|
||||
epicsPrintf (
|
||||
"to the author or \"tech_talk@aps.anl.gov\"\n");
|
||||
|
||||
taskSuspend (taskId);
|
||||
}
|
||||
|
||||
@@ -35,11 +35,12 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <bucketLib.h>
|
||||
|
||||
#ifndef NBBY
|
||||
@@ -196,7 +197,7 @@ LOCAL ITEM **bucketUnsignedCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketPointerCompare()
|
||||
*/
|
||||
ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
LOCAL ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
{
|
||||
void *ptr;
|
||||
void **pItemId;
|
||||
@@ -219,7 +220,7 @@ ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketStringCompare ()
|
||||
*/
|
||||
ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
LOCAL ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
{
|
||||
const char *pStr = pId;
|
||||
ITEM *pi;
|
||||
@@ -241,7 +242,7 @@ ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketUnsignedHash ()
|
||||
*/
|
||||
BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
const unsigned *pUId = pId;
|
||||
unsigned src;
|
||||
@@ -262,11 +263,10 @@ BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
|
||||
/*
|
||||
* bucketPointerHash ()
|
||||
*
|
||||
*/
|
||||
BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
void * const *ppId = pId;
|
||||
void * const *ppId = (void * const *) pId;
|
||||
unsigned long src;
|
||||
BUCKETID hashid;
|
||||
|
||||
@@ -292,7 +292,7 @@ BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
/*
|
||||
* bucketStringHash ()
|
||||
*/
|
||||
BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
const char *pStr = pId;
|
||||
BUCKETID hashid;
|
||||
|
||||
@@ -35,11 +35,12 @@
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <bucketLib.h>
|
||||
|
||||
#ifndef NBBY
|
||||
@@ -196,7 +197,7 @@ LOCAL ITEM **bucketUnsignedCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketPointerCompare()
|
||||
*/
|
||||
ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
LOCAL ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
{
|
||||
void *ptr;
|
||||
void **pItemId;
|
||||
@@ -219,7 +220,7 @@ ITEM **bucketPointerCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketStringCompare ()
|
||||
*/
|
||||
ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
LOCAL ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
{
|
||||
const char *pStr = pId;
|
||||
ITEM *pi;
|
||||
@@ -241,7 +242,7 @@ ITEM **bucketStringCompare (ITEM **ppi, const void *pId)
|
||||
/*
|
||||
* bucketUnsignedHash ()
|
||||
*/
|
||||
BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
const unsigned *pUId = pId;
|
||||
unsigned src;
|
||||
@@ -262,11 +263,10 @@ BUCKETID bucketUnsignedHash (BUCKET *pb, const void *pId)
|
||||
|
||||
/*
|
||||
* bucketPointerHash ()
|
||||
*
|
||||
*/
|
||||
BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
void * const *ppId = pId;
|
||||
void * const *ppId = (void * const *) pId;
|
||||
unsigned long src;
|
||||
BUCKETID hashid;
|
||||
|
||||
@@ -292,7 +292,7 @@ BUCKETID bucketPointerHash (BUCKET *pb, const void *pId)
|
||||
/*
|
||||
* bucketStringHash ()
|
||||
*/
|
||||
BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
|
||||
LOCAL BUCKETID bucketStringHash (BUCKET *pb, const void *pId)
|
||||
{
|
||||
const char *pStr = pId;
|
||||
BUCKETID hashid;
|
||||
|
||||
@@ -472,6 +472,10 @@ printf ("*FINISHED*\n");
|
||||
*pstacktop = floor(*pstacktop);
|
||||
break;
|
||||
|
||||
case NINT:
|
||||
*pstacktop = (double)(long)((*pstacktop) >= 0 ? (*pstacktop)+0.5 : (*pstacktop)-0.5);
|
||||
break;
|
||||
|
||||
case REL_NOT:
|
||||
*pstacktop = ((*pstacktop)?0:1);
|
||||
break;
|
||||
|
||||
@@ -115,7 +115,14 @@
|
||||
#define SEPERATOR 8
|
||||
#define TRASH 9
|
||||
#define FLOAT_PT_CONST 10
|
||||
#define MINUS_OPERATOR 11
|
||||
|
||||
#define UNARY_MINUS_I_S_P 7
|
||||
#define UNARY_MINUS_I_C_P 8
|
||||
#define UNARY_MINUS_CODE UNARY_NEG
|
||||
#define BINARY_MINUS_I_S_P 4
|
||||
#define BINARY_MINUS_I_C_P 4
|
||||
#define BINARY_MINUS_CODE SUB
|
||||
|
||||
/* flags end of element table */
|
||||
#define END_ELEMENTS -1
|
||||
@@ -149,9 +156,12 @@ static struct expression_element elements[] = {
|
||||
/* element i_s_p i_c_p type_element internal_rep */
|
||||
"ABS", 7, 8, UNARY_OPERATOR, ABS_VAL, /* absolute value */
|
||||
"NOT", 7, 8, UNARY_OPERATOR, UNARY_NEG, /* unary negate */
|
||||
"-", 7, 8, MINUS_OPERATOR, UNARY_NEG, /* unary negate (or binary op) */
|
||||
"SQRT", 7, 8, UNARY_OPERATOR, SQU_RT, /* square root */
|
||||
"SQR", 7, 8, UNARY_OPERATOR, SQU_RT, /* square root */
|
||||
"EXP", 7, 8, UNARY_OPERATOR, EXP, /* exponential function */
|
||||
"LOGE", 7, 8, UNARY_OPERATOR, LOG_E, /* log E */
|
||||
"LN", 7, 8, UNARY_OPERATOR, LOG_E, /* log E */
|
||||
"LOG", 7, 8, UNARY_OPERATOR, LOG_10, /* log 10 */
|
||||
"ACOS", 7, 8, UNARY_OPERATOR, ACOS, /* arc cosine */
|
||||
"ASIN", 7, 8, UNARY_OPERATOR, ASIN, /* arc sine */
|
||||
@@ -160,6 +170,7 @@ static struct expression_element elements[] = {
|
||||
"MIN", 7, 8, UNARY_OPERATOR, MIN, /* minimum of 2 args */
|
||||
"CEIL", 7, 8, UNARY_OPERATOR, CEIL, /* smallest integer >= */
|
||||
"FLOOR", 7, 8, UNARY_OPERATOR, FLOOR, /* largest integer <= */
|
||||
"NINT", 7, 8, UNARY_OPERATOR, NINT, /* nearest integer */
|
||||
"COSH", 7, 8, UNARY_OPERATOR, COSH, /* hyperbolic cosine */
|
||||
"COS", 7, 8, UNARY_OPERATOR, COS, /* cosine */
|
||||
"SINH", 7, 8, UNARY_OPERATOR, SINH, /* hyperbolic sine */
|
||||
@@ -216,7 +227,9 @@ static struct expression_element elements[] = {
|
||||
"^", 6, 6, BINARY_OPERATOR,EXPON, /* exponentiation */
|
||||
"**", 6, 6, BINARY_OPERATOR,EXPON, /* exponentiation */
|
||||
"+", 4, 4, BINARY_OPERATOR,ADD, /* addition */
|
||||
#if 0
|
||||
"-", 4, 4, BINARY_OPERATOR,SUB, /* subtraction */
|
||||
#endif
|
||||
"*", 5, 5, BINARY_OPERATOR,MULT, /* multiplication */
|
||||
"/", 5, 5, BINARY_OPERATOR,DIV, /* division */
|
||||
"%", 5, 5, BINARY_OPERATOR,MODULO, /* modulo */
|
||||
@@ -305,6 +318,7 @@ short *perror;
|
||||
register struct expression_element *pstacktop;
|
||||
double constant;
|
||||
register char *pposthold, *pc;
|
||||
char in_stack_pri, in_coming_pri, code;
|
||||
|
||||
/* convert infix expression to upper case */
|
||||
for (pc=pinfix; *pc; pc++) {
|
||||
@@ -416,6 +430,38 @@ short *perror;
|
||||
new_expression = FALSE;
|
||||
break;
|
||||
|
||||
case MINUS_OPERATOR:
|
||||
if (operand_needed){
|
||||
/* then assume minus was intended as a unary operator */
|
||||
in_coming_pri = UNARY_MINUS_I_C_P;
|
||||
in_stack_pri = UNARY_MINUS_I_S_P;
|
||||
code = UNARY_MINUS_CODE;
|
||||
new_expression = FALSE;
|
||||
}
|
||||
else {
|
||||
/* then assume minus was intended as a binary operator */
|
||||
in_coming_pri = BINARY_MINUS_I_C_P;
|
||||
in_stack_pri = BINARY_MINUS_I_S_P;
|
||||
code = BINARY_MINUS_CODE;
|
||||
operand_needed = TRUE;
|
||||
}
|
||||
|
||||
/* add operators of higher or equal priority to */
|
||||
/* postfix notation */
|
||||
while ((pstacktop->in_stack_pri >= in_coming_pri)
|
||||
&& (pstacktop >= &stack[1])){
|
||||
*ppostfix++ = pstacktop->code;
|
||||
pstacktop--;
|
||||
}
|
||||
|
||||
/* add new operator to stack */
|
||||
pstacktop++;
|
||||
*pstacktop = *pelement;
|
||||
pstacktop->in_stack_pri = in_stack_pri;
|
||||
pstacktop->code = code;
|
||||
|
||||
break;
|
||||
|
||||
case SEPERATOR:
|
||||
if (operand_needed){
|
||||
*perror = 4;
|
||||
|
||||
@@ -472,6 +472,10 @@ printf ("*FINISHED*\n");
|
||||
*pstacktop = floor(*pstacktop);
|
||||
break;
|
||||
|
||||
case NINT:
|
||||
*pstacktop = (double)(long)((*pstacktop) >= 0 ? (*pstacktop)+0.5 : (*pstacktop)-0.5);
|
||||
break;
|
||||
|
||||
case REL_NOT:
|
||||
*pstacktop = ((*pstacktop)?0:1);
|
||||
break;
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
* Also they are not used on vxWorks
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h> /* XPG2/XPG3/POSIX.1/FIPS151-1/ANSI-C */
|
||||
@@ -100,7 +104,7 @@ int cvtFloatToString(
|
||||
|
||||
/* whole numbers */
|
||||
got_one = 0;
|
||||
for (iplace = 1000000; iplace >= 1; iplace /= 10){
|
||||
for (iplace = 10000000; iplace >= 1; iplace /= 10){
|
||||
if (whole >= iplace){
|
||||
got_one = 1;
|
||||
number = whole / iplace;
|
||||
@@ -178,7 +182,7 @@ int cvtDoubleToString(
|
||||
|
||||
/* whole numbers */
|
||||
got_one = 0;
|
||||
for (iplace = 1000000; iplace >= 1; iplace /= 10){
|
||||
for (iplace = 10000000; iplace >= 1; iplace /= 10){
|
||||
if (whole >= iplace){
|
||||
got_one = 1;
|
||||
number = whole / iplace;
|
||||
|
||||
@@ -48,6 +48,10 @@
|
||||
* Also they are not used on vxWorks
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <limits.h> /* XPG2/XPG3/POSIX.1/FIPS151-1/ANSI-C */
|
||||
@@ -100,7 +104,7 @@ int cvtFloatToString(
|
||||
|
||||
/* whole numbers */
|
||||
got_one = 0;
|
||||
for (iplace = 1000000; iplace >= 1; iplace /= 10){
|
||||
for (iplace = 10000000; iplace >= 1; iplace /= 10){
|
||||
if (whole >= iplace){
|
||||
got_one = 1;
|
||||
number = whole / iplace;
|
||||
@@ -178,7 +182,7 @@ int cvtDoubleToString(
|
||||
|
||||
/* whole numbers */
|
||||
got_one = 0;
|
||||
for (iplace = 1000000; iplace >= 1; iplace /= 10){
|
||||
for (iplace = 10000000; iplace >= 1; iplace /= 10){
|
||||
if (whole >= iplace){
|
||||
got_one = 1;
|
||||
number = whole / iplace;
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
|
||||
/* #define DEBUG_DRIVER */
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <ellLib.h>
|
||||
|
||||
#if !defined(NULL)
|
||||
|
||||
@@ -32,6 +32,12 @@
|
||||
|
||||
/* #define DEBUG_DRIVER */
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <ellLib.h>
|
||||
|
||||
#if !defined(NULL)
|
||||
|
||||
96
src/libCom/env/envSubr.c
vendored
96
src/libCom/env/envSubr.c
vendored
@@ -28,6 +28,8 @@
|
||||
* .01 07-20-91 rac initial version
|
||||
* .02 08-07-91 joh added config get for long and double C types
|
||||
* .03 08-07-91 joh added config get for struct in_addr type
|
||||
* .04 01-11-95 joh use getenv()/putenv() to fetch/write env
|
||||
* vars under vxWorks
|
||||
*
|
||||
* make options
|
||||
* -DvxWorks makes a version for VxWorks
|
||||
@@ -60,20 +62,26 @@
|
||||
*
|
||||
*-***************************************************************************/
|
||||
|
||||
#ifdef vxWorks
|
||||
# include <vxWorks.h>
|
||||
# include <stdioLib.h>
|
||||
# include <in.h>
|
||||
# include <types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <sys/types.h>
|
||||
# include <netinet/in.h>
|
||||
# include <sys/types.h>
|
||||
# include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <inetLib.h>
|
||||
#include <envLib.h>
|
||||
#include <errnoLib.h>
|
||||
#endif
|
||||
|
||||
#define ENV_PRIVATE_DATA
|
||||
#include <envDefs.h>
|
||||
#include <errMdef.h>
|
||||
#include <epicsEnvParams.h>
|
||||
|
||||
|
||||
@@ -122,11 +130,8 @@ char *pBuf; /* I pointer to parameter buffer */
|
||||
char *pEnv; /* pointer to environment string */
|
||||
long i;
|
||||
|
||||
#ifndef vxWorks
|
||||
pEnv = getenv(pParam->name);
|
||||
#else
|
||||
pEnv = NULL;
|
||||
#endif
|
||||
|
||||
if (pEnv == NULL)
|
||||
pEnv = pParam->dflt;
|
||||
if (strlen(pEnv) <= 0)
|
||||
@@ -363,26 +368,64 @@ ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
*
|
||||
*-*/
|
||||
long
|
||||
envSetConfigParam(pParam, value)
|
||||
ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
char *value; /* I pointer to value string */
|
||||
envSetConfigParam (pParam, value)
|
||||
ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
char *value; /* I pointer to value string */
|
||||
{
|
||||
#ifndef vxWorks
|
||||
printf("envSetConfigParam can't be used in UNIX\n");
|
||||
printf("envSetConfigParam can only be used under vxWorks\n");
|
||||
return -1L;
|
||||
#else
|
||||
if (strlen(value) < 80)
|
||||
strcpy(pParam->dflt, value);
|
||||
else {
|
||||
strncpy(pParam->dflt, value, 79);
|
||||
pParam->dflt[79] = '\0';
|
||||
}
|
||||
long retCode = 0;
|
||||
int status;
|
||||
char *pEnv;
|
||||
|
||||
/*
|
||||
* space for two strings, an '=' character,
|
||||
* and a null termination
|
||||
*/
|
||||
pEnv = malloc (strlen (pParam->name) + strlen (value) + 2);
|
||||
if (!pEnv) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
pParam->name,
|
||||
value,
|
||||
strerror (errnoGet()));
|
||||
return -1L;
|
||||
}
|
||||
|
||||
strcpy (pEnv, pParam->name);
|
||||
strcat (pEnv, "=");
|
||||
strcat (pEnv, value);
|
||||
status = putenv (pEnv);
|
||||
if (status<0) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
pParam->name,
|
||||
value,
|
||||
strerror (errnoGet()));
|
||||
retCode = -1L;
|
||||
}
|
||||
/*
|
||||
* vxWorks copies into a private buffer
|
||||
* (this does not match UNIX behavior)
|
||||
*/
|
||||
free (pEnv);
|
||||
|
||||
return retCode;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*parameters meant to be modified in epicsEnvParams.h*/
|
||||
|
||||
epicsSetEnvParams()
|
||||
int epicsSetEnvParams()
|
||||
{
|
||||
printf("setting EPICS environment parameters\n");
|
||||
envSetConfigParam(&EPICS_TS_MIN_WEST, EPICS_TS_MIN_VALUE);
|
||||
@@ -393,7 +436,8 @@ epicsSetEnvParams()
|
||||
envSetConfigParam(&EPICS_IOC_LOG_FILE_NAME, EPICS_IOC_LOG_FILE_TXT);
|
||||
return 0;
|
||||
}
|
||||
epicsPrtEnvParams()
|
||||
|
||||
int epicsPrtEnvParams()
|
||||
{
|
||||
envPrtConfigParam(&EPICS_TS_MIN_WEST);
|
||||
envPrtConfigParam(&EPICS_CMD_PROTO_PORT);
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
* .01 07-20-91 rac initial version
|
||||
* .02 08-07-91 joh added config get for long and double C types
|
||||
* .03 08-07-91 joh added config get for struct in_addr type
|
||||
* .04 01-11-95 joh use getenv()/putenv() to fetch/write env
|
||||
* vars under vxWorks
|
||||
*
|
||||
* make options
|
||||
* -DvxWorks makes a version for VxWorks
|
||||
@@ -60,20 +62,26 @@
|
||||
*
|
||||
*-***************************************************************************/
|
||||
|
||||
#ifdef vxWorks
|
||||
# include <vxWorks.h>
|
||||
# include <stdioLib.h>
|
||||
# include <in.h>
|
||||
# include <types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _WINDOWS
|
||||
# include <winsock.h>
|
||||
#else
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
# include <sys/types.h>
|
||||
# include <netinet/in.h>
|
||||
# include <sys/types.h>
|
||||
# include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <inetLib.h>
|
||||
#include <envLib.h>
|
||||
#include <errnoLib.h>
|
||||
#endif
|
||||
|
||||
#define ENV_PRIVATE_DATA
|
||||
#include <envDefs.h>
|
||||
#include <errMdef.h>
|
||||
#include <epicsEnvParams.h>
|
||||
|
||||
|
||||
@@ -122,11 +130,8 @@ char *pBuf; /* I pointer to parameter buffer */
|
||||
char *pEnv; /* pointer to environment string */
|
||||
long i;
|
||||
|
||||
#ifndef vxWorks
|
||||
pEnv = getenv(pParam->name);
|
||||
#else
|
||||
pEnv = NULL;
|
||||
#endif
|
||||
|
||||
if (pEnv == NULL)
|
||||
pEnv = pParam->dflt;
|
||||
if (strlen(pEnv) <= 0)
|
||||
@@ -363,26 +368,64 @@ ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
*
|
||||
*-*/
|
||||
long
|
||||
envSetConfigParam(pParam, value)
|
||||
ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
char *value; /* I pointer to value string */
|
||||
envSetConfigParam (pParam, value)
|
||||
ENV_PARAM *pParam; /* I pointer to config param structure */
|
||||
char *value; /* I pointer to value string */
|
||||
{
|
||||
#ifndef vxWorks
|
||||
printf("envSetConfigParam can't be used in UNIX\n");
|
||||
printf("envSetConfigParam can only be used under vxWorks\n");
|
||||
return -1L;
|
||||
#else
|
||||
if (strlen(value) < 80)
|
||||
strcpy(pParam->dflt, value);
|
||||
else {
|
||||
strncpy(pParam->dflt, value, 79);
|
||||
pParam->dflt[79] = '\0';
|
||||
}
|
||||
long retCode = 0;
|
||||
int status;
|
||||
char *pEnv;
|
||||
|
||||
/*
|
||||
* space for two strings, an '=' character,
|
||||
* and a null termination
|
||||
*/
|
||||
pEnv = malloc (strlen (pParam->name) + strlen (value) + 2);
|
||||
if (!pEnv) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
pParam->name,
|
||||
value,
|
||||
strerror (errnoGet()));
|
||||
return -1L;
|
||||
}
|
||||
|
||||
strcpy (pEnv, pParam->name);
|
||||
strcat (pEnv, "=");
|
||||
strcat (pEnv, value);
|
||||
status = putenv (pEnv);
|
||||
if (status<0) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\" because \"%s\"\n",
|
||||
pParam->name,
|
||||
value,
|
||||
strerror (errnoGet()));
|
||||
retCode = -1L;
|
||||
}
|
||||
/*
|
||||
* vxWorks copies into a private buffer
|
||||
* (this does not match UNIX behavior)
|
||||
*/
|
||||
free (pEnv);
|
||||
|
||||
return retCode;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*parameters meant to be modified in epicsEnvParams.h*/
|
||||
|
||||
epicsSetEnvParams()
|
||||
int epicsSetEnvParams()
|
||||
{
|
||||
printf("setting EPICS environment parameters\n");
|
||||
envSetConfigParam(&EPICS_TS_MIN_WEST, EPICS_TS_MIN_VALUE);
|
||||
@@ -393,7 +436,8 @@ epicsSetEnvParams()
|
||||
envSetConfigParam(&EPICS_IOC_LOG_FILE_NAME, EPICS_IOC_LOG_FILE_TXT);
|
||||
return 0;
|
||||
}
|
||||
epicsPrtEnvParams()
|
||||
|
||||
int epicsPrtEnvParams()
|
||||
{
|
||||
envPrtConfigParam(&EPICS_TS_MIN_WEST);
|
||||
envPrtConfigParam(&EPICS_CMD_PROTO_PORT);
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
#include "dbRecType.h"
|
||||
#include "dbRecords.h"
|
||||
#include "tsDefs.h"
|
||||
#include "arAccessLib.h"
|
||||
#include "sydDefs.h"
|
||||
#include "drvGpibErr.h"
|
||||
#include "drvBitBusErr.h"
|
||||
#include "calink.h"
|
||||
@@ -23,4 +21,4 @@
|
||||
#include "errMdef.h"
|
||||
#ifdef VXLIST
|
||||
/* epics vxWorks only*/
|
||||
#endif VXLIST
|
||||
#endif /* VXLIST */
|
||||
|
||||
83
src/libCom/errPrintfUNIX.c
Normal file
83
src/libCom/errPrintfUNIX.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/* $Id$
|
||||
* errPrintfUNIX.c
|
||||
* Author: Marty Kraimer
|
||||
* Date: 02-16-95
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log: errPrintfUNIX.c
|
||||
* -----------------
|
||||
* .01 02-16-95 mrk Extracted from errSymLib.c
|
||||
***************************************************************************
|
||||
* This must ultimately be replaced by a facility that allows remote
|
||||
* nodes access to the error messages. A message handling communication
|
||||
* task should be written that allows multiple remote nodes to request
|
||||
* notification of all error messages.
|
||||
* For now lets just print messages and last errno via logMsg or printf
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <dbDefs.h>
|
||||
#include <errMdef.h>
|
||||
#include <epicsPrint.h>
|
||||
#include "errSymTbl.h"
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* ERRMESSAGE - now a macro to call errPrintf
|
||||
* ERRPRINTF - print an error symbol message
|
||||
***************************************************************/
|
||||
void errPrintf(long status, const char *pFileName,
|
||||
int lineno, const char *pformat, ...)
|
||||
{
|
||||
va_list pvar;
|
||||
|
||||
va_start(pvar, pformat);
|
||||
if(pFileName && errVerbose){
|
||||
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
}
|
||||
if(status==0) status = errno;
|
||||
if(status>0) {
|
||||
int rtnval;
|
||||
unsigned short modnum,errnum;
|
||||
char name[256];
|
||||
|
||||
rtnval = errSymFind(status,name);
|
||||
modnum = status >> 16;
|
||||
errnum = status & 0xffff;
|
||||
if(rtnval) {
|
||||
printf( "Error status (module %hu, number %hu) not in symbol table",
|
||||
modnum, errnum);
|
||||
} else {
|
||||
printf("%s ",name);
|
||||
}
|
||||
}
|
||||
vprintf(pformat,pvar);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
270
src/libCom/errPrintfVX.c
Normal file
270
src/libCom/errPrintfVX.c
Normal file
@@ -0,0 +1,270 @@
|
||||
/* $Id$
|
||||
* errPrintfVX.c
|
||||
* Author: Marty Kraimer and Jeff Hill
|
||||
* Date: 6-1-90
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
* Modification Log: errPrintfVX.c
|
||||
* -----------------
|
||||
* .01 02-16-95 mrk Extracted from errSymLib.c
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <vxWorks.h>
|
||||
#include <vxLib.h>
|
||||
#include <taskLib.h>
|
||||
#include <errnoLib.h>
|
||||
#include <intLib.h>
|
||||
#include <types.h>
|
||||
#include <symLib.h>
|
||||
#include <semLib.h>
|
||||
#include <error.h>
|
||||
#include <logLib.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <ellLib.h>
|
||||
#include <dbDefs.h>
|
||||
#include <task_params.h>
|
||||
#include <errMdef.h>
|
||||
#include <epicsPrint.h>
|
||||
#ifndef LOCAL
|
||||
#define LOCAL static
|
||||
#endif /* LOCAL */
|
||||
|
||||
static int mprintf (const char *pFormat, ...);
|
||||
static int vmprintf (const char *pFormat, va_list pvar);
|
||||
|
||||
extern FILE *iocLogFile;
|
||||
|
||||
LOCAL SEM_ID clientWaitForTask;
|
||||
LOCAL SEM_ID clientWaitForCompletion;
|
||||
LOCAL SEM_ID serverWaitForWork;
|
||||
|
||||
LOCAL void epicsPrintTask(void);
|
||||
LOCAL void errPrintfPVT(void);
|
||||
|
||||
typedef enum{cmdErrPrintf,cmdEpicsPrint} cmdType;
|
||||
|
||||
LOCAL struct {
|
||||
cmdType cmd;
|
||||
int taskid;
|
||||
long status;
|
||||
const char *pFileName;
|
||||
int lineno;
|
||||
const char *pformat;
|
||||
va_list pvar;
|
||||
int oldtaskid;
|
||||
int printfStatus;
|
||||
}pvtData;
|
||||
|
||||
LOCAL int errInitFlag=0;
|
||||
|
||||
void errInit(void)
|
||||
{
|
||||
if(!vxTas(&errInitFlag)) return;
|
||||
pvtData.oldtaskid = 0;
|
||||
if((clientWaitForTask=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
|
||||
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
|
||||
if((clientWaitForCompletion=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
|
||||
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
|
||||
if((serverWaitForWork=semBCreate(SEM_Q_FIFO,SEM_EMPTY))==NULL)
|
||||
logMsg("semBcreate failed in errInit",0,0,0,0,0,0);
|
||||
taskSpawn(EPICSPRINT_NAME,EPICSPRINT_PRI,EPICSPRINT_OPT,
|
||||
EPICSPRINT_STACK,(FUNCPTR)epicsPrintTask,
|
||||
0,0,0,0,0,0,0,0,0,0);
|
||||
if ((errSymBld()) != 0) {
|
||||
logMsg("errSymBld failed to initialize\n",0,0,0,0,0,0);
|
||||
}
|
||||
}
|
||||
|
||||
LOCAL void epicsPrintTask(void)
|
||||
{
|
||||
semGive(clientWaitForTask);
|
||||
while(TRUE) {
|
||||
if(semTake(serverWaitForWork,WAIT_FOREVER)!=OK)
|
||||
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
|
||||
switch(pvtData.cmd) {
|
||||
case (cmdErrPrintf) :
|
||||
errPrintfPVT();
|
||||
break;
|
||||
case (cmdEpicsPrint) :
|
||||
pvtData.printfStatus = vmprintf(pvtData.pformat,pvtData.pvar);
|
||||
break;
|
||||
}
|
||||
semGive(clientWaitForCompletion);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void errPrintf(long status, const char *pFileName,
|
||||
int lineno, const char *pformat, ...)
|
||||
{
|
||||
va_list pvar;
|
||||
|
||||
if(INT_CONTEXT()) {
|
||||
int logMsgArgs[6];
|
||||
int i;
|
||||
|
||||
va_start (pvar, pformat);
|
||||
for (i=0; i<NELEMENTS(logMsgArgs); i++) {
|
||||
logMsgArgs[i] = va_arg(pvar, int);
|
||||
}
|
||||
logMsg ((char *)pformat,logMsgArgs[0],logMsgArgs[1],
|
||||
logMsgArgs[2],logMsgArgs[3],logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
va_end (pvar);
|
||||
return;
|
||||
}
|
||||
errInit();
|
||||
va_start (pvar, pformat);
|
||||
if(semTake(clientWaitForTask,WAIT_FOREVER)!=OK) {
|
||||
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
pvtData.cmd = cmdErrPrintf;
|
||||
pvtData.taskid = taskIdSelf();
|
||||
pvtData.status = status;
|
||||
pvtData.pFileName = pFileName;
|
||||
pvtData.lineno = lineno;
|
||||
pvtData.pformat = pformat;
|
||||
pvtData.pvar = pvar;
|
||||
semGive(serverWaitForWork);
|
||||
if(semTake(clientWaitForCompletion,WAIT_FOREVER)!=OK) {
|
||||
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
semGive(clientWaitForTask);
|
||||
}
|
||||
|
||||
LOCAL void errPrintfPVT(void)
|
||||
{
|
||||
long status = pvtData.status;
|
||||
const char *pFileName = pvtData.pFileName;
|
||||
int lineno = pvtData.lineno;
|
||||
const char *pformat = pvtData.pformat;
|
||||
va_list pvar = pvtData.pvar;
|
||||
|
||||
|
||||
if(pvtData.taskid != pvtData.oldtaskid) {
|
||||
mprintf("task: 0X%x %s\n",pvtData.taskid,taskName(pvtData.taskid));
|
||||
pvtData.oldtaskid = pvtData.taskid;
|
||||
}
|
||||
if(pFileName && errVerbose){
|
||||
mprintf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
}
|
||||
if(status==0) status = MYERRNO;
|
||||
if(status>0) {
|
||||
int rtnval;
|
||||
unsigned short modnum,errnum;
|
||||
char name[256];
|
||||
|
||||
rtnval = errSymFind(status,name);
|
||||
modnum = status >> 16;
|
||||
errnum = status & 0xffff;
|
||||
if(rtnval) {
|
||||
mprintf("Error status (module %hu, number %hu) not in symbol table\n",
|
||||
modnum, errnum);
|
||||
} else {
|
||||
mprintf("%s ",name);
|
||||
}
|
||||
}
|
||||
vmprintf(pformat,pvar);
|
||||
mprintf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
int epicsPrintf(const char *pformat, ...)
|
||||
{
|
||||
va_list pvar;
|
||||
|
||||
va_start(pvar, pformat);
|
||||
return epicsVprintf(pformat,pvar);
|
||||
}
|
||||
|
||||
int epicsVprintf(const char *pformat, va_list pvar)
|
||||
{
|
||||
int status;
|
||||
|
||||
if(INT_CONTEXT()) {
|
||||
int logMsgArgs[6];
|
||||
int i;
|
||||
|
||||
for (i=0; i<NELEMENTS(logMsgArgs); i++) {
|
||||
logMsgArgs[i] = va_arg(pvar, int);
|
||||
}
|
||||
status = logMsg ((char *)pformat,logMsgArgs[0],logMsgArgs[1],
|
||||
logMsgArgs[2],logMsgArgs[3],logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
va_end (pvar);
|
||||
return status;
|
||||
}
|
||||
errInit();
|
||||
if(semTake(clientWaitForTask,WAIT_FOREVER)!=OK) {
|
||||
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
pvtData.cmd = cmdEpicsPrint;
|
||||
pvtData.pformat = pformat;
|
||||
pvtData.pvar = pvar;
|
||||
semGive(serverWaitForWork);
|
||||
if(semTake(clientWaitForCompletion,WAIT_FOREVER)!=OK) {
|
||||
logMsg("epicsPrint: semTake returned error\n",0,0,0,0,0,0);
|
||||
taskSuspend(taskIdSelf());
|
||||
}
|
||||
status = pvtData.printfStatus;
|
||||
semGive(clientWaitForTask);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
LOCAL int mprintf (const char *pFormat, ...)
|
||||
{
|
||||
va_list pvar;
|
||||
|
||||
va_start (pvar, pFormat);
|
||||
|
||||
return vmprintf (pFormat, pvar);
|
||||
}
|
||||
|
||||
|
||||
LOCAL int vmprintf (const char *pFormat, va_list pvar)
|
||||
{
|
||||
int s0;
|
||||
int s1;
|
||||
|
||||
s0 = vfprintf(stdout,pFormat,pvar);
|
||||
fflush(stdout);
|
||||
s1 = vfprintf(iocLogFile,pFormat,pvar);
|
||||
fflush(iocLogFile);
|
||||
va_end(pvar);
|
||||
if (s1<0) {
|
||||
return s1;
|
||||
}
|
||||
return s0;
|
||||
}
|
||||
|
||||
@@ -61,27 +61,31 @@
|
||||
* .01 09-04-93 rcz Merged errMessage.c, errPrint.c, errSymFind.c
|
||||
* rcz into one file (errSymLib.c) and changed method
|
||||
* rcz of errSymTable lookup.
|
||||
* .02 01-13-95 joh call mprintf() instead of logMsg()
|
||||
* and eliminated errToLogMsg variable
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <ellLib.h>
|
||||
#include <dbDefs.h>
|
||||
#include <errMdef.h>
|
||||
#include "errSymTbl.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
#include <logLib.h>
|
||||
#include <types.h>
|
||||
#include <symLib.h>
|
||||
#include <errnoLib.h>
|
||||
|
||||
|
||||
extern SYMTAB_ID statSymTbl;
|
||||
|
||||
#else
|
||||
#include <string.h>
|
||||
extern int errno;
|
||||
extern int sys_nerr;
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
#endif
|
||||
|
||||
@@ -108,15 +112,10 @@ static int initialized = FALSE;
|
||||
extern ERRSYMTAB_ID errSymTbl;
|
||||
|
||||
|
||||
#ifdef vxWorks
|
||||
int errToLogMsg = TRUE;
|
||||
#endif
|
||||
|
||||
/*Declare storage for errVerbose( defined in errMdef.h)*/
|
||||
int errVerbose=0;
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* ERRSYMBLD
|
||||
@@ -192,215 +191,6 @@ unsigned short errnum;
|
||||
return((unsigned short)(((modnum - 500) * 20) + errnum) % NHASH);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRMESSAGE - now a macro to call errPrintf
|
||||
* ERRPRINTF - print an error symbol message
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
void errPrintf(long status, char *pFileName, int lineno, char *pformat, ...)
|
||||
#else
|
||||
void errPrintf(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list pvar;
|
||||
static char *pReformat;
|
||||
static int reformatSize;
|
||||
static char pAdd[] = {'\n', '\0'};
|
||||
#ifndef __STDC__
|
||||
long status;
|
||||
char *pformat;
|
||||
char *pFileName;
|
||||
int lineno;
|
||||
#endif
|
||||
#ifdef vxWorks
|
||||
int id;
|
||||
static int saveid = -1;
|
||||
char *pname;
|
||||
#endif
|
||||
|
||||
#ifdef __STDC__
|
||||
va_start(pvar, pformat);
|
||||
#else
|
||||
va_start(pvar);
|
||||
status = va_arg(pvar, long);
|
||||
pFileName = va_arg(pvar, char *);
|
||||
lineno = va_arg(pvar, int);
|
||||
pformat = va_arg(pvar, char *);
|
||||
#endif
|
||||
|
||||
#ifdef vxWorks
|
||||
if(!errToLogMsg) {
|
||||
id = taskIdSelf();
|
||||
if (saveid != id) {
|
||||
saveid = id;
|
||||
pname = taskName(id);
|
||||
printf("taskid=%x taskname=%s ", id, pname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if(pFileName && errVerbose){
|
||||
#ifdef vxWorks
|
||||
if(errToLogMsg) {
|
||||
logMsg("filename=\"%s\" line number=%d\n", pFileName, lineno,
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
else{
|
||||
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
}
|
||||
#else
|
||||
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (pformat != NULL) {
|
||||
int size;
|
||||
|
||||
size = strlen(pformat)+NELEMENTS(pAdd);
|
||||
|
||||
if(reformatSize < size){
|
||||
/*
|
||||
* use a reasonable size string
|
||||
*/
|
||||
size = max(0xff, size);
|
||||
if(pReformat){
|
||||
free(pReformat);
|
||||
}
|
||||
|
||||
pReformat = (char *) malloc(size);
|
||||
if(pReformat){
|
||||
reformatSize = size;
|
||||
}
|
||||
else{
|
||||
#ifdef vxWorks
|
||||
logMsg("%s: calloc error\n", __FILE__,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
#else
|
||||
printf("%s: calloc error\n", __FILE__);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
}
|
||||
strcpy(pReformat, pformat);
|
||||
strcat(pReformat, pAdd);
|
||||
|
||||
}
|
||||
|
||||
verrPrintStatus(status, pReformat, pvar);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRPRINTSTATUS
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
int errPrintStatus(long status, char *pFormat, ...)
|
||||
#else
|
||||
int errPrintStatus(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list pvar;
|
||||
#ifndef __STDC__
|
||||
long status;
|
||||
char *pFormat;
|
||||
#endif
|
||||
|
||||
#ifdef __STDC__
|
||||
va_start(pvar, pFormat);
|
||||
#else
|
||||
va_start(pvar);
|
||||
status = va_arg(pvar, long);
|
||||
pFormat = va_arg(pvar, char *);
|
||||
#endif
|
||||
|
||||
return verrPrintStatus(status, pFormat, pvar);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* VERRPRINTSTATUS
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
int verrPrintStatus(long status, char *pFormatString, va_list pvar)
|
||||
#else
|
||||
int verrPrintStatus(status, pFormatString, pvar)
|
||||
long status;
|
||||
char *pFormatString;
|
||||
va_list pvar;
|
||||
#endif
|
||||
{
|
||||
static char ctxToLarge[] = "** Context String Overflow **";
|
||||
char name[256];
|
||||
int rtnval;
|
||||
int namelen;
|
||||
int formatlen;
|
||||
unsigned short modnum;
|
||||
unsigned short errnum;
|
||||
|
||||
|
||||
name[0] = '\0';
|
||||
if(status==0) status = MYERRNO;
|
||||
if(status >= -1){
|
||||
rtnval = 0;
|
||||
}
|
||||
else {
|
||||
rtnval = status;
|
||||
}
|
||||
if(status>0) {
|
||||
rtnval = errSymFind(status,name);
|
||||
modnum = status >> 16;
|
||||
errnum = status & 0xffff;
|
||||
if(rtnval) {
|
||||
sprintf(name,
|
||||
"Error status (module %hu, number %hu) not in symbol table",
|
||||
modnum, errnum);
|
||||
}
|
||||
}
|
||||
if(pFormatString){
|
||||
namelen = strlen(name);
|
||||
formatlen = strlen(pFormatString);
|
||||
strcat(name," ");
|
||||
if(sizeof(name)-namelen-1 > formatlen){
|
||||
strcat(name, pFormatString);
|
||||
}
|
||||
else if(sizeof(name)-namelen-1 > sizeof(ctxToLarge)){
|
||||
strcat(name, ctxToLarge);
|
||||
}
|
||||
else{
|
||||
fprintf(stderr,ctxToLarge);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef vxWorks
|
||||
if(errToLogMsg){
|
||||
int i;
|
||||
int logMsgArgs[6];
|
||||
|
||||
for(i=0; i< NELEMENTS(logMsgArgs); i++){
|
||||
logMsgArgs[i] = va_arg(pvar, int);
|
||||
}
|
||||
|
||||
logMsg(
|
||||
name,
|
||||
logMsgArgs[0],
|
||||
logMsgArgs[1],
|
||||
logMsgArgs[2],
|
||||
logMsgArgs[3],
|
||||
logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
}
|
||||
else{
|
||||
vprintf(name, pvar);
|
||||
}
|
||||
#else
|
||||
vprintf(name, pvar);
|
||||
#endif
|
||||
|
||||
return rtnval;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRSYMBOLADD
|
||||
* adds symbols to the master errnumlist as compiled from errSymTbl.c
|
||||
@@ -438,11 +228,11 @@ int UnixSymFind(status, pname, pvalue)
|
||||
{
|
||||
if (status >= sys_nerr || status < 1) {
|
||||
*pvalue = -1;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
strcpy(pname, sys_errlist[status]);
|
||||
*pvalue = status;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -466,7 +256,7 @@ int ModSymFind(status, pname, pvalue)
|
||||
modNum = (status >> 16);
|
||||
if (modNum < 501) {
|
||||
*pvalue = -1;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
hashInd = errhash(status);
|
||||
phashnode = (ERRNUMNODE**)&hashtable[hashInd];
|
||||
@@ -475,14 +265,14 @@ int ModSymFind(status, pname, pvalue)
|
||||
if (pNextNode->errNum == status) {
|
||||
strcpy(pname, pNextNode->message);
|
||||
*pvalue = status;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
phashnode = &pNextNode->hashnode;
|
||||
pNextNode = *phashnode;
|
||||
}
|
||||
*pname = 0;
|
||||
*pvalue = -1;
|
||||
return ;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
@@ -623,3 +413,5 @@ unsigned short endErrNum;
|
||||
errSymTestPrint(errNum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -61,27 +61,31 @@
|
||||
* .01 09-04-93 rcz Merged errMessage.c, errPrint.c, errSymFind.c
|
||||
* rcz into one file (errSymLib.c) and changed method
|
||||
* rcz of errSymTable lookup.
|
||||
* .02 01-13-95 joh call mprintf() instead of logMsg()
|
||||
* and eliminated errToLogMsg variable
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <ellLib.h>
|
||||
#include <dbDefs.h>
|
||||
#include <errMdef.h>
|
||||
#include "errSymTbl.h"
|
||||
#include <stdio.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#include <taskLib.h>
|
||||
#include <logLib.h>
|
||||
#include <types.h>
|
||||
#include <symLib.h>
|
||||
#include <errnoLib.h>
|
||||
|
||||
|
||||
extern SYMTAB_ID statSymTbl;
|
||||
|
||||
#else
|
||||
#include <string.h>
|
||||
extern int errno;
|
||||
extern int sys_nerr;
|
||||
extern int sys_nerr;
|
||||
extern char *sys_errlist[];
|
||||
#endif
|
||||
|
||||
@@ -108,15 +112,10 @@ static int initialized = FALSE;
|
||||
extern ERRSYMTAB_ID errSymTbl;
|
||||
|
||||
|
||||
#ifdef vxWorks
|
||||
int errToLogMsg = TRUE;
|
||||
#endif
|
||||
|
||||
/*Declare storage for errVerbose( defined in errMdef.h)*/
|
||||
int errVerbose=0;
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************************************************
|
||||
* ERRSYMBLD
|
||||
@@ -192,215 +191,6 @@ unsigned short errnum;
|
||||
return((unsigned short)(((modnum - 500) * 20) + errnum) % NHASH);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRMESSAGE - now a macro to call errPrintf
|
||||
* ERRPRINTF - print an error symbol message
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
void errPrintf(long status, char *pFileName, int lineno, char *pformat, ...)
|
||||
#else
|
||||
void errPrintf(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list pvar;
|
||||
static char *pReformat;
|
||||
static int reformatSize;
|
||||
static char pAdd[] = {'\n', '\0'};
|
||||
#ifndef __STDC__
|
||||
long status;
|
||||
char *pformat;
|
||||
char *pFileName;
|
||||
int lineno;
|
||||
#endif
|
||||
#ifdef vxWorks
|
||||
int id;
|
||||
static int saveid = -1;
|
||||
char *pname;
|
||||
#endif
|
||||
|
||||
#ifdef __STDC__
|
||||
va_start(pvar, pformat);
|
||||
#else
|
||||
va_start(pvar);
|
||||
status = va_arg(pvar, long);
|
||||
pFileName = va_arg(pvar, char *);
|
||||
lineno = va_arg(pvar, int);
|
||||
pformat = va_arg(pvar, char *);
|
||||
#endif
|
||||
|
||||
#ifdef vxWorks
|
||||
if(!errToLogMsg) {
|
||||
id = taskIdSelf();
|
||||
if (saveid != id) {
|
||||
saveid = id;
|
||||
pname = taskName(id);
|
||||
printf("taskid=%x taskname=%s ", id, pname);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if(pFileName && errVerbose){
|
||||
#ifdef vxWorks
|
||||
if(errToLogMsg) {
|
||||
logMsg("filename=\"%s\" line number=%d\n", pFileName, lineno,
|
||||
NULL, NULL, NULL, NULL);
|
||||
}
|
||||
else{
|
||||
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
}
|
||||
#else
|
||||
printf("filename=\"%s\" line number=%d\n", pFileName, lineno);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (pformat != NULL) {
|
||||
int size;
|
||||
|
||||
size = strlen(pformat)+NELEMENTS(pAdd);
|
||||
|
||||
if(reformatSize < size){
|
||||
/*
|
||||
* use a reasonable size string
|
||||
*/
|
||||
size = max(0xff, size);
|
||||
if(pReformat){
|
||||
free(pReformat);
|
||||
}
|
||||
|
||||
pReformat = (char *) malloc(size);
|
||||
if(pReformat){
|
||||
reformatSize = size;
|
||||
}
|
||||
else{
|
||||
#ifdef vxWorks
|
||||
logMsg("%s: calloc error\n", __FILE__,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
#else
|
||||
printf("%s: calloc error\n", __FILE__);
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
}
|
||||
strcpy(pReformat, pformat);
|
||||
strcat(pReformat, pAdd);
|
||||
|
||||
}
|
||||
|
||||
verrPrintStatus(status, pReformat, pvar);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRPRINTSTATUS
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
int errPrintStatus(long status, char *pFormat, ...)
|
||||
#else
|
||||
int errPrintStatus(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list pvar;
|
||||
#ifndef __STDC__
|
||||
long status;
|
||||
char *pFormat;
|
||||
#endif
|
||||
|
||||
#ifdef __STDC__
|
||||
va_start(pvar, pFormat);
|
||||
#else
|
||||
va_start(pvar);
|
||||
status = va_arg(pvar, long);
|
||||
pFormat = va_arg(pvar, char *);
|
||||
#endif
|
||||
|
||||
return verrPrintStatus(status, pFormat, pvar);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* VERRPRINTSTATUS
|
||||
***************************************************************/
|
||||
#ifdef __STDC__
|
||||
int verrPrintStatus(long status, char *pFormatString, va_list pvar)
|
||||
#else
|
||||
int verrPrintStatus(status, pFormatString, pvar)
|
||||
long status;
|
||||
char *pFormatString;
|
||||
va_list pvar;
|
||||
#endif
|
||||
{
|
||||
static char ctxToLarge[] = "** Context String Overflow **";
|
||||
char name[256];
|
||||
int rtnval;
|
||||
int namelen;
|
||||
int formatlen;
|
||||
unsigned short modnum;
|
||||
unsigned short errnum;
|
||||
|
||||
|
||||
name[0] = '\0';
|
||||
if(status==0) status = MYERRNO;
|
||||
if(status >= -1){
|
||||
rtnval = 0;
|
||||
}
|
||||
else {
|
||||
rtnval = status;
|
||||
}
|
||||
if(status>0) {
|
||||
rtnval = errSymFind(status,name);
|
||||
modnum = status >> 16;
|
||||
errnum = status & 0xffff;
|
||||
if(rtnval) {
|
||||
sprintf(name,
|
||||
"Error status (module %hu, number %hu) not in symbol table",
|
||||
modnum, errnum);
|
||||
}
|
||||
}
|
||||
if(pFormatString){
|
||||
namelen = strlen(name);
|
||||
formatlen = strlen(pFormatString);
|
||||
strcat(name," ");
|
||||
if(sizeof(name)-namelen-1 > formatlen){
|
||||
strcat(name, pFormatString);
|
||||
}
|
||||
else if(sizeof(name)-namelen-1 > sizeof(ctxToLarge)){
|
||||
strcat(name, ctxToLarge);
|
||||
}
|
||||
else{
|
||||
fprintf(stderr,ctxToLarge);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef vxWorks
|
||||
if(errToLogMsg){
|
||||
int i;
|
||||
int logMsgArgs[6];
|
||||
|
||||
for(i=0; i< NELEMENTS(logMsgArgs); i++){
|
||||
logMsgArgs[i] = va_arg(pvar, int);
|
||||
}
|
||||
|
||||
logMsg(
|
||||
name,
|
||||
logMsgArgs[0],
|
||||
logMsgArgs[1],
|
||||
logMsgArgs[2],
|
||||
logMsgArgs[3],
|
||||
logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
}
|
||||
else{
|
||||
vprintf(name, pvar);
|
||||
}
|
||||
#else
|
||||
vprintf(name, pvar);
|
||||
#endif
|
||||
|
||||
return rtnval;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* ERRSYMBOLADD
|
||||
* adds symbols to the master errnumlist as compiled from errSymTbl.c
|
||||
@@ -438,11 +228,11 @@ int UnixSymFind(status, pname, pvalue)
|
||||
{
|
||||
if (status >= sys_nerr || status < 1) {
|
||||
*pvalue = -1;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
strcpy(pname, sys_errlist[status]);
|
||||
*pvalue = status;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -466,7 +256,7 @@ int ModSymFind(status, pname, pvalue)
|
||||
modNum = (status >> 16);
|
||||
if (modNum < 501) {
|
||||
*pvalue = -1;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
hashInd = errhash(status);
|
||||
phashnode = (ERRNUMNODE**)&hashtable[hashInd];
|
||||
@@ -475,14 +265,14 @@ int ModSymFind(status, pname, pvalue)
|
||||
if (pNextNode->errNum == status) {
|
||||
strcpy(pname, pNextNode->message);
|
||||
*pvalue = status;
|
||||
return;
|
||||
return(0);
|
||||
}
|
||||
phashnode = &pNextNode->hashnode;
|
||||
pNextNode = *phashnode;
|
||||
}
|
||||
*pname = 0;
|
||||
*pvalue = -1;
|
||||
return ;
|
||||
return(0);
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
@@ -623,3 +413,5 @@ unsigned short endErrNum;
|
||||
errSymTestPrint(errNum);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -62,6 +62,10 @@
|
||||
* if we are in fdmgr_pend_event()
|
||||
* .15 joh 011993 Created fdmgr header file
|
||||
* .16 joh 011993 Converted to ANSI C
|
||||
* .17 joh 030895 More ANSI C changes and fixed lost send callback
|
||||
* problem (send call back discarded when fdmgr pend
|
||||
* event time out expires even if the send call back
|
||||
* has not been called at least once).
|
||||
*
|
||||
* NOTES:
|
||||
*
|
||||
@@ -95,9 +99,10 @@ static char *pSccsId = "@(#) $Id$";
|
||||
* ANSI
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
@@ -108,6 +113,7 @@ static char *pSccsId = "@(#) $Id$";
|
||||
#include <selectLib.h>
|
||||
#endif
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <fdmgr.h>
|
||||
|
||||
#ifndef TRUE
|
||||
@@ -182,9 +188,7 @@ fdctx *pfdctx,
|
||||
struct timeval *pt
|
||||
);
|
||||
|
||||
LOCAL void select_alarm(
|
||||
fdctx *pfdctx
|
||||
);
|
||||
LOCAL void select_alarm(void *pParam);
|
||||
|
||||
LOCAL int fdmgr_select(
|
||||
fdctx *pfdctx,
|
||||
@@ -269,7 +273,7 @@ int fdmgr_delete(fdctx *pfdctx)
|
||||
fdmgrAlarm *fdmgr_add_timeout(
|
||||
fdctx *pfdctx,
|
||||
struct timeval *ptimeout,
|
||||
void (*func)(),
|
||||
void (*func)(void *),
|
||||
void *param
|
||||
)
|
||||
{
|
||||
@@ -330,10 +334,10 @@ void *param
|
||||
}
|
||||
}
|
||||
if(pa){
|
||||
ellInsert(&pfdctx->alarm_list, pa->node.previous, (ELLNODE*)palarm);
|
||||
ellInsert(&pfdctx->alarm_list, pa->node.previous, &palarm->node);
|
||||
}
|
||||
else{
|
||||
ellAdd(&pfdctx->alarm_list,(ELLNODE*) palarm);
|
||||
ellAdd(&pfdctx->alarm_list, &palarm->node);
|
||||
}
|
||||
palarm->alt = alt_alarm;
|
||||
UNLOCK(pfdctx);
|
||||
@@ -360,8 +364,8 @@ fdmgrAlarm *palarm
|
||||
LOCK(pfdctx);
|
||||
alt = palarm->alt;
|
||||
if(alt == alt_alarm){
|
||||
ellDelete(&pfdctx->alarm_list, (ELLNODE*)palarm);
|
||||
ellAdd(&pfdctx->free_alarm_list, (ELLNODE*)palarm);
|
||||
ellDelete(&pfdctx->alarm_list, &palarm->node);
|
||||
ellAdd(&pfdctx->free_alarm_list, &palarm->node);
|
||||
palarm->alt = alt_free;
|
||||
status = OK;
|
||||
}
|
||||
@@ -423,7 +427,7 @@ fdmgrAlarm *palarm
|
||||
int fdmgr_add_fd(
|
||||
fdctx *pfdctx,
|
||||
int fd,
|
||||
void (*pfunc)(),
|
||||
void (*pfunc)(void *),
|
||||
void *param
|
||||
)
|
||||
{
|
||||
@@ -449,7 +453,7 @@ int fdmgr_add_callback(
|
||||
fdctx *pfdctx,
|
||||
int fd,
|
||||
enum fdi_type fdi,
|
||||
void (*pfunc)(),
|
||||
void (*pfunc)(void *),
|
||||
void *param
|
||||
)
|
||||
{
|
||||
@@ -495,7 +499,7 @@ void *param
|
||||
pfdentry->delete_pending = FALSE;
|
||||
|
||||
LOCK(pfdctx);
|
||||
ellAdd(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
|
||||
ellAdd(&pfdctx->fdentry_list, &pfdentry->node);
|
||||
UNLOCK(pfdctx);
|
||||
|
||||
return OK;
|
||||
@@ -542,7 +546,7 @@ enum fdi_type fdi
|
||||
pfdentry = (fdentry *) pfdentry->node.next){
|
||||
|
||||
if(pfdentry->fd == fd && pfdentry->fdi == fdi){
|
||||
ellDelete(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
|
||||
ellDelete(&pfdctx->fdentry_list, &pfdentry->node);
|
||||
fdmgr_finish_off_fdentry(pfdctx, pfdentry);
|
||||
status = OK;
|
||||
break;
|
||||
@@ -603,7 +607,7 @@ register fdentry *pfdentry
|
||||
)
|
||||
{
|
||||
FD_CLR(pfdentry->fd, pfdentry->pfds);
|
||||
ellAdd(&pfdctx->fdentry_free_list, (ELLNODE*)pfdentry);
|
||||
ellAdd(&pfdctx->fdentry_free_list, &pfdentry->node);
|
||||
}
|
||||
|
||||
|
||||
@@ -618,9 +622,8 @@ struct timeval *ptimeout
|
||||
)
|
||||
{
|
||||
int status;
|
||||
extern errno;
|
||||
struct timeval t;
|
||||
fdmgrAlarm *palarm;
|
||||
fdmgrAlarm *palarm;
|
||||
|
||||
|
||||
lockFDMGRPendEvent(pfdctx);
|
||||
@@ -707,12 +710,21 @@ struct timeval *ptimeout
|
||||
# ifdef vxWorks
|
||||
taskSafe();
|
||||
# endif
|
||||
# if defined (__hpux)
|
||||
status = select(
|
||||
pfdctx->maxfd,
|
||||
(int *)&pfdctx->readch,
|
||||
(int *)&pfdctx->writech,
|
||||
(int *)&pfdctx->excpch,
|
||||
ptimeout);
|
||||
# else
|
||||
status = select(
|
||||
pfdctx->maxfd,
|
||||
&pfdctx->readch,
|
||||
&pfdctx->writech,
|
||||
&pfdctx->excpch,
|
||||
ptimeout);
|
||||
# endif
|
||||
# ifdef vxWorks
|
||||
taskUnsafe();
|
||||
# endif
|
||||
@@ -730,8 +742,8 @@ struct timeval *ptimeout
|
||||
ptimeout->tv_usec);
|
||||
else
|
||||
fdmgrPrintf(
|
||||
"fdmgr: error from select %d\n",
|
||||
errno);
|
||||
"fdmgr: error from select %s\n",
|
||||
strerror(errno));
|
||||
|
||||
return labor_performed;
|
||||
}
|
||||
@@ -742,14 +754,14 @@ struct timeval *ptimeout
|
||||
LOCK(pfdctx)
|
||||
pfdentry = (fdentry *) pfdentry->node.next;
|
||||
if(pfdentry){
|
||||
ellDelete(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
|
||||
ellDelete(&pfdctx->fdentry_list, &pfdentry->node);
|
||||
/*
|
||||
*
|
||||
* holding place where it can be marked
|
||||
* pending delete but not deleted
|
||||
*
|
||||
*/
|
||||
ellAdd(&pfdctx->fdentry_in_use_list, (ELLNODE*)pfdentry);
|
||||
ellAdd(&pfdctx->fdentry_in_use_list, &pfdentry->node);
|
||||
}
|
||||
UNLOCK(pfdctx)
|
||||
|
||||
@@ -774,26 +786,29 @@ struct timeval *ptimeout
|
||||
*/
|
||||
if(!pfdentry->delete_pending){
|
||||
(*pfdentry->pfunc)(pfdentry->param);
|
||||
/*
|
||||
* writes are one shots
|
||||
*/
|
||||
if (pfdentry->fdi==fdi_write) {
|
||||
pfdentry->delete_pending = TRUE;
|
||||
}
|
||||
labor_performed = TRUE;
|
||||
}
|
||||
UNLOCK_FD_HANDLER(pfdctx);
|
||||
}
|
||||
|
||||
LOCK(pfdctx)
|
||||
ellDelete(&pfdctx->fdentry_in_use_list, (ELLNODE*)pfdentry);
|
||||
ellDelete(&pfdctx->fdentry_in_use_list, &pfdentry->node);
|
||||
|
||||
/*
|
||||
* if it is marked pending delete
|
||||
* reset it and place it on the free list
|
||||
*
|
||||
* write fd interest is treated as a one shot
|
||||
* so remove them after each action
|
||||
*/
|
||||
if(pfdentry->delete_pending || pfdentry->fdi==fdi_write){
|
||||
if(pfdentry->delete_pending){
|
||||
fdmgr_finish_off_fdentry(pfdctx, pfdentry);
|
||||
}
|
||||
else{
|
||||
ellAdd(&pfdctx->fdentry_list, (ELLNODE*)pfdentry);
|
||||
ellAdd(&pfdctx->fdentry_list, &pfdentry->node);
|
||||
}
|
||||
UNLOCK(pfdctx)
|
||||
|
||||
@@ -818,8 +833,8 @@ struct timeval *poffset
|
||||
{
|
||||
struct timeval t;
|
||||
int status;
|
||||
fdmgrAlarm *pa;
|
||||
fdmgrAlarm *nextpa;
|
||||
fdmgrAlarm *pa;
|
||||
fdmgrAlarm *nextpa;
|
||||
|
||||
status = fdmgr_gettimeval(pfdctx, &t);
|
||||
assert (status >= 0);
|
||||
@@ -832,9 +847,9 @@ struct timeval *poffset
|
||||
if(pa->t.tv_usec > t.tv_usec)
|
||||
break;
|
||||
|
||||
nextpa = (fdmgrAlarm*)pa->node.next;
|
||||
ellDelete(&pfdctx->alarm_list, (ELLNODE*)pa);
|
||||
ellAdd(&pfdctx->expired_alarm_list, (ELLNODE*)pa);
|
||||
nextpa = (fdmgrAlarm*) pa->node.next;
|
||||
ellDelete(&pfdctx->alarm_list, &pa->node);
|
||||
ellAdd(&pfdctx->expired_alarm_list, &pa->node);
|
||||
pa->alt = alt_expired;
|
||||
}
|
||||
UNLOCK(pfdctx);
|
||||
@@ -914,10 +929,10 @@ struct timeval *poffset
|
||||
* select_alarm()
|
||||
*
|
||||
*/
|
||||
LOCAL void select_alarm(
|
||||
fdctx *pfdctx
|
||||
)
|
||||
LOCAL void select_alarm(void *pParam)
|
||||
{
|
||||
fdctx *pfdctx = pParam;
|
||||
|
||||
pfdctx->select_tmo = TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
* .01 04-19-94 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
* .01 04-19-94 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -124,6 +124,8 @@ int lineNum;
|
||||
#else
|
||||
abort();
|
||||
#endif
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*+/subr**********************************************************************
|
||||
|
||||
@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
* .01 04-07-94 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -51,6 +51,10 @@ DEVELOPMENT CENTER AT ARGONNE NATIONAL LABORATORY (708-252-2000).
|
||||
* .01 04-07-94 mrk Initial Implementation
|
||||
*/
|
||||
|
||||
#ifdef vxWorks
|
||||
#include <vxWorks.h>
|
||||
#endif
|
||||
|
||||
#include <dbDefs.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@@ -30,8 +30,10 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <epicsAssert.h>
|
||||
#include <ellLib.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
|
||||
305
src/libCom/mprintf.c
Normal file
305
src/libCom/mprintf.c
Normal file
@@ -0,0 +1,305 @@
|
||||
/*
|
||||
* mprintf.c
|
||||
* Author: Jeffrey Hill
|
||||
* Date: 1-13-95
|
||||
*
|
||||
* Experimental Physics and Industrial Control System (EPICS)
|
||||
*
|
||||
* Copyright 1991, the Regents of the University of California,
|
||||
* and the University of Chicago Board of Governors.
|
||||
*
|
||||
* This software was produced under U.S. Government contracts:
|
||||
* (W-7405-ENG-36) at the Los Alamos National Laboratory,
|
||||
* and (W-31-109-ENG-38) at Argonne National Laboratory.
|
||||
*
|
||||
* Initial development by:
|
||||
* The Controls and Automation Group (AT-8)
|
||||
* Ground Test Accelerator
|
||||
* Accelerator Technology Division
|
||||
* Los Alamos National Laboratory
|
||||
*
|
||||
* Co-developed with
|
||||
* The Controls and Computing Group
|
||||
* Accelerator Systems Division
|
||||
* Advanced Photon Source
|
||||
* Argonne National Laboratory
|
||||
*
|
||||
*
|
||||
* This source provides a similar service to logMsg() that
|
||||
* solves some of its fundamental problems.
|
||||
*
|
||||
* Known problems with logMsg()
|
||||
* o Does not have variable arguments.
|
||||
* o Prints output at the highest priority in the system.
|
||||
* o Does not queue the format string so problems result
|
||||
* if the calling task reuses the format string.
|
||||
* o Problems result if the format string was allocated
|
||||
* on the stack (a C automatic variable).
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* ANSI includes
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
|
||||
/*
|
||||
* OS dependent includes
|
||||
*/
|
||||
#ifdef vxWorks
|
||||
#include <semLib.h>
|
||||
#include <logLib.h>
|
||||
#include <intLib.h>
|
||||
#include <taskLib.h>
|
||||
#endif
|
||||
|
||||
#ifndef LOCAL
|
||||
#define LOCAL static
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* mprintf header file
|
||||
*/
|
||||
#include <mprintf.h>
|
||||
|
||||
#ifdef vxWorks
|
||||
typedef struct {
|
||||
FILE **pppFileList[3];
|
||||
SEM_ID sem;
|
||||
}osDepen;
|
||||
#else
|
||||
typedef struct {
|
||||
FILE **pppFileList[2];
|
||||
}osDepen;
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct mprintfContext {
|
||||
int (*pPrintfISR) (char *pFormat, va_list pvar);
|
||||
void (*pInit) (struct mprintfContext *pCtx);
|
||||
void (*pPrintThreadName) (struct mprintfContext *pCtx, FILE *pfile);
|
||||
void (*pMutexLock) (struct mprintfContext *pCtx);
|
||||
void (*pMutexUnlock) (struct mprintfContext *pCtx);
|
||||
FILE ***pppFileList;
|
||||
osDepen os;
|
||||
int initComplete;
|
||||
}mpc;
|
||||
|
||||
LOCAL int vmprintfISR (char *pFormat, va_list pvar);
|
||||
LOCAL void mprintfInit (mpc *pCtx);
|
||||
LOCAL void printThreadName (mpc *pCtx, FILE *pfile);
|
||||
LOCAL void mprintfMutexLock (mpc *pCtx);
|
||||
LOCAL void mprintfMutexUnlock (mpc *pCtx);
|
||||
|
||||
#ifdef vxWorks
|
||||
LOCAL FILE *stdoutRef;
|
||||
extern FILE *iocLogFile;
|
||||
LOCAL mpc ctx = {
|
||||
vmprintfISR,
|
||||
mprintfInit,
|
||||
printThreadName,
|
||||
mprintfMutexLock,
|
||||
mprintfMutexUnlock,
|
||||
ctx.os.pppFileList,
|
||||
{&stdoutRef, &iocLogFile, NULL}
|
||||
};
|
||||
#else
|
||||
LOCAL FILE *stdoutRef;
|
||||
LOCAL mpc ctx = {
|
||||
vmprintfISR,
|
||||
mprintfInit,
|
||||
printThreadName,
|
||||
mprintfMutexLock,
|
||||
mprintfMutexUnlock,
|
||||
ctx.os.pppFileList,
|
||||
{&stdoutRef, NULL}
|
||||
};
|
||||
#endif
|
||||
|
||||
LOCAL mpc *pCtx = &ctx;
|
||||
|
||||
|
||||
/*
|
||||
* mprintf ()
|
||||
*/
|
||||
int mprintf (char *pFormat, ...)
|
||||
{
|
||||
va_list pvar;
|
||||
|
||||
va_start (pvar, pFormat);
|
||||
|
||||
return vmprintf (pFormat, pvar);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* vmprintf ()
|
||||
*/
|
||||
int vmprintf (char *pFormat, va_list pvar)
|
||||
{
|
||||
int status;
|
||||
FILE ***pppFile;
|
||||
|
||||
status = (*pCtx->pPrintfISR) (pFormat, pvar);
|
||||
if (status) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pCtx->initComplete) {
|
||||
(*pCtx->pInit) (pCtx);
|
||||
assert (pCtx->initComplete);
|
||||
}
|
||||
|
||||
(*pCtx->pMutexLock) (pCtx);
|
||||
for (pppFile = pCtx->pppFileList; *pppFile; pppFile++){
|
||||
FILE *pFile;
|
||||
|
||||
pFile = **pppFile;
|
||||
|
||||
if (pFile) {
|
||||
(*pCtx->pPrintThreadName) (pCtx, pFile);
|
||||
vfprintf (
|
||||
pFile,
|
||||
pFormat,
|
||||
pvar);
|
||||
fflush (pFile);
|
||||
}
|
||||
}
|
||||
(*pCtx->pMutexUnlock) (pCtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* mprintfInit ()
|
||||
*/
|
||||
#ifdef vxWorks
|
||||
LOCAL void mprintfInit (mpc *pCtx)
|
||||
{
|
||||
pCtx->os.sem = semMCreate (
|
||||
SEM_Q_PRIORITY |
|
||||
SEM_DELETE_SAFE |
|
||||
SEM_INVERSION_SAFE);
|
||||
if (pCtx->os.sem == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
stdoutRef = stdout;
|
||||
|
||||
pCtx->initComplete = TRUE;
|
||||
}
|
||||
#else
|
||||
LOCAL void mprintfInit (mpc *pCtx)
|
||||
{
|
||||
stdoutRef = stdout;
|
||||
|
||||
pCtx->initComplete = TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* mprintfMutexLock ()
|
||||
*/
|
||||
#ifdef vxWorks
|
||||
LOCAL void mprintfMutexLock (mpc *pCtx)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = semTake (pCtx->os.sem, WAIT_FOREVER);
|
||||
assert (status == OK);
|
||||
}
|
||||
#else
|
||||
LOCAL void mprintfMutexLock (mpc *pCtx)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* mprintfMutexUnlock ()
|
||||
*/
|
||||
#ifdef vxWorks
|
||||
LOCAL void mprintfMutexUnlock (mpc *pCtx)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = semGive (pCtx->os.sem);
|
||||
assert (status == OK);
|
||||
}
|
||||
#else
|
||||
LOCAL void mprintfMutexUnlock (mpc *pCtx)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(vxWorks)
|
||||
LOCAL int vmprintfISR (char *pFormat, va_list pvar)
|
||||
{
|
||||
unsigned i;
|
||||
int status;
|
||||
int logMsgArgs[6];
|
||||
|
||||
if (!INT_CONTEXT()) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
va_start (pvar, pFormat);
|
||||
for (i=0; i<NELEMENTS(logMsgArgs); i++) {
|
||||
logMsgArgs[i] = va_arg(pvar, int);
|
||||
}
|
||||
status = logMsg (pFormat,
|
||||
logMsgArgs[0],
|
||||
logMsgArgs[1],
|
||||
logMsgArgs[2],
|
||||
logMsgArgs[3],
|
||||
logMsgArgs[4],
|
||||
logMsgArgs[5]);
|
||||
va_end (pvar);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
#else
|
||||
LOCAL int vmprintfISR (char *pFormat, va_list pvar)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(vxWorks)
|
||||
LOCAL void printThreadName (mpc *pCtx, FILE *pfile)
|
||||
{
|
||||
int id;
|
||||
|
||||
id = taskIdSelf();
|
||||
|
||||
fprintf (
|
||||
pfile,
|
||||
"0X%x %s ",
|
||||
id,
|
||||
taskName(id));
|
||||
|
||||
return;
|
||||
}
|
||||
#else
|
||||
LOCAL void printThreadName (mpc *pCtx, FILE *pfile)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user