Compare commits

...

270 Commits

Author SHA1 Message Date
Andrew Johnson
cc2e2082b7 R3.14.5 Release. 2004-02-04 20:45:33 +00:00
Jeff Hill
dd1b4d2791 fixed warnings 2004-02-04 17:35:08 +00:00
Andrew Johnson
1a1078f961 Ok to release. 2004-02-04 16:13:26 +00:00
Andrew Johnson
51df33928f Set release date. 2004-02-04 16:09:57 +00:00
Ralph Lange
c0d6282157 aCC version update 2004-02-04 11:22:08 +00:00
Ralph Lange
58879ff350 Bugfix - mostly a minor cut'n'paste issue. 2004-02-04 10:30:04 +00:00
Jeff Hill
8e499dcfb7 fixed warnings 2004-02-04 02:14:29 +00:00
Jeff Hill
82cb39fcd5 cosmetic 2004-02-04 02:13:25 +00:00
Jeff Hill
b868ce79b7 fuixed ms warnings 2004-02-04 02:12:05 +00:00
Jeff Hill
a00c041353 fixed debug diagnostics 2004-02-04 02:11:38 +00:00
Jeff Hill
afb643443f fixed no reconnect 2nd time bug 2004-02-04 02:10:30 +00:00
Jeff Hill
0dc56953ff removed junk 2004-02-04 02:10:00 +00:00
Jeff Hill
8459529f70 use global printf for debug stuff 2004-02-04 02:09:43 +00:00
Jeff Hill
9fb90cfcab supress sun pro warnings 2004-02-04 02:09:11 +00:00
W. Eric Norum
fbf90dd641 Remove unreachable code. 2004-02-03 21:35:25 +00:00
W. Eric Norum
585e2f7d6c Stupid vxWorks implementation of toupper/tolower expands macro argument more than once! 2004-02-03 16:49:33 +00:00
Ralph Lange
0da4a9df30 Cosmetic 2004-02-03 15:33:45 +00:00
Ralph Lange
936f5a48b6 Bugfixes for compiling with -DDEBUG 2004-02-03 13:48:43 +00:00
Ralph Lange
429a135265 Bugfixes for compiling with -DDEBUG 2004-02-03 13:42:42 +00:00
Jeff Hill
2a8a75fdc9 fixed logic error in repeaterClient::verify 2004-02-03 03:32:00 +00:00
Jeff Hill
9231d4c9b9 removed repeater confirm through cac 2004-02-03 03:04:42 +00:00
Jeff Hill
4bb85b7256 improved diagnostic 2004-02-03 02:21:01 +00:00
Jeff Hill
9977039b55 cosmetic 2004-02-03 02:20:44 +00:00
Jeff Hill
fb6c0cd8fc improved diagnostics 2004-02-03 01:45:56 +00:00
Jeff Hill
351a45b734 new show interface 2004-02-03 01:45:45 +00:00
Jeff Hill
c1e2dc29bd removed overly stringent assert 2004-02-02 20:13:15 +00:00
Jeff Hill
b10a642321 ignore sigpipe and sigalrm 2004-02-02 18:31:53 +00:00
Jeff Hill
c49757c9b5 dont print message or wakeup receive thread from send thread
if its a receive thread initiated shutdown
2004-02-02 18:26:49 +00:00
Ralph Lange
89c136d426 Best not to bracket include with extern "C" 2004-02-01 17:26:10 +00:00
Ralph Lange
e6587e9755 Fix to get around weird HP aCC behaviour ("C" linkage for friends):
caInstallDefaultService() calls a static member function instead of being a friend.
2004-02-01 15:44:24 +00:00
Ralph Lange
3d27e9aeb1 Suppress HP aCC warnings. 2004-01-31 21:13:28 +00:00
Jeff Hill
4c2a8386a1 clean up better if we receive disconnect notification when sending 2004-01-30 01:35:55 +00:00
Jeff Hill
d2d71324da cosmetic 2004-01-30 01:25:16 +00:00
Jeff Hill
70a6e931fb best not to bracket include with extern "C" 2004-01-30 01:24:22 +00:00
Ralph Lange
ac1258fcc7 Bugfix; added note to keep people from using parseOptions(). 2004-01-28 20:48:31 +00:00
Andrew Johnson
6f931a18f1 Fixed various compiler warnings. 2004-01-28 00:04:03 +00:00
Andrew Johnson
e0b918ce08 Ancient files, no longer used. 2004-01-27 22:03:11 +00:00
Andrew Johnson
12b51ec036 Force aitInt8 to be signed - ANSI allows chars to be unsigned 2004-01-27 21:54:06 +00:00
Janet B. Anderson
6b16dbac9d Added name_OBJLIBS osclass tests and definitions. 2004-01-27 20:30:27 +00:00
Jeff Hill
a6d1becc7a deleted repeated word 2004-01-27 20:26:20 +00:00
Jeff Hill
d2893ab3fb fixed structure 2004-01-27 19:45:19 +00:00
Jeff Hill
791fba7274 fixed structure 2004-01-27 19:34:40 +00:00
Jeff Hill
5bd8fe9148 fixed structure 2004-01-27 18:43:44 +00:00
Jeff Hill
a9abc6ee1c fixed spelling 2004-01-27 18:33:08 +00:00
Jeff Hill
945a5e7930 added section discussing reconnect issues when server's address changes 2004-01-27 18:09:37 +00:00
Jeff Hill
4b50e4d060 fixed ms warnings 2004-01-27 00:35:40 +00:00
Jeff Hill
50cc1e967e fixed disconnect notify supressed when channel state is disconnected 2004-01-27 00:33:15 +00:00
Jeff Hill
67937c1b74 fixed shutdown deadlock 2004-01-27 00:32:55 +00:00
Jeff Hill
b59586dc83 fixed ms warnings 2004-01-27 00:27:52 +00:00
Jeff Hill
94a77fec91 fixed disconnect notify supressed when channel state is disconnected 2004-01-27 00:27:02 +00:00
Janet B. Anderson
b11b328317 Initial version. 2004-01-26 21:05:27 +00:00
Janet B. Anderson
7f64d58e26 Added RANLIB definition. 2004-01-26 20:02:37 +00:00
Janet B. Anderson
4bcdad7722 Fixed typo. 2004-01-26 16:43:04 +00:00
Janet B. Anderson
f23fb5512e Removed ifeq and ifneq tests on vxWorks and RTEMS. 2004-01-26 01:30:01 +00:00
W. Eric Norum
cc79bd0f7d Minor cleanup. 2004-01-25 17:56:09 +00:00
Jeff Hill
36ffaa3968 fix unguard needs to be moved inside of sate test (that needs to be guarded) 2004-01-24 00:13:59 +00:00
Jeff Hill
57420c3e3c removed legacy unguard incompatible with current structure of code 2004-01-24 00:13:16 +00:00
Andrew Johnson
65c202c80f Don't generate an empty file if registerRecordDeviceDriver.pl fails. 2004-01-23 22:57:26 +00:00
Jeff Hill
bc9c0eb526 fixed gnu warnings 2004-01-23 20:36:54 +00:00
Jeff Hill
565a47935c fixed solaris warnings 2004-01-23 20:15:35 +00:00
Jeff Hill
bb05cea3c1 fixed solaris warnings 2004-01-23 19:55:11 +00:00
Andrew Johnson
8087b29199 Make the parser slightly more robust against comments and
other uses of the keywords.
2004-01-23 19:26:11 +00:00
Janet B. Anderson
a2b69080ca Removed config files for unused architecutres. 2004-01-23 19:06:07 +00:00
Janet B. Anderson
5924f1e002 Removed extra comma in findstring function. 2004-01-23 18:09:16 +00:00
Marty Kraimer
19eb4e7fd5 add ifdef __cplusplus 2004-01-23 16:26:32 +00:00
Jeff Hill
042f24ee8a added ca changes for R3.14.5 2004-01-22 23:11:08 +00:00
Janet B. Anderson
4b11e5242c Fixed .stt rule. Changed syntax of command to remove suffix. 2004-01-22 22:02:50 +00:00
Janet B. Anderson
ffb5098abc Fixed .stt rule. 2004-01-22 22:00:26 +00:00
Jeff Hill
21ea090431 fixed missing code interfacing back to net io subsystem 2004-01-22 21:04:03 +00:00
Jeff Hill
3ffea2456c hybernate when there are enobuf problems 2004-01-22 20:43:13 +00:00
Jeff Hill
2d41308609 hybernate send threads when there are enobuf problems 2004-01-22 20:37:20 +00:00
Jeff Hill
fbe397addb hybernate receive threads when there are enobuf problems 2004-01-22 20:31:21 +00:00
Jeff Hill
3c8efba3c4 hybernate send/receive threads when there are enobuf problems 2004-01-22 19:17:32 +00:00
Jeff Hill
5b1507e15e cosmetic 2004-01-22 19:09:06 +00:00
Jeff Hill
a624ca3bdd workaround for 68k cross compiler bug 2004-01-22 17:55:39 +00:00
Janet B. Anderson
59a2bedda5 Removed files with bad names and added files with correct names. 2004-01-22 15:55:06 +00:00
Janet B. Anderson
541986e5f4 Added PREPROCESS.cpp definition. 2004-01-22 15:02:06 +00:00
Janet B. Anderson
b384578105 Added null definitions for STATIC_LDFLAGS and RANLIB for cross builds. 2004-01-22 15:00:58 +00:00
Ralph Lange
91eaa26047 += First version of CA commandline tools (caget only) 2004-01-20 17:22:05 +00:00
Marty Kraimer
f61e5d1491 change wording 2004-01-20 17:03:58 +00:00
Janet B. Anderson
71c8913e2c Added info about COMPAT_TOOLS_313. 2004-01-20 16:48:36 +00:00
Janet B. Anderson
43f69c266e Added test on COMPAT_TOOLS_313. 2004-01-20 16:39:37 +00:00
Janet B. Anderson
f0b6960189 Added COMPAT_TOOLS_313. 2004-01-20 16:38:56 +00:00
Janet B. Anderson
206b24d4c5 Changed COMPAT313 to COMPAT_313. 2004-01-20 15:41:25 +00:00
Ralph Lange
b53ad8b82f Removed malloc.h reference (Eric says ANSI says stdlib.h) 2004-01-20 15:29:47 +00:00
Marty Kraimer
3bc5fb63d1 dont print ? as escaped character 2004-01-20 15:27:29 +00:00
Ralph Lange
3ea334068e Added parseOptions to add getopt() functionality (and allow compiling on WIN32) 2004-01-20 12:41:16 +00:00
cvs2svn
f58b4e2efd This commit was manufactured by cvs2svn to create branch 'B3.14'. 2004-01-20 12:38:42 +00:00
Janet B. Anderson
611d49a06c Updated the R3.13 compatability notes. 2004-01-19 21:15:35 +00:00
W. Eric Norum
157003598f Add dbtr note. 2004-01-19 19:54:37 +00:00
W. Eric Norum
0b3f346659 Don't seg-fault if no argument is passed to dbtr. 2004-01-19 19:52:08 +00:00
Marty Kraimer
e53964fbba wrong prototype fot devInit 2004-01-19 19:20:00 +00:00
Marty Kraimer
f24825aee9 bad arg to errlogPrintf 2004-01-19 19:14:38 +00:00
Janet B. Anderson
25d76153ff Fixed Makefile so distclean target will work. 2004-01-19 17:02:31 +00:00
Ralph Lange
adff31997d += catools 2004-01-19 16:11:49 +00:00
Ralph Lange
249152d650 += catools 2004-01-19 16:11:41 +00:00
Ralph Lange
bae8f2515e += caget 2004-01-19 16:08:30 +00:00
Janet B. Anderson
9e168bfd69 Changed nda to _USER_. 2004-01-19 15:02:30 +00:00
Ralph Lange
b69b906c14 Cosmetic changes. 2004-01-19 10:35:05 +00:00
Janet B. Anderson
6c2540a462 Updates from nda. 2004-01-16 22:59:07 +00:00
Janet B. Anderson
333d00abb9 Added APS Virtual LINAC Templates.
Added not about building R3.13 extensions.
2004-01-16 22:50:12 +00:00
Janet B. Anderson
118807d776 Removed CMPLR_PREFIX and CMPLR_SUFFIX definitions. 2004-01-16 17:36:25 +00:00
Janet B. Anderson
4325c27f3e Added SHRLIB_CFLAGS definition. 2004-01-16 17:34:42 +00:00
Janet B. Anderson
634696132e Change test to test on BUILD_CLASS not CROSS. 2004-01-16 17:33:40 +00:00
Janet B. Anderson
a03b21e635 Get os from T_A not OS_CLASS (dont want words with upper case letters). 2004-01-16 17:05:24 +00:00
Jeff Hill
b6e0dbaec7 cleanned up win32 thread entry 2004-01-15 23:24:08 +00:00
Janet B. Anderson
6775981bf6 Does not make sense to have a version number on loadable libraries. 2004-01-15 22:49:55 +00:00
Janet B. Anderson
0fde7b6d84 Added defines to make this a non cross build. 2004-01-15 22:16:52 +00:00
Janet B. Anderson
45363a24b0 Modified comments. 2004-01-15 22:15:09 +00:00
Janet B. Anderson
e513e30866 Moved LDLIBS_READLINE definition. 2004-01-15 22:14:11 +00:00
Janet B. Anderson
5f357e94b0 Removed versioning on install of loadable shrlibs. 2004-01-15 22:05:38 +00:00
Andrew Johnson
1425980268 Cleanup: removed two ancient unused routines. 2004-01-15 20:54:02 +00:00
Andrew Johnson
4c0bf5025f Fix issue with one unpatched Solaris compiler version. 2004-01-15 20:01:31 +00:00
Jeff Hill
0437370e49 fixed TCP and UDP information too close together in casr 2004-01-15 18:52:40 +00:00
Jeff Hill
d543774f33 fixed gnu warnings 2004-01-15 17:30:00 +00:00
Andrew Johnson
552e47ae5f These look like someone's leftovers. 2004-01-15 17:05:45 +00:00
Janet B. Anderson
6de4d8c7a2 Commented out PERLLIB definition. 2004-01-15 15:22:37 +00:00
Janet B. Anderson
10bf550911 Added New build targets. 2004-01-15 15:08:24 +00:00
Marty Kraimer
1c493e9ec0 fix type error 2004-01-15 13:35:38 +00:00
Jeff Hill
24d2d57d62 dont check to see if timer thread is suspended when blocking for it to shut down 2004-01-15 04:15:04 +00:00
Jeff Hill
b6b381cc78 fixed gnu warnings 2004-01-15 04:14:01 +00:00
Jeff Hill
5b4c37df17 make sure that evid is set before first subscription cb arrives 2004-01-15 03:16:54 +00:00
Jeff Hill
8bd3d4a8a0 fixed gnu warnings 2004-01-15 03:13:08 +00:00
Jeff Hill
67fbf44633 fixed io cancel shutdown order problem 2004-01-15 02:52:28 +00:00
Jeff Hill
a2531d6bc9 fixed gnu warnings 2004-01-15 02:51:35 +00:00
Jeff Hill
60a797048a many changes associated will disconnecting the channel but not disconnecting
the circuit
2004-01-15 01:42:49 +00:00
Janet B. Anderson
409aa721b9 Initial version. 2004-01-14 19:40:25 +00:00
Janet B. Anderson
448343bef8 Changed text to - Sequencer program not running 2004-01-14 15:20:45 +00:00
Marty Kraimer
0aa150f544 register dbLockShowLocked 2004-01-14 13:22:13 +00:00
Marty Kraimer
3771989a0c remove spin lock version 2004-01-14 13:20:24 +00:00
W. Eric Norum
4dc47cc3c7 Add epicsStrnCaseCmp(). 2004-01-13 23:07:11 +00:00
Janet B. Anderson
ca87b50a5a Removed sioc scripts. 2004-01-13 22:09:25 +00:00
Janet B. Anderson
a5cd52dad4 Initial version from Ned Arnold 2004-01-13 22:02:26 +00:00
Janet B. Anderson
fda69beae0 Initial version. 2004-01-13 22:02:13 +00:00
Janet B. Anderson
cb1e29e235 Changed $(CROSS_<name>) to $($(BUILD_CLASS)_<name>) 2004-01-13 21:38:17 +00:00
Janet B. Anderson
6c0bdcd717 Make SHRLIB_CFLAGS and override of previous definitions. 2004-01-13 21:35:23 +00:00
Janet B. Anderson
138ee471db Modified comment. 2004-01-13 16:39:33 +00:00
Janet B. Anderson
de70a70b1b Added COMPAT_313 macro for building/installing R3.13 compatability files. 2004-01-13 16:15:05 +00:00
Janet B. Anderson
2fd5fb4b22 Added dependancy comments. 2004-01-13 15:15:32 +00:00
Ralph Lange
0f3f74dbaf Cleaned up alarm status and severity string representation, alarmString.h is deprecated now. 2004-01-12 11:29:02 +00:00
W. Eric Norum
3f77bcdc08 Add timestamp stringing support. 2004-01-11 16:20:22 +00:00
Andrew Johnson
2d77802856 Changed to the EPICS Open License as agreed with ANL Legal. 2004-01-09 15:59:06 +00:00
Ralph Lange
bafee08673 Changed the strange way that receiveTimeoutNotify() was declared as HP's aCC compiler didn't like it. 2004-01-09 12:16:08 +00:00
Ralph Lange
78cce4015b Changed order of member initializers in tcpRecvWatchdog's constructor to avoid warning. 2004-01-09 10:57:35 +00:00
Ralph Lange
c140e69d40 Bugfix in tsDLList<T>::push 2004-01-09 09:38:05 +00:00
Jeff Hill
38599f8391 fixed template parameters to match 2004-01-09 01:30:28 +00:00
Jeff Hill
7166456564 throw srtandard exception 2004-01-09 01:06:38 +00:00
Jeff Hill
cde473e4d9 fixed names 2004-01-09 01:05:27 +00:00
Jeff Hill
f04fa5fdf3 many changes associated will disconnecting the channel but not disconnecting the circuit 2004-01-09 00:42:15 +00:00
Jeff Hill
60dde019c0 eliminate esscimqi_shuechanismImplemenedHerein 2004-01-08 23:04:58 +00:00
Jeff Hill
aba3613efc include <climits> 2004-01-08 23:04:25 +00:00
Jeff Hill
6691657c42 new list push method 2004-01-08 23:03:27 +00:00
W. Eric Norum
75ca062f1b Add simple device support for converting time to nicely-formatted string. 2004-01-08 21:10:29 +00:00
Ralph Lange
0dbaefd5d9 += version number for LOADABLE_SHRLIB. 2004-01-07 15:26:40 +00:00
Ralph Lange
f325c487bc Fixed LOADABLE_SHRLIB_PREFIX bug. 2004-01-07 14:13:54 +00:00
Ralph Lange
364e023331 Updated DST dates. 2004-01-07 10:58:20 +00:00
Ralph Lange
267d7593ba Works also for standard C comments. 2004-01-07 10:23:26 +00:00
Janet B. Anderson
3051293fe9 Fix for COMMANDLINE_LIBRARY = EPICS and no LD_LIBRARY_PATH. 2004-01-06 16:45:10 +00:00
Janet B. Anderson
d986ed523d Remove browse make target. 2003-12-22 19:43:29 +00:00
Janet B. Anderson
5e40c17b26 Added Darwin cppflag definition. 2003-12-22 19:40:58 +00:00
Janet B. Anderson
ef084aceaf The option -z ignore must preceed -z defs. 2003-12-18 22:10:38 +00:00
Janet B. Anderson
657a6c822a Reorganized *SHRLIB_LDFLAGS definitions. 2003-12-18 21:41:55 +00:00
Janet B. Anderson
7108f87c6e Added SHRLIB_CFLAGS=-KPIC. Added -z text to shrlib link lines. 2003-12-18 21:40:09 +00:00
Janet B. Anderson
416ec2c6ae Use SHRLIB_CFLAGS for library and loadable library source code compiles. 2003-12-18 21:37:34 +00:00
Janet B. Anderson
455060a705 Initial version. 2003-12-18 15:58:43 +00:00
Janet B. Anderson
8b15eddf12 Moved HOST_OPT to CONFIG. file. 2003-12-18 15:58:13 +00:00
Janet B. Anderson
a084474857 Initial version. 2003-12-18 15:35:28 +00:00
Janet B. Anderson
8d0d26b56d Removed -mcpu compiler option. Added code for 386,486,... cross builds 2003-12-18 15:34:38 +00:00
Janet B. Anderson
592660778d Use the default (i.e. no -mcpu=xxxx options) compiler settings. 2003-12-18 15:25:20 +00:00
Janet B. Anderson
4c4b80dc66 Added comments. 2003-12-18 15:23:24 +00:00
Janet B. Anderson
283fc8f3eb Moved HOST_OPT macro definition. 2003-12-18 15:14:38 +00:00
Janet B. Anderson
d9a1b65f36 Added comment line. 2003-12-17 17:28:32 +00:00
Janet B. Anderson
c9af50db0c Initial version. Used to mofdify created header files to avoid solaris
compiler warning messages when headers created from WIN32 build.
2003-12-17 17:05:55 +00:00
Janet B. Anderson
d7023b1f87 Changed order of _LDLIBS for consistancy. 2003-12-17 17:04:01 +00:00
Marty Kraimer
3f560514e2 changes so that it builds on solaris 2003-12-17 12:52:34 +00:00
Marty Kraimer
258ebe6bcd more changes for dbCaPutCallback 2003-12-16 20:13:36 +00:00
Marty Kraimer
fff249dd3a use callbackRequestProcessCallbackDelayed 2003-12-16 20:09:28 +00:00
Marty Kraimer
fdd78eaf81 support for dbCaPutCallback 2003-12-16 20:05:17 +00:00
cvs2svn
1758f60c79 This commit was manufactured by cvs2svn to create branch 'B3.14'. 2003-12-16 20:02:24 +00:00
Marty Kraimer
13a780f4c4 Let calcoutRecord use device support 2003-12-16 19:51:34 +00:00
Marty Kraimer
5902d83d19 changes for dbCaPutCallback 2003-12-16 19:47:48 +00:00
Janet B. Anderson
d8ae672385 Added athlon flags. 2003-12-12 16:54:05 +00:00
Janet B. Anderson
89aa3edc12 Removed number of lines in comment. 2003-12-11 15:05:32 +00:00
Ralph Lange
03922dd993 Casting through a (void*) to avoid warnings on HP's native C++ compiler. (Found with motorRecord 5.2) 2003-12-10 15:11:43 +00:00
W. Eric Norum
943d2d2ac1 Add system command notes. 2003-12-08 23:17:43 +00:00
W. Eric Norum
d6c4117b35 Add support for iocsh 'system' command. 2003-12-08 20:37:14 +00:00
Marty Kraimer
9d57a77d90 issue message if FLNK is CA and doesnt access .PROC 2003-12-05 13:55:52 +00:00
Andrew Johnson
95859680f7 Needed for building on Solaris 9 2003-12-02 22:45:32 +00:00
Marty Kraimer
10fa0e0eb2 add epicsStrPrintEscaped 2003-12-01 16:04:23 +00:00
Marty Kraimer
b369035b9d add epicsStrPrintEscaped. 2003-12-01 16:03:31 +00:00
Andrew Johnson
47fc7f5d88 Change Tornado to use the patched compilers. 2003-11-21 21:22:24 +00:00
Andrew Johnson
0a3edefb39 Make cdCommands environment variable names match envPaths,
i.e. don't upper-case the app name.
Also added ARCH and IOC environment variables.
2003-11-21 21:11:30 +00:00
Andrew Johnson
3d5ab5cca5 Expanded the RELEASE consistency checking, now all target architecture
RELEASE.* files are checked, so you can't fool the system.
2003-11-21 20:33:00 +00:00
Andrew Johnson
68975ee309 Internal reorganization to simplify reading RELEASE files
Added -T option to allow manual setting of $top
2003-11-21 20:25:37 +00:00
Andrew Johnson
03a5551d93 Needed to build on Solaris 9. 2003-11-20 21:24:27 +00:00
Andrew Johnson
81fa76c132 Needed for building on Solaris 9 2003-11-20 21:14:32 +00:00
Jeff Hill
66959c07a8 return ECA_PUTFAIL instead of ECA_INTERNAL when unexpected write exception occurs 2003-11-14 16:55:09 +00:00
Jeff Hill
df1e65bc8a throw a standard exception 2003-11-14 16:52:55 +00:00
Jeff Hill
19dd302bd8 fixed regression tests so that they specify preemptive callback for local pv situation 2003-11-14 16:37:41 +00:00
Andrew Johnson
e0e0694821 Added the realclean target
removd command echo suppression to match other clean rules
2003-11-14 16:31:36 +00:00
W. Eric Norum
d2149209ea Fix nested comments in previous change. 2003-11-07 21:21:05 +00:00
W. Eric Norum
748e7cce1b Get rid of gcc complaint about C++ comments. 2003-11-07 19:15:21 +00:00
W. Eric Norum
71319ab5d5 Get rid ofgcc complaint about C++ comments. 2003-11-07 16:36:24 +00:00
Marty Kraimer
3cece37c92 add new notes 2003-11-06 17:11:02 +00:00
Marty Kraimer
9dc80154e3 changes for dbCaPutCallback and others 2003-11-06 17:09:21 +00:00
Marty Kraimer
ca17594d00 add devLoTestAsyn and devMbboDirectTestAsyn 2003-11-06 17:03:07 +00:00
cvs2svn
bf2447f1cc This commit was manufactured by cvs2svn to create branch 'B3.14'. 2003-11-06 17:03:00 +00:00
Marty Kraimer
18a3008f51 add devXxCallback 2003-11-06 16:57:57 +00:00
Marty Kraimer
04eb6ebb58 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
2003-11-06 16:47:48 +00:00
Marty Kraimer
876b493e2c The fields ZRST,...,FFST are now special(SPC_MOD) 2003-11-06 16:45:20 +00:00
Marty Kraimer
d9805b979e make size of CALC 40 2003-11-06 16:43:48 +00:00
Marty Kraimer
46a8fac619 add dbCaPutLinkCallback 2003-11-06 16:39:05 +00:00
W. Eric Norum
eab7314e36 Clean up trailing \n on vxWorks input. 2003-11-04 21:55:27 +00:00
Marty Kraimer
a07722260f change DB CA to DB CA Link 2003-11-04 13:01:15 +00:00
W. Eric Norum
1c55c85de9 The IOC shell dose not convert a 0 command-line argument to a NULL pointer.
Allow "" to indicate that all record types should be printed.
2003-11-03 22:43:50 +00:00
Andrew Johnson
c095f483e9 Typo, s/NTP_FRACTION DENOMINATOR/NTP_FRACTION_DENOMINATOR/ 2003-10-29 19:51:12 +00:00
Andrew Johnson
a5921d2bea Missing closing $ in RCS keyword. 2003-10-29 19:43:24 +00:00
Jeff Hill
c26cd7fdce architecture independent manipulation of NTP stamps 2003-10-28 18:56:56 +00:00
Jeff Hill
c69536fc8e return an error condition if they try to start a preemptive callback enabled context
when the thread already has a single threaded context.
2003-10-28 16:05:49 +00:00
Jeff Hill
0712df904b keep circuit open with disconnected channels attached if the circuit
becomes unresponsive
2003-10-23 22:45:54 +00:00
Jeff Hill
70091854bc new unresponsive circuit notify method 2003-10-23 22:33:15 +00:00
Jeff Hill
ab2a2d7a9c new channel create received flag and new circuit responive, unresponsive, and
hangup methods
2003-10-23 22:32:45 +00:00
Jeff Hill
2011e6b87a increased locking requirements 2003-10-23 22:31:06 +00:00
Jeff Hill
fab73db5e8 timeout now results in unresponsive circuit notify and not an abort shutdown 2003-10-23 22:30:25 +00:00
Jeff Hill
be9a9afc68 removed unused method 2003-10-23 22:30:01 +00:00
Jeff Hill
f751b73665 increased locking requirements and added unresponsive/responsive
circuit notify methods
2003-10-23 22:27:52 +00:00
Jeff Hill
de880dbf39 new error code 2003-10-23 22:26:22 +00:00
Jeff Hill
d9f803937a fixedsearch interval computation 2003-10-21 22:26:20 +00:00
Jeff Hill
1b730ac8fc fixedsearch interval computation 2003-10-21 22:12:43 +00:00
Jeff Hill
3a2e71e46e fixed channel not destroyed if client disconnects during asynchronous
enum string table fetch
2003-09-29 23:15:01 +00:00
Jeff Hill
1cbb1c9b71 fixed channel not destroyed if client disconnects during asynchronous
enum string table fetch
2003-09-29 22:58:43 +00:00
Jeff Hill
3c4d947f2a cosmetic 2003-09-29 22:42:24 +00:00
Jeff Hill
44e31ae9f3 changes allowing the test to work with enumerated channels 2003-09-29 18:13:28 +00:00
Marty Kraimer
f9107d0233 add registrar(sncExampleRegistrar) 2003-09-25 11:38:06 +00:00
Janet B. Anderson
8633e72026 R3.14.4 2003-09-23 21:35:11 +00:00
Janet B. Anderson
1106ecd818 Added Registration code changed info. 2003-09-23 21:19:28 +00:00
Janet B. Anderson
6e6cd59674 More Updated for R3.14.4. 2003-09-23 21:09:31 +00:00
Janet B. Anderson
4cdc2575c5 Updated for R3.14.4. 2003-09-23 20:09:48 +00:00
Jeff Hill
9f52f7282d fixed errMessage fmt string 2003-09-23 16:52:59 +00:00
Janet B. Anderson
ed882fe82d Updated for R3.14.4. 2003-09-23 16:15:08 +00:00
W. Eric Norum
d0e58f9aa7 Add format string checking. 2003-09-21 21:44:48 +00:00
Janet B. Anderson
2c13aa03e2 Added JAR_PACKAGES and changes JAR command. 2003-09-21 21:42:09 +00:00
Janet B. Anderson
3717607892 Added release file names and cvs export command. 2003-09-19 18:36:54 +00:00
Janet B. Anderson
cb72210d45 Added RULES_PYTHON. 2003-09-19 18:05:57 +00:00
Janet B. Anderson
92d01c0e5f Initial version. 2003-09-19 16:12:33 +00:00
Janet B. Anderson
42506d8c1c Updated JAVA and PYTHON definitions. 2003-09-19 16:08:05 +00:00
W. Eric Norum
dfccee739f Clean up 'truncated' message.
Ensure that truncated errrlogMessage output is reported as such.
2003-09-17 19:35:45 +00:00
Jeff Hill
35d07ffbda changed the name of cxxCompilerDependencies.h to compilerDependencies.h 2003-09-17 19:25:31 +00:00
W. Eric Norum
d158974870 Use epicsVsnprintf to eliminate possibility of buffer overflows. 2003-09-17 18:51:44 +00:00
W. Eric Norum
2e922d7195 Move format-string checking conditional to cxxCompilerDependencies. 2003-09-17 14:43:26 +00:00
W. Eric Norum
e405ebbbee Merged into cxxCompilerDependencies.h 2003-09-17 14:33:08 +00:00
Janet B. Anderson
da15507f8d Added BASE_3_14 definition. 2003-09-16 20:56:22 +00:00
W. Eric Norum
8411adb987 Fix error message. 2003-09-16 18:58:59 +00:00
W. Eric Norum
c30c884687 Make arguments match format string. 2003-09-16 18:54:43 +00:00
Marty Kraimer
21fe691d96 errMessage must not get NULL argument 2003-09-16 18:43:52 +00:00
W. Eric Norum
22e21f268b Add gcc format-string checking. 2003-09-16 18:06:49 +00:00
Andrew Johnson
d45e1b13e4 Removed WIN32 getopt.* (GPL) 2003-09-16 17:56:21 +00:00
Andrew Johnson
8873934c9b These files contain GPL code, and not compatible with the EPICS Base license. I
don't care that this removal breaks the WIN32 port of EPICS, we can't legally
distribute this code as part of EPICS.  Someone will have to rewrite the getopt
functionality, or grab a version that is not GPL licensed (try BSD).
2003-09-16 17:45:19 +00:00
Marty Kraimer
c0c11c359f epicsSnprintf did not work. It is fixed. 2003-09-16 12:53:54 +00:00
Andrew Johnson
367e27d5f5 Support for configure/RELEASE.<hostarch>.<targetarch> files 2003-09-15 21:01:36 +00:00
Andrew Johnson
35bd1a76d1 Removed string calculation engine, only needed by Tim Mooney's recordtypes. 2003-09-12 19:13:54 +00:00
Jeff Hill
a887ca44d1 added two bug fix descriptions 2003-09-10 20:59:22 +00:00
Jeff Hill
dd273da508 added two bug fix descriptions 2003-09-10 20:45:56 +00:00
Jeff Hill
245cf129ff fixed disconnect callback when channel known to be disconnected 2003-09-10 17:09:25 +00:00
Jeff Hill
36b1f9e4ff fixed bug where entry was deleted from within entry's callback 2003-09-08 17:11:15 +00:00
Andrew Johnson
24a0197f88 Fix file stmt without quotes. 2003-09-05 20:54:28 +00:00
W. Eric Norum
e30e1159a2 Added note about vxWorks ledLib. 2003-09-05 18:13:25 +00:00
Andrew Johnson
42ea151881 Don't use '0' for string arguments which should be empty... 2003-09-05 16:55:05 +00:00
W. Eric Norum
ce201c6361 Use ledLib command-line editing on vxWorks. 2003-09-05 14:38:18 +00:00
Andrew Johnson
0784bbec71 Oops, missing upgrade documentation for the xxx_recordDeviceDriver routine. 2003-09-04 23:09:50 +00:00
335 changed files with 19445 additions and 8513 deletions

67
LICENSE
View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -18,7 +18,7 @@
EPICS_VERSION=3
EPICS_REVISION=14
EPICS_MODIFICATION=3
EPICS_MODIFICATION=5
EPICS_UPDATE_NAME=
EPICS_UPDATE_LEVEL=0

View File

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

View File

@@ -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)/%: %

View File

@@ -148,7 +148,7 @@ $(TARGETS) $(PROD): $(DEPLIBS)
@$(RM) $@
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $*.i
%.c: %.stt
%.c: ../%.stt
@echo "converting $<
@$(RM) $@
$(SNC) $(TARGET_SNCFLAGS) $(SNCFLAGS) $<

View File

@@ -22,7 +22,6 @@ ACTIONS += install
ACTIONS += buildInstall
ACTIONS += depends
ACTIONS += rebuild
ACTIONS += browse
actionPart = $(word 1, $(subst $(DIVIDER), ,$@))
archPart = $(word 2, $(subst $(DIVIDER), ,$@))

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View 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

View 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

View 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

View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,3 +9,6 @@
include $(CONFIG)/os/CONFIG.linux-x86.linux-x86
# Removes -O optimization and adds -g compile option
HOST_OPT=NO

View File

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

View 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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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

View 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

View File

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

View File

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

View File

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

View File

@@ -9,3 +9,4 @@
include $(CONFIG)/os/CONFIG.win32-x86.win32-x86
HOST_OPT=NO

View File

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

View File

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

View File

@@ -5,5 +5,3 @@
#Compiles for profiling with the gprof profiler.
#GPROF=YES
# Removes -O optimization and adds -g compile option
HOST_OPT=NO

View File

@@ -1,3 +0,0 @@
# Removes optimization and adds debugging options
HOST_OPT=NO

View File

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

View File

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

View 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";
}

View File

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

View File

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

View File

@@ -102,8 +102,8 @@ from the st.cmd files in the iocBoot subdirectories.
<p>Remove</p>
<pre>ld &lt; 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>

View File

@@ -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 =&lt;full path to seq module top&gt;</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 &lt;top&gt;/*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
&lt;appname&gt;Include.dbd file and remove the file
&lt;name&gt;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 &lt;recordname&gt;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&lt;devname&gt; definition
<blockquote>
<pre>epicsExportAddress(dset,dev&lt;devname&gt;);</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&lt;devname&gt; definition
<blockquote>
<pre>epicsExportAddress(drvet,drv&lt;devname&gt;);</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 &lt;appname&gt;Include.dbd: e.g.
remove
<blockquote>
<pre>function("mySubInit")
function("mySubProcess")</pre>
</blockquote>
8) Add a registrar statement to &lt;name&gt;Include.dbd with the new
registration function as parameter: e.g. add
<blockquote>
<pre>registrar("mySub")</pre>
</blockquote>
</blockquote>
<h3>Modify the Makefiles in &lt;top&gt;/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 &lt;top&gt;/iocBoot/ioc* directories.</h3>
@@ -207,13 +339,17 @@ ld &lt; iocCore</pre>
<p>Change "<tt>ld &lt; &lt;libname&gt;Lib</tt>" to "<tt>ld &lt;
&lt;libname&gt;.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/&lt;name&gt;.dbd")
registerRecordDeviceDriver(pdbbase)</pre>
&lt;name&gt;_registerRecordDeviceDriver(pdbbase)</pre>
<p>where &lt;name&gt; 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=&lt;full path to modules directory&gt;/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=&lt;full path name to epics extensions
directory&gt;</tt></p>
<p><tt>MSI=&lt;full path name to msi executable&gt;</tt></p>
<p>to your application config/RELEASE file.</p>
<br>

View File

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

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

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

View File

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

View File

@@ -4,7 +4,7 @@ README.1st
EPICS base
Release 3.14.3
Release 3.14.4
What is EPICS base?

View File

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

View File

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

View File

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

View File

@@ -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>
&lt;base&gt;/bin/&lt;arch&gt;/makeBaseApp.pl -t vlinac vlinac
&lt;base&gt;/bin/&lt;arch&gt;/makeBaseApp.pl -i -t vlinac vlinac</pre>
<p>For further information, see:</p>
<pre> &lt;top&gt;/vlinacApp/misc/README
&lt;top&gt;/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>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 &lt;PV name&gt; [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] &lt;PV name&gt; ...</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 &lt;sec&gt;</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 &lt;type&gt;</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>-# &lt;count&gt;</td>
<td>Print first &lt;count&gt; 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 &lt;nr&gt;</td>
<td>Use %f format, with &lt;nr&gt; digits after the decimal point</td>
</tr>
<tr>
<td>-e &lt;nr&gt;</td>
<td>Use e format, with &lt;nr&gt; 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] &lt;PV name&gt; ...</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] &lt;PV name&gt; &lt;value&gt;</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] &lt;PV name&gt; ...</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>

View File

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

View File

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

View File

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

View File

@@ -33,7 +33,7 @@
#endif
#include "tsFreeList.h"
#include "cxxCompilerDependencies.h"
#include "compilerDependencies.h"
#ifdef autoPtrFreeListh_epicsExportSharedSymbols
# define epicsExportSharedSymbols

View File

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

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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