Compare commits
270 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cc2e2082b7 | ||
|
|
dd1b4d2791 | ||
|
|
1a1078f961 | ||
|
|
51df33928f | ||
|
|
c0d6282157 | ||
|
|
58879ff350 | ||
|
|
8e499dcfb7 | ||
|
|
82cb39fcd5 | ||
|
|
b868ce79b7 | ||
|
|
a00c041353 | ||
|
|
afb643443f | ||
|
|
0dc56953ff | ||
|
|
8459529f70 | ||
|
|
9fb90cfcab | ||
|
|
fbf90dd641 | ||
|
|
585e2f7d6c | ||
|
|
0da4a9df30 | ||
|
|
936f5a48b6 | ||
|
|
429a135265 | ||
|
|
2a8a75fdc9 | ||
|
|
9231d4c9b9 | ||
|
|
4bb85b7256 | ||
|
|
9977039b55 | ||
|
|
fb6c0cd8fc | ||
|
|
351a45b734 | ||
|
|
c1e2dc29bd | ||
|
|
b10a642321 | ||
|
|
c49757c9b5 | ||
|
|
89c136d426 | ||
|
|
e6587e9755 | ||
|
|
3d27e9aeb1 | ||
|
|
4c2a8386a1 | ||
|
|
d2d71324da | ||
|
|
70a6e931fb | ||
|
|
ac1258fcc7 | ||
|
|
6f931a18f1 | ||
|
|
e0b918ce08 | ||
|
|
12b51ec036 | ||
|
|
6b16dbac9d | ||
|
|
a6d1becc7a | ||
|
|
d2893ab3fb | ||
|
|
791fba7274 | ||
|
|
5bd8fe9148 | ||
|
|
a9abc6ee1c | ||
|
|
945a5e7930 | ||
|
|
4b50e4d060 | ||
|
|
50cc1e967e | ||
|
|
67937c1b74 | ||
|
|
b59586dc83 | ||
|
|
94a77fec91 | ||
|
|
b11b328317 | ||
|
|
7f64d58e26 | ||
|
|
4bcdad7722 | ||
|
|
f23fb5512e | ||
|
|
cc79bd0f7d | ||
|
|
36ffaa3968 | ||
|
|
57420c3e3c | ||
|
|
65c202c80f | ||
|
|
bc9c0eb526 | ||
|
|
565a47935c | ||
|
|
bb05cea3c1 | ||
|
|
8087b29199 | ||
|
|
a2b69080ca | ||
|
|
5924f1e002 | ||
|
|
19eb4e7fd5 | ||
|
|
042f24ee8a | ||
|
|
4b11e5242c | ||
|
|
ffb5098abc | ||
|
|
21ea090431 | ||
|
|
3ffea2456c | ||
|
|
2d41308609 | ||
|
|
fbe397addb | ||
|
|
3c8efba3c4 | ||
|
|
5b1507e15e | ||
|
|
a624ca3bdd | ||
|
|
59a2bedda5 | ||
|
|
541986e5f4 | ||
|
|
b384578105 | ||
|
|
91eaa26047 | ||
|
|
f61e5d1491 | ||
|
|
71c8913e2c | ||
|
|
43f69c266e | ||
|
|
f0b6960189 | ||
|
|
206b24d4c5 | ||
|
|
b53ad8b82f | ||
|
|
3bc5fb63d1 | ||
|
|
3ea334068e | ||
|
|
f58b4e2efd | ||
|
|
611d49a06c | ||
|
|
157003598f | ||
|
|
0b3f346659 | ||
|
|
e53964fbba | ||
|
|
f24825aee9 | ||
|
|
25d76153ff | ||
|
|
adff31997d | ||
|
|
249152d650 | ||
|
|
bae8f2515e | ||
|
|
9e168bfd69 | ||
|
|
b69b906c14 | ||
|
|
6c2540a462 | ||
|
|
333d00abb9 | ||
|
|
118807d776 | ||
|
|
4325c27f3e | ||
|
|
634696132e | ||
|
|
a03b21e635 | ||
|
|
b6e0dbaec7 | ||
|
|
6775981bf6 | ||
|
|
0fde7b6d84 | ||
|
|
45363a24b0 | ||
|
|
e513e30866 | ||
|
|
5f357e94b0 | ||
|
|
1425980268 | ||
|
|
4c0bf5025f | ||
|
|
0437370e49 | ||
|
|
d543774f33 | ||
|
|
552e47ae5f | ||
|
|
6de4d8c7a2 | ||
|
|
10bf550911 | ||
|
|
1c493e9ec0 | ||
|
|
24d2d57d62 | ||
|
|
b6b381cc78 | ||
|
|
5b4c37df17 | ||
|
|
8bd3d4a8a0 | ||
|
|
67fbf44633 | ||
|
|
a2531d6bc9 | ||
|
|
60a797048a | ||
|
|
409aa721b9 | ||
|
|
448343bef8 | ||
|
|
0aa150f544 | ||
|
|
3771989a0c | ||
|
|
4dc47cc3c7 | ||
|
|
ca87b50a5a | ||
|
|
a5cd52dad4 | ||
|
|
fda69beae0 | ||
|
|
cb1e29e235 | ||
|
|
6c0bdcd717 | ||
|
|
138ee471db | ||
|
|
de70a70b1b | ||
|
|
2fd5fb4b22 | ||
|
|
0f3f74dbaf | ||
|
|
3f77bcdc08 | ||
|
|
2d77802856 | ||
|
|
bafee08673 | ||
|
|
78cce4015b | ||
|
|
c140e69d40 | ||
|
|
38599f8391 | ||
|
|
7166456564 | ||
|
|
cde473e4d9 | ||
|
|
f04fa5fdf3 | ||
|
|
60dde019c0 | ||
|
|
aba3613efc | ||
|
|
6691657c42 | ||
|
|
75ca062f1b | ||
|
|
0dbaefd5d9 | ||
|
|
f325c487bc | ||
|
|
364e023331 | ||
|
|
267d7593ba | ||
|
|
3051293fe9 | ||
|
|
d986ed523d | ||
|
|
5e40c17b26 | ||
|
|
ef084aceaf | ||
|
|
657a6c822a | ||
|
|
7108f87c6e | ||
|
|
416ec2c6ae | ||
|
|
455060a705 | ||
|
|
8b15eddf12 | ||
|
|
a084474857 | ||
|
|
8d0d26b56d | ||
|
|
592660778d | ||
|
|
4c4b80dc66 | ||
|
|
283fc8f3eb | ||
|
|
d9a1b65f36 | ||
|
|
c9af50db0c | ||
|
|
d7023b1f87 | ||
|
|
3f560514e2 | ||
|
|
258ebe6bcd | ||
|
|
fff249dd3a | ||
|
|
fdd78eaf81 | ||
|
|
1758f60c79 | ||
|
|
13a780f4c4 | ||
|
|
5902d83d19 | ||
|
|
d8ae672385 | ||
|
|
89aa3edc12 | ||
|
|
03922dd993 | ||
|
|
943d2d2ac1 | ||
|
|
d6c4117b35 | ||
|
|
9d57a77d90 | ||
|
|
95859680f7 | ||
|
|
10fa0e0eb2 | ||
|
|
b369035b9d | ||
|
|
47fc7f5d88 | ||
|
|
0a3edefb39 | ||
|
|
3d5ab5cca5 | ||
|
|
68975ee309 | ||
|
|
03a5551d93 | ||
|
|
81fa76c132 | ||
|
|
66959c07a8 | ||
|
|
df1e65bc8a | ||
|
|
19dd302bd8 | ||
|
|
e0e0694821 | ||
|
|
d2149209ea | ||
|
|
748e7cce1b | ||
|
|
71319ab5d5 | ||
|
|
3cece37c92 | ||
|
|
9dc80154e3 | ||
|
|
ca17594d00 | ||
|
|
bf2447f1cc | ||
|
|
18a3008f51 | ||
|
|
04eb6ebb58 | ||
|
|
876b493e2c | ||
|
|
d9805b979e | ||
|
|
46a8fac619 | ||
|
|
eab7314e36 | ||
|
|
a07722260f | ||
|
|
1c55c85de9 | ||
|
|
c095f483e9 | ||
|
|
a5921d2bea | ||
|
|
c26cd7fdce | ||
|
|
c69536fc8e | ||
|
|
0712df904b | ||
|
|
70091854bc | ||
|
|
ab2a2d7a9c | ||
|
|
2011e6b87a | ||
|
|
fab73db5e8 | ||
|
|
be9a9afc68 | ||
|
|
f751b73665 | ||
|
|
de880dbf39 | ||
|
|
d9f803937a | ||
|
|
1b730ac8fc | ||
|
|
3a2e71e46e | ||
|
|
1cbb1c9b71 | ||
|
|
3c4d947f2a | ||
|
|
44e31ae9f3 | ||
|
|
f9107d0233 | ||
|
|
8633e72026 | ||
|
|
1106ecd818 | ||
|
|
6e6cd59674 | ||
|
|
4cdc2575c5 | ||
|
|
9f52f7282d | ||
|
|
ed882fe82d | ||
|
|
d0e58f9aa7 | ||
|
|
2c13aa03e2 | ||
|
|
3717607892 | ||
|
|
cb72210d45 | ||
|
|
92d01c0e5f | ||
|
|
42506d8c1c | ||
|
|
dfccee739f | ||
|
|
35d07ffbda | ||
|
|
d158974870 | ||
|
|
2e922d7195 | ||
|
|
e405ebbbee | ||
|
|
da15507f8d | ||
|
|
8411adb987 | ||
|
|
c30c884687 | ||
|
|
21fe691d96 | ||
|
|
22e21f268b | ||
|
|
d45e1b13e4 | ||
|
|
8873934c9b | ||
|
|
c0c11c359f | ||
|
|
367e27d5f5 | ||
|
|
35bd1a76d1 | ||
|
|
a887ca44d1 | ||
|
|
dd273da508 | ||
|
|
245cf129ff | ||
|
|
36b1f9e4ff | ||
|
|
24a0197f88 | ||
|
|
e30e1159a2 | ||
|
|
42ea151881 | ||
|
|
ce201c6361 | ||
|
|
0784bbec71 |
67
LICENSE
67
LICENSE
@@ -1,29 +1,19 @@
|
||||
Copyright (c) 1991-2003 University of Chicago and The Regents of the
|
||||
Copyright (c) 1991-2004 University of Chicago and The Regents of the
|
||||
University of California. All rights reserved.
|
||||
|
||||
EPICS BASE is distributed subject to the following license agreement:
|
||||
EPICS BASE is distributed subject to the following license conditions:
|
||||
|
||||
SOFTWARE LICENSE AGREEMENT
|
||||
Software: EPICS BASE
|
||||
Versions: 3.13.7 and higher
|
||||
|
||||
IMPORTANT! READ CAREFULLY: EPICS BASE is NOT distributed as Open Source.
|
||||
This is a legal agreement between you (in your capacity as an individual
|
||||
and as an agent for your company, institution or other entity) and The
|
||||
University of Chicago, as Operator of Argonne National Laboratory under
|
||||
Contract W-31-109-ENG-38 with the U.S. Department of Energy ("Argonne"),
|
||||
and The Regents of the University of California, as Operator of Los Alamos
|
||||
National Laboratory under Contract W-7405-ENG-36 with the U.S. Department
|
||||
of Energy ("Los Alamos").
|
||||
|
||||
1. The "Software", below, refers to EPICS BASE (in either source code, or
|
||||
binary form and accompanying documentation). Each licensee is
|
||||
addressed as "you" or "Licensee."
|
||||
|
||||
2. Argonne and Los Alamos are copyright holders in the Software. The
|
||||
copyright holders and their third-party licensors hereby grant
|
||||
Licensee a royalty-free nonexclusive license, subject to the
|
||||
limitations stated herein and U.S. Government license rights.
|
||||
2. The copyright holders shown above and their third-party licensors
|
||||
hereby grant Licensee a royalty-free nonexclusive license, subject to
|
||||
the limitations stated herein and U.S. Government license rights.
|
||||
|
||||
3. You may modify and make a copy or copies of the Software for use
|
||||
within your organization, if you meet the following conditions:
|
||||
@@ -44,39 +34,28 @@ of Energy ("Los Alamos").
|
||||
materials provided with the copy;
|
||||
c. Modified copies and works based on the Software must carry
|
||||
prominent notices stating that you changed specified portions of
|
||||
the Software; and
|
||||
d. Prior to sending a copy or modified copy of the Software to any
|
||||
person or entity outside your organization you must verify with
|
||||
Argonne that the intended recipient of the Software has executed
|
||||
a license with Argonne for EPICS BASE. (See
|
||||
http://www.aps.anl.gov/epics/license/verify.php for information
|
||||
on how to contact Argonne.)
|
||||
the Software.
|
||||
|
||||
5. THE SOFTWARE INCLUDES PORTIONS WHICH MAY REQUIRE SOME FORM OF EXPORT
|
||||
CONTROL LICENSE FROM THE U.S. GOVERNMENT. FAILURE TO OBTAIN SUCH
|
||||
EXPORT CONTROL LICENSE MAY RESULT IN CRIMINAL LIABILITY UNDER U.S.
|
||||
LAWS.
|
||||
|
||||
6. Portions of the Software resulted from work developed under a U.S.
|
||||
5. Portions of the Software resulted from work developed under a U.S.
|
||||
Government contract and are subject to the following license: the
|
||||
Government is granted for itself and others acting on its behalf a
|
||||
paid-up, nonexclusive, irrevocable worldwide license in this computer
|
||||
software to reproduce, prepare derivative works, and perform publicly
|
||||
and display publicly.
|
||||
|
||||
7. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY
|
||||
6. WARRANTY DISCLAIMER. THE SOFTWARE IS SUPPLIED "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND. THE COPYRIGHT HOLDERS, THEIR THIRD PARTY LICENSORS, THE
|
||||
UNITED STATES, THE UNITED STATES DEPARTMENT OF ENERGY, AND THEIR
|
||||
EMPLOYEES: (1) DISCLAIM ANY WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
|
||||
BUT NOT LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
FOR A PARTICULAR PURPOSE, TITLE OR NONINFRINGEMENT, (2) DO NOT ASSUME
|
||||
FOR A PARTICULAR PURPOSE, TITLE OR NON-INFRINGEMENT, (2) DO NOT ASSUME
|
||||
ANY LEGAL LIABILITY OR RESPONSIBILITY FOR THE ACCURACY, COMPLETENESS,
|
||||
OR USEFULNESS OF THE SOFTWARE, (3) DO NOT REPRESENT THAT USE OF THE
|
||||
SOFTWARE WOULD NOT INFRINGE PRIVATELY OWNED RIGHTS, (4) DO NOT WARRANT
|
||||
THAT THE SOFTWARE WILL FUNCTION UNINTERRUPTED, THAT IT IS ERROR FREE
|
||||
THAT THE SOFTWARE WILL FUNCTION UNINTERRUPTED, THAT IT IS ERROR-FREE
|
||||
OR THAT ANY ERRORS WILL BE CORRECTED.
|
||||
|
||||
8. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDERS, THEIR
|
||||
7. LIMITATION OF LIABILITY. IN NO EVENT WILL THE COPYRIGHT HOLDERS, THEIR
|
||||
THIRD PARTY LICENSORS, THE UNITED STATES, THE UNITED STATES DEPARTMENT
|
||||
OF ENERGY, OR THEIR EMPLOYEES: BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
|
||||
CONSEQUENTIAL, SPECIAL OR PUNITIVE DAMAGES OF ANY KIND OR NATURE,
|
||||
@@ -89,21 +68,17 @@ of Energy ("Los Alamos").
|
||||
________________________________________________________________________
|
||||
|
||||
This software is in part copyrighted by the BERLINER SPEICHERRING
|
||||
GESELLSCHAFT FUER SYNCHROTRONSTRAHLUNG M.B.H. (BESSY),
|
||||
BERLIN, GERMANY.
|
||||
GESELLSCHAFT FUER SYNCHROTRONSTRAHLUNG M.B.H. (BESSY), BERLIN, GERMANY.
|
||||
|
||||
In no event shall BESSY be liable to any party for direct,
|
||||
indirect, special, incidental, or consequential damages arising
|
||||
out of the use of this software, its documentation, or any
|
||||
derivatives thereof, even if BESSY has been advised of the
|
||||
possibility of such damage.
|
||||
In no event shall BESSY be liable to any party for direct, indirect,
|
||||
special, incidental, or consequential damages arising out of the use of
|
||||
this software, its documentation, or any derivatives thereof, even if
|
||||
BESSY has been advised of the possibility of such damage.
|
||||
|
||||
BESSY specifically disclaims any warranties, including, but not
|
||||
limited to, the implied warranties of merchantability, fitness for
|
||||
a particular purpose, and non-infringement. This software is
|
||||
provided on an "as is" basis, and BESSY has no obligation to
|
||||
provide maintenance, support, updates, enhancements, or
|
||||
modifications.
|
||||
BESSY specifically disclaims any warranties, including, but not limited
|
||||
to, the implied warranties of merchantability, fitness for a particular
|
||||
purpose, and non-infringement. This software is provided on an "as is"
|
||||
basis, and BESSY has no obligation to provide maintenance, support,
|
||||
updates, enhancements, or modifications.
|
||||
________________________________________________________________________
|
||||
|
||||
|
||||
|
||||
3
Makefile
3
Makefile
@@ -14,7 +14,8 @@
|
||||
TOP = .
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
DIRS += config config/tools configure src
|
||||
DIRS += config config/tools
|
||||
DIRS += configure src
|
||||
|
||||
include $(TOP)/configure/RULES_TOP
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ RANLIB = ranlib
|
||||
ANSI=GCC
|
||||
CPLUSPLUS=G++
|
||||
|
||||
OP_SYS_CPPFLAGS += -DDarwin
|
||||
OP_SYS_CFLAGS += -no-cpp-precomp
|
||||
OP_SYS_INCLUDES = -I/sw/include -I/usr/X11R6/include
|
||||
OP_SYS_LDFLAGS += -L/sw/lib -L/usr/X11R6/lib
|
||||
|
||||
@@ -73,10 +73,12 @@ POSIX_CPPFLAGS_YES += -D__EXTENSIONS__
|
||||
ARCH_DEP_LDLIBS += -lsocket -lnsl
|
||||
ARCH_DEP_LDLIBS += -lposix4 -lpthread
|
||||
ARCH_DEP_LDLIBS_8 = -lCrun
|
||||
ARCH_DEP_LDLIBS_9 = -lCrun
|
||||
ARCH_DEP_LDLIBS += $(ARCH_DEP_LDLIBS_$(SOLARIS_VERSION))
|
||||
|
||||
#Allows R3.13 built extensions to load R3.14 shared libs
|
||||
SYS_DLL_LIBS_solaris_8 = Crun
|
||||
SYS_DLL_LIBS_solaris_9 = Crun
|
||||
SYS_DLL_LIBS_solaris += posix4 pthread $(SYS_DLL_LIBS_solaris_$(SOLARIS_VERSION))
|
||||
|
||||
# Runtime ldflags
|
||||
|
||||
@@ -41,10 +41,12 @@ POSIX_CPPFLAGS_YES += -D__EXTENSIONS__
|
||||
ARCH_DEP_LDLIBS += -lsocket -lnsl
|
||||
ARCH_DEP_LDLIBS += -lposix4 -lpthread
|
||||
ARCH_DEP_LDLIBS_8 = -lCrun
|
||||
ARCH_DEP_LDLIBS_9 = -lCrun
|
||||
ARCH_DEP_LDLIBS += $(ARCH_DEP_LDLIBS_$(SOLARIS_VERSION))
|
||||
|
||||
#Allows R3.13 built extensions to load R3.14 shared libs
|
||||
SYS_DLL_LIBS_solaris_8 = Crun
|
||||
SYS_DLL_LIBS_solaris_9 = Crun
|
||||
SYS_DLL_LIBS_solaris += posix4 pthread $(SYS_DLL_LIBS_solaris_$(SOLARIS_VERSION))
|
||||
|
||||
# Runtime ldflags
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
EPICS_VERSION=3
|
||||
EPICS_REVISION=14
|
||||
EPICS_MODIFICATION=3
|
||||
EPICS_MODIFICATION=5
|
||||
EPICS_UPDATE_NAME=
|
||||
EPICS_UPDATE_LEVEL=0
|
||||
|
||||
|
||||
@@ -15,10 +15,12 @@ TOP=..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
ifeq ($(strip $(COMPAT_313)),YES)
|
||||
INSTALL_CONFIG = $(INSTALL_LOCATION)/config
|
||||
|
||||
CONFIGS += $(subst ../,,$(wildcard ../CONFIG*))
|
||||
CONFIGS += $(subst ../,,$(wildcard ../RULES*))
|
||||
endif
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
|
||||
@@ -650,8 +650,8 @@ endif
|
||||
@$(RM) $@
|
||||
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $*.i
|
||||
|
||||
%.c: %.stt
|
||||
@echo "converting $<
|
||||
%.c: ../%.stt
|
||||
@echo "converting $<"
|
||||
ln -s $< $*.st
|
||||
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $*.st
|
||||
@$(RM) $*.st
|
||||
@@ -784,8 +784,8 @@ $(INSTALL_SHRLIB)/lib%: lib%
|
||||
@echo "Installing library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m 555 $< $(INSTALL_SHRLIB)
|
||||
ifdef SHRLIB_VERSION
|
||||
@$(RM) $(@:%.$(SHRLIB_VERSION)=%)
|
||||
ln -s $< $(@:%.$(SHRLIB_VERSION)=%)
|
||||
$(RM) $(subst .$(SHRLIB_VERSION),,$@)
|
||||
ln -s $< $(subst .$(SHRLIB_VERSION),,$@)
|
||||
endif # SHRLIB_VERSION
|
||||
|
||||
$(INSTALL_TCLLIB)/%: %
|
||||
|
||||
@@ -148,7 +148,7 @@ $(TARGETS) $(PROD): $(DEPLIBS)
|
||||
@$(RM) $@
|
||||
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $*.i
|
||||
|
||||
%.c: %.stt
|
||||
%.c: ../%.stt
|
||||
@echo "converting $<
|
||||
@$(RM) $@
|
||||
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $<
|
||||
|
||||
@@ -22,7 +22,6 @@ ACTIONS += install
|
||||
ACTIONS += buildInstall
|
||||
ACTIONS += depends
|
||||
ACTIONS += rebuild
|
||||
ACTIONS += browse
|
||||
|
||||
actionPart = $(word 1, $(subst $(DIVIDER), ,$@))
|
||||
archPart = $(word 2, $(subst $(DIVIDER), ,$@))
|
||||
|
||||
@@ -15,8 +15,10 @@ TOP=../..
|
||||
|
||||
include $(TOP)/configure/CONFIG
|
||||
|
||||
ifeq ($(findstring YES,$(COMPAT_313) $(COMPAT_TOOLS_313)),YES)
|
||||
SCRIPTS_HOST += $(subst ../,,$(wildcard ../*.pl))
|
||||
SCRIPTS_HOST += installEpics
|
||||
endif
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@ CONFIG ?= $(TOP)/configure
|
||||
|
||||
-include $(CONFIG)/RELEASE
|
||||
-include $(CONFIG)/RELEASE.$(EPICS_HOST_ARCH)
|
||||
-include $(CONFIG)/RELEASE.Common.$(T_A)
|
||||
-include $(CONFIG)/RELEASE.$(EPICS_HOST_ARCH).$(T_A)
|
||||
|
||||
include $(CONFIG)/CONFIG_COMMON
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
EPICS_VERSION=3
|
||||
EPICS_REVISION=14
|
||||
EPICS_MODIFICATION=3
|
||||
EPICS_MODIFICATION=5
|
||||
EPICS_UPDATE_NAME=
|
||||
EPICS_UPDATE_LEVEL=0
|
||||
|
||||
@@ -27,3 +27,4 @@ EPICS_VERSION_STRING="EPICS Version ${EPICS_VERSION}.${EPICS_REVISION}.${EPICS_M
|
||||
CVS_DATE="\$$Date$$"
|
||||
CVS_TAG="\$$Name$$"
|
||||
|
||||
BASE_3_14=YES
|
||||
|
||||
@@ -240,8 +240,8 @@ STATIC_LDFLAGS = $(STATIC_LDFLAGS_$(STATIC_BUILD))
|
||||
STATIC_LDLIBS = $(STATIC_LDLIBS_$(STATIC_BUILD))
|
||||
|
||||
#--------------------------------------------------
|
||||
# cflags for library src file
|
||||
LIBRARY_SRCS=$(basename $(foreach lib,$(LIBRARY),$($(lib)_OBJS) $(LIBRARY_OBJS)))
|
||||
# cflags for shared library src files (from SHRLIB_CFLAGS)
|
||||
LIBRARY_SRCS=$(basename $(foreach lib,$(LIBRARY) $(LOADABLE_LIBRARY),$($(lib)_OBJS) $(LIBRARY_OBJS)))
|
||||
LIBRARY_SRC_CFLAGS=$($(patsubst $*,SHRLIB,$(findstring $*,$(LIBRARY_SRCS)))_CFLAGS)
|
||||
|
||||
#--------------------------------------------------
|
||||
@@ -254,24 +254,24 @@ OP_SYS_LDFLAGS += $(LDFLAGS_$(COMMANDLINE_LIBRARY))
|
||||
# Flags
|
||||
|
||||
INCLUDES = -I. $(GENERIC_SRC_INCLUDES) $(INSTALL_INCLUDES) $(RELEASE_INCLUDES)\
|
||||
$(TARGET_INCLUDES) $(USR_INCLUDES) $(OP_SYS_INCLUDES) $(CROSS_INCLUDES)
|
||||
$(TARGET_INCLUDES) $(USR_INCLUDES) $(OP_SYS_INCLUDES) $($(BUILD_CLASS)_INCLUDES)
|
||||
|
||||
CFLAGS = $(CONFORM_CFLAGS) $(CROSS_CFLAGS) $(OPT_CFLAGS) $(DEBUG_CFLAGS)\
|
||||
CFLAGS = $(CONFORM_CFLAGS) $($(BUILD_CLASS)_CFLAGS) $(OPT_CFLAGS) $(DEBUG_CFLAGS)\
|
||||
$(WARN_CFLAGS) $(TARGET_CFLAGS) $(USR_CFLAGS) $(ARCH_DEP_CFLAGS)\
|
||||
$(CODE_CFLAGS) $(STATIC_CFLAGS) $(OP_SYS_CFLAGS) $(LIBRARY_SRC_CFLAGS)
|
||||
|
||||
CXXFLAGS = $(CONFORM_CXXFLAGS) $(CROSS_CXXFLAGS) $(OPT_CXXFLAGS)\
|
||||
CXXFLAGS = $(CONFORM_CXXFLAGS) $($(BUILD_CLASS)_CXXFLAGS) $(OPT_CXXFLAGS)\
|
||||
$(DEBUG_CXXFLAGS) $(WARN_CXXFLAGS) $(TARGET_CXXFLAGS) $(USR_CXXFLAGS)\
|
||||
$(ARCH_DEP_CXXFLAGS) $(CODE_CXXFLAGS) $(STATIC_CXXCFLAGS) $(OP_SYS_CXXFLAGS) $(LIBRARY_SRC_CFLAGS)
|
||||
|
||||
LDFLAGS = $(OPT_LDFLAGS) $(TARGET_LDFLAGS) $(USR_LDFLAGS) \
|
||||
$(ARCH_DEP_LDFLAGS) $(DEBUG_LDFLAGS) $(OP_SYS_LDFLAGS) $(CROSS_LDFLAGS)\
|
||||
$(ARCH_DEP_LDFLAGS) $(DEBUG_LDFLAGS) $(OP_SYS_LDFLAGS) $($(BUILD_CLASS)_LDFLAGS)\
|
||||
$(RUNTIME_LDFLAGS) $(CODE_LDFLAGS)
|
||||
|
||||
LDLIBS = $(STATIC_LDLIBS)\
|
||||
$(POSIX_LDLIBS) $(ARCH_DEP_LDLIBS) $(DEBUG_LDLIBS) $(OP_SYS_LDLIBS)
|
||||
|
||||
CPPFLAGS += $(CONFORM_CPPFLAGS) $(CROSS_CPPFLAGS) $(POSIX_CPPFLAGS)\
|
||||
CPPFLAGS += $(CONFORM_CPPFLAGS) $($(BUILD_CLASS)_CPPFLAGS) $(POSIX_CPPFLAGS)\
|
||||
$(BASE_CPPFLAGS) $(TARGET_CPPFLAGS) $(USR_CPPFLAGS) $(ARCH_DEP_CPPFLAGS)\
|
||||
$(OP_SYS_CPPFLAGS) $(OP_SYS_INCLUDE_CPPFLAGS) $(CODE_CPPFLAGS)
|
||||
|
||||
@@ -291,10 +291,15 @@ PATH_FILTER = $(1)
|
||||
COMPILE.c = $(CC) -c $(CPPFLAGS) $(CFLAGS) $(call PATH_FILTER,$(INCLUDES)) $(SOURCE_FLAG)
|
||||
COMPILE.cpp = $(CCC) -c $(CPPFLAGS) $(CXXFLAGS) $(call PATH_FILTER,$(INCLUDES)) $(SOURCE_CXXFLAG)
|
||||
|
||||
#--------------------------------------------------
|
||||
# C preprocessor command
|
||||
PREPROCESS.cpp = $(CPP) $(CPPFLAGS) $(INCLUDES) $< > $@
|
||||
|
||||
#--------------------------------------------------
|
||||
# Depends command
|
||||
|
||||
HDEPENDS_FLAGS =
|
||||
# Use only dependancies from current top tree
|
||||
HDEPENDS_INCLUDES = $(filter .%,$(subst -I,,$(INCLUDES)))
|
||||
HDEPENDSFLAGS = -m $*$(DEP) $(HDEPENDS_INCLUDES) $@ $<
|
||||
HDEPENDS_CMD_YES = -$(MKMF) $(HDEPENDS_FLAGS) $(HDEPENDSFLAGS)
|
||||
|
||||
@@ -130,6 +130,22 @@ HOST_WARN=YES
|
||||
# must be either YES or NO
|
||||
CROSS_WARN=YES
|
||||
|
||||
# Create and/or install perl build tools for R3.13 extension builds?
|
||||
# must be either YES or NO
|
||||
#
|
||||
# NOTE: Set to YES only if you have existing R3.13 extensions to be
|
||||
# built with this base
|
||||
#
|
||||
COMPAT_TOOLS_313=NO
|
||||
|
||||
# Create and/or install files for R3.13 ioc application and extension builds?
|
||||
# must be either YES or NO
|
||||
#
|
||||
# NOTE: Set to YES only if you have existing R3.13 ioc applications
|
||||
# and extensions to be built with this base
|
||||
#
|
||||
COMPAT_313=NO
|
||||
|
||||
# Installation directory
|
||||
#Note: INSTALL_LOCATION definition moved to configure/RELEASE file
|
||||
|
||||
|
||||
@@ -32,11 +32,15 @@
|
||||
# EPICS_TIMEZONE=<name>::<minutesWest>:<start daylight>:<end daylight>
|
||||
#NOTE: start and end are mmddhh that bis mounth,day,hour
|
||||
# eg EPICS_TIMEZONE=CUS::360:033102:102802
|
||||
# DST for 2003 US: Apr 6 - Oct 26
|
||||
# EU: Mar 30 - Oct 26
|
||||
#
|
||||
# DST for 2004 US: Apr 4 - Oct 31
|
||||
# EU: Mar 28 - Oct 31
|
||||
# (see: http://www.worldtimezone.org/daylight.html)
|
||||
#
|
||||
# EPICS_TS_NTP_INET ntp or Unix time server ip addr.
|
||||
|
||||
EPICS_TIMEZONE=CUS::360:040602:102602
|
||||
EPICS_TIMEZONE=CUS::360:040402:103102
|
||||
#EPICS_TIMEZONE=MET::-60:032802:103102
|
||||
EPICS_TS_NTP_INET=
|
||||
|
||||
|
||||
|
||||
@@ -7,12 +7,16 @@
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
#RELEASE Location of external products
|
||||
# RELEASE: Define location of external products
|
||||
#
|
||||
# NOTE: RELEASE.$(EPICS_HOST_ARCH) files will override
|
||||
# NB: Settings in RELEASE files can be overridden in files named
|
||||
# RELEASE.$(EPICS_HOST_ARCH)
|
||||
# RELEASE.Common.$(T_A)
|
||||
# RELEASE.$(EPICS_HOST_ARCH).$(T_A)
|
||||
|
||||
# Tornado directory
|
||||
VX_DIR = /usr/local/vw/tornado202
|
||||
VX_DIR = /usr/local/vw/tornado202p1
|
||||
#VX_DIR = /usr/local/vw/tornado22-$(ARCH_CLASS)
|
||||
|
||||
# If you don't want to install into $(TOP) dir then
|
||||
# define INSTALL_LOCATION here
|
||||
|
||||
@@ -275,8 +275,9 @@ dbInstalls: $(DB_INSTALLS)
|
||||
##################################################### register record,device,driver support
|
||||
|
||||
%_registerRecordDeviceDriver.cpp: %.dbd
|
||||
@$(RM) $@
|
||||
$(REGISTERRECORDDEVICEDRIVER) $< $(basename $@) > $@
|
||||
@$(RM) $@ temp.cpp
|
||||
$(REGISTERRECORDDEVICEDRIVER) $< $(basename $@) > temp.cpp
|
||||
$(MV) temp.cpp $@
|
||||
|
||||
.PRECIOUS: %_registerRecordDeviceDriver.cpp
|
||||
|
||||
|
||||
@@ -24,6 +24,6 @@ else
|
||||
$(PERL) $(TOOLS)/convertRelease.pl -a $(ARCH) -t $(IOCS_APPL_TOP) $@
|
||||
endif
|
||||
|
||||
clean:
|
||||
@$(RM) cdCommands envPaths
|
||||
realclean clean:
|
||||
$(RM) cdCommands envPaths
|
||||
|
||||
|
||||
@@ -47,9 +47,21 @@ $(buildDirs):
|
||||
O.Common:
|
||||
$(MKDIR) O.Common
|
||||
|
||||
checkRelease: $(wildcard $(TOP)/configure/RELEASE*)
|
||||
#
|
||||
# RELEASE consistency checking
|
||||
|
||||
# The RELEASE.$(EPICS_HOST_ARCH) files don't need to be included here:
|
||||
targetReleaseFiles = $(wildcard $(foreach arch, $(BUILD_ARCHS), \
|
||||
$(TOP)/configure/RELEASE.Common.$(arch) \
|
||||
$(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).$(arch)))
|
||||
checkReleaseTargets = $(addprefix checkRelease, $(suffix $(targetReleaseFiles)))
|
||||
|
||||
checkRelease: $(checkReleaseTargets)
|
||||
$(PERL) $(TOOLS)/convertRelease.pl -h $(EPICS_HOST_ARCH) $@
|
||||
|
||||
$(checkReleaseTargets):checkRelease.%:
|
||||
$(PERL) $(TOOLS)/convertRelease.pl -h $(EPICS_HOST_ARCH) -a $* checkRelease
|
||||
|
||||
#
|
||||
# special clean rule
|
||||
#
|
||||
@@ -66,5 +78,5 @@ realclean ::
|
||||
.PHONY : $(cleanArchTargets)
|
||||
.PHONY : $(BUILD_ARCHS)
|
||||
.PHONY : $(ACTIONS) clean realclean all
|
||||
.PHONY : checkRelease
|
||||
.PHONY : checkRelease $(checkReleaseTargets)
|
||||
|
||||
|
||||
@@ -327,19 +327,18 @@ $(INSTALL_LIB)/%.lib: %.lib
|
||||
@$(INSTALL_LIBRARY) -d -m 644 $< $(INSTALL_LIB)
|
||||
|
||||
$(INSTALL_SHRLIB)/lib%: lib%
|
||||
@echo "Installing library $@"
|
||||
@echo "Installing shared library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m 555 $< $(INSTALL_SHRLIB)
|
||||
ifdef SHRLIB_VERSION
|
||||
@$(RM) $(subst .$(SHRLIB_VERSION),,$@)
|
||||
ln -s $< $(subst .$(SHRLIB_VERSION),,$@)
|
||||
|
||||
endif # SHRLIB_VERSION
|
||||
|
||||
ifneq ($(INSTALL_TCLLIB),$(INSTALL_BIN))
|
||||
$(INSTALL_TCLLIB)/%: %
|
||||
@echo "Installing Tcl library $@"
|
||||
@$(INSTALL) -d -m 555 $< $(INSTALL_TCLLIB)
|
||||
|
||||
|
||||
$(INSTALL_TCLLIB)/%: ../%
|
||||
@echo "Installing Tcl library $@"
|
||||
@$(INSTALL) -d -m 555 $< $(INSTALL_TCLLIB)
|
||||
@@ -348,7 +347,7 @@ endif
|
||||
$(INSTALL_LOADABLE_SHRLIBS): $(INSTALL_SHRLIB)/%: %
|
||||
@echo "Installing loadable shared library $@"
|
||||
@$(INSTALL_LIBRARY) -d -m 555 $< $(INSTALL_SHRLIB)
|
||||
|
||||
|
||||
$(INSTALL_CONFIG)/%: %
|
||||
@echo "Installing config file $@"
|
||||
@$(INSTALL) -d -m 644 $< $(@D)
|
||||
@@ -400,5 +399,3 @@ $(INSTALL_TEMPLATES_SUBDIR)/%: %
|
||||
|
||||
endif # BASE_RULES_BUILD
|
||||
# EOF RULES_BUILD
|
||||
|
||||
|
||||
|
||||
@@ -17,10 +17,11 @@
|
||||
JAVA_INC = $(JAVA_DIR)/include
|
||||
JAVA_BIN = $(JAVA_DIR)/bin
|
||||
JAVA_INCLUDES += -I$(JAVA_INC) -I$(JAVA_INC)/$(OS_CLASS) -I$(COMMON_DIR)
|
||||
JAVA_INCLUDES += -I$(JAVA_INC) -I$(JAVA_INC)/$(word 1, $(subst -, ,$(T_A))) -I$(COMMON_DIR)
|
||||
|
||||
JAVACCMD = $(subst \,/,$(JAVA_BIN)/javac$(EXE) $(CLASSPATH) $(SOURCEPATH) $(JAVACFLAGS))
|
||||
JAVAHCMD = $(subst \,/,$(JAVA_BIN)/javah$(EXE) -d $(COMMON_DIR) -force $(CLASSPATH) $(JAVAHFLAGS))
|
||||
JARCMD = $(subst \,/,$(JAVA_BIN)/jar$(EXE) $(JAR_OPTIONS) $(COMMON_JAR) $(JARINPUT))
|
||||
JARCMD = $(subst \,/,$(JAVA_BIN)/jar$(EXE) $(JAR_OPTIONS) $(COMMON_JAR) $(JARINPUT) $(JARPACKAGES))
|
||||
|
||||
#-------------------------------------------------------
|
||||
vpath %.java ..
|
||||
@@ -60,9 +61,11 @@ DEPTESTJAVA += $(subst .class,.java,$(TESTCLASSES))
|
||||
|
||||
COMMON_JAR += $(addprefix $(COMMON_DIR)/,$(JAR))
|
||||
INSTALL_JAR =$(addprefix $(INSTALL_JAVA)/,$(JAR))
|
||||
JARMANIFEST += $(firstword $(trim $(MANIFEST) $(JAR_MANIFEST)))
|
||||
JARMANIFEST += $(firstword $(MANIFEST) $(JAR_MANIFEST))
|
||||
JARINPUT += $(subst .java,.class,$(JAR_INPUT))
|
||||
JARDEPFILES += $(JARINPUT) $(JARMANIFEST)
|
||||
JARDEPFILES += $(addprefix $(INSTALL_JAVA)/,$(subst .java,.class,$(JAVA))) $(JARINPUT)
|
||||
JARPACKAGES += $(foreach pkg,$(JAR_PACKAGES),-C $(INSTALL_JAVA) $(subst .,/,$(pkg)))
|
||||
|
||||
ifneq ($(JARMANIFEST),)
|
||||
JAR_OPTIONS = cvmf $(JARMANIFEST)
|
||||
else
|
||||
|
||||
@@ -24,7 +24,7 @@ OBJ = .o
|
||||
LIB_PREFIX = lib
|
||||
LIB_SUFFIX = .a
|
||||
SHRLIB_SUFFIX = .so$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_SUFFIX = .so$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_SUFFIX = .so
|
||||
LOADABLE_SHRLIB_PREFIX = lib
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
@@ -21,15 +21,14 @@ OP_SYS_CFLAGS = -D_HPUX_SOURCE
|
||||
OP_SYS_CXXFLAGS =
|
||||
|
||||
SHRLIB_SUFFIX = .sl$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_SUFFIX = .sl$(addprefix .,$(SHRLIB_VERSION))
|
||||
LOADABLE_SHRLIB_PREFIX =
|
||||
LOADABLE_SHRLIB_SUFFIX = .sl
|
||||
|
||||
# Set runtime path for shared libraries
|
||||
empty:= # trick from the make docs...
|
||||
space:= $(empty) $(empty)
|
||||
RUNTIME_LDFLAGS = -Wl,+b$(subst $(space),:,$(sort $(SHRLIB_SEARCH_DIRS))),+s
|
||||
|
||||
ifdef CROSS
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=parisc-hp-unix
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
|
||||
18
configure/os/CONFIG.Common.linux-386
Normal file
18
configure/os/CONFIG.Common.linux-386
Normal file
@@ -0,0 +1,18 @@
|
||||
# CONFIG.Common.linux-386
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-386 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-386
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all linux x86 targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86
|
||||
|
||||
ARCH_DEP_CFLAGS = -march=i386
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=i386-pc-linux-gnu
|
||||
endif
|
||||
|
||||
18
configure/os/CONFIG.Common.linux-486
Normal file
18
configure/os/CONFIG.Common.linux-486
Normal file
@@ -0,0 +1,18 @@
|
||||
# CONFIG.Common.linux-486
|
||||
#
|
||||
# $Id
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-486 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-486
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all linux x86 targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86
|
||||
|
||||
ARCH_DEP_CFLAGS = -march=i486
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=i486-pc-linux-gnu
|
||||
endif
|
||||
|
||||
19
configure/os/CONFIG.Common.linux-586
Normal file
19
configure/os/CONFIG.Common.linux-586
Normal file
@@ -0,0 +1,19 @@
|
||||
# CONFIG.Common.linux-586
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-586 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-586
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all linux x86 targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86
|
||||
|
||||
# i586 is euivalent to pentiumpro
|
||||
ARCH_DEP_CFLAGS = -march=i586
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=i586-pc-linux-gnu
|
||||
endif
|
||||
|
||||
19
configure/os/CONFIG.Common.linux-686
Normal file
19
configure/os/CONFIG.Common.linux-686
Normal file
@@ -0,0 +1,19 @@
|
||||
# CONFIG.Common.linux-686
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-686 target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-686
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all linux x86 targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86
|
||||
|
||||
# i686 is euivalent to pentiumpro
|
||||
ARCH_DEP_CFLAGS = -march=i686
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=i686-pc-linux-gnu
|
||||
endif
|
||||
|
||||
19
configure/os/CONFIG.Common.linux-athlon
Normal file
19
configure/os/CONFIG.Common.linux-athlon
Normal file
@@ -0,0 +1,19 @@
|
||||
# CONFIG.Common.linux-athlon
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-athlon target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-athlon
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all linux x86 targets
|
||||
include $(CONFIG)/os/CONFIG.Common.linux-x86
|
||||
|
||||
ARCH_DEP_CFLAGS += -march=athlon-mp -mfpmath=sse
|
||||
|
||||
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=athlon-pc-linux-gnu
|
||||
endif
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-mpc82xx target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.linux-mpc82xx
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Unix targets
|
||||
include $(CONFIG)/os/CONFIG.Common.UnixCommon
|
||||
|
||||
OS_CLASS = Linux
|
||||
ARCH_CLASS = mpc82xx
|
||||
|
||||
CODE_CPPFLAGS = -D_REENTRANT
|
||||
|
||||
POSIX_CPPFLAGS_YES = -D_POSIX_C_SOURCE=199506L -D_POSIX_THREADS -D_XOPEN_SOURCE=500
|
||||
POSIX_CPPFLAGS_NO =
|
||||
POSIX_LDLIBS_YES = -lpthread
|
||||
POSIX_LDLIBS_NO =
|
||||
|
||||
# -D_BSD_SOURCE for gethostname() in unistd.h as needed by cacChannelIO.cpp.
|
||||
OP_SYS_CPPFLAGS += -D_BSD_SOURCE
|
||||
OP_SYS_CPPFLAGS += -Dlinux
|
||||
OP_SYS_LDFLAGS +=
|
||||
OP_SYS_LDLIBS = -lrt
|
||||
|
||||
#ARCH_DEP_CPPFLAGS += -D_X86_
|
||||
|
||||
# Set runtime path for shared libraries
|
||||
RUNTIME_LDFLAGS = $(SHRLIB_SEARCH_DIRS:%=-Wl,-rpath,%)
|
||||
|
||||
ifdef CROSS
|
||||
GNU_TARGET=ppc_82xx
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
|
||||
|
||||
@@ -25,14 +25,28 @@ OP_SYS_CPPFLAGS += -Dlinux
|
||||
OP_SYS_LDLIBS += -lrt
|
||||
|
||||
ARCH_DEP_CPPFLAGS += -D_X86_
|
||||
ARCH_DEP_CFLAGS += -mcpu=pentium
|
||||
|
||||
# Set runtime path for shared libraries
|
||||
RUNTIME_LDFLAGS = $(SHRLIB_SEARCH_DIRS:%=-Wl,-rpath,%)
|
||||
|
||||
ifdef CROSS
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
ifeq ($(EPICS_HOST_ARCH),linux-x86)
|
||||
# Added for 386,486,... cross builds
|
||||
CMPLR_PREFIX=
|
||||
CROSS_INCLUDES=
|
||||
CROSS_LDFLAGS=
|
||||
# Use -w not -Wall
|
||||
#WARN_CFLAGS_YES = -w
|
||||
#WARN_CXXFLAGS_YES = -w
|
||||
-include $(CONFIG)/os/CONFIG_SITE.Common.linux-x86
|
||||
-include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
-include $(CONFIG)/os/CONFIG_SITE.linux-x86.linux-x86
|
||||
else
|
||||
GNU_TARGET=i586-pc-linux-gnu
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
endif
|
||||
|
||||
LDLIBS_READLINE = -lreadline -lcurses
|
||||
|
||||
|
||||
@@ -21,11 +21,10 @@ OP_SYS_CPPFLAGS += -Dlinux
|
||||
OP_SYS_LDLIBS = libc.so libm.so libdl.so librt.so
|
||||
|
||||
ARCH_DEP_CPPFLAGS += -D_X86_
|
||||
ARCH_DEP_CFLAGS += -mcpu=pentium
|
||||
|
||||
RUNTIME_LDFLAGS += $(RUNTIME_LDFLAGS_$(SHARED_LIBRARIES))
|
||||
|
||||
ifdef CROSS
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=i586-pc-linux-gnu
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
# CONFIG.Common.lynxos-x86
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# This file is maintained by the build community.
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.lynxos-x86
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix targets
|
||||
include $(CONFIG)/os/CONFIG.Common.UnixCommon
|
||||
|
||||
OS_CLASS = lynxos
|
||||
ARCH_CLASS = x86
|
||||
|
||||
CODE_CPPFLAGS =
|
||||
|
||||
POSIX_CPPFLAGS_YES =
|
||||
POSIX_CPPFLAGS_NO =
|
||||
POSIX_LDLIBS_YES += -lposix4d9 -lpthread
|
||||
POSIX_LDLIBS_NO +=
|
||||
|
||||
ARCH_DEP_CPPFLAGS += -D_X86_
|
||||
ARCH_DEP_LDFLAGS =
|
||||
ARCH_DEP_LDLIBS =
|
||||
|
||||
ifdef CROSS
|
||||
GNU_TARGET=x86-lynxos
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
# CONFIG.Common.osf-alpha
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for osf-alpha target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.osf-alpha
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Unix targets
|
||||
include $(CONFIG)/os/CONFIG.Common.UnixCommon
|
||||
|
||||
OS_CLASS = osf
|
||||
ARCH_CLASS = alpha
|
||||
|
||||
CODE_CPPFLAGS =
|
||||
|
||||
POSIX_CPPFLAGS_YES =
|
||||
POSIX_LDLIBS_YES +=
|
||||
POSIX_CPPFLAGS_NO =
|
||||
POSIX_LDLIBS_NO +=
|
||||
|
||||
OP_SYS_CPPFLAGS = -D_OSF_SOURCE
|
||||
|
||||
ifdef CROSS
|
||||
GNU_TARGET=alpha-osf
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
|
||||
@@ -30,7 +30,7 @@ OP_SYS_CPPFLAGS += -DSOLARIS=$(SOLARIS_VERSION)
|
||||
# Set runtime path for shared libraries
|
||||
RUNTIME_LDFLAGS = $(SHRLIB_SEARCH_DIRS:%=-R%)
|
||||
|
||||
ifdef CROSS
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=sparc-sun-solaris2
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
@@ -38,6 +38,7 @@ endif
|
||||
|
||||
OP_SYS_LDLIBS += -lsocket -lnsl
|
||||
OP_SYS_LDLIBS_8 += -lCrun -lc -lCstd
|
||||
OP_SYS_LDLIBS_9 += -lCrun -lc -lCstd
|
||||
OP_SYS_LDLIBS += $(OP_SYS_LDLIBS_$(SOLARIS_VERSION))
|
||||
|
||||
# Definitions used when COMMANDLINE_LIBRARY is READLINE
|
||||
|
||||
@@ -12,4 +12,6 @@ include $(CONFIG)/os/CONFIG.Common.solaris-sparc
|
||||
# CONFIG.Common.solaris-sparc
|
||||
|
||||
OP_SYS_LDLIBS_8 = -lc
|
||||
OP_SYS_LDLIBS_9 = -lc
|
||||
|
||||
OP_SYS_LDFLAGS += -R$(GNU_LIB) -L$(GNU_LIB)
|
||||
|
||||
@@ -31,7 +31,7 @@ ARCH_DEP_CPPFLAGS = -D_X86_
|
||||
# Set runtime path for shared libraries
|
||||
RUNTIME_LDFLAGS = $(SHRLIB_SEARCH_DIRS:%=-R%)
|
||||
|
||||
ifdef CROSS
|
||||
ifeq ($(BUILD_CLASS),CROSS)
|
||||
GNU_TARGET=x86-sun-solaris2
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
@@ -39,4 +39,5 @@ endif
|
||||
|
||||
OP_SYS_LDLIBS += -lsocket -lnsl
|
||||
OP_SYS_LDLIBS_8 += -lCrun -lc -lCstd
|
||||
OP_SYS_LDLIBS_9 += -lCrun -lc -lCstd
|
||||
OP_SYS_LDLIBS += $(OP_SYS_LDLIBS_$(SOLARIS_VERSION))
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
# CONFIG.Common.sun4-x86
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for sun4-x86 target archs
|
||||
# Sites may override these definitions in CONFIG_SITE.Common.sun4-x86
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Unix target archs
|
||||
include $(CONFIG)/os/CONFIG.Common.UnixCommon
|
||||
|
||||
OS_CLASS = sun4
|
||||
ARCH_CLASS = x86
|
||||
|
||||
CODE_CPPFLAGS = -D__EXTENSIONS__
|
||||
|
||||
POSIX_CPPFLAGS_YES = -D_POSIX_C_SOURCE=199506L -D_XOPEN_SOURCE=500
|
||||
POSIX_CPPFLAGS_NO =
|
||||
POSIX_LDLIBS_YES += -lpthread -lthread
|
||||
|
||||
OP_SYS_CPPFLAGS = -DSUNOS4
|
||||
|
||||
ARCH_DEP_CPPFLAGS += -D_X86_
|
||||
|
||||
# Set runtime path for shared libraries
|
||||
RUNTIME_LDFLAGS = $(SHRLIB_SEARCH_DIRS:%=-R%)
|
||||
|
||||
ifdef CROSS
|
||||
GNU_TARGET=x86-sun-sunos4
|
||||
CMPLR_SUFFIX=
|
||||
CMPLR_PREFIX=$(addsuffix -,$(GNU_TARGET))
|
||||
endif
|
||||
|
||||
OP_SYS_LDLIBS += -lsocket -lnsl
|
||||
|
||||
@@ -134,6 +134,11 @@ LINK.cpp += $(PROD_LDFLAGS) $(PROD_LD_OBJS) $(PROD_LD_RESS) $(PROD_LDLIBS)
|
||||
CFLAGS_ctdt = $(filter-out -pedantic,$(CFLAGS)) -fdollars-in-identifiers
|
||||
COMPILE.ctdt = $(CC) -c $(CPPFLAGS) $(CFLAGS_ctdt) $(call PATH_FILTER,$(INCLUDES)) $(SOURCE_FLAG)
|
||||
|
||||
#--------------------------------------------------
|
||||
# C preprocessor command
|
||||
VXCPPFLAGS = $(filterout $(OP_SYS_INCLUDE_CPPFLAGS),$(CPPFLAGS))
|
||||
PREPROCESS.cpp = $(CPP) $(VXCPPFLAGS) $(INCLUDES) $< > $@
|
||||
|
||||
#--------------------------------------------------
|
||||
# Allow site overrides
|
||||
-include $(CONFIG)/os/CONFIG_SITE.Common.vxWorksCommon
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-mpc82xx host builds
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-mpc82xx.Common
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix hosts
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
# $Id$
|
||||
#
|
||||
# Definitions for linux-mpc82xx host - linux-mpc82xx target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-mpc82xx.linux-mpc82xx
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include common gnu compiler definitions
|
||||
include $(CONFIG)/CONFIG.gnuCommon
|
||||
|
||||
GNU_DIR = /usr
|
||||
|
||||
CC = $(GNU_BIN)/gcc
|
||||
CCC = $(GNU_BIN)/g++
|
||||
|
||||
STATIC_LDFLAGS_YES= -Wl,-Bstatic
|
||||
STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Wl,-Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
SHRLIB_LDFLAGS += -shared -z defs
|
||||
LOADABLE_SHRLIB_LDFLAGS = -shared
|
||||
|
||||
@@ -28,6 +28,7 @@ WINLINK = $(BORLAND_BIN)/ilink -q
|
||||
CCLINKOPT = -q -a8
|
||||
CC = $(BORLAND_BIN)/bc++ $(CCLINKOPT)
|
||||
LD = $(BORLAND_BIN)/bc++ -r
|
||||
RANLIB =
|
||||
|
||||
#
|
||||
# __STDC__=0 works but not as cleanly as with
|
||||
|
||||
@@ -10,3 +10,6 @@
|
||||
#Include definitions common to linux-x86 hosts
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.Common
|
||||
|
||||
# Make all crosscompiler builds debug builds
|
||||
#CROSS_OPT=NO
|
||||
|
||||
|
||||
@@ -9,3 +9,6 @@
|
||||
|
||||
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
|
||||
|
||||
# Removes -O optimization and adds -g compile option
|
||||
HOST_OPT=NO
|
||||
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
# $Id$
|
||||
#
|
||||
# Definitions for linux-x86 host - linux-mpc82xx target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-x86.linux-mpc82xx
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include common gnu compiler definitions
|
||||
include $(CONFIG)/CONFIG.gnuCommon
|
||||
|
||||
GNU_DIR = /opt/hardhat/devkit/ppc/82xx
|
||||
GNU_TARGET_INCLUDE_DIR = $(GNU_DIR)/target/usr/include/
|
||||
|
||||
CC = $(GNU_BIN)/ppc_82xx-gcc
|
||||
CCC = $(GNU_BIN)/ppc_82xx-g++
|
||||
|
||||
# Override the -nostdinc flag, needed here...
|
||||
CROSS_CPPFLAGS =
|
||||
13
configure/os/CONFIG.linux-x86.linux-x86-debug
Normal file
13
configure/os/CONFIG.linux-x86.linux-x86-debug
Normal file
@@ -0,0 +1,13 @@
|
||||
# CONFIG.linux-x86-debug.linux-x86-debug
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for linux-x86 host - linux-x86-debug target build with debug compiler flags
|
||||
# Sites may override these definitions in CONFIG_SITE.linux-x86.linux-x86-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
include $(CONFIG)/os/CONFIG.linux-x86-debug.linux-x86-debug
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
# CONFIG.lynxos-68k.Common
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for lynxos-68k host archs
|
||||
# Sites may override these definitions in CONFIG_SITE.lynxos-68k.Common
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix hosts
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
|
||||
WIND_HOST_TYPE = lynxos
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# CONFIG.lynxos-x86.lynxos-x86
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
# This file is maintained by the build community.
|
||||
# Sites may override these definitions in CONFIG_SITE.lynxos-x86.lynxos-x86
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include common gnu compiler definitions
|
||||
include $(CONFIG)/CONFIG.gnuCommon
|
||||
|
||||
GNU_DIR = /usr
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
# CONFIG.osf-alpha.Common
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for osf-alpha host archs
|
||||
# Sites may override these definitions in CONFIG_SITE.osf-alpha.Common
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix hosts
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
|
||||
WIND_HOST_TYPE = osf-alpha
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# CONFIG.osf-alpha.osf-alpha
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for osf-alpha host archs
|
||||
# Sites may override these definitions in CONFIG_SITE.osf-alpha.osf-alpha
|
||||
#-------------------------------------------------------
|
||||
|
||||
CC = cc
|
||||
CCC = cxx
|
||||
CPP = $(CC) -E
|
||||
RANLIB =
|
||||
AR = ar
|
||||
LD = -r
|
||||
|
||||
# Configure OS vendor C compiler
|
||||
CONFORM_CFLAGS_ANSI = -std
|
||||
CONFORM_CFLAGS_STRICT = -std1
|
||||
CONFORM_CFLAGS_TRAD = -std0
|
||||
CODE_CFLAGS =
|
||||
WARN_CFLAGS_YES =
|
||||
WARN_CFLAGS_NO = -w
|
||||
OPT_CFLAGS_YES = -O
|
||||
OPT_CFLAGS_NO = -g
|
||||
|
||||
# Configure OS vendor C++ compiler
|
||||
CONFORM_CXXFLAGS_NORMAL =
|
||||
CONFORM_CXXFLAGS_STRICT =
|
||||
PROF_CXXFLAGS_YES = +p
|
||||
PROF_CXXFLAGS_NO =
|
||||
CODE_CXXFLAGS =
|
||||
WARN_CXXFLAGS_YES =
|
||||
WARN_CXXFLAGS_NO =
|
||||
OPT_CXXFLAGS_YES = -O
|
||||
OPT_CXXFLAGS_NO = -g
|
||||
|
||||
STATIC_LDFLAGS_YES= -Bstatic
|
||||
STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
SHRLIB_LDFLAGS = -shared
|
||||
LOADABLE_SHRLIB_LDFLAGS = $(SHRLIB_LDFLAGS)
|
||||
|
||||
############# ???????????
|
||||
#####ACC_SFLAGS_YES= -non_shared
|
||||
#####ACC_SFLAGS_NO= -call_shared
|
||||
|
||||
@@ -23,7 +23,8 @@ STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Wl,-Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
SHRLIB_LDFLAGS = -G -h $@ -z ignore -z combreloc -z lazyload
|
||||
SHRLIB_LDFLAGS += -z defs
|
||||
LOADABLE_SHRLIB_LDFLAGS = -G -h $@ -z ignore -z combreloc -z lazyload
|
||||
SHRLIB_LDFLAGS += -G -h $@ -z ignore -z defs
|
||||
LOADABLE_SHRLIB_LDFLAGS += -G -h $@
|
||||
|
||||
OP_SYS_LDFLAGS += -z ignore -z combreloc -z lazyload
|
||||
|
||||
|
||||
@@ -52,8 +52,9 @@ STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
SHRLIB_LDFLAGS += -z defs -KPIC -G -h $@
|
||||
LOADABLE_SHRLIB_LDFLAGS += -KPIC -G -h $@
|
||||
SHRLIB_CFLAGS = -KPIC
|
||||
SHRLIB_LDFLAGS += -z defs -G -h $@ -z text
|
||||
LOADABLE_SHRLIB_LDFLAGS += -G -h $@ -z text
|
||||
|
||||
OP_SYS_LDFLAGS += -z ignore -z combreloc -z lazyload
|
||||
|
||||
|
||||
15
configure/os/CONFIG.solaris-sparc.solaris-sparc-debug
Normal file
15
configure/os/CONFIG.solaris-sparc.solaris-sparc-debug
Normal file
@@ -0,0 +1,15 @@
|
||||
# CONFIG.solaris-sparc.solaris-sparc-debug
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for solaris-sparc host - solaris-sparc-debug target build with debug compiler flags
|
||||
# Sites may override these definitions in CONFIG_SITE.solaris-sparc.solaris-sparc-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
include $(CONFIG)/os/CONFIG.solaris-sparc.solaris-sparc
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
GNU = NO
|
||||
|
||||
13
configure/os/CONFIG.solaris-sparc.solaris-sparc-gnu
Normal file
13
configure/os/CONFIG.solaris-sparc.solaris-sparc-gnu
Normal file
@@ -0,0 +1,13 @@
|
||||
# CONFIG.solaris-sparc.solaris-sparc-gnu
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for solaris-sparc host - solaris-sparc-gnu target build with gnu compiler
|
||||
# Sites may override these definitions in CONFIG_SITE.solaris-sparc.solaris-sparc-gnu
|
||||
#-------------------------------------------------------
|
||||
|
||||
include $(CONFIG)/os/CONFIG.solaris-sparc-gnu.solaris-sparc-gnu
|
||||
|
||||
BUILD_CLASS = HOST
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
# CONFIG.sun4-68k.Common
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for sun4-68k host archs
|
||||
# Sites may override these definitions in CONFIG_SITE.sun4-68k.Common
|
||||
#-------------------------------------------------------
|
||||
|
||||
#Include definitions common to unix hosts
|
||||
include $(CONFIG)/os/CONFIG.UnixCommon.Common
|
||||
|
||||
WIND_HOST_TYPE = sun4-sunos4
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# CONFIG.sun4-68k.sun4-68k
|
||||
#
|
||||
# $Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for sun4-68k target arch when host arch is sun4-68k
|
||||
# Sites may override these definitions in CONFIG_SITE.sun4-68k.sun4-68k
|
||||
#-------------------------------------------------------
|
||||
|
||||
# Include definitions common to all Unix target archs
|
||||
include $(CONFIG)/os/CONFIG.common.UnixCommon
|
||||
|
||||
OS_CLASS = sun4
|
||||
ARCH_CLASS = 68k
|
||||
|
||||
CC = cc
|
||||
CCC = CC
|
||||
CPP = $(CC) -E
|
||||
RANLIB = ranlib -t
|
||||
AR = $(CCC) -xar -o
|
||||
LD = ld -r
|
||||
|
||||
# Configure OS vendor C compilers
|
||||
CONFORM_CFLAGS_ANSI = -Xa
|
||||
CONFORM_CFLAGS_STRICT = -Xc
|
||||
CONFORM_CFLAGS_TRAD = -Xs
|
||||
CODE_CFLAGS = -pic
|
||||
WARN_CFLAGS_YES = -vc
|
||||
WARN_CFLAGS_NO = -w
|
||||
OPT_CFLAGS_YES = -O
|
||||
OPT_CFLAGS_NO = -g
|
||||
|
||||
CONFORM_CXXFLAGS_NORMAL =
|
||||
CONFORM_CXXFLAGS_STRICT =
|
||||
CONFORM_CXXFLAGS_TRAD =
|
||||
CODE_CXXFLAGS = -pic
|
||||
WARN_CXXFLAGS_YES =
|
||||
WARN_CXXFLAGS_NO = -w
|
||||
OPT_CXXFLAGS_YES = -O
|
||||
OPT_CXXFLAGS_NO = -g
|
||||
|
||||
STATIC_LDFLAGS_YES= -Bstatic
|
||||
STATIC_LDFLAGS_NO=
|
||||
STATIC_LDLIBS_YES= -Bdynamic
|
||||
STATIC_LDLIBS_NO=
|
||||
|
||||
SHRLIB_LDFLAGS = -assert pure-text -h $@
|
||||
LOADABLE_SHRLIB_LDFLAGS = -assert pure-text -h $@
|
||||
|
||||
@@ -43,6 +43,7 @@ ARCMD = $(BORLAND_BIN)/tlib $@ $(foreach lib,$(LIBRARY_LD_OBJS),+$(lib))
|
||||
CCLINKOPT = -q -tWM -tWD -a8 -D_WIN32 -D_RTLDLL
|
||||
CC = $(BORLAND_BIN)/bcc32 $(CCLINKOPT)
|
||||
LD = $(BORLAND_BIN)/bcc32 -r
|
||||
RANLIB =
|
||||
|
||||
#
|
||||
# __STDC__=0 works but not as cleanly as with
|
||||
@@ -84,7 +85,8 @@ OPT_CFLAGS_YES = -k- -H- -R- -O1 -v- -vi
|
||||
OPT_CFLAGS_NO =
|
||||
|
||||
# OS vendor c preprocessor
|
||||
CPP = $(BORLAND_BIN)/cl /E
|
||||
CPP = $(BORLAND_BIN)/cpp32 -Sr
|
||||
PREPROCESS.cpp = $(CPP) $(CPPFLAGS) $(subst /,\\,$(INCLUDES)) -o$@ $<
|
||||
|
||||
# Configure OS vendor C++ compiler
|
||||
#
|
||||
@@ -152,6 +154,7 @@ LINK_OPT_FLAGS_NO = -c -C -Gi -Gn -Tpd -x -w-
|
||||
WIN32_DLLFLAGS = $(LINK_OPT_FLAGS_$(HOST_OPT)) $(TARGET_LDFLAGS) $(LIB_LDFLAGS)
|
||||
OPT_LDFLAGS =
|
||||
|
||||
SHRLIB_CFLAGS=
|
||||
ARCH_DEP_CFLAGS=
|
||||
|
||||
# to identify the general architecture class:
|
||||
|
||||
@@ -9,3 +9,4 @@
|
||||
|
||||
include $(CONFIG)/os/CONFIG.win32-x86.win32-x86
|
||||
|
||||
HOST_OPT=NO
|
||||
|
||||
@@ -151,6 +151,8 @@ STATIC_CXXFLAGS_NO= /MD$(VISC_STATIC_CFLAGS_DEBUG) $(VISC_DLL)
|
||||
|
||||
STATIC_LDLIBS_YES=ws2_32.lib advapi32.lib user32.lib kernel32.lib winmm.lib
|
||||
STATIC_LDLIBS_NO=
|
||||
STATIC_LDFLAGS=
|
||||
RANLIB=
|
||||
|
||||
# add /profile here to run the ms profiler
|
||||
# /LTCG - whole program optimization
|
||||
@@ -161,6 +163,7 @@ LINK_OPT_FLAGS_NO = /debug /incremental:no /fixed:no
|
||||
OPT_LDFLAGS = $(LINK_OPT_FLAGS_$(HOST_OPT))
|
||||
|
||||
ARCH_DEP_CFLAGS=
|
||||
SHRLIB_CFLAGS=
|
||||
|
||||
# to identify the general architecture class:
|
||||
# should be BSD, SYSV, WIN32, ...
|
||||
|
||||
@@ -20,4 +20,3 @@
|
||||
# If readline is not installed comment the following line
|
||||
# to omit command-line editing and history support
|
||||
COMMANDLINE_LIBRARY = READLINE
|
||||
LDLIBS_READLINE = -lreadline -lncurses
|
||||
|
||||
@@ -5,5 +5,3 @@
|
||||
#Compiles for profiling with the gprof profiler.
|
||||
#GPROF=YES
|
||||
|
||||
# Removes -O optimization and adds -g compile option
|
||||
HOST_OPT=NO
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
|
||||
# Removes optimization and adds debugging options
|
||||
HOST_OPT=NO
|
||||
@@ -1,7 +1,7 @@
|
||||
# $Id$
|
||||
|
||||
# Microsoft Visual C++ .NET is the default compiler
|
||||
# If you have Visual C++ 6.0, uncomment the following 4 override lines
|
||||
# If you have Visual C++ 6.0, uncomment the following override lines
|
||||
# This will to eliminate warnings about unknown options /GL, LTCG, and /44355.
|
||||
#OPT_CFLAGS_YES = /Ox
|
||||
#OPT_CXXFLAGS_YES = /Ox
|
||||
|
||||
@@ -14,9 +14,6 @@ eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
#
|
||||
# Parse configure/RELEASE file(s) and generate a derived output file.
|
||||
#
|
||||
# This tool replaces makeConfigAppInclude.pl, makeIocCdCommands.pl and
|
||||
# makeRulesInclude.pl and adds consistency checks for RELEASE files.
|
||||
#
|
||||
|
||||
use Cwd;
|
||||
use Getopt::Std;
|
||||
@@ -25,7 +22,7 @@ $cwd = cwd();
|
||||
$cwd =~ s/\/tmp_mnt//; # hack for sun4
|
||||
$cwd =~ s/\\/\//g; # hack for win32
|
||||
|
||||
getopt "aht";
|
||||
getopt "ahtT";
|
||||
|
||||
if ($opt_a) {
|
||||
$arch = $opt_a;
|
||||
@@ -37,29 +34,28 @@ if ($opt_a) {
|
||||
$hostarch = $arch;
|
||||
$hostarch = $opt_h if ($opt_h);
|
||||
|
||||
# Find $top from current path; NB only works under iocBoot/* and configure/*
|
||||
$top = $cwd;
|
||||
#$top =~ s/^\/cygdrive\/(\w)\//$1:\//;
|
||||
$top =~ s/\/iocBoot.*$//;
|
||||
$top =~ s/\/configure.*$//;
|
||||
if ($^O eq "cygwin") {
|
||||
chomp($top = `cygpath -m $top`);
|
||||
if ($opt_T) {
|
||||
$top = $opt_T;
|
||||
} else { # Find $top from current path
|
||||
# This approach is only possible under iocBoot/* and configure/*
|
||||
$top = $cwd;
|
||||
$top =~ s/\/iocBoot.*$//;
|
||||
$top =~ s/\/configure.*$//;
|
||||
chomp($top = `cygpath -m $top`) if ($^O eq "cygwin");
|
||||
}
|
||||
|
||||
# The IOC may need a different path to get to $top
|
||||
if ($opt_t) {
|
||||
$iocroot = $ioctop = $opt_t;
|
||||
$iocroot = $opt_t;
|
||||
$root = $top;
|
||||
while (substr($iocroot, -1, 1) eq substr($root, -1, 1)) {
|
||||
chop $iocroot;
|
||||
chop $root;
|
||||
}
|
||||
} else {
|
||||
$ioctop = $top;
|
||||
}
|
||||
|
||||
unless (@ARGV == 1) {
|
||||
print "Usage: convertRelease.pl [-a arch] [-h hostarch] [-t ioctop] outfile\n";
|
||||
print "Usage: convertRelease.pl [-a arch] [-h hostarch] [-T top] [-t ioctop] outfile\n";
|
||||
print " where outfile is be one of:\n";
|
||||
print "\tcheckRelease - checks consistency with support apps\n";
|
||||
print "\tcdCommands - generate cd path strings for vxWorks IOCs\n";
|
||||
@@ -76,13 +72,8 @@ $outfile = $ARGV[0];
|
||||
|
||||
# Read the RELEASE file(s)
|
||||
$relfile = "$top/configure/RELEASE";
|
||||
die "Can't find configure/RELEASE file" unless (-f $relfile);
|
||||
&readRelease($relfile, \%macros, \@apps);
|
||||
|
||||
if ($hostarch) {
|
||||
$relfile .= ".$hostarch";
|
||||
&readRelease($relfile, \%macros, \@apps) if (-r $relfile);
|
||||
}
|
||||
die "Can't find configure/RELEASE file" unless (-r $relfile);
|
||||
&readReleaseFiles($relfile, \%macros, \@apps);
|
||||
&expandRelease(\%macros, \@apps);
|
||||
|
||||
|
||||
@@ -97,7 +88,29 @@ for ($outfile) {
|
||||
}
|
||||
|
||||
#
|
||||
# Parse a configure/RELEASE file.
|
||||
# Parse all relevent configure/RELEASE* files and includes
|
||||
#
|
||||
sub readReleaseFiles {
|
||||
my ($relfile, $Rmacros, $Rapps) = @_;
|
||||
|
||||
return unless (-r $relfile);
|
||||
&readRelease($relfile, $Rmacros, $Rapps);
|
||||
if ($hostarch) {
|
||||
my ($hrelfile) = "$relfile.$hostarch";
|
||||
&readRelease($hrelfile, $Rmacros, $Rapps) if (-r $hrelfile);
|
||||
}
|
||||
if ($arch) {
|
||||
my ($crelfile) = "$relfile.Common.$arch";
|
||||
&readRelease($crelfile, $Rmacros, $Rapps) if (-r $crelfile);
|
||||
if ($hostarch) {
|
||||
my ($arelfile) = "$relfile.$hostarch.$arch";
|
||||
&readRelease($arelfile, $Rmacros, $Rapps) if (-r $arelfile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Parse a configure/RELEASE file and its includes.
|
||||
#
|
||||
# NB: This subroutine also appears in base/src/makeBaseApp/makeBaseApp.pl
|
||||
# If you make changes here, they will be needed there as well.
|
||||
@@ -113,7 +126,7 @@ sub readRelease {
|
||||
s/\r$//; # Shouldn't need this, but sometimes...
|
||||
s/\s*#.*$//; # Remove trailing comments
|
||||
s/\s+$//; # Remove trailing whitespace
|
||||
next if /^\s*$/; # Skip blank lines
|
||||
next if /^\s*$/; # Skip blank lines
|
||||
|
||||
# Expand all already-defined macros in the line:
|
||||
while (($pre,$var,$post) = /(.*)\$\((\w+)\)(.*)/) {
|
||||
@@ -165,23 +178,23 @@ sub configAppInclude {
|
||||
print OUT "export ${app}\n";
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/bin/$hostarch");
|
||||
print OUT "${app}_HOST_BIN = \$(strip \$($app))/bin/\$(EPICS_HOST_ARCH)\n";
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/lib/$hostarch");
|
||||
print OUT "${app}_HOST_LIB = \$(strip \$($app))/bin/\$(EPICS_HOST_ARCH)\n";
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/bin/$arch");
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/bin/$arch");
|
||||
print OUT "${app}_BIN = \$(strip \$($app))/bin/$arch\n";
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/lib/$arch");
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/lib/$arch");
|
||||
print OUT "${app}_LIB = \$(strip \$($app))/lib/$arch\n";
|
||||
}
|
||||
# We can't just include TOP in the foreach list:
|
||||
@@ -191,20 +204,20 @@ sub configAppInclude {
|
||||
print OUT "SHRLIB_SEARCH_DIRS = $path/lib/$arch\n";
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/lib/$arch");
|
||||
next unless (-d "$path/lib/$arch");
|
||||
print OUT "SHRLIB_SEARCH_DIRS += \$(${app}_LIB)\n";
|
||||
}
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/include");
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/include");
|
||||
print OUT "RELEASE_INCLUDES += -I\$(strip \$($app))/include/os/\$(OS_CLASS)\n";
|
||||
print OUT "RELEASE_INCLUDES += -I\$(strip \$($app))/include\n";
|
||||
}
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/dbd");
|
||||
print OUT "RELEASE_DBDFLAGS += -I \$(strip \$($app))/dbd\n";
|
||||
$path = $macros{$app};
|
||||
next unless (-d "$path/dbd");
|
||||
print OUT "RELEASE_DBDFLAGS += -I \$(strip \$($app))/dbd\n";
|
||||
}
|
||||
close OUT;
|
||||
}
|
||||
@@ -218,8 +231,8 @@ sub rulesInclude {
|
||||
print OUT "# be lost when the application is next rebuilt.\n\n";
|
||||
|
||||
foreach $app (@includes) {
|
||||
$path = $macros{$app};
|
||||
next unless (-r "$path/configure/RULES_BUILD");
|
||||
$path = $macros{$app};
|
||||
next unless (-r "$path/configure/RULES_BUILD");
|
||||
print OUT "-include \$(strip \$($app))/configure/RULES_BUILD\n";
|
||||
}
|
||||
close OUT;
|
||||
@@ -237,17 +250,23 @@ sub cdCommands {
|
||||
|
||||
print OUT "startup = \"$startup\"\n";
|
||||
|
||||
$ioc = $cwd;
|
||||
$ioc =~ s/^.*\///; # iocname is last component of directory name
|
||||
|
||||
print OUT "putenv \"ARCH=$arch\"\n";
|
||||
print OUT "putenv \"IOC=$ioc\"\n";
|
||||
|
||||
foreach $app (@includes) {
|
||||
$iocpath = $path = $macros{$app};
|
||||
$iocpath =~ s/^$root/$iocroot/o if ($opt_t);
|
||||
$app_lc = lc($app);
|
||||
$app_uc = uc($app);
|
||||
print OUT "$app_lc = \"$iocpath\"\n" if (-d $path);
|
||||
print OUT "putenv \"$app_uc=$iocpath\"\n" if (-d $path);
|
||||
print OUT "putenv \"$app=$iocpath\"\n" if (-d $path);
|
||||
print OUT "${app_lc}bin = \"$iocpath/bin/$arch\"\n" if (-d "$path/bin/$arch");
|
||||
}
|
||||
close OUT;
|
||||
}
|
||||
|
||||
sub envPaths {
|
||||
die "Architecture not set (use -a option)" unless ($arch);
|
||||
@includes = grep !/^TEMPLATE_TOP$/, @apps;
|
||||
@@ -256,7 +275,7 @@ sub envPaths {
|
||||
open(OUT,">$outfile") or die "$! creating $outfile";
|
||||
|
||||
$ioc = $cwd;
|
||||
$ioc =~ s/^.*\///;
|
||||
$ioc =~ s/^.*\///; # iocname is last component of directory name
|
||||
|
||||
print OUT "epicsEnvSet(ARCH,\"$arch\")\n";
|
||||
print OUT "epicsEnvSet(IOC,\"$ioc\")\n";
|
||||
@@ -264,10 +283,11 @@ sub envPaths {
|
||||
foreach $app (@includes) {
|
||||
$iocpath = $path = $macros{$app};
|
||||
$iocpath =~ s/^$root/$iocroot/o if ($opt_t);
|
||||
print OUT "epicsEnvSet($app,\"$iocpath\")\n" if (-d $path);
|
||||
print OUT "epicsEnvSet($app,\"$iocpath\")\n" if (-d $path);
|
||||
}
|
||||
close OUT;
|
||||
}
|
||||
|
||||
sub checkRelease {
|
||||
$status = 0;
|
||||
delete $macros{TOP};
|
||||
@@ -277,11 +297,7 @@ sub checkRelease {
|
||||
%check = (TOP => $path);
|
||||
@order = ();
|
||||
$relfile = "$path/configure/RELEASE";
|
||||
&readRelease($relfile, \%check, \@order) if (-r $relfile);
|
||||
if ($hostarch) {
|
||||
$relfile .= ".$hostarch";
|
||||
&readRelease($relfile, \%check, \@order) if (-r $relfile);
|
||||
}
|
||||
&readReleaseFiles($relfile, \%check, \@order);
|
||||
&expandRelease(\%check, \@order);
|
||||
delete $check{TOP};
|
||||
|
||||
|
||||
31
configure/tools/dos2unix.pl
Normal file
31
configure/tools/dos2unix.pl
Normal file
@@ -0,0 +1,31 @@
|
||||
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
if $running_under_some_shell; # makeConfigAppInclude.pl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
# Converts text file in DOS CR/LF format to unix ISO format
|
||||
# $Id$
|
||||
|
||||
@files=@ARGV;
|
||||
|
||||
$| = 1;
|
||||
foreach( @files ) {
|
||||
open(INPUT, "<$_");
|
||||
$backup = "$_.bak";
|
||||
rename( $_, $backup) || die "Unable to rename $_\n$!\n";
|
||||
open(OUTPUT, ">$_");
|
||||
while(<INPUT>) {
|
||||
s/\r\n/\n/;
|
||||
print OUTPUT;
|
||||
}
|
||||
close INPUT;
|
||||
close OUTPUT;
|
||||
unlink ($backup) or die "Cannot remove $backup";
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
if $running_under_some_shell; # makeDependsTargets.pl
|
||||
if $running_under_some_shell; # filterWarnings.pl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# Copyright (c) 2002 Berliner Elektronenspeicherringgesellschaft fuer
|
||||
# Synchrotronstrahlung.
|
||||
# EPICS BASE Versions 3.13.7
|
||||
# and higher are distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
@@ -34,7 +36,7 @@ while ( $errline = <> ) {
|
||||
($errno) = ($errline =~ m/.* ([0-9]+):/);
|
||||
$codeline = <>;
|
||||
$pointline = <>;
|
||||
next if $codeline =~ m|//\s*X.*aCC[^a-zA-Z]*$errno|;
|
||||
next if $codeline =~ m|/[/*]\s*X.*aCC[^a-zA-Z]*$errno|;
|
||||
|
||||
print wrap ("", " ", $errline);
|
||||
print $codeline;
|
||||
|
||||
@@ -68,6 +68,13 @@ foreach $name ( @nameList ) {
|
||||
print OUT "${name}_LDFLAGS+=\$(${name}_LDFLAGS_DEFAULT)\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "ifneq (\$(strip \$(${name}_OBJLIBS_\$(OS_CLASS))),)\n";
|
||||
print OUT "${name}_OBJLIBS+=\$(subst -nil-,,\$(${name}_OBJLIBS_\$(OS_CLASS)))\n";
|
||||
print OUT "else\n";
|
||||
print OUT "ifdef ${name}_OBJLIBS_DEFAULT\n";
|
||||
print OUT "${name}_OBJLIBS+=\$(${name}_OBJLIBS_DEFAULT)\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "ifneq (\$(strip \$(${name}_LDOBJS_\$(OS_CLASS))),)\n";
|
||||
print OUT "${name}_LDOBJS+=\$(subst -nil-,,\$(${name}_LDOBJS_\$(OS_CLASS)))\n";
|
||||
print OUT "else\n";
|
||||
@@ -75,6 +82,7 @@ foreach $name ( @nameList ) {
|
||||
print OUT "${name}_LDOBJS+=\$(${name}_LDOBJS_DEFAULT)\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "${name}_LDLIBS+=\$(${name}_LIBS)\n";
|
||||
print OUT "ifneq (\$(strip \$(${name}_LIBS_\$(OS_CLASS))),)\n";
|
||||
print OUT "${name}_LDLIBS+=\$(subst -nil-,,\$(${name}_LIBS_\$(OS_CLASS)))\n";
|
||||
print OUT "else\n";
|
||||
@@ -82,7 +90,6 @@ foreach $name ( @nameList ) {
|
||||
print OUT "${name}_LDLIBS+=\$(${name}_LIBS_DEFAULT)\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "endif\n";
|
||||
print OUT "${name}_LDLIBS+=\$(${name}_LIBS)\n";
|
||||
print OUT "ifneq (\$(strip \$(${name}_SYS_LIBS_\$(OS_CLASS))),)\n";
|
||||
print OUT "${name}_SYS_LIBS+=\$(subst -nil-,,\$(${name}_SYS_LIBS_\$(OS_CLASS)))\n";
|
||||
print OUT "else\n";
|
||||
|
||||
@@ -102,8 +102,8 @@ from the st.cmd files in the iocBoot subdirectories.
|
||||
<p>Remove</p>
|
||||
<pre>ld < iocCore
|
||||
</pre>
|
||||
<p>Immediately after the dbLoadDatabase command add</p>
|
||||
<pre>registerRecordDeviceDriver(pdbbase)
|
||||
<p>Immediately after the dbLoadDatabase(xxx.dbd) command add</p>
|
||||
<pre>xxx_registerRecordDeviceDriver(pdbbase)
|
||||
</pre>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h2>Converting an EPICS R3.13 application to R3.14.3</h2>
|
||||
<h2>Converting an EPICS R3.13 application to R3.14.4</h2>
|
||||
</center>
|
||||
|
||||
<p><br>
|
||||
This document describes how to convert a R3.13 vxWorks application so that it
|
||||
builds with release R3.14.3. It describes procedures such that:</p>
|
||||
builds with release R3.14.4. It describes procedures such that:</p>
|
||||
<ul>
|
||||
<li>The application uses the configure rules which are new to R3.14.</li>
|
||||
</ul>
|
||||
@@ -50,7 +50,7 @@ If sequence programs (*.st or *.stt files) exist in your application, add the
|
||||
SNCSEQ location definition for the R3.14 seq external module</p>
|
||||
|
||||
<p><tt>SNCSEQ =<full path to seq module top></tt></p>
|
||||
The R3.14 seq module must exist and be built with EPICS base R3.14.3
|
||||
The R3.14 seq module must exist and be built with EPICS base R3.14.4
|
||||
|
||||
<h3>Modify the Makefiles in <top>/*App directories.</h3>
|
||||
|
||||
@@ -167,6 +167,134 @@ example_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
|
||||
<p>After these changes are made the following files are no longer needed:
|
||||
baseLIBOBS, Makefile.Host, and Makefile.Vx</p>
|
||||
|
||||
<h3>File base.dbd no longer needed</h3>
|
||||
|
||||
<blockquote>
|
||||
You now can add the line include "base.dbd" to your
|
||||
<appname>Include.dbd file and remove the file
|
||||
<name>App/src/base.dbd from your src directory. The base.dbd from
|
||||
base/dbd will be included. However, if you only want a subset of
|
||||
record definitions from base you should keep your base.dbd
|
||||
file.</blockquote>
|
||||
|
||||
<h3>Record support</h3>
|
||||
|
||||
<blockquote>
|
||||
Add the following line after all existing #includes
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
The structure rset is now a typedef so change
|
||||
|
||||
<blockquote>
|
||||
<pre>struct rset <recordname>RSET={ ...</pre>
|
||||
</blockquote>
|
||||
to
|
||||
|
||||
<blockquote>
|
||||
<pre>rset <recordname>RSET={ ...</pre>
|
||||
</blockquote>
|
||||
and add the following line after the "rset <recordname>RSET="
|
||||
definition.
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(rset,xxxRSET);</pre>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<h3>Device support</h3>
|
||||
|
||||
<blockquote>
|
||||
Add the following line after all existing #includes
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
and add the following line after the dset dev<devname> definition
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(dset,dev<devname>);</pre>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<h3>Driver support</h3>
|
||||
|
||||
<blockquote>
|
||||
Add the following line after all existing #includes
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
and add the following line after the drvet dev<devname> definition
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportAddress(drvet,drv<devname>);</pre>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<h3>Registration code changed</h3>
|
||||
|
||||
<blockquote>
|
||||
Registration code for application specific functions, e.g. subroutine
|
||||
record init and process functions, has been changed as follows
|
||||
|
||||
<p>1) Include the registration support header files:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "dbDefs.h"
|
||||
#include "registryFunction.h"</pre>
|
||||
</blockquote>
|
||||
2) Include the export definitions header file after including all other
|
||||
header files:
|
||||
|
||||
<blockquote>
|
||||
<pre>#include "epicsExport.h"</pre>
|
||||
</blockquote>
|
||||
3) Make the application specific functions static functions, e.g.
|
||||
|
||||
<blockquote>
|
||||
<pre>static long mySubInit(subRecord *precord,processMethod process)
|
||||
static long mySubProcess(subRecord *precord)</pre>
|
||||
</blockquote>
|
||||
4) Define a registryFunctionRef array of the application specific functions
|
||||
to be registered, e.g.
|
||||
|
||||
<blockquote>
|
||||
<pre>static registryFunctionRef mySubRef[] = {
|
||||
{"mySubInit",(REGISTRYFUNCTION)mySubInit},
|
||||
{"mySubProcess",(REGISTRYFUNCTION)mySubProcess}
|
||||
};</pre>
|
||||
</blockquote>
|
||||
5) Add a new function to do the registration of the registryFunctionRef
|
||||
array elements, e.g.
|
||||
|
||||
<blockquote>
|
||||
<pre>void mySub(void)
|
||||
{
|
||||
registryFunctionRefAdd(mySubRef,NELEMENTS(mySubRef));
|
||||
}</pre>
|
||||
</blockquote>
|
||||
6) Call the epicsExportRegistrar with the new registration function: e.g.
|
||||
|
||||
<blockquote>
|
||||
<pre>epicsExportRegistrar(mySub);</pre>
|
||||
</blockquote>
|
||||
7) Remove the existing function lines in <appname>Include.dbd: e.g.
|
||||
remove
|
||||
|
||||
<blockquote>
|
||||
<pre>function("mySubInit")
|
||||
function("mySubProcess")</pre>
|
||||
</blockquote>
|
||||
8) Add a registrar statement to <name>Include.dbd with the new
|
||||
registration function as parameter: e.g. add
|
||||
|
||||
<blockquote>
|
||||
<pre>registrar("mySub")</pre>
|
||||
</blockquote>
|
||||
</blockquote>
|
||||
|
||||
<h3>Modify the Makefiles in <top>/iocBoot directory.</h3>
|
||||
|
||||
<p>Change " i<tt>nclude $(TOP)/config/CONFIG_APP" </tt>to "<tt>include
|
||||
@@ -196,7 +324,11 @@ $(TOP)/configure/RULES.ioc"</tt></p>
|
||||
|
||||
<p>If it exists remove the line</p>
|
||||
|
||||
<p><tt>buildInstall: cdCommands</tt></p>
|
||||
<p><tt>buildInstall: cdCommands </tt></p>
|
||||
|
||||
<p>Add the line</p>
|
||||
<p><tt>TARGETS = cdCommands</tt></p>
|
||||
<p>before the include for RULES.ioc line.</p>
|
||||
|
||||
<h3>Modify st.cmd in <top>/iocBoot/ioc* directories.</h3>
|
||||
|
||||
@@ -207,13 +339,17 @@ ld < iocCore</pre>
|
||||
<p>Change "<tt>ld < <libname>Lib</tt>" to "<tt>ld <
|
||||
<libname>.munch"</tt></p>
|
||||
|
||||
<p>Change "<tt>cd appbin</tt>" to "<tt>cd topbin</tt>"</p>
|
||||
|
||||
<p>Change the statement:</p>
|
||||
|
||||
<p><tt>dbLoadDatabase("../../dbd/exampleApp.dbd")</tt> <br>
|
||||
</p>
|
||||
to
|
||||
<pre>dbLoadDatabase("../../dbd/<name>.dbd")
|
||||
registerRecordDeviceDriver(pdbbase)</pre>
|
||||
<name>_registerRecordDeviceDriver(pdbbase)</pre>
|
||||
|
||||
<p>where <name> is replaced with the name of your dbd file.</p>
|
||||
|
||||
<h3>recGbl calls</h3>
|
||||
|
||||
@@ -230,18 +366,13 @@ base.dbd. If these record types are used at your site, they
|
||||
downloaded and built with base R3.14 by your EPICS administrator. To update
|
||||
the R3.14 location of these record types in your application you must add
|
||||
appropriate module definitions to your application's config/RELEASE file and
|
||||
change the <tt>LIBOBJS</tt> definitions.</p>
|
||||
add <tt>LIBOBJS</tt> definitions to the src Makefile.</p>
|
||||
|
||||
<p>For example add</p>
|
||||
|
||||
<p> <tt>PID=<full path to modules directory>/pid</tt></p>
|
||||
|
||||
<p>to config/RELEASE. <br>
|
||||
Remove</p>
|
||||
|
||||
<p> <tt>LIBOBJS += $(EPICS_BASE_BIN)/pidRecord.o</tt></p>
|
||||
|
||||
<p>from baseLIBOBJS, and add</p>
|
||||
<p>to config/RELEASE and add <br>
|
||||
|
||||
<p></p>
|
||||
|
||||
@@ -298,8 +429,7 @@ administrator. dbLoadTemplate is still supported on iocs.
|
||||
application, db files are created from template and substitution files you
|
||||
should add the definition</p>
|
||||
|
||||
<p><tt>EPICS_EXTENSIONS=<full path name to epics extensions
|
||||
directory></tt></p>
|
||||
<p><tt>MSI=<full path name to msi executable></tt></p>
|
||||
|
||||
<p>to your application config/RELEASE file.</p>
|
||||
<br>
|
||||
|
||||
@@ -6,10 +6,32 @@
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h2> Converting an EPICS R3.14.2 application to R3.14.3</h2></center>
|
||||
<h2>Converting an EPICS R3.14.2 application to R3.14.3</h2></center>
|
||||
|
||||
<p><br>This document describes how to convert a R3.14.2 application
|
||||
so that it builds with release R3.14.3.
|
||||
<p>This document describes how to convert a R3.14.2 application
|
||||
so that it builds and runs properly with release R3.14.3.</p>
|
||||
|
||||
</p><h3>No changes required.</h3>
|
||||
<h3>registerRecordDeviceDriver Name Change</h3>
|
||||
|
||||
<p>All application iocBoot/iocxxx/st.cmd files must be modified for R3.14.3 as
|
||||
the generated routine that registers record device and driver support has been
|
||||
renamed to incorporate the name of the dbd file it came from. The change to
|
||||
the startup script is straightforward; any pair of lines like this:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>dbLoadDatabase("dbd/<i>something</i>.dbd",0,0)
|
||||
registerRecordDeviceDriver(pdbbase)</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>must have the second line changed so the result looks like this:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>dbLoadDatabase("dbd/<i>something</i>.dbd",0,0)
|
||||
<i>something</i>_registerRecordDeviceDriver(pdbbase)</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>There may be other pathname components in the dbLoadDatabase line which
|
||||
should remain exactly as before.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
17
documentation/ConvertingR3.14.3AppsToR3.14.4.html
Normal file
17
documentation/ConvertingR3.14.3AppsToR3.14.4.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="jba">
|
||||
<meta name="GENERATOR" content="Mozilla/4.77 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]"></head>
|
||||
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h2>Converting an EPICS R3.14.3 application to R3.14.4</h2></center>
|
||||
|
||||
<p>This document describes how to convert a R3.14.3 application
|
||||
so that it builds and runs properly with release R3.14.4.</p>
|
||||
|
||||
</p><h3>No changes required.</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
17
documentation/ConvertingR3.14.4AppsToR3.14.5.html
Normal file
17
documentation/ConvertingR3.14.4AppsToR3.14.5.html
Normal file
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en"><html><head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<meta name="Author" content="jba">
|
||||
<meta name="GENERATOR" content="Mozilla/4.77 [en] (X11; U; SunOS 5.8 sun4u) [Netscape]"></head>
|
||||
|
||||
<body>
|
||||
|
||||
<center>
|
||||
<h2>Converting an EPICS R3.14.4 application to R3.14.5</h2></center>
|
||||
|
||||
<p>This document describes how to convert a R3.14.4 application
|
||||
so that it builds and runs properly with release R3.14.5.</p>
|
||||
|
||||
</p><h3>No changes required.</h3>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -9,9 +9,18 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1 style="text-align: center">EPICS base R3.14.3: Known Problems</h1>
|
||||
<h1 style="text-align: center">EPICS base R3.14.4: Known Problems</h1>
|
||||
|
||||
<h3>Known Bugs</h3>
|
||||
<h3>Known Bugs R3.14.4</h3>
|
||||
|
||||
<h4>exampleApp sequencer</h4>
|
||||
<p>The following must be added to exampleInclude.dbd</p>
|
||||
</pre>registrar(sncExampleRegistrar)</pre>
|
||||
<h4>mbboRecord</h4>
|
||||
<p>
|
||||
If a database link is made to an mbbo record with a request type of DBR_STRING then the DBR_STRING value is the numeric value of the VAL field converted to a string. It should be the appropriate choice string indexed by the VAL field.
|
||||
An example is the DOL link of a stringout record linked to an mbbo record.
|
||||
This bug has been in all releases since 3.13.6<p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -4,7 +4,7 @@ README.1st
|
||||
|
||||
EPICS base
|
||||
|
||||
Release 3.14.3
|
||||
Release 3.14.4
|
||||
|
||||
What is EPICS base?
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ of my Bash login script (~/.bash_login):
|
||||
#
|
||||
# EPICS
|
||||
#
|
||||
EPICS_BASE="${HOME}/src/EPICS/work/epics/base"
|
||||
EPICS_EXTENSIONS="${HOME}/src/EPICS/work/epics/extensions"
|
||||
EPICS_BASE="${HOME}/src/EPICS/base"
|
||||
EPICS_EXTENSIONS="${HOME}/src/EPICS/extensions"
|
||||
<strong>.</strong> "${EPICS_BASE}"/startup/Site.profile
|
||||
</pre>
|
||||
</li>
|
||||
@@ -37,7 +37,7 @@ Run <code>make</code>.
|
||||
|
||||
<li>
|
||||
As distributed, EPICS on Mac OS X uses the default command line input
|
||||
routines. IOC applications are much more pleasant to interact with if
|
||||
routines. IOC applications are more pleasant to interact with if
|
||||
either the readline or libtecla library is used. The easiest
|
||||
way to get either or both of these libraries on to your system is to
|
||||
download and install them using the either the DarwinPorts
|
||||
|
||||
@@ -17,7 +17,7 @@ Tools needed
|
||||
- HP's ANSI C compiler (cc)
|
||||
|
||||
- Recent version of HP's aCC C++ compiler aCC
|
||||
(we currently use A.03.45; A.03.39 should also do)
|
||||
(we currently use A.03.52; anything >= A.03.39 should also do)
|
||||
HP's old frontend-based C++ compiler (CC) will not work.
|
||||
|
||||
o For compiling with the GNU compilers
|
||||
|
||||
@@ -17,7 +17,7 @@ EPICS base</h2></center>
|
||||
|
||||
<center>
|
||||
<h2>
|
||||
Release 3.14.3</h2></center>
|
||||
Release 3.14.4</h2></center>
|
||||
|
||||
<h3>
|
||||
What is EPICS base?</h3>
|
||||
|
||||
@@ -3,17 +3,241 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
<title>EPICS Base Release R3.14.3</title>
|
||||
<title>EPICS Base R3.14.x Release Notes</title>
|
||||
</head>
|
||||
|
||||
<body lang="en">
|
||||
|
||||
<center>
|
||||
<h1>EPICS Base Release 3.14.3</h1>
|
||||
<h1 align='center'>EPICS Base Release 3.14.5<br>
|
||||
4 February 2004</h1>
|
||||
|
||||
<h1>4 September 2003</h1>
|
||||
<h2 align='center'>Changes since 3.14.4</h2>
|
||||
|
||||
<h4>dbtr</h4>
|
||||
|
||||
<p>Don't seg-fault if no argument is passed to dbtr.</p>
|
||||
|
||||
<h4>New build targets.</h4>
|
||||
|
||||
<p>New files have been created in configure/os to allow
|
||||
CROSS_COMPILER_TARGET_ARCHS to include solaris-sparc-gnu and
|
||||
solaris-sparc-debug when EPICS_HOST_ARCH is solaris-sparc. Also
|
||||
CROSS_COMPILER_TARGET_ARCHS can now include linux-x86-debug when
|
||||
EPICS_HOST_ARCH is linux-x86.</p>
|
||||
|
||||
<h4>New epicsString.h function</h4>
|
||||
|
||||
<p>A new function epicsStrnCaseCmp has been added. It is like strncmp except
|
||||
that it ignores case.</p>
|
||||
|
||||
<h4>R3.13 compatability files</h4>
|
||||
|
||||
<p>R3.13 compatability files are no longer generated automatically during the
|
||||
build. configure/CONFIG_SITE contains two new macros for building
|
||||
compatibility files. They are set to NO but can be set to YES. The macros
|
||||
are:</p>
|
||||
<ul>
|
||||
<li>COMPAT_TOOLS_313
|
||||
<p>This will install the compatibility files needed to build R3.13
|
||||
extensions built with this R3.14 base.</p>
|
||||
</li>
|
||||
<li>COMPAT_313
|
||||
<p>This will install the compatibility files needed to build R3.13
|
||||
extensions and IOC applications built with this R3.14 base.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h4>APS Virtual LINAC Templates</h4>
|
||||
|
||||
<p>A new set of templates has been included in R3.14.5 to implement a Virtual
|
||||
LINAC in an ioc using databases and sequence programs. The Virtual LINAC
|
||||
simulates the generation and transmission of an electron beam down a LINAC.
|
||||
Several steering coils, BPMs, and other typical accelerator components are
|
||||
simulated to provide a realistic interaction between the operator and the
|
||||
"LINAC". Since it is an entirely soft application, it will work on any
|
||||
platform. An medm display is provided as the primary GUI. It can also be used
|
||||
to experiment with other CA client tools.</p>
|
||||
|
||||
<p>To install the templates, use the following commands:</p>
|
||||
<pre> mkdir <top>
|
||||
cd <top>
|
||||
<base>/bin/<arch>/makeBaseApp.pl -t vlinac vlinac
|
||||
<base>/bin/<arch>/makeBaseApp.pl -i -t vlinac vlinac</pre>
|
||||
|
||||
<p>For further information, see:</p>
|
||||
<pre> <top>/vlinacApp/misc/README
|
||||
<top>/vlinacApp/misc/Virtual_Linac_Info.pdf</pre>
|
||||
|
||||
<h4>Stringin record time-stamp soft device support</h4>
|
||||
Add simple device support for converting time to nicely-formatted string
|
||||
using INP field as epicsTimeToStrftime format string:
|
||||
<pre>record(stringin, "$(user):now")
|
||||
{
|
||||
field(DESC, "Current time and date")
|
||||
field(DTYP, "Soft Timestamp")
|
||||
field(INP, "@%Y-%m-%d %H:%M:%S.%03f")
|
||||
}</pre>
|
||||
|
||||
<h4>Channel Access Portable Server (used by the CA gateway and others)</h4>
|
||||
<ul>
|
||||
<li>Fixed failure occurring if client disconnected while asynchronous PV
|
||||
attach was outstanding, or, for enumerated native type process variables,
|
||||
while enumerated string table cache asynchronous IO was outstanding. This
|
||||
problem does not occur in IOCs because they are not yet based on the
|
||||
portable server library. This bug was first detected by Ken Evans in the
|
||||
production CA gateway at the APS.</li>
|
||||
</ul>
|
||||
|
||||
<h4>Channel Access Original Server (used in IOC) </h4>
|
||||
<ul>
|
||||
<li>A bug causing the server threads to become stuck in a state where they
|
||||
process requests, but no longer send responses, if in the past the system
|
||||
was experiencing network buffer starvation has been fixed. This problem
|
||||
existed probably in all previous EPICS releases, but network buffer
|
||||
starvation issues have become more prevalent starting with Tornado
|
||||
2.0.</li>
|
||||
<li>Users noticed that UDP related output from the casr diagnostic was
|
||||
easily confused with the information from casr for TCP circuits. This has
|
||||
been fixed.</li>
|
||||
</ul>
|
||||
|
||||
<h4>Channel Access Client Library</h4>
|
||||
<ul>
|
||||
<li>Disconnect behavior is now more robust in response to congestion. When
|
||||
a channel times out, the channel is disconnected, but not the circuit.
|
||||
The circuit is only disconnected when the internal TCP/IP keepalive timer
|
||||
fires or if teh IOC reboots with the same IP address. This will result in
|
||||
less UDP search traffic during periods of congestion and also less TCP/IP
|
||||
circuit thrashing. A side effect will be that if a user turns off a
|
||||
vxWorks IOC, changes its IP address, and then reboots it, then the user
|
||||
will need to wait out the full duration of the TCP/IP keepalive timer
|
||||
before the client will reconnect. This is undoubtedly a negative side
|
||||
effect, but it is felt that the improvements in robustness justify the
|
||||
confusion resulting in the small number of situations that a vxWorks
|
||||
IOC's IP address is changed.</li>
|
||||
<li>In previous releases if a directory service returns the address of a CA
|
||||
server that does <em>not</em> have the PV that is being sought then the
|
||||
client library could end up sending search requests at a very high rate.
|
||||
This problem has been fixed by placing all disconnected channels in a
|
||||
queue implementing a short delay prior to there being ready again for
|
||||
periodic name resolution requests.</li>
|
||||
<li>In previous R3.14 releases the CA client library's search datagram
|
||||
interval exponential backoff was flawed. CA's search datagram interval
|
||||
exponential backoff should proceed following the sequence 30mS, 60mS,
|
||||
120mS, 240mS, and so on. Or a similar behavior with higher initial delays
|
||||
resulting from a round trip time delay estimate greater than 30 mS.
|
||||
However, instead the backoff delays were 30mS, 30mS, 30mS, 30mS, 30mS,
|
||||
30mS, 60mS, 120mS, 240mS, and on. This bug also impacted what CA does
|
||||
when a channel disconnects or there is a beacon anomaly ( a new server
|
||||
event). The intent was to start the search delay for disconnected
|
||||
channels in these situations at 2 seconds but due to the above bug the
|
||||
delay was more like 64mS. This bug appears only in earlier versions of
|
||||
EPICS R3.14.</li>
|
||||
</ul>
|
||||
|
||||
<h4>dbCa</h4>
|
||||
|
||||
<p>Better error messages are now generated.</p>
|
||||
|
||||
<p>dbCaPutLinkCallback is a new function. It provides the ability to
|
||||
implement record/driver support that does not complete until a channel access
|
||||
put callback has completed. See the Application Developer's Guide for
|
||||
details.</p>
|
||||
|
||||
<p>dbCaAddLinkCallback is a new function. The caller can provide a connect
|
||||
and monitor callback. See the Application Developer's Guide for details.</p>
|
||||
|
||||
<h4>devXxSoftCallback</h4>
|
||||
|
||||
<p>Soft device that uses dbCaPutLinkCallback has been written for ao, bo,
|
||||
calcout, longout, mbbo, mbboDirect, and stringout records. The dbd
|
||||
definitions have been added to devSoft.dbd. In other to use the new support
|
||||
the DTYP field is defined:</p>
|
||||
<pre> field(DTYP,"Async Soft Channel")</pre>
|
||||
|
||||
<h4>calcoutRecord</h4>
|
||||
|
||||
<p>The CALC and OCAL fields now have a size of 40 so that they are the same
|
||||
as the calcRecord.</p>
|
||||
|
||||
<p>calcoutRecord now has associated device support. The default support will
|
||||
act just like the old calcout. Support bis also available that uses
|
||||
dbCaPutLinkCallback.</p>
|
||||
|
||||
<h4>mbbiRecord</h4>
|
||||
|
||||
<p>The fields ZRST,...,FFST are now special(SPC_MOD).</p>
|
||||
|
||||
<h4>mbboRecord</h4>
|
||||
|
||||
<p>The fields ZRST,...,FFST are now special(SPC_MOD). init_record now checks
|
||||
to see if state strings or values are defined during pass 0. Previously if
|
||||
another record had a DBR_STRING link to an mbboRecord it thought the field
|
||||
was a USHORT instead of an ENUM.</p>
|
||||
|
||||
<h4>epicsString</h4>
|
||||
|
||||
<p>A new function has been added epicsStrPrintEscaped, which converts the
|
||||
standard C escape characters to \xxx characters.</p>
|
||||
|
||||
<h4>IOC shell system command</h4>
|
||||
|
||||
<p>The 'system' command has been added to the IOC shell. To enable this
|
||||
command, add <code>registrar(iocshSystemCommand)</code> to an application
|
||||
database description file.</p>
|
||||
|
||||
<center>
|
||||
<h2>Changes since 3.14.3</h2>
|
||||
</center>
|
||||
|
||||
<h4>sCalcPostfix</h4>
|
||||
|
||||
<p>This has been removed from base.</p>
|
||||
|
||||
<h4>Format string checking</h4>
|
||||
|
||||
<p>'printf-style' functions like errlogPrintf have their arguments verified
|
||||
against their format string when compiled with gcc.</p>
|
||||
|
||||
<h4>IOC shell command-line editing on vxWorks</h4>
|
||||
|
||||
<p>The IOC shell now uses the vxWorks ledLib routines so command-line editing
|
||||
is now the same in the IOC shell as it is in the vxWorks shell.</p>
|
||||
|
||||
<h4>CA client library crashes when the same PV name is on multiple
|
||||
servers</h4>
|
||||
|
||||
<p>If the CA client library was searching for a PV name that was hosted on
|
||||
more than one server a segmentation violation occurred when printing a
|
||||
diagnostic message resulting in a failure of the CA client library. The bug
|
||||
was introduced in R3.14.3. The code was tested on WIN32 prior to release, but
|
||||
the problem has so far been reproduced only on Linux.</p>
|
||||
|
||||
<p>Thanks to Ernest Williams at the SNS for discovering and helping to
|
||||
diagnose the problem.</p>
|
||||
|
||||
<h4>Disconnection callback function called when CA channel known to be
|
||||
disconnected</h4>
|
||||
|
||||
<p>If a CA circuit timed out during the connect sequence then the CA client
|
||||
library called the applications's disconnect callback function indicating a
|
||||
disconnect state transition when the channel was already known to be
|
||||
disconnected. This has caused the sequencer to improperly maintain its
|
||||
connected channel count. Other CA client side tools may also be impacted.</p>
|
||||
|
||||
<p>Recent versions of vxWorks appear to experience a connect failure if the
|
||||
vxWorks IP kernel reassigns the same ephemeral TCP port number as was
|
||||
assigned during a previous lifetime. The IP kernel on the vxWorks system
|
||||
hosting the CA server might have a stale entry for this ephemeral port that
|
||||
has not yet timed out which prevents the client from connecting with the
|
||||
ephemeral port assigned by the IP kernel. Eventually, after EPICS_CA_CONN_TMO
|
||||
seconds, the TCP connect sequence is aborted and the client library closes
|
||||
the socket, opens a new socket, receives a new ephemeral port assignment, and
|
||||
successfully connects.</p>
|
||||
|
||||
<p>Thanks to Mark Rivers for initially reporting the bug and energetically
|
||||
assisting with identifying the cause.</p>
|
||||
|
||||
<center>
|
||||
<h2>Changes since 3.14.2</h2>
|
||||
</center>
|
||||
|
||||
@@ -123,7 +123,8 @@ have been responsible for specific tasks in the past:</p>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Janet Anderson</td>
|
||||
<td>Edit and commit changes to the EPICS version number file.</td>
|
||||
<td>Edit and commit changes to the EPICS version number files,
|
||||
config/CONFIG_BASE_VERSION and configure/CONFIG_BASE_VERSION.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
@@ -134,7 +135,8 @@ have been responsible for specific tasks in the past:</p>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Janet Anderson</td>
|
||||
<td>Export the tagged version and create the
|
||||
<td>Export the tagged version, "cvs export -kv -d base-x.y.z
|
||||
-r Rx-y-zepics/base", and create the
|
||||
baseR<i>x.y.z</i>[{alpha,beta}<i>n</i>].tar.gz file of the result</td>
|
||||
</tr>
|
||||
<tr>
|
||||
|
||||
@@ -31,18 +31,14 @@ DIRS += db/test
|
||||
DIRS += as
|
||||
DIRS += util
|
||||
DIRS += dbtools
|
||||
DIRS += catools
|
||||
DIRS += rsrv
|
||||
DIRS += rec
|
||||
DIRS += dev
|
||||
DIRS += misc
|
||||
DIRS += iocsh
|
||||
#Following are optional
|
||||
ifeq ($(findstring vxWorks,$(BUILD_ARCHS)),vxWorks)
|
||||
DIRS += vxWorks
|
||||
endif
|
||||
ifneq (,$(findstring RTEMS,$(BUILD_ARCHS)))
|
||||
DIRS += RTEMS
|
||||
endif
|
||||
DIRS += softIoc
|
||||
DIRS += libCom/test
|
||||
DIRS += gdd
|
||||
|
||||
@@ -35,8 +35,10 @@ ascheck_SRCS = ascheck.c
|
||||
PROD_LIBS = asHost dbStaticHost Com
|
||||
|
||||
# For R3.13 compatibility only
|
||||
ifeq ($(strip $(COMPAT_313)),YES)
|
||||
OBJLIB_vxWorks=asIoc
|
||||
OBJLIB_SRCS += $(LIB_SRCS) $(asIoc_SRCS)
|
||||
endif
|
||||
|
||||
include $(TOP)/configure/RULES
|
||||
|
||||
|
||||
@@ -1159,7 +1159,7 @@ static ASG *asAsgAdd(char *asgName)
|
||||
&& ellCount(&pnext->ruleList)==0)
|
||||
return(pnext);
|
||||
}
|
||||
errMessage(S_asLib_dupAsg,NULL);
|
||||
errMessage(S_asLib_dupAsg,"asAsgAdd");
|
||||
return(NULL);
|
||||
}
|
||||
pnext = (ASG *)ellNext((ELLNODE *)pnext);
|
||||
|
||||
222
src/ca/CASG.cpp
222
src/ca/CASG.cpp
@@ -23,31 +23,39 @@
|
||||
#include "iocinf.h"
|
||||
#include "syncGroup.h"
|
||||
#include "oldAccess.h"
|
||||
#include "autoPtrDestroy.h"
|
||||
#include "cac.h"
|
||||
#include "sgAutoPtr.h"
|
||||
|
||||
casgRecycle::~casgRecycle () {}
|
||||
|
||||
CASG::CASG ( ca_client_context &cacIn ) :
|
||||
CASG::CASG ( epicsGuard < epicsMutex > & guard, ca_client_context & cacIn ) :
|
||||
client ( cacIn ), magic ( CASG_MAGIC )
|
||||
{
|
||||
client.installCASG ( *this );
|
||||
client.installCASG ( guard, *this );
|
||||
}
|
||||
|
||||
CASG::~CASG ()
|
||||
{
|
||||
if ( this->verify () ) {
|
||||
this->reset ();
|
||||
this->client.uninstallCASG ( *this );
|
||||
}
|
||||
|
||||
void CASG::destructor (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
|
||||
if ( this->verify ( guard ) ) {
|
||||
this->reset ( cbGuard, guard );
|
||||
this->client.uninstallCASG ( guard, *this );
|
||||
this->magic = 0;
|
||||
}
|
||||
else {
|
||||
this->printf ("cac: attempt to destroy invalid sync group ignored\n");
|
||||
this->printf ( "cac: attempt to destroy invalid sync group ignored\n" );
|
||||
}
|
||||
this->~CASG ();
|
||||
}
|
||||
|
||||
bool CASG::verify () const
|
||||
bool CASG::verify ( epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return ( this->magic == CASG_MAGIC );
|
||||
}
|
||||
@@ -55,7 +63,10 @@ bool CASG::verify () const
|
||||
/*
|
||||
* CASG::block ()
|
||||
*/
|
||||
int CASG::block ( double timeout )
|
||||
int CASG::block (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
double timeout )
|
||||
{
|
||||
epicsTime cur_time;
|
||||
epicsTime beg_time;
|
||||
@@ -63,6 +74,8 @@ int CASG::block ( double timeout )
|
||||
double remaining;
|
||||
int status;
|
||||
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
|
||||
// prevent recursion nightmares by disabling blocking
|
||||
// for IO from within a CA callback.
|
||||
if ( epicsThreadPrivateGet ( caClientCallbackThreadId ) ) {
|
||||
@@ -75,7 +88,7 @@ int CASG::block ( double timeout )
|
||||
|
||||
cur_time = epicsTime::getCurrent ();
|
||||
|
||||
this->client.flushRequest ();
|
||||
this->client.flush ( guard );
|
||||
|
||||
beg_time = cur_time;
|
||||
delay = 0.0;
|
||||
@@ -96,7 +109,11 @@ int CASG::block ( double timeout )
|
||||
break;
|
||||
}
|
||||
|
||||
this->client.blockForEventAndEnableCallbacks ( this->sem, remaining );
|
||||
{
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
epicsGuardRelease < epicsMutex > uncbGuard ( cbGuard );
|
||||
this->sem.wait ( remaining );
|
||||
}
|
||||
|
||||
/*
|
||||
* force a time update
|
||||
@@ -106,148 +123,135 @@ int CASG::block ( double timeout )
|
||||
delay = cur_time - beg_time;
|
||||
}
|
||||
|
||||
this->reset ();
|
||||
this->reset ( cbGuard, guard );
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void CASG::reset ()
|
||||
void CASG::reset (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
this->destroyCompletedIO ();
|
||||
this->destroyPendingIO ();
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
this->destroyCompletedIO ( guard );
|
||||
this->destroyPendingIO ( cbGuard, guard );
|
||||
}
|
||||
|
||||
// lock must be applied
|
||||
void CASG::destroyCompletedIO ()
|
||||
void CASG::destroyCompletedIO (
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
tsDLList < syncGroupNotify > userStillRequestingList;
|
||||
syncGroupNotify *pNotify;
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
syncGroupNotify * pNotify;
|
||||
while ( ( pNotify = this->ioCompletedList.get () ) ) {
|
||||
if ( pNotify->ioInitiated() ) {
|
||||
pNotify->destroy ( * this );
|
||||
}
|
||||
else {
|
||||
userStillRequestingList.add ( *pNotify );
|
||||
}
|
||||
pNotify->destroy ( guard, * this );
|
||||
}
|
||||
this->ioCompletedList.add ( userStillRequestingList );
|
||||
}
|
||||
|
||||
// lock must be applied
|
||||
void CASG::destroyPendingIO ()
|
||||
void CASG::destroyPendingIO (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
tsDLList < syncGroupNotify > userStillRequestingList;
|
||||
syncGroupNotify *pNotify;
|
||||
while ( ( pNotify = this->ioPendingList.get () ) ) {
|
||||
if ( pNotify->ioInitiated() ) {
|
||||
pNotify->destroy ( * this );
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
syncGroupNotify * pNotify;
|
||||
while ( ( pNotify = this->ioPendingList.first () ) ) {
|
||||
pNotify->cancel ( cbGuard, guard );
|
||||
// cancel must release the guard while
|
||||
// canceling put callbacks so we
|
||||
// must double check list membership
|
||||
if ( pNotify->ioPending ( guard ) ) {
|
||||
this->ioPendingList.remove ( *pNotify );
|
||||
}
|
||||
else {
|
||||
userStillRequestingList.add ( *pNotify );
|
||||
this->ioCompletedList.remove ( *pNotify );
|
||||
}
|
||||
pNotify->destroy ( guard, *this );
|
||||
}
|
||||
this->ioPendingList.add ( userStillRequestingList );
|
||||
}
|
||||
|
||||
void CASG::show ( unsigned level ) const
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->client.mutexRef () );
|
||||
this->show ( guard, level );
|
||||
}
|
||||
|
||||
void CASG::show (
|
||||
epicsGuard < epicsMutex > & guard, unsigned level ) const
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
::printf ( "Sync Group: id=%u, magic=%u, opPend=%u\n",
|
||||
this->getId (), this->magic, this->ioPendingList.count () );
|
||||
if ( level ) {
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
::printf ( "\tPending" );
|
||||
tsDLIterConst < syncGroupNotify > notifyPending = this->ioPendingList.firstIter ();
|
||||
tsDLIterConst < syncGroupNotify > notifyPending =
|
||||
this->ioPendingList.firstIter ();
|
||||
while ( notifyPending.valid () ) {
|
||||
notifyPending->show ( level - 1u );
|
||||
notifyPending->show ( guard, level - 1u );
|
||||
notifyPending++;
|
||||
}
|
||||
::printf ( "\tCompleted" );
|
||||
tsDLIterConst < syncGroupNotify > notifyCompleted = this->ioCompletedList.firstIter ();
|
||||
tsDLIterConst < syncGroupNotify > notifyCompleted =
|
||||
this->ioCompletedList.firstIter ();
|
||||
while ( notifyCompleted.valid () ) {
|
||||
notifyCompleted->show ( level - 1u );
|
||||
notifyCompleted->show ( guard, level - 1u );
|
||||
notifyCompleted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CASG::ioComplete ()
|
||||
bool CASG::ioComplete (
|
||||
epicsGuard < epicsMutex > & /* cbGuard */,
|
||||
epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
bool isCompleted;
|
||||
{
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
this->destroyCompletedIO ();
|
||||
isCompleted = ( this->ioPendingList.count () == 0u );
|
||||
}
|
||||
return isCompleted;
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
this->destroyCompletedIO ( guard );
|
||||
return this->ioPendingList.count () == 0u;
|
||||
}
|
||||
|
||||
void CASG::put ( chid pChan, unsigned type, arrayElementCount count, const void * pValue )
|
||||
void CASG::put ( epicsGuard < epicsMutex > & guard, chid pChan,
|
||||
unsigned type, arrayElementCount count, const void * pValue )
|
||||
{
|
||||
sgAutoPtr < syncGroupWriteNotify > pNotify ( *this );
|
||||
{
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
pNotify = syncGroupWriteNotify::factory (
|
||||
this->freeListWriteOP, *this, pChan );
|
||||
if ( pNotify.get () ) {
|
||||
this->ioPendingList.add ( *pNotify );
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
pNotify->begin ( type, count, pValue );
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
sgAutoPtr < syncGroupWriteNotify > pNotify ( guard, *this, this->ioPendingList );
|
||||
pNotify = syncGroupWriteNotify::factory (
|
||||
this->freeListWriteOP, *this, pChan );
|
||||
pNotify->begin ( guard, type, count, pValue );
|
||||
pNotify.release ();
|
||||
}
|
||||
|
||||
void CASG::get ( chid pChan, unsigned type, arrayElementCount count, void *pValue )
|
||||
void CASG::get ( epicsGuard < epicsMutex > & guard, chid pChan,
|
||||
unsigned type, arrayElementCount count, void *pValue )
|
||||
{
|
||||
sgAutoPtr < syncGroupReadNotify > pNotify ( *this );
|
||||
{
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
pNotify = syncGroupReadNotify::factory (
|
||||
this->freeListReadOP, *this, pChan, pValue );
|
||||
if ( pNotify.get () ) {
|
||||
this->ioPendingList.add ( *pNotify );
|
||||
}
|
||||
else {
|
||||
return;
|
||||
}
|
||||
}
|
||||
pNotify->begin ( type, count );
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
sgAutoPtr < syncGroupReadNotify > pNotify ( guard, *this, this->ioPendingList );
|
||||
pNotify = syncGroupReadNotify::factory (
|
||||
this->freeListReadOP, *this, pChan, pValue );
|
||||
pNotify->begin ( guard, type, count );
|
||||
pNotify.release ();
|
||||
}
|
||||
|
||||
void CASG::destroyPendingIO ( syncGroupNotify * pNotify )
|
||||
void CASG::completionNotify (
|
||||
epicsGuard < epicsMutex > & guard, syncGroupNotify & notify )
|
||||
{
|
||||
if ( pNotify ) {
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
this->ioPendingList.remove ( *pNotify );
|
||||
pNotify->destroy ( *this );
|
||||
}
|
||||
}
|
||||
|
||||
void CASG::completionNotify ( syncGroupNotify & notify )
|
||||
{
|
||||
unsigned requestsIncomplete;
|
||||
{
|
||||
epicsGuard < casgMutex > locker ( this->mutex );
|
||||
this->ioPendingList.remove ( notify );
|
||||
this->ioCompletedList.add ( notify );
|
||||
requestsIncomplete = this->ioPendingList.count ();
|
||||
}
|
||||
if ( requestsIncomplete == 0u ) {
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
this->ioPendingList.remove ( notify );
|
||||
this->ioCompletedList.add ( notify );
|
||||
if ( this->ioPendingList.count () == 0u ) {
|
||||
this->sem.signal ();
|
||||
}
|
||||
}
|
||||
|
||||
void CASG::recycleSyncGroupWriteNotify ( syncGroupWriteNotify & io )
|
||||
void CASG::recycleSyncGroupWriteNotify (
|
||||
epicsGuard < epicsMutex > & guard, syncGroupWriteNotify & io )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
this->freeListWriteOP.release ( & io );
|
||||
}
|
||||
|
||||
void CASG::recycleSyncGroupReadNotify ( syncGroupReadNotify & io )
|
||||
void CASG::recycleSyncGroupReadNotify (
|
||||
epicsGuard < epicsMutex > & guard, syncGroupReadNotify & io )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
this->freeListReadOP.release ( & io );
|
||||
}
|
||||
|
||||
@@ -265,18 +269,30 @@ int CASG::printf ( const char *pformat, ... )
|
||||
return status;
|
||||
}
|
||||
|
||||
void CASG::exception ( int status, const char *pContext,
|
||||
const char *pFileName, unsigned lineNo )
|
||||
void CASG::exception (
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
int status, const char * pContext,
|
||||
const char * pFileName, unsigned lineNo )
|
||||
{
|
||||
this->client.exception ( status, pContext, pFileName, lineNo );
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
if ( status != ECA_CHANDESTROY ) {
|
||||
this->client.exception (
|
||||
guard, status, pContext, pFileName, lineNo );
|
||||
}
|
||||
}
|
||||
|
||||
void CASG::exception ( int status, const char *pContext,
|
||||
const char *pFileName, unsigned lineNo, oldChannelNotify &chan,
|
||||
void CASG::exception (
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
int status, const char * pContext,
|
||||
const char * pFileName, unsigned lineNo, oldChannelNotify & chan,
|
||||
unsigned type, arrayElementCount count, unsigned op )
|
||||
{
|
||||
this->client.exception ( status, pContext, pFileName,
|
||||
lineNo, chan, type, count, op );
|
||||
guard.assertIdenticalMutex ( this->client.mutexRef() );
|
||||
if ( status != ECA_CHANDESTROY ) {
|
||||
this->client.exception (
|
||||
guard, status, pContext, pFileName,
|
||||
lineNo, chan, type, count, op );
|
||||
}
|
||||
}
|
||||
|
||||
void * CASG::operator new ( size_t ) // X aCC 361
|
||||
|
||||
@@ -11,21 +11,27 @@
|
||||
|
||||
<h1>EPICS R3.14 Channel Access Reference Manual</h1>
|
||||
<address>
|
||||
Jeffrey O. Hill<br>
|
||||
|
||||
Jeffrey O. Hill
|
||||
</address>
|
||||
|
||||
<p><font size="2">Los Alamos National Laboratory</font></p>
|
||||
<p><font size="2">Los Alamos National Laboratory<br>
|
||||
SNS Division</font></p>
|
||||
<address>
|
||||
Ralph Lange
|
||||
</address>
|
||||
|
||||
<p>SNS Division<font size="2"></font></p>
|
||||
<p><font size="2">BESSY</font></p>
|
||||
|
||||
<p><font size="1">Copyright © 2002 The University of Chicago, as Operator of
|
||||
Argonne National Laboratory.<br>
|
||||
Copyright © 2002 The Regents of the University of California, as Operator of
|
||||
Los Alamos National Laboratory.<br>
|
||||
EPICS BASE Versions 3.13.7 and higher are distributed subject to a Software
|
||||
License Agreement found in the file LICENSE that is included with this
|
||||
distribution.</font></p>
|
||||
Copyright © 2002 Berliner Elektronenspeicherringgesellschaft für
|
||||
Synchrotronstrahlung.</font></p>
|
||||
|
||||
<p><font size="1">EPICS BASE Versions 3.13.7 and higher are distributed
|
||||
subject to a Software License Agreement found in the file LICENSE that is
|
||||
included with this distribution.</font></p>
|
||||
|
||||
<p><a href="http://www.w3.org/Amaya/"><img
|
||||
src="http://www.w3.org/Amaya/Icons/w3c-amaya.gif" alt="W3C-Amaya" height="31"
|
||||
@@ -56,7 +62,7 @@ height="31" width="88"></a></p>
|
||||
<li><a href="#Configurin2">Configuring a CA server</a></li>
|
||||
</ul>
|
||||
|
||||
<h3><a href="#Command">Command Line Utilities</a></h3>
|
||||
<h3><a href="#CommandUtils">Command Line Utilities</a></h3>
|
||||
<ul>
|
||||
<li><a href="#acctst">acctst - CA client library regression test</a></li>
|
||||
<li><a href="#caEventRat">caEventRate - PV event rate logging</a></li>
|
||||
@@ -66,6 +72,20 @@ height="31" width="88"></a></p>
|
||||
data type to the console</a></li>
|
||||
</ul>
|
||||
|
||||
<h3 style=""><a href="#CommandTools">Command Line Tools <span
|
||||
style="color: #FF5F00">(under development)</span></a></h3>
|
||||
<ul style="">
|
||||
<li><a href="#caget">caget - Get and print value for PVs</a></li>
|
||||
<li><a href="#camonitor">camonitor - Set up monitor and continuously print
|
||||
incoming values for PVs <span style="color: #FF5F00">(not implemented
|
||||
yet)</span></a></li>
|
||||
<li><a href="#caput">caput - Put value to a PV <span
|
||||
style="color: #FF5F00">(not implemented yet)</span></a></li>
|
||||
<li><a href="#cainfo">cainfo - Print all available channel status and
|
||||
information for a PV <span style="color: #FF5F00">(not implemented
|
||||
yet)</span></a></li>
|
||||
</ul>
|
||||
|
||||
<h3><a href="#Troublesho">Troubleshooting</a></h3>
|
||||
<ul>
|
||||
<li><a href="#When">When Clients Do Not Connect to Their Server</a>
|
||||
@@ -77,7 +97,8 @@ height="31" width="88"></a></p>
|
||||
<li><a href="#Unicast">Unicast Addresses in the EPICS_CA_ADDR_LIST Does
|
||||
not Reliably Contact Servers Sharing the Same UDP Port on the Same
|
||||
Host</a></li>
|
||||
<li><a href="#Problems">Client Does not See Server's Beacons</a></li>
|
||||
<li><a href="#Client1">Client Does not See Server's Beacons</a></li>
|
||||
<li><a href="#Server1">A server's IP address was changed</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#Problems">ENOBUFS Messages</a></li>
|
||||
@@ -735,7 +756,7 @@ implemet this feature.</em></p>
|
||||
<p>See also <a href="#Routing">Routing Restrictions on vxWorks
|
||||
Systems</a>.</p>
|
||||
|
||||
<h2><a name="Command">Command Line Utilities</a></h2>
|
||||
<h2><a name="CommandUtils">Command Line Utilities</a></h2>
|
||||
|
||||
<h3><a name="acctst">acctst</a></h3>
|
||||
<pre>acctst <PV name> [progress logging level] [channel duplication count]
|
||||
@@ -810,6 +831,284 @@ of the PV is converted to each of the many external data type that can be
|
||||
specified at the CA client library interface, and each of these is formated
|
||||
and then output to the console.</p>
|
||||
|
||||
<h2><a name="CommandTools">Command Line Tools <span
|
||||
style="color: #FF5F00">(under development)</span></a></h2>
|
||||
|
||||
<p><span style="color: #FF5F00">Note: The CA Command Line Tools are currently
|
||||
under development. Thus only the first of the tools is included in EPICS Base
|
||||
R3.14.5, while the others are still being worked on. These tools have not yet
|
||||
proven to be stable and reliable. The user interface might still change, so
|
||||
please be careful relying on these early versions in scripts and other
|
||||
crucial places. Please report any bugs or unexpected behaviour to the author:
|
||||
Ralph.Lange@bessy.de</span></p>
|
||||
|
||||
<h3><a name="caget">caget</a></h3>
|
||||
<pre>caget [options] <PV name> ...</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Get and print value for PV(s).</p>
|
||||
|
||||
<p>The values for one or multiple PVs are read and printed to stdout. The
|
||||
DBR_... format in which the data is read, the output format, and a number of
|
||||
details of how integer and float values are represented can be controlled
|
||||
using command line options.</p>
|
||||
|
||||
<table border="1">
|
||||
<caption></caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Option</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>-h</td>
|
||||
<td>Print usage information</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><strong>CA options:</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-w <sec></td>
|
||||
<td>Wait time, specifies longer CA timeout, default is 1.0 second</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-c</td>
|
||||
<td>Asynchronous get (use ca_get_callback instead of ca_get)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><strong>Format and data type options:</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>Default output format is "name value"</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-t</td>
|
||||
<td>Terse mode - print only value, without name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-a</td>
|
||||
<td>Wide mode "name timestamp value stat sevr" (read PVs as
|
||||
DBR_TIME_xxx)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-n</td>
|
||||
<td>Print DBF_ENUM values as number (default are enum string
|
||||
values)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-d <type></td>
|
||||
<td>Request specific dbr type; use string (DBR_ prefix may be omitted)
|
||||
|
||||
<p>or number of one of the following types:</p>
|
||||
|
||||
<table border="1">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>DBR_STRING</td>
|
||||
<td>0</td>
|
||||
<td>DBR_STS_FLOAT</td>
|
||||
<td>9</td>
|
||||
<td>DBR_TIME_LONG</td>
|
||||
<td>19</td>
|
||||
<td>DBR_CTRL_SHORT</td>
|
||||
<td>29</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_INT</td>
|
||||
<td>1</td>
|
||||
<td>DBR_STS_ENUM</td>
|
||||
<td>10</td>
|
||||
<td>DBR_TIME_DOUBLE</td>
|
||||
<td>20</td>
|
||||
<td>DBR_CTRL_INT</td>
|
||||
<td>29</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_SHORT</td>
|
||||
<td>1</td>
|
||||
<td>DBR_STS_CHAR</td>
|
||||
<td>11</td>
|
||||
<td>DBR_GR_STRING</td>
|
||||
<td>21</td>
|
||||
<td>DBR_CTRL_FLOAT</td>
|
||||
<td>30</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_FLOAT</td>
|
||||
<td>2</td>
|
||||
<td>DBR_STS_LONG</td>
|
||||
<td>12</td>
|
||||
<td>DBR_GR_SHORT</td>
|
||||
<td>22</td>
|
||||
<td>DBR_CTRL_ENUM</td>
|
||||
<td>31</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_ENUM</td>
|
||||
<td>3</td>
|
||||
<td>DBR_STS_DOUBLE</td>
|
||||
<td>13</td>
|
||||
<td>DBR_GR_INT</td>
|
||||
<td>22</td>
|
||||
<td>DBR_CTRL_CHAR</td>
|
||||
<td>32</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_CHAR</td>
|
||||
<td>4</td>
|
||||
<td>DBR_TIME_STRING</td>
|
||||
<td>14</td>
|
||||
<td>DBR_GR_FLOAT</td>
|
||||
<td>23</td>
|
||||
<td>DBR_CTRL_LONG</td>
|
||||
<td>33</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_LONG</td>
|
||||
<td>5</td>
|
||||
<td>DBR_TIME_INT</td>
|
||||
<td>15</td>
|
||||
<td>DBR_GR_ENUM</td>
|
||||
<td>24</td>
|
||||
<td>DBR_CTRL_DOUBLE</td>
|
||||
<td>34</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_DOUBLE</td>
|
||||
<td>6</td>
|
||||
<td>DBR_TIME_SHORT</td>
|
||||
<td>15</td>
|
||||
<td>DBR_GR_CHAR</td>
|
||||
<td>25</td>
|
||||
<td>DBR_STSACK_STRING</td>
|
||||
<td>37</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_STS_STRING</td>
|
||||
<td>7</td>
|
||||
<td>DBR_TIME_FLOAT</td>
|
||||
<td>16</td>
|
||||
<td>DBR_GR_LONG</td>
|
||||
<td>26</td>
|
||||
<td>DBR_CLASS_NAME</td>
|
||||
<td>38</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_STS_SHORT</td>
|
||||
<td>8</td>
|
||||
<td>DBR_TIME_ENUM</td>
|
||||
<td>17</td>
|
||||
<td>DBR_GR_DOUBLE</td>
|
||||
<td>27</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>DBR_STS_INT</td>
|
||||
<td>8</td>
|
||||
<td>DBR_TIME_CHAR</td>
|
||||
<td>18</td>
|
||||
<td>DBR_CTRL_STRING</td>
|
||||
<td>28</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><strong>Arrays:</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>Value format: Print number of requested values, then list of
|
||||
values</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Default:</td>
|
||||
<td>Print all values</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-# <count></td>
|
||||
<td>Print first <count> elements of an array</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><strong>Floating point type format:</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Default:</td>
|
||||
<td>Use %g format</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-f <nr></td>
|
||||
<td>Use %f format, with <nr> digits after the decimal point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-e <nr></td>
|
||||
<td>Use e format, with <nr> digits after the decimal point</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><strong>Integer number format:</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Default:</td>
|
||||
<td>Print as decimal number</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-0x</td>
|
||||
<td>Print as hex number</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-0o</td>
|
||||
<td>Print as octal number</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-0b</td>
|
||||
<td>Print as binary number</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3><a name="camonitor">camonitor</a></h3>
|
||||
<pre>camonitor [options] <PV name> ...</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Subscribe to and print value updates for PV(s).</p>
|
||||
|
||||
<p><span style="color: #FF5F00">Not implemented yet. Under
|
||||
development.</span></p>
|
||||
|
||||
<h3><a name="caput">caput</a></h3>
|
||||
<pre>caput [options] <PV name> <value></pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Put value to a PV.</p>
|
||||
|
||||
<p><span style="color: #FF5F00">Not implemented yet. Under
|
||||
development.</span></p>
|
||||
|
||||
<h3><a name="cainfo">cainfo</a></h3>
|
||||
<pre>cainfo [options] <PV name> ...</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Get and print channel and connection information for PV(s).</p>
|
||||
|
||||
<p><span style="color: #FF5F00">Not implemented yet. Under
|
||||
development.</span></p>
|
||||
|
||||
<h2><a name="Troublesho">Troubleshooting</a></h2>
|
||||
|
||||
<h3><a name="When">When Clients Do Not Connect to Their Server</a></h3>
|
||||
@@ -859,6 +1158,52 @@ single specific host's ip address).</p>
|
||||
<p>See <a href="#Dynamic">Dynamic Changes in the CA Client Library Search
|
||||
Interval.</a></p>
|
||||
|
||||
<h4><a name="Server1">A Server's IP Address Was Changed</a></h4>
|
||||
|
||||
<p>When communication over a virtual circuit times out, then each channel
|
||||
attached to the circuit enters a disconnected state and the disconnect
|
||||
callback handler specified for the channel is called. However, the circuit is
|
||||
not disconnected until TCP/IP's internal, typically long duration, keep alive
|
||||
timer expires. The disconnected channels remain attached to the beleaguered
|
||||
circuit and no attempt is made to search for, or to reestablish, a new
|
||||
circuit. If, at some time in the future, the circuit becomes responsive
|
||||
again, then the attached channels enter a connected state again and reconnect
|
||||
call back handlers are called. Any monitor subscriptions that received an
|
||||
update message while the channel was disconnected are also refreshed. If at
|
||||
any time the library receives an indication from the operating system that a
|
||||
beleaguered circuit has shutdown or was disconnected then the library will
|
||||
immediately reattempt to find servers for each channel and connect circuits
|
||||
to them.</p>
|
||||
|
||||
<p>A well known negative side effect of the above behavior is that CA clients
|
||||
will wait the full (typically long) duration of TCP/IP's internal keep alive
|
||||
timer prior to reconnecting under the following scenario (all of the
|
||||
following occur):</p>
|
||||
<ul>
|
||||
<li>An server's (IOC's) operating system crashes (or is abruptly turned
|
||||
off) or a vxWorks system is stopped by any means</li>
|
||||
<li>This operating system does not immediately reboot using the same IP
|
||||
address</li>
|
||||
<li>A duplicate of the server (IOC) is started appearing at a different IP
|
||||
address</li>
|
||||
</ul>
|
||||
|
||||
<p>It is unlikely that any rational organization will advocate the above
|
||||
scenario in a production system. Nevertheless, there <em>are</em>
|
||||
opportunities for users to become confused during control system
|
||||
<em>development</em>, but it is felt that the robustness improvements justify
|
||||
isolated confusion during the system integration and checkout activities
|
||||
where the above scenarios are most likely to occur.</p>
|
||||
|
||||
<p>Contrast the above behavior with the CA client library behavior of
|
||||
releases prior to R3.14.5 where the beleaguered circuit was immediately
|
||||
closed when communication over it timed out. Any attached channels were
|
||||
immediately searched for, and after successful search responses arrived then
|
||||
attempts were made to build a new circuit. This behavior could result in
|
||||
undesirable resource consumption resulting from periodic circuit setup and
|
||||
teardown overhead (thrashing) during periods of CPU / network / IP kernel
|
||||
buffer congestion. </p>
|
||||
|
||||
<h3><a name="Problems">ENOBUFS Messages</a></h3>
|
||||
|
||||
<p>Many Berkley UNIX derived Internet Protocol (IP) kernels use a memory
|
||||
@@ -3054,6 +3399,7 @@ void * PDBR );</code></p>
|
||||
bytes</dd>
|
||||
</dl>
|
||||
|
||||
<p><small>$Id$</small></p>
|
||||
<p><small>$Id: CAref.html,v 1.58.2.1 2003/09/03 22:31:48 jhill Exp
|
||||
$</small></p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -29,23 +29,23 @@ INC += caDiagnostics.h
|
||||
LIBSRCS += cac.cpp
|
||||
LIBSRCS += cacChannel.cpp
|
||||
LIBSRCS += cacChannelNotify.cpp
|
||||
LIBSRCS += cacNotify.cpp
|
||||
LIBSRCS += cacContextNotify.cpp
|
||||
LIBSRCS += cacReadNotify.cpp
|
||||
LIBSRCS += cacWriteNotify.cpp
|
||||
LIBSRCS += cacStateNotify.cpp
|
||||
LIBSRCS += cacServiceList.cpp
|
||||
LIBSRCS += access.cpp
|
||||
LIBSRCS += iocinf.cpp
|
||||
LIBSRCS += convert.cpp
|
||||
LIBSRCS += test_event.cpp
|
||||
LIBSRCS += repeater.cpp
|
||||
LIBSRCS += searchTimer.cpp
|
||||
LIBSRCS += disconnectGovernorTimer.cpp
|
||||
LIBSRCS += repeaterSubscribeTimer.cpp
|
||||
LIBSRCS += tcpiiu.cpp
|
||||
LIBSRCS += udpiiu.cpp
|
||||
LIBSRCS += netiiu.cpp
|
||||
LIBSRCS += nciu.cpp
|
||||
LIBSRCS += baseNMIU.cpp
|
||||
LIBSRCS += nciu.cpp
|
||||
LIBSRCS += netiiu.cpp
|
||||
LIBSRCS += udpiiu.cpp
|
||||
LIBSRCS += tcpiiu.cpp
|
||||
LIBSRCS += netReadNotifyIO.cpp
|
||||
LIBSRCS += netWriteNotifyIO.cpp
|
||||
LIBSRCS += netSubscription.cpp
|
||||
@@ -76,8 +76,10 @@ LIBRARY=ca
|
||||
ca_RCS_WIN32 = ca.rc
|
||||
|
||||
# For R3.13 compatibility only
|
||||
ifeq ($(strip $(COMPAT_313)),YES)
|
||||
OBJLIB_vxWorks=ca
|
||||
OBJLIB_SRCS = $(LIBSRCS)
|
||||
endif
|
||||
|
||||
ca_LIBS = Com
|
||||
|
||||
@@ -89,7 +91,8 @@ PROD_LIBS = ca Com
|
||||
PROD_SYS_LIBS_WIN32 = ws2_32 advapi32 user32
|
||||
|
||||
PROD_HOST += caRepeater catime acctst caConnTest casw caEventRate
|
||||
OBJS_IOC_vxWorks += catime acctst caConnTest casw caEventRate
|
||||
OBJS_IOC_vxWorks +=
|
||||
OBJS_IOC += catime acctst caConnTest casw caEventRate
|
||||
caRepeater_SRCS = caRepeater.cpp
|
||||
catime_SRCS = catimeMain.c catime.c
|
||||
acctst_SRCS = acctstMain.c acctst.c
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
#define epicsExportSharedSymbols
|
||||
#include "iocinf.h"
|
||||
#include "oldAccess.h"
|
||||
#include "autoPtrDestroy.h"
|
||||
#include "cac.h"
|
||||
|
||||
epicsThreadPrivateId caClientContextId;
|
||||
@@ -118,7 +117,10 @@ const char * ca_message_text []
|
||||
"User destroyed channel",
|
||||
"Invalid channel priority",
|
||||
"Preemptive callback not enabled - additional threads may not join context",
|
||||
"Client's protocol revision does not support transfers exceeding 16k bytes"
|
||||
"Client's protocol revision does not support transfers exceeding 16k bytes",
|
||||
"Virtual circuit connection sequence aborted",
|
||||
|
||||
"Virtual circuit unresponsive"
|
||||
};
|
||||
|
||||
static epicsThreadOnceId caClientContextIdOnce = EPICS_THREAD_ONCE_INIT;
|
||||
@@ -184,19 +186,22 @@ int epicsShareAPI ca_context_create (
|
||||
ca_client_context *pcac;
|
||||
|
||||
try {
|
||||
epicsThreadOnce ( &caClientContextIdOnce, ca_init_client_context, 0);
|
||||
epicsThreadOnce ( & caClientContextIdOnce, ca_init_client_context, 0);
|
||||
if ( caClientContextId == 0 ) {
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
|
||||
pcac = ( ca_client_context * ) epicsThreadPrivateGet ( caClientContextId );
|
||||
if ( pcac ) {
|
||||
if ( premptiveCallbackSelect == ca_enable_preemptive_callback &&
|
||||
! pcac->preemptiveCallbakIsEnabled() ) {
|
||||
return ECA_NOTTHREADED;
|
||||
}
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
bool enablePreemptiveCallback =
|
||||
premptiveCallbackSelect == ca_enable_preemptive_callback;
|
||||
pcac = new ca_client_context ( enablePreemptiveCallback );
|
||||
pcac = new ca_client_context (
|
||||
premptiveCallbackSelect == ca_enable_preemptive_callback );
|
||||
if ( ! pcac ) {
|
||||
return ECA_ALLOCMEM;
|
||||
}
|
||||
@@ -209,22 +214,6 @@ int epicsShareAPI ca_context_create (
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
//
|
||||
// ca_register_service ()
|
||||
//
|
||||
int epicsShareAPI ca_register_service ( cacService *pService )
|
||||
{
|
||||
ca_client_context *pcac;
|
||||
int caStatus = fetchClientContext (&pcac);
|
||||
if ( caStatus != ECA_NORMAL ) {
|
||||
return caStatus;
|
||||
}
|
||||
if ( pService ) {
|
||||
pcac->registerService ( *pService );
|
||||
}
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
//
|
||||
// ca_modify_host_name ()
|
||||
//
|
||||
@@ -321,8 +310,8 @@ int epicsShareAPI ca_create_channel (
|
||||
CAFDHANDLER * pFunc = 0;
|
||||
void * pArg = 0;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex >
|
||||
autoMutex ( pcac->mutex );
|
||||
epicsGuard < epicsMutex >
|
||||
guard ( pcac->mutex );
|
||||
if ( pcac->fdRegFuncNeedsToBeCalled ) {
|
||||
pFunc = pcac->fdRegFunc;
|
||||
pArg = pcac->fdRegArg;
|
||||
@@ -335,14 +324,18 @@ int epicsShareAPI ca_create_channel (
|
||||
}
|
||||
|
||||
try {
|
||||
epicsGuard < epicsMutex > guard ( pcac->mutex );
|
||||
oldChannelNotify * pChanNotify =
|
||||
new ( pcac->oldChannelNotifyFreeList )
|
||||
oldChannelNotify ( *pcac, name_str,
|
||||
oldChannelNotify ( guard, *pcac, name_str,
|
||||
conn_func, puser, priority );
|
||||
// make sure that their chan pointer is set prior to
|
||||
// calling connection call backs
|
||||
*chanptr = pChanNotify;
|
||||
pChanNotify->initiateConnect ();
|
||||
pChanNotify->initiateConnect ( guard );
|
||||
// no need to worry about a connect preempting here because
|
||||
// the connect sequence will not start untill initiateConnect()
|
||||
// is called
|
||||
}
|
||||
catch ( cacChannel::badString & ) {
|
||||
return ECA_BADSTR;
|
||||
@@ -353,6 +346,9 @@ int epicsShareAPI ca_create_channel (
|
||||
catch ( cacChannel::badPriority & ) {
|
||||
return ECA_BADPRIORITY;
|
||||
}
|
||||
catch ( cacChannel::unsupportedByService & ) {
|
||||
return ECA_UNAVAILINSERV;
|
||||
}
|
||||
catch ( ... ) {
|
||||
return ECA_INTERNAL;
|
||||
}
|
||||
@@ -385,12 +381,13 @@ int epicsShareAPI ca_array_get ( chtype type,
|
||||
return ECA_BADTYPE;
|
||||
}
|
||||
unsigned tmpType = static_cast < unsigned > ( type );
|
||||
autoPtrFreeList < getCopy > pNotify
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
autoPtrFreeList < getCopy, 0x400, epicsMutexNOOP > pNotify
|
||||
( pChan->getClientCtx().getCopyFreeList,
|
||||
new ( pChan->getClientCtx().getCopyFreeList )
|
||||
getCopy ( pChan->getClientCtx(), *pChan,
|
||||
getCopy ( guard, pChan->getClientCtx(), *pChan,
|
||||
tmpType, count, pValue ) );
|
||||
pChan->read ( type, count, *pNotify );
|
||||
pChan->read ( guard, type, count, *pNotify );
|
||||
pNotify.release ();
|
||||
caStatus = ECA_NORMAL;
|
||||
}
|
||||
@@ -451,11 +448,12 @@ int epicsShareAPI ca_array_get_callback ( chtype type,
|
||||
}
|
||||
unsigned tmpType = static_cast < unsigned > ( type );
|
||||
|
||||
autoPtrFreeList < getCallback > pNotify
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
autoPtrFreeList < getCallback, 0x400, epicsMutexNOOP > pNotify
|
||||
( pChan->getClientCtx().getCallbackFreeList,
|
||||
new ( pChan->getClientCtx().getCallbackFreeList )
|
||||
getCallback ( *pChan, pfunc, arg ) );
|
||||
pChan->read ( tmpType, count, *pNotify );
|
||||
pChan->read ( guard, tmpType, count, *pNotify );
|
||||
pNotify.release ();
|
||||
caStatus = ECA_NORMAL;
|
||||
}
|
||||
@@ -513,12 +511,13 @@ int epicsShareAPI ca_array_put_callback ( chtype type, arrayElementCount count,
|
||||
if ( type < 0 ) {
|
||||
return ECA_BADTYPE;
|
||||
}
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
unsigned tmpType = static_cast < unsigned > ( type );
|
||||
autoPtrFreeList < putCallback > pNotify
|
||||
autoPtrFreeList < putCallback, 0x400, epicsMutexNOOP > pNotify
|
||||
( pChan->getClientCtx().putCallbackFreeList,
|
||||
new ( pChan->getClientCtx().putCallbackFreeList )
|
||||
putCallback ( *pChan, pfunc, usrarg ) );
|
||||
pChan->write ( tmpType, count, pValue, *pNotify );
|
||||
pChan->write ( guard, tmpType, count, pValue, *pNotify );
|
||||
pNotify.release ();
|
||||
caStatus = ECA_NORMAL;
|
||||
}
|
||||
@@ -556,7 +555,7 @@ int epicsShareAPI ca_array_put_callback ( chtype type, arrayElementCount count,
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
caStatus = ECA_INTERNAL;
|
||||
caStatus = ECA_PUTFAIL;
|
||||
}
|
||||
return caStatus;
|
||||
}
|
||||
@@ -566,7 +565,7 @@ int epicsShareAPI ca_array_put_callback ( chtype type, arrayElementCount count,
|
||||
*/
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
|
||||
chid pChan, const void *pValue )
|
||||
chid pChan, const void * pValue )
|
||||
{
|
||||
if ( type < 0 ) {
|
||||
return ECA_BADTYPE;
|
||||
@@ -575,7 +574,8 @@ int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
|
||||
|
||||
int caStatus;
|
||||
try {
|
||||
pChan->write ( tmpType, count, pValue );
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
pChan->write ( guard, tmpType, count, pValue );
|
||||
caStatus = ECA_NORMAL;
|
||||
}
|
||||
catch ( cacChannel::badString & )
|
||||
@@ -612,7 +612,7 @@ int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
|
||||
}
|
||||
catch ( ... )
|
||||
{
|
||||
caStatus = ECA_INTERNAL;
|
||||
caStatus = ECA_PUTFAIL;
|
||||
}
|
||||
return caStatus;
|
||||
}
|
||||
@@ -623,7 +623,8 @@ int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_change_connection_event ( chid pChan, caCh *pfunc )
|
||||
{
|
||||
return pChan->changeConnCallBack ( pfunc );
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->changeConnCallBack ( guard, pfunc );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -632,7 +633,8 @@ int epicsShareAPI ca_change_connection_event ( chid pChan, caCh *pfunc )
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_replace_access_rights_event ( chid pChan, caArh *pfunc )
|
||||
{
|
||||
return pChan->replaceAccessRightsEvent ( pfunc );
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->replaceAccessRightsEvent ( guard, pfunc );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -680,16 +682,17 @@ int epicsShareAPI ca_create_subscription (
|
||||
}
|
||||
|
||||
try {
|
||||
autoPtrFreeList < oldSubscription > pSubsr
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
autoPtrFreeList < oldSubscription, 0x400, epicsMutexNOOP > pSubsr
|
||||
( pChan->getClientCtx().subscriptionFreeList,
|
||||
new ( pChan->getClientCtx().subscriptionFreeList )
|
||||
oldSubscription ( *pChan,
|
||||
pCallBack, pCallBackArg ) );
|
||||
evid pTmp = pSubsr.release ();
|
||||
if ( monixptr ) {
|
||||
*monixptr = pTmp;
|
||||
*monixptr = pSubsr.get ();
|
||||
}
|
||||
pTmp->begin ( tmpType, count, mask );
|
||||
pSubsr->begin ( guard, tmpType, count, mask );
|
||||
pSubsr.release ();
|
||||
// dont touch pTmp after this because
|
||||
// the first callback might have canceled it
|
||||
return ECA_NORMAL;
|
||||
@@ -744,8 +747,15 @@ epicsShareFunc int epicsShareAPI ca_clear_subscription ( evid pMon )
|
||||
{
|
||||
oldChannelNotify & chan = pMon->channel ();
|
||||
ca_client_context & cac = chan.getClientCtx ();
|
||||
pMon->ioCancel ();
|
||||
cac.destroySubscription ( *pMon );
|
||||
if ( cac.pCallbackGuard.get() ) {
|
||||
epicsGuard < epicsMutex > guard ( cac.mutex );
|
||||
pMon->ioCancel ( *cac.pCallbackGuard, guard );
|
||||
}
|
||||
else {
|
||||
epicsGuard < epicsMutex > cbGuard ( cac.cbMutex );
|
||||
epicsGuard < epicsMutex > guard ( cac.mutex );
|
||||
pMon->ioCancel ( cbGuard, guard );
|
||||
}
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
|
||||
@@ -830,16 +840,16 @@ int epicsShareAPI ca_pend_io ( ca_real timeout )
|
||||
/*
|
||||
* ca_flush_io ()
|
||||
*/
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_flush_io ()
|
||||
{
|
||||
ca_client_context *pcac;
|
||||
ca_client_context * pcac;
|
||||
int caStatus = fetchClientContext (&pcac);
|
||||
if ( caStatus != ECA_NORMAL ) {
|
||||
return caStatus;
|
||||
}
|
||||
|
||||
pcac->flushRequest ();
|
||||
epicsGuard < epicsMutex > guard ( pcac->mutex );
|
||||
pcac->flush ( guard );
|
||||
|
||||
return ECA_NORMAL;
|
||||
}
|
||||
@@ -847,7 +857,6 @@ int epicsShareAPI ca_flush_io ()
|
||||
/*
|
||||
* CA_TEST_IO ()
|
||||
*/
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_test_io () // X aCC 361
|
||||
{
|
||||
ca_client_context *pcac;
|
||||
@@ -927,9 +936,11 @@ void epicsShareAPI ca_signal_formated ( long ca_status, const char *pfilenm,
|
||||
pcac->vSignal ( ca_status, pfilenm, lineno, pFormat, theArgs );
|
||||
}
|
||||
else {
|
||||
fprintf ( stderr, "file=%s line=%d: CA exception delivered to a thread w/o ca context\n",
|
||||
pfilenm, lineno );
|
||||
vfprintf ( stderr, pFormat, theArgs );
|
||||
fprintf ( stderr, "CA exception in thread w/o CA ctx: status=%s file=%s line=%d: \n",
|
||||
ca_message ( ca_status ), pfilenm, lineno );
|
||||
if ( pFormat ) {
|
||||
vfprintf ( stderr, pFormat, theArgs );
|
||||
}
|
||||
}
|
||||
va_end ( theArgs );
|
||||
}
|
||||
@@ -962,16 +973,21 @@ int epicsShareAPI ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
|
||||
// extern "C"
|
||||
void epicsShareAPI ca_get_host_name ( chid pChan, char *pBuf, unsigned bufLength )
|
||||
{
|
||||
pChan->hostName ( pBuf, bufLength );
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
pChan->hostName ( guard, pBuf, bufLength );
|
||||
}
|
||||
|
||||
/*
|
||||
* ca_host_name ()
|
||||
*
|
||||
* !!!! not thread safe !!!!
|
||||
*
|
||||
*/
|
||||
// extern "C"
|
||||
const char * epicsShareAPI ca_host_name ( chid pChan )
|
||||
{
|
||||
return pChan->pHostName ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->pHostName ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -980,7 +996,8 @@ const char * epicsShareAPI ca_host_name ( chid pChan )
|
||||
// extern "C"
|
||||
int epicsShareAPI ca_v42_ok ( chid pChan )
|
||||
{
|
||||
return pChan->ca_v42_ok ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->ca_v42_ok ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1016,7 +1033,8 @@ int epicsShareAPI ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
|
||||
// extern "C"
|
||||
short epicsShareAPI ca_field_type ( chid pChan )
|
||||
{
|
||||
return pChan->nativeType ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->nativeType ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1025,7 +1043,8 @@ short epicsShareAPI ca_field_type ( chid pChan )
|
||||
// extern "C"
|
||||
arrayElementCount epicsShareAPI ca_element_count ( chid pChan )
|
||||
{
|
||||
return pChan->nativeElementCount ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->nativeElementCount ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1034,10 +1053,11 @@ arrayElementCount epicsShareAPI ca_element_count ( chid pChan )
|
||||
// extern "C"
|
||||
enum channel_state epicsShareAPI ca_state ( chid pChan ) // X aCC 361
|
||||
{
|
||||
if ( pChan->connected() ) {
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
if ( pChan->connected ( guard ) ) {
|
||||
return cs_conn;
|
||||
}
|
||||
else if ( pChan->previouslyConnected() ){
|
||||
else if ( pChan->previouslyConnected ( guard ) ){
|
||||
return cs_prev_conn;
|
||||
}
|
||||
else {
|
||||
@@ -1051,7 +1071,8 @@ enum channel_state epicsShareAPI ca_state ( chid pChan ) // X aCC 361
|
||||
// extern "C"
|
||||
void epicsShareAPI ca_set_puser ( chid pChan, void *puser )
|
||||
{
|
||||
pChan->setPrivatePointer ( puser );
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
pChan->setPrivatePointer ( guard, puser );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1060,7 +1081,8 @@ void epicsShareAPI ca_set_puser ( chid pChan, void *puser )
|
||||
// extern "C"
|
||||
void * epicsShareAPI ca_puser ( chid pChan )
|
||||
{
|
||||
return pChan->privatePointer ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->privatePointer ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1069,7 +1091,8 @@ void * epicsShareAPI ca_puser ( chid pChan )
|
||||
// extern "C"
|
||||
unsigned epicsShareAPI ca_read_access ( chid pChan )
|
||||
{
|
||||
return pChan->accessRights().readPermit();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->accessRights(guard).readPermit();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1078,7 +1101,8 @@ unsigned epicsShareAPI ca_read_access ( chid pChan )
|
||||
// extern "C"
|
||||
unsigned epicsShareAPI ca_write_access ( chid pChan )
|
||||
{
|
||||
return pChan->accessRights().writePermit();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->accessRights(guard).writePermit();
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1087,25 +1111,28 @@ unsigned epicsShareAPI ca_write_access ( chid pChan )
|
||||
// extern "C"
|
||||
const char * epicsShareAPI ca_name ( chid pChan )
|
||||
{
|
||||
return pChan->pName ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->pName ( guard );
|
||||
}
|
||||
|
||||
// extern "C"
|
||||
unsigned epicsShareAPI ca_search_attempts ( chid pChan )
|
||||
{
|
||||
return pChan->searchAttempts ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->searchAttempts ( guard );
|
||||
}
|
||||
|
||||
// extern "C"
|
||||
double epicsShareAPI ca_beacon_period ( chid pChan )
|
||||
{
|
||||
return pChan->beaconPeriod ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->beaconPeriod ( guard );
|
||||
}
|
||||
|
||||
// extern "C"
|
||||
double epicsShareAPI ca_receive_watchdog_delay ( chid pChan )
|
||||
{
|
||||
return pChan->receiveWatchdogDelay ();
|
||||
epicsGuard < epicsMutex > guard ( pChan->getClientCtx().mutex );
|
||||
return pChan->receiveWatchdogDelay ( guard );
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1123,7 +1150,7 @@ unsigned epicsShareAPI ca_get_ioc_connection_count ()
|
||||
return 0u;
|
||||
}
|
||||
|
||||
return pcac->connectionCount ();
|
||||
return pcac->circuitCount ();
|
||||
}
|
||||
|
||||
unsigned epicsShareAPI ca_beacon_anomaly_count ()
|
||||
@@ -1387,7 +1414,7 @@ epicsShareDef const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1] = {
|
||||
sizeof(dbr_string_t), /* string max size */
|
||||
};
|
||||
|
||||
// extern "C"
|
||||
//extern "C"
|
||||
epicsShareDef const enum dbr_value_class dbr_value_class[LAST_BUFFER_TYPE+1] = {
|
||||
dbr_class_string, /* string max size */
|
||||
dbr_class_int, /* short */
|
||||
|
||||
@@ -813,40 +813,39 @@ void verifyBlockInPendIO ( chid chan, unsigned interestLevel )
|
||||
{
|
||||
int status;
|
||||
|
||||
|
||||
if ( ca_read_access (chan) ) {
|
||||
dbr_float_t req;
|
||||
dbr_float_t resp;
|
||||
dbr_long_t req;
|
||||
dbr_long_t resp;
|
||||
|
||||
showProgressBegin ( "verifyBlockInPendIO", interestLevel );
|
||||
req = 56.57f;
|
||||
resp = -99.99f;
|
||||
SEVCHK ( ca_put (DBR_FLOAT, chan, &req), NULL );
|
||||
SEVCHK ( ca_get (DBR_FLOAT, chan, &resp), NULL );
|
||||
req = 0;
|
||||
resp = -100;
|
||||
SEVCHK ( ca_put (DBR_LONG, chan, &req), NULL );
|
||||
SEVCHK ( ca_get (DBR_LONG, chan, &resp), NULL );
|
||||
status = ca_pend_io (1.0e-12);
|
||||
if ( status == ECA_NORMAL ) {
|
||||
if ( resp != req ) {
|
||||
printf (
|
||||
"get block test failed - val written %f\n", req );
|
||||
"get block test failed - val written %d\n", req );
|
||||
printf (
|
||||
"get block test failed - val read %f\n", resp );
|
||||
"get block test failed - val read %d\n", resp );
|
||||
assert ( 0 );
|
||||
}
|
||||
}
|
||||
else if ( resp != -99.99f ) {
|
||||
else if ( resp != -100 ) {
|
||||
printf ( "CA didnt block for get to return?\n" );
|
||||
}
|
||||
|
||||
req = 33.44f;
|
||||
resp = -99.99f;
|
||||
SEVCHK ( ca_put (DBR_FLOAT, chan, &req), NULL );
|
||||
SEVCHK ( ca_get (DBR_FLOAT, chan, &resp), NULL );
|
||||
req = 1;
|
||||
resp = -100;
|
||||
SEVCHK ( ca_put (DBR_LONG, chan, &req), NULL );
|
||||
SEVCHK ( ca_get (DBR_LONG, chan, &resp), NULL );
|
||||
SEVCHK ( ca_pend_io (timeoutToPendIO) , NULL );
|
||||
if ( resp != req ) {
|
||||
printf (
|
||||
"get block test failed - val written %f\n", req);
|
||||
"get block test failed - val written %d\n", req);
|
||||
printf (
|
||||
"get block test failed - val read %f\n", resp);
|
||||
"get block test failed - val read %d\n", resp);
|
||||
assert(0);
|
||||
}
|
||||
showProgressEnd ( interestLevel );
|
||||
@@ -934,8 +933,7 @@ void verifyAnalogIO ( chid chan, int dataType, double min, double max,
|
||||
return;
|
||||
}
|
||||
|
||||
if ( ca_field_type ( chan ) != DBR_FLOAT &&
|
||||
ca_field_type ( chan ) != DBR_DOUBLE ) {
|
||||
if ( dbr_value_class[ca_field_type ( chan )] != dbr_class_float ) {
|
||||
printf ("skipped analog test - not an analog type\n");
|
||||
return;
|
||||
}
|
||||
@@ -2079,7 +2077,13 @@ void monitorUpdateTest ( chid chan, unsigned interestLevel )
|
||||
unsigned prevPassCount;
|
||||
unsigned tries;
|
||||
|
||||
if ( ! ca_read_access ( chan ) ) {
|
||||
if ( ! ca_write_access ( chan ) ) {
|
||||
printf ("skipped monitorUpdateTest test - no write access\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ( dbr_value_class[ca_field_type ( chan )] != dbr_class_float ) {
|
||||
printf ("skipped monitorUpdateTest test - not an analog type\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2088,7 +2092,7 @@ void monitorUpdateTest ( chid chan, unsigned interestLevel )
|
||||
/*
|
||||
* set channel to known value
|
||||
*/
|
||||
temp = 1.0;
|
||||
temp = 1;
|
||||
SEVCHK ( ca_put ( DBR_FLOAT, chan, &temp ), NULL );
|
||||
|
||||
for ( i = 0; i < NELEMENTS(test); i++ ) {
|
||||
@@ -2407,7 +2411,9 @@ void verifyChannelPriorities ( const char *pName, unsigned interestLevel )
|
||||
showProgressEnd ( interestLevel );
|
||||
}
|
||||
|
||||
void verifyImmediateTearDown ( const char * pName, unsigned interestLevel )
|
||||
void verifyImmediateTearDown ( const char * pName,
|
||||
enum ca_preemptive_callback_select select,
|
||||
unsigned interestLevel )
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
@@ -2416,7 +2422,8 @@ void verifyImmediateTearDown ( const char * pName, unsigned interestLevel )
|
||||
for ( i = 0u; i < 1000; i++ ) {
|
||||
chid chan;
|
||||
int status;
|
||||
double value = i;
|
||||
dbr_long_t value = i % 2;
|
||||
ca_context_create ( select );
|
||||
ca_task_initialize ();
|
||||
status = ca_create_channel ( pName, 0, 0, 0, & chan );
|
||||
SEVCHK ( status, "immediate tear down channel create failed" );
|
||||
@@ -2428,15 +2435,17 @@ void verifyImmediateTearDown ( const char * pName, unsigned interestLevel )
|
||||
* get flushed out
|
||||
*/
|
||||
if ( i > 0 ) {
|
||||
double currentValue = 0.0;
|
||||
status = ca_get ( DBR_DOUBLE, chan, & currentValue );
|
||||
dbr_long_t currentValue = value;
|
||||
status = ca_get ( DBR_LONG, chan, & currentValue );
|
||||
SEVCHK ( status, "immediate tear down channel get failed" );
|
||||
status = ca_pend_io ( timeoutToPendIO );
|
||||
SEVCHK ( status, "immediate tear down channel get failed" );
|
||||
assert ( currentValue == i - 1 );
|
||||
assert ( currentValue == ( (i + 1) % 2 ) );
|
||||
}
|
||||
status = ca_put ( DBR_DOUBLE, chan, & value );
|
||||
status = ca_put ( DBR_LONG, chan, & value );
|
||||
SEVCHK ( status, "immediate tear down channel put failed" );
|
||||
status = ca_clear_channel ( chan );
|
||||
SEVCHK ( status, "immediate tear down channel clear failed" );
|
||||
ca_task_exit ();
|
||||
epicsThreadSleep ( 1e-15 );
|
||||
if ( i % 100 == 0 ) {
|
||||
@@ -2626,9 +2635,9 @@ int acctst ( char *pName, unsigned interestLevel, unsigned channelCount,
|
||||
epicsEnvSet ( "EPICS_CA_MAX_ARRAY_BYTES", tmpString );
|
||||
}
|
||||
|
||||
verifyImmediateTearDown ( pName, interestLevel );
|
||||
verifyImmediateTearDown ( pName, select, interestLevel );
|
||||
|
||||
status = ca_context_create ( select );
|
||||
status = ca_context_create ( select );
|
||||
SEVCHK ( status, NULL );
|
||||
|
||||
verifyDataTypeMacros ();
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
#endif
|
||||
|
||||
#include "tsFreeList.h"
|
||||
#include "cxxCompilerDependencies.h"
|
||||
#include "compilerDependencies.h"
|
||||
|
||||
#ifdef autoPtrFreeListh_epicsExportSharedSymbols
|
||||
# define epicsExportSharedSymbols
|
||||
|
||||
@@ -30,27 +30,29 @@
|
||||
template < class T >
|
||||
class autoPtrRecycle {
|
||||
public:
|
||||
autoPtrRecycle ( chronIntIdResTable < baseNMIU > &,
|
||||
tsDLList < class baseNMIU > &, cacRecycle &, T * );
|
||||
autoPtrRecycle (
|
||||
epicsGuard < epicsMutex > &, chronIntIdResTable < baseNMIU > &,
|
||||
cacRecycle &, T * );
|
||||
~autoPtrRecycle ();
|
||||
T & operator * () const;
|
||||
T * operator -> () const;
|
||||
T * get () const;
|
||||
T * release ();
|
||||
private:
|
||||
T *p;
|
||||
cacRecycle &r;
|
||||
tsDLList < class baseNMIU > &eventq;
|
||||
chronIntIdResTable < baseNMIU > &ioTable;
|
||||
T * p;
|
||||
cacRecycle & r;
|
||||
chronIntIdResTable < baseNMIU > & ioTable;
|
||||
epicsGuard < epicsMutex > & guard;
|
||||
// not implemented
|
||||
autoPtrRecycle ( const autoPtrRecycle & );
|
||||
autoPtrRecycle & operator = ( const autoPtrRecycle & );
|
||||
};
|
||||
|
||||
template < class T >
|
||||
inline autoPtrRecycle<T>::autoPtrRecycle ( chronIntIdResTable < baseNMIU > &tbl,
|
||||
tsDLList < class baseNMIU > &list, cacRecycle &rIn, T *pIn ) :
|
||||
p ( pIn ), r ( rIn ), eventq ( list ), ioTable ( tbl ) {}
|
||||
inline autoPtrRecycle<T>::autoPtrRecycle (
|
||||
epicsGuard < epicsMutex > & guardIn, chronIntIdResTable < baseNMIU > & tbl,
|
||||
cacRecycle & rIn, T * pIn ) :
|
||||
p ( pIn ), r ( rIn ), ioTable ( tbl ), guard ( guardIn ) {}
|
||||
|
||||
template < class T >
|
||||
inline autoPtrRecycle<T>::~autoPtrRecycle ()
|
||||
@@ -58,8 +60,7 @@ inline autoPtrRecycle<T>::~autoPtrRecycle ()
|
||||
if ( this->p ) {
|
||||
baseNMIU *pb = this->p;
|
||||
this->ioTable.remove ( *pb );
|
||||
this->eventq.remove ( *pb );
|
||||
pb->destroy ( this->r );
|
||||
pb->destroy ( this->guard, this->r );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,11 +24,6 @@
|
||||
#include <limits.h>
|
||||
#include <float.h>
|
||||
|
||||
#if 0
|
||||
#define DEBUG
|
||||
#define DEBUG_ALL 0
|
||||
#endif
|
||||
|
||||
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
@@ -50,10 +45,10 @@
|
||||
* zero (so we can correctly compute the period
|
||||
* between the 1st and 2nd beacons)
|
||||
*/
|
||||
bhe::bhe ( const epicsTime & initialTimeStamp,
|
||||
bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp,
|
||||
unsigned initialBeaconNumber, const inetAddrID & addr ) :
|
||||
inetAddrID ( addr ), timeStamp ( initialTimeStamp ), averagePeriod ( - DBL_MAX ),
|
||||
pIIU ( 0 ), lastBeaconNumber ( initialBeaconNumber )
|
||||
mutex ( mutexIn ), pIIU ( 0 ), lastBeaconNumber ( initialBeaconNumber )
|
||||
{
|
||||
# ifdef DEBUG
|
||||
{
|
||||
@@ -68,10 +63,11 @@ bhe::~bhe ()
|
||||
{
|
||||
}
|
||||
|
||||
void bhe::beaconAnomalyNotify ()
|
||||
void bhe::beaconAnomalyNotify ( epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
if ( this->pIIU ) {
|
||||
this->pIIU->beaconAnomalyNotify ();
|
||||
this->pIIU->beaconAnomalyNotify ( guard );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +76,7 @@ void bhe::logBeacon ( const char * pDiagnostic,
|
||||
const double & currentPeriod,
|
||||
const epicsTime & currentTime )
|
||||
{
|
||||
if ( this->pIIU || DEBUG_ALL ) {
|
||||
if ( this->pIIU ) {
|
||||
char name[64];
|
||||
this->name ( name, sizeof ( name ) );
|
||||
char date[64];
|
||||
@@ -103,7 +99,7 @@ inline void bhe::logBeacon ( const char * /* pDiagnostic */,
|
||||
void bhe::logBeaconDiscard ( unsigned beaconAdvance,
|
||||
const epicsTime & currentTime )
|
||||
{
|
||||
if ( this->pIIU || DEBUG_ALL ) {
|
||||
if ( this->pIIU ) {
|
||||
char name[64];
|
||||
this->name ( name, sizeof ( name ) );
|
||||
char date[64];
|
||||
@@ -125,10 +121,13 @@ void bhe::logBeaconDiscard ( unsigned /* beaconAdvance */,
|
||||
*
|
||||
* updates beacon period, and looks for beacon anomalies
|
||||
*/
|
||||
bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
bool bhe::updatePeriod (
|
||||
epicsGuard < epicsMutex > & guard, const epicsTime & programBeginTime,
|
||||
const epicsTime & currentTime, ca_uint32_t beaconNumber,
|
||||
unsigned protocolRevision )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
|
||||
//
|
||||
// this block is enetered if the beacon was created as a side effect of
|
||||
// creating a connection and so we dont yet know the first beacon time
|
||||
@@ -139,7 +138,7 @@ bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
this->lastBeaconNumber = beaconNumber;
|
||||
}
|
||||
|
||||
this->beaconAnomalyNotify ();
|
||||
this->beaconAnomalyNotify ( guard );
|
||||
|
||||
/*
|
||||
* this is the 1st beacon seen - the beacon time stamp
|
||||
@@ -189,7 +188,7 @@ bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
if ( this->averagePeriod < 0.0 ) {
|
||||
double totalRunningTime;
|
||||
|
||||
this->beaconAnomalyNotify ();
|
||||
this->beaconAnomalyNotify ( guard );
|
||||
|
||||
/*
|
||||
* this is the 2nd beacon seen. We cant tell about
|
||||
@@ -229,7 +228,7 @@ bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
* trigger on any missing beacon
|
||||
* if connected to this server
|
||||
*/
|
||||
this->beaconAnomalyNotify ();
|
||||
this->beaconAnomalyNotify ( guard );
|
||||
|
||||
if ( currentPeriod >= this->averagePeriod * 3.25 ) {
|
||||
/*
|
||||
@@ -253,14 +252,14 @@ bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
* that the server is available
|
||||
*/
|
||||
else if ( currentPeriod <= this->averagePeriod * 0.80 ) {
|
||||
this->beaconAnomalyNotify ();
|
||||
this->beaconAnomalyNotify ( guard );
|
||||
netChange = true;
|
||||
logBeacon ( "bal", currentPeriod, currentTime );
|
||||
}
|
||||
else if ( this->pIIU ) {
|
||||
// update state of health for active virtual circuits
|
||||
// if the beacon looks ok
|
||||
this->pIIU->beaconArrivalNotify ( currentTime );
|
||||
this->pIIU->beaconArrivalNotify ( guard, currentTime );
|
||||
logBeacon ( "vb", currentPeriod, currentTime );
|
||||
}
|
||||
|
||||
@@ -274,33 +273,60 @@ bool bhe::updatePeriod ( const epicsTime & programBeginTime,
|
||||
return netChange;
|
||||
}
|
||||
|
||||
void bhe::show ( unsigned /* level */ ) const
|
||||
void bhe::show ( unsigned level ) const
|
||||
{
|
||||
::printf ( "CA beacon hash entry at %p with average period %f\n",
|
||||
static_cast <const void *> ( this ), this->averagePeriod );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->show ( guard, level );
|
||||
}
|
||||
|
||||
double bhe::period () const
|
||||
void bhe::show ( epicsGuard < epicsMutex > &, unsigned level ) const
|
||||
{
|
||||
char host [64];
|
||||
this->name ( host, sizeof ( host ) );
|
||||
if ( this->averagePeriod == -DBL_MAX ) {
|
||||
::printf ( "CA beacon hash entry for %s <no period estimate>\n",
|
||||
host );
|
||||
}
|
||||
else {
|
||||
::printf ( "CA beacon hash entry for %s with period estimate %f\n",
|
||||
host, this->averagePeriod );
|
||||
}
|
||||
if ( level > 0u ) {
|
||||
char date[64];
|
||||
this->timeStamp.strftime ( date, sizeof ( date ), "%a %b %d %Y %H:%M:%S");
|
||||
::printf ( "\tbeacon number %u, on %s\n",
|
||||
this->lastBeaconNumber, date );
|
||||
}
|
||||
}
|
||||
|
||||
double bhe::period ( epicsGuard < epicsMutex > & guard ) const
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
return this->averagePeriod;
|
||||
}
|
||||
|
||||
epicsTime bhe::updateTime () const
|
||||
epicsTime bhe::updateTime ( epicsGuard < epicsMutex > & guard ) const
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
return this->timeStamp;
|
||||
}
|
||||
|
||||
void bhe::registerIIU ( tcpiiu & iiu )
|
||||
void bhe::registerIIU (
|
||||
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
this->pIIU = & iiu;
|
||||
}
|
||||
|
||||
void bhe::unregisterIIU ( tcpiiu & iiu )
|
||||
void bhe::unregisterIIU (
|
||||
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
if ( this->pIIU == & iiu ) {
|
||||
this->pIIU = 0;
|
||||
this->timeStamp = epicsTime();
|
||||
this->averagePeriod = - DBL_MAX;
|
||||
logBeacon ( "ui", this->averagePeriod, epicsTime::getCurrent () );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
23
src/ca/bhe.h
23
src/ca/bhe.h
@@ -31,7 +31,7 @@
|
||||
#include "tsDLList.h"
|
||||
#include "tsFreeList.h"
|
||||
#include "epicsTime.h"
|
||||
#include "cxxCompilerDependencies.h"
|
||||
#include "compilerDependencies.h"
|
||||
|
||||
#ifdef bhehEpicsExportSharedSymbols
|
||||
# define epicsExportSharedSymbols
|
||||
@@ -55,18 +55,21 @@ public:
|
||||
|
||||
class bhe : public tsSLNode < bhe >, public inetAddrID {
|
||||
public:
|
||||
epicsShareFunc bhe ( const epicsTime & initialTimeStamp,
|
||||
epicsShareFunc bhe (
|
||||
epicsMutex &, const epicsTime & initialTimeStamp,
|
||||
unsigned initialBeaconNumber, const inetAddrID & addr );
|
||||
epicsShareFunc ~bhe ();
|
||||
epicsShareFunc bool updatePeriod (
|
||||
epicsGuard < epicsMutex > &,
|
||||
const epicsTime & programBeginTime,
|
||||
const epicsTime & currentTime, ca_uint32_t beaconNumber,
|
||||
unsigned protocolRevision );
|
||||
epicsShareFunc double period () const;
|
||||
epicsShareFunc epicsTime updateTime () const;
|
||||
epicsShareFunc void show ( unsigned level) const;
|
||||
epicsShareFunc void registerIIU ( tcpiiu & );
|
||||
epicsShareFunc void unregisterIIU ( tcpiiu & );
|
||||
epicsShareFunc double period ( epicsGuard < epicsMutex > & ) const;
|
||||
epicsShareFunc epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
|
||||
epicsShareFunc void show ( unsigned level ) const;
|
||||
epicsShareFunc void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
|
||||
epicsShareFunc void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
|
||||
epicsShareFunc void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
|
||||
epicsShareFunc void * operator new ( size_t size, bheMemoryManager & );
|
||||
#ifdef CXX_PLACEMENT_DELETE
|
||||
epicsShareFunc void operator delete ( void *, bheMemoryManager & );
|
||||
@@ -74,9 +77,10 @@ public:
|
||||
private:
|
||||
epicsTime timeStamp;
|
||||
double averagePeriod;
|
||||
epicsMutex & mutex;
|
||||
tcpiiu * pIIU;
|
||||
ca_uint32_t lastBeaconNumber;
|
||||
void beaconAnomalyNotify ();
|
||||
void beaconAnomalyNotify ( epicsGuard < epicsMutex > & );
|
||||
void logBeacon ( const char * pDiagnostic,
|
||||
const double & currentPeriod,
|
||||
const epicsTime & currentTime );
|
||||
@@ -92,10 +96,13 @@ private:
|
||||
// Tornado 2.0.1 GNU compiler bugs
|
||||
class bheFreeStore : public bheMemoryManager {
|
||||
public:
|
||||
bheFreeStore () {}
|
||||
void * allocate ( size_t );
|
||||
void release ( void * );
|
||||
private:
|
||||
tsFreeList < bhe, 0x100 > freeList;
|
||||
bheFreeStore ( const bheFreeStore & );
|
||||
bheFreeStore & operator = ( const bheFreeStore & );
|
||||
};
|
||||
|
||||
inline void * bhe::operator new ( size_t size,
|
||||
|
||||
@@ -36,8 +36,28 @@
|
||||
#include "oldAccess.h"
|
||||
#include "cac.h"
|
||||
|
||||
epicsShareDef epicsThreadPrivateId caClientCallbackThreadId;
|
||||
|
||||
static epicsThreadOnceId cacOnce = EPICS_THREAD_ONCE_INIT;
|
||||
|
||||
extern "C" void cacExitHandler ()
|
||||
{
|
||||
epicsThreadPrivateDelete ( caClientCallbackThreadId );
|
||||
}
|
||||
|
||||
// runs once only for each process
|
||||
extern "C" void cacOnceFunc ( void * )
|
||||
{
|
||||
caClientCallbackThreadId = epicsThreadPrivateCreate ();
|
||||
assert ( caClientCallbackThreadId );
|
||||
atexit ( cacExitHandler );
|
||||
}
|
||||
|
||||
extern epicsThreadPrivateId caClientContextId;
|
||||
|
||||
cacService * ca_client_context::pDefaultService = 0;
|
||||
epicsMutex ca_client_context::defaultServiceInstallMutex;
|
||||
|
||||
ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
|
||||
ca_exception_func ( 0 ), ca_exception_arg ( 0 ),
|
||||
pVPrintfFunc ( errlogVprintf ), fdRegFunc ( 0 ), fdRegArg ( 0 ),
|
||||
@@ -47,6 +67,25 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
|
||||
{
|
||||
static const unsigned short PORT_ANY = 0u;
|
||||
|
||||
if ( ! osiSockAttach () ) {
|
||||
throwWithLocation ( noSocket () );
|
||||
}
|
||||
|
||||
epicsThreadOnce ( & cacOnce, cacOnceFunc, 0 );
|
||||
|
||||
{
|
||||
// this wont consistently work if called from file scope constructor
|
||||
epicsGuard < epicsMutex > guard ( ca_client_context::defaultServiceInstallMutex );
|
||||
if ( ca_client_context::pDefaultService ) {
|
||||
this->pServiceContext.reset (
|
||||
& ca_client_context::pDefaultService->contextCreate (
|
||||
this->mutex, this->cbMutex, *this ) );
|
||||
}
|
||||
else {
|
||||
this->pServiceContext.reset ( new cac ( this->mutex, this->cbMutex, *this ) );
|
||||
}
|
||||
}
|
||||
|
||||
this->sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
|
||||
if ( this->sock == INVALID_SOCKET ) {
|
||||
char sockErrBuf[64];
|
||||
@@ -113,17 +152,13 @@ ca_client_context::ca_client_context ( bool enablePreemptiveCallback ) :
|
||||
this->localPort = epicsNTOH16 ( tmpAddr.ia.sin_port );
|
||||
}
|
||||
|
||||
epics_auto_ptr < cac > pCAC (
|
||||
new cac ( *this ) );
|
||||
|
||||
epics_auto_ptr < epicsGuard < epicsMutex > > pCBGuard;
|
||||
if ( ! enablePreemptiveCallback ) {
|
||||
pCBGuard.reset ( new epicsGuard < epicsMutex > ( this->callbackMutex ) );
|
||||
pCBGuard.reset ( new epicsGuard < epicsMutex > ( this->cbMutex ) );
|
||||
}
|
||||
|
||||
// multiple steps ensure exception safety
|
||||
this->pCallbackGuard = pCBGuard;
|
||||
this->pClientCtx = pCAC;
|
||||
}
|
||||
|
||||
ca_client_context::~ca_client_context ()
|
||||
@@ -133,49 +168,83 @@ ca_client_context::~ca_client_context ()
|
||||
( this->fdRegArg, this->sock, false );
|
||||
}
|
||||
epicsSocketDestroy ( this->sock );
|
||||
|
||||
osiSockRelease ();
|
||||
|
||||
// force a logical shutdown order
|
||||
// so that the cac class does not hang its
|
||||
// receive threads during their shutdown sequence
|
||||
// and so that classes using this classes mutex
|
||||
// are destroyed before the mutex is destroyed
|
||||
if ( this->pCallbackGuard.get() ) {
|
||||
epicsGuardRelease < epicsMutex > unguard ( *this->pCallbackGuard );
|
||||
this->pServiceContext.reset ( 0 );
|
||||
}
|
||||
else {
|
||||
this->pServiceContext.reset ( 0 );
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::destroyChannel ( oldChannelNotify & chan )
|
||||
{
|
||||
chan.~oldChannelNotify ();
|
||||
this->oldChannelNotifyFreeList.release ( & chan );
|
||||
if ( this->pCallbackGuard.get() ) {
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
chan.destructor ( *this->pCallbackGuard.get(), guard );
|
||||
this->oldChannelNotifyFreeList.release ( & chan );
|
||||
}
|
||||
else {
|
||||
epicsGuard < epicsMutex > cbGuard ( this->cbMutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
chan.destructor ( cbGuard, guard );
|
||||
this->oldChannelNotifyFreeList.release ( & chan );
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::destroyGetCopy ( getCopy & gc )
|
||||
void ca_client_context::destroyGetCopy (
|
||||
epicsGuard < epicsMutex > & guard, getCopy & gc )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
gc.~getCopy ();
|
||||
this->getCopyFreeList.release ( & gc );
|
||||
}
|
||||
|
||||
void ca_client_context::destroyGetCallback ( getCallback & gcb )
|
||||
void ca_client_context::destroyGetCallback (
|
||||
epicsGuard < epicsMutex > & guard, getCallback & gcb )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
gcb.~getCallback ();
|
||||
this->getCallbackFreeList.release ( & gcb );
|
||||
}
|
||||
|
||||
void ca_client_context::destroyPutCallback ( putCallback & pcb )
|
||||
void ca_client_context::destroyPutCallback (
|
||||
epicsGuard < epicsMutex > & guard, putCallback & pcb )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
pcb.~putCallback ();
|
||||
this->putCallbackFreeList.release ( & pcb );
|
||||
}
|
||||
|
||||
void ca_client_context::destroySubscription ( oldSubscription & os )
|
||||
void ca_client_context::destroySubscription (
|
||||
epicsGuard < epicsMutex > & guard, oldSubscription & os )
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
os.~oldSubscription ();
|
||||
this->subscriptionFreeList.release ( & os );
|
||||
}
|
||||
|
||||
void ca_client_context::changeExceptionEvent ( caExceptionHandler *pfunc, void *arg )
|
||||
void ca_client_context::changeExceptionEvent (
|
||||
caExceptionHandler * pfunc, void * arg )
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->ca_exception_func = pfunc;
|
||||
this->ca_exception_arg = arg;
|
||||
// should block here until releated callback in progress completes
|
||||
}
|
||||
|
||||
void ca_client_context::replaceErrLogHandler ( caPrintfFunc *ca_printf_func )
|
||||
void ca_client_context::replaceErrLogHandler (
|
||||
caPrintfFunc * ca_printf_func )
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > autoMutex ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
if ( ca_printf_func ) {
|
||||
this->pVPrintfFunc = ca_printf_func;
|
||||
}
|
||||
@@ -185,16 +254,18 @@ void ca_client_context::replaceErrLogHandler ( caPrintfFunc *ca_printf_func )
|
||||
// should block here until releated callback in progress completes
|
||||
}
|
||||
|
||||
void ca_client_context::registerForFileDescriptorCallBack ( CAFDHANDLER *pFunc, void *pArg )
|
||||
void ca_client_context::registerForFileDescriptorCallBack (
|
||||
CAFDHANDLER *pFunc, void *pArg )
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > autoMutex ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->fdRegFunc = pFunc;
|
||||
this->fdRegArg = pArg;
|
||||
this->fdRegFuncNeedsToBeCalled = true;
|
||||
// should block here until releated callback in progress completes
|
||||
}
|
||||
|
||||
int ca_client_context::printf ( const char *pformat, ... ) const
|
||||
int ca_client_context::printf (
|
||||
const char *pformat, ... ) const
|
||||
{
|
||||
va_list theArgs;
|
||||
int status;
|
||||
@@ -208,11 +279,12 @@ int ca_client_context::printf ( const char *pformat, ... ) const
|
||||
return status;
|
||||
}
|
||||
|
||||
int ca_client_context::vPrintf ( const char *pformat, va_list args ) const // X aCC 361
|
||||
int ca_client_context::vPrintf (
|
||||
const char *pformat, va_list args ) const // X aCC 361
|
||||
{
|
||||
caPrintfFunc *pFunc;
|
||||
caPrintfFunc * pFunc;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > autoMutex ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
pFunc = this->pVPrintfFunc;
|
||||
}
|
||||
if ( pFunc ) {
|
||||
@@ -223,81 +295,137 @@ int ca_client_context::vPrintf ( const char *pformat, va_list args ) const // X
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::exception ( int stat, const char *pCtx,
|
||||
const char *pFile, unsigned lineNo )
|
||||
void ca_client_context::exception (
|
||||
epicsGuard < epicsMutex > & guard, int stat, const char * pCtx,
|
||||
const char * pFile, unsigned lineNo )
|
||||
{
|
||||
struct exception_handler_args args;
|
||||
caExceptionHandler *pFunc;
|
||||
void *pArg;
|
||||
caExceptionHandler * pFunc = this->ca_exception_func;
|
||||
void * pArg = this->ca_exception_arg;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > autoMutex ( this->mutex );
|
||||
pFunc = this->ca_exception_func;
|
||||
pArg = this->ca_exception_arg;
|
||||
}
|
||||
|
||||
// NOOP if they disable exceptions
|
||||
if ( pFunc ) {
|
||||
args.chid = NULL;
|
||||
args.type = TYPENOTCONN;
|
||||
args.count = 0;
|
||||
args.addr = NULL;
|
||||
args.stat = stat;
|
||||
args.op = CA_OP_OTHER;
|
||||
args.ctx = pCtx;
|
||||
args.pFile = pFile;
|
||||
args.lineNo = lineNo;
|
||||
args.usr = pArg;
|
||||
( *pFunc ) ( args );
|
||||
}
|
||||
else {
|
||||
this->pClientCtx->signal ( stat, pFile, lineNo, pCtx );
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
// NOOP if they disable exceptions
|
||||
if ( pFunc ) {
|
||||
args.chid = NULL;
|
||||
args.type = TYPENOTCONN;
|
||||
args.count = 0;
|
||||
args.addr = NULL;
|
||||
args.stat = stat;
|
||||
args.op = CA_OP_OTHER;
|
||||
args.ctx = pCtx;
|
||||
args.pFile = pFile;
|
||||
args.lineNo = lineNo;
|
||||
args.usr = pArg;
|
||||
( *pFunc ) ( args );
|
||||
}
|
||||
else {
|
||||
this->signal ( stat, pFile, lineNo, pCtx );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::exception ( int status, const char *pContext,
|
||||
const char *pFileName, unsigned lineNo, oldChannelNotify &chan,
|
||||
void ca_client_context::exception (
|
||||
epicsGuard < epicsMutex > & guard, int status, const char * pContext,
|
||||
const char * pFileName, unsigned lineNo, oldChannelNotify & chan,
|
||||
unsigned type, arrayElementCount count, unsigned op )
|
||||
{
|
||||
struct exception_handler_args args;
|
||||
caExceptionHandler *pFunc;
|
||||
void *pArg;
|
||||
caExceptionHandler * pFunc = this->ca_exception_func;
|
||||
void * pArg = this->ca_exception_arg;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > autoMutex ( this->mutex );
|
||||
pFunc = this->ca_exception_func;
|
||||
pArg = this->ca_exception_arg;
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
// NOOP if they disable exceptions
|
||||
if ( pFunc ) {
|
||||
args.chid = &chan;
|
||||
args.type = type;
|
||||
args.count = count;
|
||||
args.addr = NULL;
|
||||
args.stat = status;
|
||||
args.op = op;
|
||||
args.ctx = pContext;
|
||||
args.pFile = pFileName;
|
||||
args.lineNo = lineNo;
|
||||
args.usr = pArg;
|
||||
( *pFunc ) ( args );
|
||||
}
|
||||
else {
|
||||
this->signal ( status, pFileName, lineNo,
|
||||
"op=%u, channel=%s, type=%s, count=%lu, ctx=\"%s\"",
|
||||
op, ca_name ( &chan ),
|
||||
dbr_type_to_text ( static_cast <int> ( type ) ),
|
||||
count, pContext );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NOOP if they disable exceptions
|
||||
if ( pFunc ) {
|
||||
args.chid = &chan;
|
||||
args.type = type;
|
||||
args.count = count;
|
||||
args.addr = NULL;
|
||||
args.stat = status;
|
||||
args.op = op;
|
||||
args.ctx = pContext;
|
||||
args.pFile = pFileName;
|
||||
args.lineNo = lineNo;
|
||||
args.usr = pArg;
|
||||
( *pFunc ) ( args );
|
||||
void ca_client_context::signal ( int ca_status, const char * pfilenm,
|
||||
int lineno, const char * pFormat, ... )
|
||||
{
|
||||
va_list theArgs;
|
||||
va_start ( theArgs, pFormat );
|
||||
this->vSignal ( ca_status, pfilenm, lineno, pFormat, theArgs);
|
||||
va_end ( theArgs );
|
||||
}
|
||||
|
||||
void ca_client_context::vSignal ( int ca_status, const char *pfilenm,
|
||||
int lineno, const char *pFormat, va_list args )
|
||||
{
|
||||
static const char *severity[] =
|
||||
{
|
||||
"Warning",
|
||||
"Success",
|
||||
"Error",
|
||||
"Info",
|
||||
"Fatal",
|
||||
"Fatal",
|
||||
"Fatal",
|
||||
"Fatal"
|
||||
};
|
||||
|
||||
this->printf ( "CA.Client.Exception...............................................\n" );
|
||||
|
||||
this->printf ( " %s: \"%s\"\n",
|
||||
severity[ CA_EXTRACT_SEVERITY ( ca_status ) ],
|
||||
ca_message ( ca_status ) );
|
||||
|
||||
if ( pFormat ) {
|
||||
this->printf ( " Context: \"" );
|
||||
this->vPrintf ( pFormat, args );
|
||||
this->printf ( "\"\n" );
|
||||
}
|
||||
else {
|
||||
this->pClientCtx->signal ( status, pFileName, lineNo,
|
||||
"op=%u, channel=%s, type=%s, count=%lu, ctx=\"%s\"",
|
||||
op, ca_name ( &chan ),
|
||||
dbr_type_to_text ( static_cast <int> ( type ) ),
|
||||
count, pContext );
|
||||
|
||||
if ( pfilenm ) {
|
||||
this->printf ( " Source File: %s line %d\n",
|
||||
pfilenm, lineno );
|
||||
}
|
||||
|
||||
epicsTime current = epicsTime::getCurrent ();
|
||||
char date[64];
|
||||
current.strftime ( date, sizeof ( date ), "%a %b %d %Y %H:%M:%S.%f");
|
||||
this->printf ( " Current Time: %s\n", date );
|
||||
|
||||
/*
|
||||
* Terminate execution if unsuccessful
|
||||
*/
|
||||
if( ! ( ca_status & CA_M_SUCCESS ) &&
|
||||
CA_EXTRACT_SEVERITY ( ca_status ) != CA_K_WARNING ){
|
||||
errlogFlush ();
|
||||
abort ();
|
||||
}
|
||||
|
||||
this->printf ( "..................................................................\n" );
|
||||
}
|
||||
|
||||
void ca_client_context::show ( unsigned level ) const
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
::printf ( "ca_client_context at %p pndRecvCnt=%u ioSeqNo=%u\n",
|
||||
static_cast <const void *> ( this ),
|
||||
this->pndRecvCnt, this->ioSeqNo );
|
||||
|
||||
if ( level > 0u ) {
|
||||
this->mutex.show ( level - 1u );
|
||||
this->pClientCtx->show ( level - 1u );
|
||||
this->pServiceContext->show ( guard, level - 1u );
|
||||
::printf ( "\tpreemptive callback is %s\n",
|
||||
this->pCallbackGuard.get() ? "disabled" : "enabled" );
|
||||
::printf ( "\tthere are %u unsatisfied IO operations blocking ca_pend_io()\n",
|
||||
@@ -306,6 +434,8 @@ void ca_client_context::show ( unsigned level ) const
|
||||
this->ioSeqNo );
|
||||
::printf ( "IO done event:\n");
|
||||
this->ioDone.show ( level - 1u );
|
||||
::printf ( "Synchronous group identifier hash table:\n" );
|
||||
this->sgTable.show ( level - 1u );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -315,37 +445,26 @@ void ca_client_context::attachToClientCtx ()
|
||||
epicsThreadPrivateSet ( caClientContextId, this );
|
||||
}
|
||||
|
||||
void ca_client_context::incrementOutstandingIO ( unsigned ioSeqNoIn )
|
||||
void ca_client_context::incrementOutstandingIO (
|
||||
epicsGuard < epicsMutex > & guard, unsigned ioSeqNoIn )
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
if ( this->ioSeqNo == ioSeqNoIn ) {
|
||||
assert ( this->pndRecvCnt < UINT_MAX );
|
||||
this->pndRecvCnt++;
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::decrementOutstandingIO ( unsigned ioSeqNoIn )
|
||||
void ca_client_context::decrementOutstandingIO (
|
||||
epicsGuard < epicsMutex > & guard, unsigned ioSeqNoIn )
|
||||
{
|
||||
bool signalNeeded;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
if ( this->ioSeqNo == ioSeqNoIn ) {
|
||||
assert ( this->pndRecvCnt > 0u );
|
||||
this->pndRecvCnt--;
|
||||
if ( this->pndRecvCnt == 0u ) {
|
||||
signalNeeded = true;
|
||||
}
|
||||
else {
|
||||
signalNeeded = false;
|
||||
}
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
if ( this->ioSeqNo == ioSeqNoIn ) {
|
||||
assert ( this->pndRecvCnt > 0u );
|
||||
this->pndRecvCnt--;
|
||||
if ( this->pndRecvCnt == 0u ) {
|
||||
this->ioDone.signal ();
|
||||
}
|
||||
else {
|
||||
signalNeeded = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( signalNeeded ) {
|
||||
this->ioDone.signal ();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,7 +486,9 @@ int ca_client_context::pendIO ( const double & timeout )
|
||||
epicsTime beg_time = epicsTime::getCurrent ();
|
||||
double remaining = timeout;
|
||||
|
||||
this->flushRequest ();
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
this->flush ( guard );
|
||||
|
||||
while ( this->pndRecvCnt > 0 ) {
|
||||
if ( remaining < CAC_SIGNIFICANT_DELAY ) {
|
||||
@@ -375,7 +496,10 @@ int ca_client_context::pendIO ( const double & timeout )
|
||||
break;
|
||||
}
|
||||
|
||||
this->blockForEventAndEnableCallbacks ( this->ioDone, remaining );
|
||||
{
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
this->blockForEventAndEnableCallbacks ( this->ioDone, remaining );
|
||||
}
|
||||
|
||||
double delay = epicsTime::getCurrent () - beg_time;
|
||||
if ( delay < timeout ) {
|
||||
@@ -386,11 +510,8 @@ int ca_client_context::pendIO ( const double & timeout )
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
this->ioSeqNo++;
|
||||
this->pndRecvCnt = 0u;
|
||||
}
|
||||
this->ioSeqNo++;
|
||||
this->pndRecvCnt = 0u;
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -411,10 +532,16 @@ int ca_client_context::pendEvent ( const double & timeout )
|
||||
|
||||
epicsTime current = epicsTime::getCurrent ();
|
||||
|
||||
this->flushRequest ();
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->flush ( guard );
|
||||
}
|
||||
|
||||
// process at least once if preemptive callback is disabled
|
||||
if ( this->pCallbackGuard.get() ) {
|
||||
epicsGuardRelease < epicsMutex > cbUnguard ( *this->pCallbackGuard );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
//
|
||||
// This is needed because in non-preemptive callback mode
|
||||
// legacy applications that use file descriptor managers
|
||||
@@ -423,11 +550,11 @@ int ca_client_context::pendEvent ( const double & timeout )
|
||||
// been read. We must guarantee that other threads get a
|
||||
// chance to run if there is data in any of the sockets.
|
||||
//
|
||||
epicsGuardRelease < epicsMutex > unguardcb ( *this->pCallbackGuard );
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
if ( this->fdRegFunc ) {
|
||||
epicsGuardRelease < ca_client_context_mutex > unguard ( guard );
|
||||
// remove short udp message sent to wake up a file descriptor manager
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
|
||||
// remove short udp message sent to wake
|
||||
// up a file descriptor manager
|
||||
osiSockAddr tmpAddr;
|
||||
osiSocklen_t addrSize = sizeof ( tmpAddr.sa );
|
||||
char buf = 0;
|
||||
@@ -439,7 +566,7 @@ int ca_client_context::pendEvent ( const double & timeout )
|
||||
}
|
||||
this->noWakeupSincePend = true;
|
||||
while ( this->callbackThreadsPending > 0 ) {
|
||||
epicsGuardRelease < ca_client_context_mutex > unguard ( guard );
|
||||
epicsGuardRelease < epicsMutex > unguard ( guard );
|
||||
this->callbackThreadActivityComplete.wait ( 30.0 );
|
||||
}
|
||||
}
|
||||
@@ -479,13 +606,13 @@ void ca_client_context::blockForEventAndEnableCallbacks (
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::callbackLock ()
|
||||
void ca_client_context::callbackProcessingInitiateNotify ()
|
||||
{
|
||||
// if preemptive callback is enabled then this is a noop
|
||||
if ( this->pCallbackGuard.get() ) {
|
||||
bool sendNeeded = false;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->callbackThreadsPending++;
|
||||
if ( this->fdRegFunc && this->noWakeupSincePend ) {
|
||||
this->noWakeupSincePend = false;
|
||||
@@ -504,19 +631,15 @@ void ca_client_context::callbackLock ()
|
||||
0, & tmpAddr.sa, sizeof ( tmpAddr.sa ) );
|
||||
}
|
||||
}
|
||||
|
||||
this->callbackMutex.lock ();
|
||||
}
|
||||
|
||||
void ca_client_context::callbackUnlock ()
|
||||
void ca_client_context::callbackProcessingCompleteNotify ()
|
||||
{
|
||||
this->callbackMutex.unlock ();
|
||||
|
||||
// if preemptive callback is enabled then this is a noop
|
||||
if ( this->pCallbackGuard.get() ) {
|
||||
bool signalNeeded = false;
|
||||
{
|
||||
epicsGuard < ca_client_context_mutex > guard ( this->mutex );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
if ( this->callbackThreadsPending <= 1 ) {
|
||||
if ( this->callbackThreadsPending == 1 ) {
|
||||
this->callbackThreadsPending = 0;
|
||||
@@ -533,74 +656,89 @@ void ca_client_context::callbackUnlock ()
|
||||
}
|
||||
}
|
||||
|
||||
void ca_client_context::changeConnCallBack (
|
||||
caCh * pfunc, caCh * & pConnCallBack, const bool & currentlyConnected )
|
||||
cacChannel & ca_client_context::createChannel (
|
||||
epicsGuard < epicsMutex > & guard, const char * pChannelName,
|
||||
oldChannelNotify & chan, cacChannel::priLev pri )
|
||||
{
|
||||
epicsGuard < epicsMutex > callbackGuard ( this->callbackMutex );
|
||||
if ( ! currentlyConnected ) {
|
||||
if ( pfunc ) {
|
||||
if ( ! pConnCallBack ) {
|
||||
this->decrementOutstandingIO ( this->ioSeqNo );
|
||||
}
|
||||
}
|
||||
else {
|
||||
if ( pConnCallBack ) {
|
||||
this->incrementOutstandingIO ( this->ioSeqNo );
|
||||
}
|
||||
}
|
||||
}
|
||||
pConnCallBack = pfunc;
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
return this->pServiceContext->createChannel (
|
||||
guard, pChannelName, chan, pri );
|
||||
}
|
||||
|
||||
void ca_client_context::registerService ( cacService &service )
|
||||
void ca_client_context::flush ( epicsGuard < epicsMutex > & guard )
|
||||
{
|
||||
this->pClientCtx->registerService ( service );
|
||||
this->pServiceContext->flush ( guard );
|
||||
}
|
||||
|
||||
cacChannel & ca_client_context::createChannel ( const char * name_str,
|
||||
oldChannelNotify & chan, cacChannel::priLev pri )
|
||||
unsigned ca_client_context::circuitCount () const
|
||||
{
|
||||
return this->pClientCtx->createChannel ( name_str, chan, pri );
|
||||
}
|
||||
|
||||
void ca_client_context::flushRequest ()
|
||||
{
|
||||
this->pClientCtx->flushRequest ();
|
||||
}
|
||||
|
||||
unsigned ca_client_context::connectionCount () const
|
||||
{
|
||||
return this->pClientCtx->connectionCount ();
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
return this->pServiceContext->circuitCount ( guard );
|
||||
}
|
||||
|
||||
unsigned ca_client_context::beaconAnomaliesSinceProgramStart () const
|
||||
{
|
||||
return this->pClientCtx->beaconAnomaliesSinceProgramStart ();
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
return this->pServiceContext->beaconAnomaliesSinceProgramStart ( guard );
|
||||
}
|
||||
|
||||
CASG * ca_client_context::lookupCASG ( unsigned id )
|
||||
void ca_client_context::installCASG (
|
||||
epicsGuard < epicsMutex > & guard, CASG & sg )
|
||||
{
|
||||
return this->pClientCtx->lookupCASG ( id );
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
this->sgTable.add ( sg );
|
||||
}
|
||||
|
||||
void ca_client_context::installCASG ( CASG &sg )
|
||||
void ca_client_context::uninstallCASG (
|
||||
epicsGuard < epicsMutex > & guard, CASG & sg )
|
||||
{
|
||||
this->pClientCtx->installCASG ( sg );
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
this->sgTable.remove ( sg );
|
||||
}
|
||||
|
||||
void ca_client_context::uninstallCASG ( CASG &sg )
|
||||
CASG * ca_client_context::lookupCASG (
|
||||
epicsGuard < epicsMutex > & guard, unsigned idIn )
|
||||
{
|
||||
this->pClientCtx->uninstallCASG ( sg );
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
CASG * psg = this->sgTable.lookup ( idIn );
|
||||
if ( psg ) {
|
||||
if ( ! psg->verify ( guard ) ) {
|
||||
psg = 0;
|
||||
}
|
||||
}
|
||||
return psg;
|
||||
}
|
||||
|
||||
void ca_client_context::vSignal ( int ca_status, const char *pfilenm,
|
||||
int lineno, const char *pFormat, va_list args )
|
||||
void ca_client_context::selfTest () const
|
||||
{
|
||||
this->pClientCtx->vSignal ( ca_status, pfilenm,
|
||||
lineno, pFormat, args );
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->sgTable.verify ();
|
||||
this->pServiceContext->selfTest ( guard );
|
||||
}
|
||||
|
||||
void ca_client_context::selfTest ()
|
||||
epicsMutex & ca_client_context::mutexRef () const
|
||||
{
|
||||
this->pClientCtx->selfTest ();
|
||||
return this->mutex;
|
||||
}
|
||||
|
||||
cacContext & ca_client_context::createNetworkContext (
|
||||
epicsMutex & mutexIn, epicsMutex & cbMutexIn )
|
||||
{
|
||||
return * new cac ( mutexIn, cbMutexIn, *this );
|
||||
}
|
||||
|
||||
void ca_client_context::installDefaultService ( cacService & service )
|
||||
{
|
||||
// this wont consistently work if called from file scope constructor
|
||||
epicsGuard < epicsMutex > guard ( ca_client_context::defaultServiceInstallMutex );
|
||||
if ( ca_client_context::pDefaultService ) {
|
||||
throw std::logic_error
|
||||
( "CA in-memory service already installed and can't be replaced");
|
||||
}
|
||||
ca_client_context::pDefaultService = & service;
|
||||
}
|
||||
|
||||
void epicsShareAPI caInstallDefaultService ( cacService & service )
|
||||
{
|
||||
ca_client_context::installDefaultService ( service );
|
||||
}
|
||||
|
||||
1265
src/ca/cac.cpp
1265
src/ca/cac.cpp
File diff suppressed because it is too large
Load Diff
322
src/ca/cac.h
322
src/ca/cac.h
@@ -31,7 +31,7 @@
|
||||
# undef epicsExportSharedSymbols
|
||||
#endif
|
||||
|
||||
#include "cxxCompilerDependencies.h"
|
||||
#include "compilerDependencies.h"
|
||||
#include "ipAddrToAsciiAsynchronous.h"
|
||||
#include "msgForMultiplyDefinedPV.h"
|
||||
#include "epicsTimer.h"
|
||||
@@ -60,9 +60,12 @@ class netSubscription;
|
||||
// is applied
|
||||
class cacRecycle { // X aCC 655
|
||||
public:
|
||||
virtual void recycleReadNotifyIO ( netReadNotifyIO &io ) = 0;
|
||||
virtual void recycleWriteNotifyIO ( netWriteNotifyIO &io ) = 0;
|
||||
virtual void recycleSubscription ( netSubscription &io ) = 0;
|
||||
virtual void recycleReadNotifyIO (
|
||||
epicsGuard < epicsMutex > &, netReadNotifyIO &io ) = 0;
|
||||
virtual void recycleWriteNotifyIO (
|
||||
epicsGuard < epicsMutex > &, netWriteNotifyIO &io ) = 0;
|
||||
virtual void recycleSubscription (
|
||||
epicsGuard < epicsMutex > &, netSubscription &io ) = 0;
|
||||
};
|
||||
|
||||
struct CASG;
|
||||
@@ -70,107 +73,136 @@ class inetAddrID;
|
||||
class caServerID;
|
||||
struct caHdrLargeArray;
|
||||
|
||||
extern epicsThreadPrivateId caClientCallbackThreadId;
|
||||
|
||||
class callbackMutex {
|
||||
public:
|
||||
callbackMutex ( cacNotify & );
|
||||
~callbackMutex ();
|
||||
void lock ();
|
||||
void unlock ();
|
||||
private:
|
||||
cacNotify & notify;
|
||||
callbackMutex ( callbackMutex & );
|
||||
callbackMutex & operator = ( callbackMutex & );
|
||||
};
|
||||
|
||||
class cacMutex {
|
||||
public:
|
||||
void lock ();
|
||||
void unlock ();
|
||||
void show ( unsigned level ) const;
|
||||
private:
|
||||
epicsMutex mutex;
|
||||
};
|
||||
|
||||
class cacComBufMemoryManager : public comBufMemoryManager
|
||||
{
|
||||
public:
|
||||
cacComBufMemoryManager () {}
|
||||
void * allocate ( size_t );
|
||||
void release ( void * );
|
||||
private:
|
||||
tsFreeList < comBuf, 0x20 > freeList;
|
||||
cacComBufMemoryManager ( const cacComBufMemoryManager & );
|
||||
cacComBufMemoryManager & operator = ( const cacComBufMemoryManager & );
|
||||
};
|
||||
|
||||
class cacDisconnectChannelPrivate { // X aCC 655
|
||||
public:
|
||||
virtual void disconnectChannel (
|
||||
const epicsTime & currentTime,
|
||||
epicsGuard < callbackMutex > &,
|
||||
epicsGuard < cacMutex > &, nciu & chan ) = 0;
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard, nciu & chan ) = 0;
|
||||
};
|
||||
|
||||
class cac : private cacRecycle, private cacDisconnectChannelPrivate,
|
||||
class notifyGuard {
|
||||
public:
|
||||
notifyGuard ( cacContextNotify & );
|
||||
~notifyGuard ();
|
||||
private:
|
||||
cacContextNotify & notify;
|
||||
notifyGuard ( const notifyGuard & );
|
||||
notifyGuard & operator = ( const notifyGuard & );
|
||||
};
|
||||
|
||||
class callbackManager : public notifyGuard {
|
||||
public:
|
||||
callbackManager (
|
||||
cacContextNotify &,
|
||||
epicsMutex & callbackControl );
|
||||
epicsGuard < epicsMutex > cbGuard;
|
||||
};
|
||||
|
||||
class cac :
|
||||
public cacContext,
|
||||
private cacRecycle,
|
||||
private cacDisconnectChannelPrivate,
|
||||
private callbackForMultiplyDefinedPV
|
||||
{
|
||||
public:
|
||||
cac ( cacNotify & );
|
||||
cac (
|
||||
epicsMutex & mutualExclusion,
|
||||
epicsMutex & callbackControl,
|
||||
cacContextNotify & );
|
||||
virtual ~cac ();
|
||||
|
||||
// beacon management
|
||||
void beaconNotify ( const inetAddrID & addr, const epicsTime & currentTime,
|
||||
ca_uint32_t beaconNumber, unsigned protocolRevision );
|
||||
void repeaterSubscribeConfirmNotify ();
|
||||
unsigned beaconAnomaliesSinceProgramStart () const;
|
||||
unsigned beaconAnomaliesSinceProgramStart (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
|
||||
// IO management
|
||||
void flushRequest ();
|
||||
bool executeResponse ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
void flush ( epicsGuard < epicsMutex > & guard );
|
||||
bool executeResponse ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, caHdrLargeArray &, char *pMsgBody );
|
||||
|
||||
// channel routines
|
||||
bool transferChanToVirtCircuit (
|
||||
epicsGuard < callbackMutex > &,
|
||||
unsigned cid, unsigned sid,
|
||||
ca_uint16_t typeCode, arrayElementCount count,
|
||||
unsigned minorVersionNumber, const osiSockAddr & );
|
||||
|
||||
void destroyChannel ( nciu & );
|
||||
cacChannel & createChannel ( const char *name_str,
|
||||
cacChannelNotify &chan, cacChannel::priLev pri );
|
||||
void registerService ( cacService &service );
|
||||
void initiateConnect ( nciu & );
|
||||
epicsGuard < epicsMutex > &,
|
||||
unsigned cid, unsigned sid,
|
||||
ca_uint16_t typeCode, arrayElementCount count,
|
||||
unsigned minorVersionNumber, const osiSockAddr & );
|
||||
void disconnectAllChannels (
|
||||
epicsGuard < epicsMutex > & callbackControlGuard,
|
||||
epicsGuard < epicsMutex > & mutualExclusionGuard,
|
||||
tcpiiu & );
|
||||
cacChannel & createChannel (
|
||||
epicsGuard < epicsMutex > & guard, const char * pChannelName,
|
||||
cacChannelNotify &, cacChannel::priLev );
|
||||
void destroyChannel (
|
||||
epicsGuard < epicsMutex > & callbackControlGuard,
|
||||
epicsGuard < epicsMutex > & mutualExclusionGuard,
|
||||
nciu & );
|
||||
void initiateConnect (
|
||||
epicsGuard < epicsMutex > &, nciu & );
|
||||
|
||||
// IO requests
|
||||
void writeRequest ( nciu &, unsigned type,
|
||||
void writeRequest ( epicsGuard < epicsMutex > &, nciu &, unsigned type,
|
||||
arrayElementCount nElem, const void * pValue );
|
||||
cacChannel::ioid writeNotifyRequest ( nciu &, unsigned type,
|
||||
arrayElementCount nElem, const void *pValue, cacWriteNotify & );
|
||||
cacChannel::ioid readNotifyRequest ( nciu &, unsigned type,
|
||||
arrayElementCount nElem, cacReadNotify & );
|
||||
cacChannel::ioid subscriptionRequest ( nciu &, unsigned type,
|
||||
arrayElementCount nElem, unsigned mask, cacStateNotify & );
|
||||
void ioCancel ( nciu & chan, const cacChannel::ioid & id );
|
||||
void ioShow ( const cacChannel::ioid &id, unsigned level ) const;
|
||||
netWriteNotifyIO & writeNotifyRequest (
|
||||
epicsGuard < epicsMutex > &, nciu &, privateInterfaceForIO &,
|
||||
unsigned type, arrayElementCount nElem, const void * pValue,
|
||||
cacWriteNotify & );
|
||||
netReadNotifyIO & readNotifyRequest (
|
||||
epicsGuard < epicsMutex > &, nciu &, privateInterfaceForIO &,
|
||||
unsigned type, arrayElementCount nElem,
|
||||
cacReadNotify & );
|
||||
netSubscription & subscriptionRequest (
|
||||
epicsGuard < epicsMutex > &, nciu &, privateInterfaceForIO &,
|
||||
unsigned type, arrayElementCount nElem, unsigned mask,
|
||||
cacStateNotify & );
|
||||
baseNMIU * destroyIO (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
const cacChannel::ioid & idIn,
|
||||
nciu & chan );
|
||||
void disconnectAllIO (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
nciu &, tsDLList < baseNMIU > & ioList );
|
||||
|
||||
void ioShow (
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
const cacChannel::ioid &id, unsigned level ) const;
|
||||
|
||||
// sync group routines
|
||||
CASG * lookupCASG ( unsigned id );
|
||||
void installCASG ( CASG & );
|
||||
void uninstallCASG ( CASG & );
|
||||
CASG * lookupCASG ( epicsGuard < epicsMutex > &, unsigned id );
|
||||
void installCASG ( epicsGuard < epicsMutex > &, CASG & );
|
||||
void uninstallCASG ( epicsGuard < epicsMutex > &, CASG & );
|
||||
|
||||
// exception generation
|
||||
void exception ( epicsGuard < callbackMutex > &, int status, const char * pContext,
|
||||
void exception (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
int status, const char * pContext,
|
||||
const char * pFileName, unsigned lineNo );
|
||||
|
||||
// diagnostics
|
||||
unsigned connectionCount () const;
|
||||
void show ( unsigned level ) const;
|
||||
int printf ( const char *pformat, ... ) const;
|
||||
int vPrintf ( const char *pformat, va_list args ) const;
|
||||
void signal ( int ca_status, const char *pfilenm,
|
||||
int lineno, const char *pFormat, ... );
|
||||
void vSignal ( int ca_status, const char *pfilenm,
|
||||
int lineno, const char *pFormat, va_list args );
|
||||
unsigned circuitCount ( epicsGuard < epicsMutex > & ) const;
|
||||
void show ( epicsGuard < epicsMutex > &, unsigned level ) const;
|
||||
int printf ( epicsGuard < epicsMutex > & callbackControl,
|
||||
const char *pformat, ... ) const;
|
||||
int vPrintf ( epicsGuard < epicsMutex > & callbackControl,
|
||||
const char *pformat, va_list args ) const;
|
||||
|
||||
// buffer management
|
||||
char * allocateSmallBufferTCP ();
|
||||
@@ -182,19 +214,20 @@ public:
|
||||
// misc
|
||||
const char * userNamePointer () const;
|
||||
unsigned getInitializingThreadsPriority () const;
|
||||
cacMutex & mutexRef ();
|
||||
epicsMutex & mutexRef ();
|
||||
void attachToClientCtx ();
|
||||
void selfTest () const;
|
||||
double beaconPeriod ( const nciu & chan ) const;
|
||||
void selfTest (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
double beaconPeriod (
|
||||
epicsGuard < epicsMutex > &,
|
||||
const nciu & chan ) const;
|
||||
static unsigned lowestPriorityLevelAbove ( unsigned priority );
|
||||
static unsigned highestPriorityLevelBelow ( unsigned priority );
|
||||
void initiateAbortShutdown ( tcpiiu & );
|
||||
void disconnectNotify ( tcpiiu & );
|
||||
void destroyIIU ( tcpiiu & iiu );
|
||||
void flushIfRequired ( epicsGuard < epicsMutex > &, netiiu & );
|
||||
|
||||
private:
|
||||
localHostName hostNameCache;
|
||||
cacServiceList services;
|
||||
chronIntIdResTable < nciu > chanTable;
|
||||
//
|
||||
// !!!! There is at this point no good reason
|
||||
@@ -209,10 +242,9 @@ private:
|
||||
// !!!! terms of detecting damaged protocol.
|
||||
//
|
||||
chronIntIdResTable < baseNMIU > ioTable;
|
||||
chronIntIdResTable < CASG > sgTable;
|
||||
resTable < bhe, inetAddrID > beaconTable;
|
||||
resTable < tcpiiu, caServerID > serverTable;
|
||||
tsDLList < tcpiiu > serverList;
|
||||
tsDLList < tcpiiu > circuitList;
|
||||
tsFreeList
|
||||
< class tcpiiu, 32, epicsMutexNOOP >
|
||||
freeListVirtualCircuit;
|
||||
@@ -225,7 +257,9 @@ private:
|
||||
tsFreeList
|
||||
< class netSubscription, 1024, epicsMutexNOOP >
|
||||
freeListSubscription;
|
||||
tsFreeList < nciu, 1024 > channelFreeList;
|
||||
tsFreeList
|
||||
< class nciu, 1024, epicsMutexNOOP >
|
||||
channelFreeList;
|
||||
tsFreeList
|
||||
< class msgForMultiplyDefinedPV, 16 >
|
||||
mdpvFreeList;
|
||||
@@ -236,102 +270,90 @@ private:
|
||||
// **** lock hierarchy ****
|
||||
// callback lock must always be acquired before
|
||||
// the primary mutex if both locks are needed
|
||||
callbackMutex cbMutex;
|
||||
mutable cacMutex mutex;
|
||||
mutable epicsMutex & mutex;
|
||||
mutable epicsMutex & cbMutex;
|
||||
epicsEvent iiuUninstall;
|
||||
epicsSingleton
|
||||
< cacServiceList >::reference
|
||||
globalServiceList;
|
||||
ipAddrToAsciiEngine & ipToAEngine;
|
||||
ipAddrToAsciiEngine & ipToAEngine;
|
||||
epicsTimerQueueActive & timerQueue;
|
||||
char * pUserName;
|
||||
class udpiiu * pudpiiu;
|
||||
void * tcpSmallRecvBufFreeList;
|
||||
void * tcpLargeRecvBufFreeList;
|
||||
cacNotify & notify;
|
||||
cacContextNotify & notify;
|
||||
epicsThreadId initializingThreadsId;
|
||||
unsigned initializingThreadsPriority;
|
||||
unsigned maxRecvBytesTCP;
|
||||
unsigned beaconAnomalyCount;
|
||||
unsigned circuitsInstalled;
|
||||
|
||||
void run ();
|
||||
void connectAllIO ( epicsGuard < cacMutex > &, nciu &chan );
|
||||
void disconnectAllIO ( epicsGuard < cacMutex > & locker, nciu & chan, bool enableCallbacks );
|
||||
void flushIfRequired ( epicsGuard < cacMutex > &, netiiu & );
|
||||
void recycleReadNotifyIO ( netReadNotifyIO &io );
|
||||
void recycleWriteNotifyIO ( netWriteNotifyIO &io );
|
||||
void recycleSubscription ( netSubscription &io );
|
||||
void recycleReadNotifyIO (
|
||||
epicsGuard < epicsMutex > &, netReadNotifyIO &io );
|
||||
void recycleWriteNotifyIO (
|
||||
epicsGuard < epicsMutex > &, netWriteNotifyIO &io );
|
||||
void recycleSubscription (
|
||||
epicsGuard < epicsMutex > &, netSubscription &io );
|
||||
|
||||
void disconnectChannel (
|
||||
const epicsTime & currentTime,
|
||||
epicsGuard < callbackMutex > &,
|
||||
epicsGuard < cacMutex > &, nciu & chan );
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard, nciu & chan );
|
||||
|
||||
void ioCompletionNotify ( unsigned id, unsigned type,
|
||||
arrayElementCount count, const void *pData );
|
||||
void ioExceptionNotify ( unsigned id,
|
||||
int status, const char *pContext );
|
||||
void ioExceptionNotify ( unsigned id, int status,
|
||||
const char *pContext, unsigned type, arrayElementCount count );
|
||||
const char * pContext, unsigned type, arrayElementCount count );
|
||||
void ioExceptionNotifyAndUninstall ( unsigned id, int status,
|
||||
const char * pContext, unsigned type, arrayElementCount count );
|
||||
|
||||
void pvMultiplyDefinedNotify ( msgForMultiplyDefinedPV & mfmdpv,
|
||||
const char * pChannelName, const char * pAcc, const char * pRej );
|
||||
|
||||
void ioCompletionNotifyAndDestroy ( unsigned id );
|
||||
void ioCompletionNotifyAndDestroy ( unsigned id,
|
||||
unsigned type, arrayElementCount count, const void *pData );
|
||||
void ioExceptionNotifyAndDestroy ( unsigned id,
|
||||
int status, const char *pContext );
|
||||
void ioExceptionNotifyAndDestroy ( unsigned id,
|
||||
int status, const char *pContext, unsigned type, arrayElementCount count );
|
||||
|
||||
// recv protocol stubs
|
||||
bool versionAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool versionAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool echoRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool echoRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool writeNotifyRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool writeNotifyRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool readNotifyRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool readNotifyRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool eventRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool eventRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool readRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool readRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool clearChannelRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool clearChannelRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool exceptionRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool exceptionRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool accessRightsRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool accessRightsRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool claimCIURespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool createChannelRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool verifyAndDisconnectChan ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool verifyAndDisconnectChan ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
bool badTCPRespAction ( epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
bool badTCPRespAction ( callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
|
||||
typedef bool ( cac::*pProtoStubTCP ) (
|
||||
epicsGuard < callbackMutex > &, tcpiiu &,
|
||||
callbackManager &, tcpiiu &,
|
||||
const epicsTime & currentTime, const caHdrLargeArray &, void *pMsgBdy );
|
||||
static const pProtoStubTCP tcpJumpTableCAC [];
|
||||
|
||||
bool defaultExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool defaultExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool eventAddExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool eventAddExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool readExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool readExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool writeExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool writeExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool clearChanExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool clearChanExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool readNotifyExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool readNotifyExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
bool writeNotifyExcep ( epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
bool writeNotifyExcep ( callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
typedef bool ( cac::*pExcepProtoStubTCP ) (
|
||||
epicsGuard < callbackMutex > &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
callbackManager &, tcpiiu &iiu, const caHdrLargeArray &hdr,
|
||||
const char *pCtx, unsigned status );
|
||||
static const pExcepProtoStubTCP tcpExcepJumpTableCAC [];
|
||||
|
||||
@@ -349,19 +371,16 @@ inline unsigned cac::getInitializingThreadsPriority () const
|
||||
return this->initializingThreadsPriority;
|
||||
}
|
||||
|
||||
inline cacMutex & cac::mutexRef ()
|
||||
inline epicsMutex & cac::mutexRef ()
|
||||
{
|
||||
return this->mutex;
|
||||
}
|
||||
|
||||
inline void cac::exception ( epicsGuard < callbackMutex > &, int status,
|
||||
const char *pContext, const char *pFileName, unsigned lineNo )
|
||||
{
|
||||
this->notify.exception ( status, pContext, pFileName, lineNo );
|
||||
}
|
||||
|
||||
inline int cac::vPrintf ( const char *pformat, va_list args ) const
|
||||
inline int cac::vPrintf (
|
||||
epicsGuard < epicsMutex > & callbackControl,
|
||||
const char *pformat, va_list args ) const
|
||||
{
|
||||
callbackControl.assertIdenticalMutex ( this->cbMutex );
|
||||
return this->notify.vPrintf ( pformat, args );
|
||||
}
|
||||
|
||||
@@ -399,43 +418,38 @@ inline void cac::releaseLargeBufferTCP ( char *pBuf )
|
||||
freeListFree ( this->tcpLargeRecvBufFreeList, pBuf );
|
||||
}
|
||||
|
||||
inline unsigned cac::beaconAnomaliesSinceProgramStart () const
|
||||
inline unsigned cac::beaconAnomaliesSinceProgramStart (
|
||||
epicsGuard < epicsMutex > & guard ) const
|
||||
{
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
return this->beaconAnomalyCount;
|
||||
}
|
||||
|
||||
inline void cacMutex::lock ()
|
||||
inline void cac::disconnectAllChannels (
|
||||
epicsGuard < epicsMutex > & cbGuard,
|
||||
epicsGuard < epicsMutex > & guard,
|
||||
tcpiiu & iiu )
|
||||
{
|
||||
this->mutex.lock ();
|
||||
cbGuard.assertIdenticalMutex ( this->cbMutex );
|
||||
guard.assertIdenticalMutex ( this->mutex );
|
||||
iiu.removeAllChannels ( cbGuard, guard, *this->pudpiiu );
|
||||
}
|
||||
|
||||
inline void cacMutex::unlock ()
|
||||
{
|
||||
this->mutex.unlock ();
|
||||
}
|
||||
|
||||
inline void cacMutex::show ( unsigned level ) const
|
||||
{
|
||||
this->mutex.show ( level );
|
||||
}
|
||||
|
||||
inline callbackMutex::callbackMutex ( cacNotify & notifyIn ) :
|
||||
inline notifyGuard::notifyGuard ( cacContextNotify & notifyIn ) :
|
||||
notify ( notifyIn )
|
||||
{
|
||||
this->notify.callbackProcessingInitiateNotify ();
|
||||
}
|
||||
|
||||
inline callbackMutex::~callbackMutex ()
|
||||
inline notifyGuard::~notifyGuard ()
|
||||
{
|
||||
this->notify.callbackProcessingCompleteNotify ();
|
||||
}
|
||||
|
||||
inline void callbackMutex::lock ()
|
||||
inline callbackManager::callbackManager (
|
||||
cacContextNotify & notify, epicsMutex & callbackControl ) :
|
||||
notifyGuard ( notify ), cbGuard ( callbackControl )
|
||||
{
|
||||
this->notify.callbackLock ();
|
||||
}
|
||||
|
||||
inline void callbackMutex::unlock ()
|
||||
{
|
||||
this->notify.callbackUnlock ();
|
||||
}
|
||||
|
||||
#endif // ifdef cach
|
||||
|
||||
@@ -43,39 +43,47 @@ cacChannel::~cacChannel ()
|
||||
{
|
||||
}
|
||||
|
||||
caAccessRights cacChannel::accessRights () const
|
||||
caAccessRights cacChannel::accessRights (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
static caAccessRights ar ( true, true );
|
||||
return ar;
|
||||
}
|
||||
|
||||
unsigned cacChannel::searchAttempts () const
|
||||
unsigned cacChannel::searchAttempts (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return 0u;
|
||||
}
|
||||
|
||||
double cacChannel::beaconPeriod () const
|
||||
double cacChannel::beaconPeriod (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return - DBL_MAX;
|
||||
}
|
||||
|
||||
double cacChannel::receiveWatchdogDelay () const
|
||||
double cacChannel::receiveWatchdogDelay (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return - DBL_MAX;
|
||||
}
|
||||
|
||||
bool cacChannel::ca_v42_ok () const
|
||||
bool cacChannel::ca_v42_ok (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cacChannel::connected () const
|
||||
bool cacChannel::connected (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// the default is to assume that it is a locally hosted channel
|
||||
void cacChannel::hostName ( char *pBuf, unsigned bufLength ) const
|
||||
void cacChannel::hostName (
|
||||
epicsGuard < epicsMutex > &,
|
||||
char *pBuf, unsigned bufLength ) const
|
||||
{
|
||||
if ( bufLength ) {
|
||||
epicsSingleton < localHostName >::reference
|
||||
@@ -86,7 +94,8 @@ void cacChannel::hostName ( char *pBuf, unsigned bufLength ) const
|
||||
|
||||
// deprecated - please do not use
|
||||
// the default is to assume that it is a locally hosted channel
|
||||
const char * cacChannel::pHostName () const
|
||||
const char * cacChannel::pHostName (
|
||||
epicsGuard < epicsMutex > & ) const
|
||||
{
|
||||
epicsSingleton < localHostName >::reference
|
||||
ref ( localHostNameAtLoadTime.getReference () );
|
||||
@@ -104,5 +113,8 @@ void cacChannel::operator delete ( void * )
|
||||
__FILE__, __LINE__ );
|
||||
}
|
||||
|
||||
cacContext::~cacContext () {}
|
||||
|
||||
cacService::~cacService () {}
|
||||
|
||||
|
||||
|
||||
@@ -27,15 +27,15 @@
|
||||
#include "cacIO.h"
|
||||
#undef epicsExportSharedSymbols
|
||||
|
||||
cacNotify::~cacNotify ()
|
||||
cacContextNotify::~cacContextNotify ()
|
||||
{
|
||||
}
|
||||
|
||||
void cacNotify::callbackLock ()
|
||||
void cacContextNotify::callbackProcessingInitiateNotify ()
|
||||
{
|
||||
}
|
||||
|
||||
void cacNotify::callbackUnlock ()
|
||||
void cacContextNotify::callbackProcessingCompleteNotify ()
|
||||
{
|
||||
}
|
||||
|
||||
189
src/ca/cacIO.h
189
src/ca/cacIO.h
@@ -55,6 +55,8 @@
|
||||
|
||||
#include "tsDLList.h"
|
||||
#include "epicsMutex.h"
|
||||
#include "epicsGuard.h"
|
||||
#include "epicsSingleton.h"
|
||||
|
||||
#ifdef cacIOh_restore_epicsExportSharedSymbols
|
||||
# define epicsExportSharedSymbols
|
||||
@@ -71,9 +73,11 @@ typedef unsigned long arrayElementCount;
|
||||
class epicsShareClass cacWriteNotify { // X aCC 655
|
||||
public:
|
||||
virtual ~cacWriteNotify () = 0;
|
||||
virtual void completion () = 0;
|
||||
virtual void completion ( epicsGuard < epicsMutex > & ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void exception ( int status, const char *pContext,
|
||||
virtual void exception (
|
||||
epicsGuard < epicsMutex > &,
|
||||
int status, const char * pContext,
|
||||
unsigned type, arrayElementCount count ) = 0;
|
||||
};
|
||||
|
||||
@@ -82,11 +86,14 @@ public:
|
||||
class epicsShareClass cacReadNotify { // X aCC 655
|
||||
public:
|
||||
virtual ~cacReadNotify () = 0;
|
||||
virtual void completion ( unsigned type,
|
||||
arrayElementCount count, const void *pData ) = 0;
|
||||
virtual void completion (
|
||||
epicsGuard < epicsMutex > &, unsigned type,
|
||||
arrayElementCount count, const void * pData ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void exception ( int status,
|
||||
const char *pContext, unsigned type, arrayElementCount count ) = 0;
|
||||
virtual void exception (
|
||||
epicsGuard < epicsMutex > &, int status,
|
||||
const char * pContext, unsigned type,
|
||||
arrayElementCount count ) = 0;
|
||||
};
|
||||
|
||||
// 1) this should not be passing caerr.h status to the exception callback
|
||||
@@ -94,11 +101,14 @@ public:
|
||||
class epicsShareClass cacStateNotify { // X aCC 655
|
||||
public:
|
||||
virtual ~cacStateNotify () = 0;
|
||||
virtual void current ( unsigned type,
|
||||
arrayElementCount count, const void *pData ) = 0;
|
||||
virtual void current (
|
||||
epicsGuard < epicsMutex > &, unsigned type,
|
||||
arrayElementCount count, const void * pData ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void exception ( int status,
|
||||
const char *pContext, unsigned type, arrayElementCount count ) = 0;
|
||||
virtual void exception (
|
||||
epicsGuard < epicsMutex > &, int status,
|
||||
const char *pContext, unsigned type,
|
||||
arrayElementCount count ) = 0;
|
||||
};
|
||||
|
||||
class caAccessRights {
|
||||
@@ -125,16 +135,20 @@ private:
|
||||
class epicsShareClass cacChannelNotify { // X aCC 655
|
||||
public:
|
||||
virtual ~cacChannelNotify () = 0;
|
||||
virtual void connectNotify () = 0;
|
||||
virtual void disconnectNotify () = 0;
|
||||
virtual void connectNotify ( epicsGuard < epicsMutex > & ) = 0;
|
||||
virtual void disconnectNotify ( epicsGuard < epicsMutex > & ) = 0;
|
||||
virtual void serviceShutdownNotify () = 0;
|
||||
virtual void accessRightsNotify ( const caAccessRights & ) = 0;
|
||||
virtual void exception ( int status, const char *pContext ) = 0;
|
||||
virtual void accessRightsNotify (
|
||||
epicsGuard < epicsMutex > &, const caAccessRights & ) = 0;
|
||||
virtual void exception (
|
||||
epicsGuard < epicsMutex > &, int status, const char *pContext ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void readException ( int status, const char *pContext,
|
||||
virtual void readException (
|
||||
epicsGuard < epicsMutex > &, int status, const char *pContext,
|
||||
unsigned type, arrayElementCount count, void *pValue ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void writeException ( int status, const char *pContext,
|
||||
virtual void writeException (
|
||||
epicsGuard < epicsMutex > &, int status, const char * pContext,
|
||||
unsigned type, arrayElementCount count ) = 0;
|
||||
};
|
||||
|
||||
@@ -159,32 +173,61 @@ public:
|
||||
enum ioStatus { iosSynch, iosAsynch };
|
||||
|
||||
cacChannel ( cacChannelNotify & );
|
||||
cacChannelNotify & notify () const;
|
||||
virtual void destroy () = 0;
|
||||
virtual const char * pName () const = 0; // not thread safe
|
||||
virtual void show ( unsigned level ) const = 0;
|
||||
virtual void initiateConnect () = 0;
|
||||
virtual ioStatus read ( unsigned type, arrayElementCount count,
|
||||
virtual void destroy (
|
||||
epicsGuard < epicsMutex > & callbackControlGuard,
|
||||
epicsGuard < epicsMutex > & mutualExclusionGuard ) = 0;
|
||||
cacChannelNotify & notify () const; // required ?????
|
||||
virtual const char * pName (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual void show (
|
||||
epicsGuard < epicsMutex > &,
|
||||
unsigned level ) const = 0;
|
||||
virtual void initiateConnect (
|
||||
epicsGuard < epicsMutex > & ) = 0;
|
||||
virtual ioStatus read (
|
||||
epicsGuard < epicsMutex > &,
|
||||
unsigned type, arrayElementCount count,
|
||||
cacReadNotify &, ioid * = 0 ) = 0;
|
||||
virtual void write ( unsigned type, arrayElementCount count,
|
||||
virtual void write (
|
||||
epicsGuard < epicsMutex > &,
|
||||
unsigned type, arrayElementCount count,
|
||||
const void *pValue ) = 0;
|
||||
virtual ioStatus write ( unsigned type, arrayElementCount count,
|
||||
virtual ioStatus write (
|
||||
epicsGuard < epicsMutex > &,
|
||||
unsigned type, arrayElementCount count,
|
||||
const void *pValue, cacWriteNotify &, ioid * = 0 ) = 0;
|
||||
virtual void subscribe ( unsigned type, arrayElementCount count,
|
||||
unsigned mask, cacStateNotify &, ioid * = 0 ) = 0;
|
||||
virtual void ioCancel ( const ioid & ) = 0;
|
||||
virtual void ioShow ( const ioid &, unsigned level ) const = 0;
|
||||
virtual short nativeType () const = 0;
|
||||
virtual arrayElementCount nativeElementCount () const = 0;
|
||||
virtual caAccessRights accessRights () const; // defaults to unrestricted access
|
||||
virtual unsigned searchAttempts () const; // defaults to zero
|
||||
virtual double beaconPeriod () const; // defaults to negative DBL_MAX
|
||||
virtual double receiveWatchdogDelay () const; // defaults to negative DBL_MAX
|
||||
virtual bool ca_v42_ok () const; // defaults to true
|
||||
virtual bool connected () const; // defaults to true
|
||||
virtual void subscribe (
|
||||
epicsGuard < epicsMutex > &, unsigned type,
|
||||
arrayElementCount count, unsigned mask, cacStateNotify &,
|
||||
ioid * = 0 ) = 0;
|
||||
virtual void ioCancel (
|
||||
epicsGuard < epicsMutex > & callbackControlGuard,
|
||||
epicsGuard < epicsMutex > & mutualExclusionGuard,
|
||||
const ioid & ) = 0;
|
||||
virtual void ioShow (
|
||||
epicsGuard < epicsMutex > &,
|
||||
const ioid &, unsigned level ) const = 0;
|
||||
virtual short nativeType (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual arrayElementCount nativeElementCount (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual caAccessRights accessRights (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
virtual unsigned searchAttempts (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
virtual double beaconPeriod (
|
||||
epicsGuard < epicsMutex > & ) const; // negative DBL_MAX if UKN
|
||||
virtual double receiveWatchdogDelay (
|
||||
epicsGuard < epicsMutex > & ) const; // negative DBL_MAX if UKN
|
||||
virtual bool ca_v42_ok (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
virtual bool connected (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
virtual void hostName (
|
||||
char * pBuf, unsigned bufLength ) const; // defaults to local host name
|
||||
virtual const char * pHostName () const;
|
||||
epicsGuard < epicsMutex > &,
|
||||
char * pBuf, unsigned bufLength ) const;
|
||||
virtual const char * pHostName (
|
||||
epicsGuard < epicsMutex > & ) const;
|
||||
|
||||
// exceptions
|
||||
class badString {};
|
||||
@@ -210,49 +253,59 @@ private:
|
||||
void operator delete ( void * );
|
||||
};
|
||||
|
||||
class cacNotify { // X aCC 655
|
||||
class epicsShareClass cacContext { // X aCC 655
|
||||
public:
|
||||
virtual ~cacNotify () = 0;
|
||||
virtual ~cacContext ();
|
||||
virtual cacChannel & createChannel (
|
||||
epicsGuard < epicsMutex > &,
|
||||
const char * pChannelName, cacChannelNotify &,
|
||||
cacChannel::priLev = cacChannel::priorityDefault ) = 0;
|
||||
virtual void flush (
|
||||
epicsGuard < epicsMutex > & ) = 0;
|
||||
virtual unsigned circuitCount (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual void selfTest (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual unsigned beaconAnomaliesSinceProgramStart (
|
||||
epicsGuard < epicsMutex > & ) const = 0;
|
||||
virtual void show (
|
||||
epicsGuard < epicsMutex > &, unsigned level ) const = 0;
|
||||
};
|
||||
|
||||
class epicsShareClass cacContextNotify { // X aCC 655
|
||||
public:
|
||||
virtual ~cacContextNotify () = 0;
|
||||
virtual cacContext & createNetworkContext (
|
||||
epicsMutex & mutualExclusion, epicsMutex & callbackControl ) = 0;
|
||||
// we should probably have a different vf for each type of exception ????
|
||||
virtual void exception ( int status, const char * pContext,
|
||||
virtual void exception (
|
||||
epicsGuard < epicsMutex > &, int status, const char * pContext,
|
||||
const char * pFileName, unsigned lineNo ) = 0;
|
||||
// perhaps this should be phased out in deference to the exception mechanism
|
||||
virtual int vPrintf ( const char *pformat, va_list args ) const = 0;
|
||||
// backwards compatibility
|
||||
virtual int vPrintf ( const char * pformat, va_list args ) const = 0;
|
||||
// backwards compatibility (from here down)
|
||||
virtual void attachToClientCtx () = 0;
|
||||
virtual void blockForEventAndEnableCallbacks (
|
||||
class epicsEvent & event, const double & timeout ) = 0;
|
||||
virtual void callbackLock () = 0;
|
||||
virtual void callbackUnlock () = 0;
|
||||
virtual void callbackProcessingInitiateNotify () = 0;
|
||||
virtual void callbackProcessingCompleteNotify () = 0;
|
||||
};
|
||||
|
||||
class cacService : public tsDLNode < cacService > { // X aCC 655
|
||||
// **** Lock Hierarchy ****
|
||||
// callbackControl must be taken before mutualExclusion if both are held at
|
||||
// the same time
|
||||
class epicsShareClass cacService { // X aCC 655
|
||||
public:
|
||||
virtual cacChannel * createChannel (
|
||||
const char *pName, cacChannelNotify &,
|
||||
cacChannel::priLev = cacChannel::priorityDefault ) = 0;
|
||||
virtual void show ( unsigned level ) const = 0;
|
||||
virtual ~cacService () = 0;
|
||||
virtual cacContext & contextCreate (
|
||||
epicsMutex & mutualExclusion,
|
||||
epicsMutex & callbackControl,
|
||||
cacContextNotify & ) = 0;
|
||||
};
|
||||
|
||||
class cacServiceList {
|
||||
public:
|
||||
epicsShareFunc cacServiceList ();
|
||||
epicsShareFunc void registerService ( cacService &service );
|
||||
epicsShareFunc cacChannel * createChannel (
|
||||
const char *pName, cacChannelNotify &,
|
||||
cacChannel::priLev = cacChannel::priorityDefault );
|
||||
epicsShareFunc void show ( unsigned level ) const;
|
||||
private:
|
||||
tsDLList < cacService > services;
|
||||
mutable epicsMutex mutex;
|
||||
cacServiceList ( const cacServiceList & );
|
||||
cacServiceList & operator = ( const cacServiceList & );
|
||||
};
|
||||
epicsShareFunc void epicsShareAPI caInstallDefaultService ( cacService & service );
|
||||
|
||||
template < class T > class epicsSingleton;
|
||||
epicsShareExtern epicsSingleton < cacServiceList > globalServiceListCAC;
|
||||
|
||||
epicsShareFunc int epicsShareAPI ca_register_service ( cacService *pService );
|
||||
epicsShareExtern epicsThreadPrivateId caClientCallbackThreadId;
|
||||
|
||||
inline cacChannel::cacChannel ( cacChannelNotify & notify ) :
|
||||
callback ( notify )
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
* National Laboratory.
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE Versions 3.13.7
|
||||
* and higher are distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
* $Id$
|
||||
*
|
||||
*
|
||||
* L O S A L A M O S
|
||||
* Los Alamos National Laboratory
|
||||
* Los Alamos, New Mexico 87545
|
||||
*
|
||||
* Copyright, 1986, The Regents of the University of California.
|
||||
*
|
||||
*
|
||||
* Author Jeffrey O. Hill
|
||||
* johill@lanl.gov
|
||||
* 505 665 1831
|
||||
*/
|
||||
|
||||
#include "epicsSingleton.h"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "iocinf.h"
|
||||
#include "epicsGuard.h"
|
||||
#include "cacIO.h"
|
||||
|
||||
epicsShareDef epicsSingleton < cacServiceList > globalServiceListCAC;
|
||||
|
||||
cacServiceList::cacServiceList ()
|
||||
{
|
||||
}
|
||||
|
||||
void cacServiceList::registerService ( cacService &service )
|
||||
{
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
this->services.add ( service );
|
||||
}
|
||||
|
||||
cacChannel * cacServiceList::createChannel (
|
||||
const char * pName, cacChannelNotify & chan, cacChannel::priLev pri )
|
||||
{
|
||||
cacChannel *pChanIO = 0;
|
||||
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
tsDLIter < cacService > iter = this->services.firstIter ();
|
||||
while ( iter.valid () ) {
|
||||
pChanIO = iter->createChannel ( pName, chan, pri );
|
||||
if ( pChanIO ) {
|
||||
break;
|
||||
}
|
||||
iter++;
|
||||
}
|
||||
|
||||
return pChanIO;
|
||||
}
|
||||
|
||||
void cacServiceList::show ( unsigned level ) const
|
||||
{
|
||||
epicsGuard < epicsMutex > locker ( this->mutex );
|
||||
tsDLIterConst < cacService > iter = this->services.firstIter ();
|
||||
while ( iter.valid () ) {
|
||||
iter->show ( level );
|
||||
iter++;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user