Compare commits
112 Commits
end-of-lib
...
R3.15.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce7943fb44 | ||
|
|
4e865a03d8 | ||
|
|
9a4febd3bc | ||
|
|
dc5d373b57 | ||
|
|
47c361f135 | ||
|
|
9943796f7f | ||
| 3cb72ec209 | |||
| 701ef5b936 | |||
| c3995a9d63 | |||
| ce3eadde34 | |||
|
|
62929fcbd1 | ||
|
|
456a68eb96 | ||
|
|
b319b4722f | ||
|
|
b4cc5fdf4b | ||
|
|
d35835659c | ||
| 65714033ea | |||
| 7151fbe498 | |||
|
|
cbb13bf6b1 | ||
|
|
150d764d28 | ||
|
|
7dd1ea4cab | ||
|
|
922ed30136 | ||
|
|
9f9f119e7e | ||
|
|
d8214a4531 | ||
|
|
120b100e7e | ||
|
|
949e9d788a | ||
|
|
27c6e6a385 | ||
|
|
4b59476170 | ||
|
|
526b565c6b | ||
|
|
1b7b2bcceb | ||
|
|
49c925d064 | ||
|
|
6a2ed4b333 | ||
|
|
d3bcf5737f | ||
|
|
6c5505ad3e | ||
|
|
4247d98b08 | ||
|
|
13735a8088 | ||
|
|
58d4242b68 | ||
|
|
8e42f516b0 | ||
|
|
9051cdbb34 | ||
|
|
8ffea9de27 | ||
|
|
2548a37267 | ||
|
|
1dc1b25aaa | ||
|
|
fb31dd784b | ||
|
|
fe7260e263 | ||
|
|
67e2b74758 | ||
|
|
c09b6e2f1b | ||
|
|
45be2306bd | ||
|
|
6027f906c3 | ||
|
|
ec351c5e2f | ||
| 89870e2817 | |||
| 4e9cf72d71 | |||
| 80869a0868 | |||
| 998fa984ba | |||
| 31844af88e | |||
| 8f161f9463 | |||
| e0399478ad | |||
|
|
2a2a1e54ac | ||
|
|
20d2cff501 | ||
|
|
860ce156a2 | ||
|
|
0f21196670 | ||
|
|
31fc35fbe8 | ||
|
|
f892731b3f | ||
| ab493264b2 | |||
| 68779943eb | |||
| 7a5ff26984 | |||
| eae59183cc | |||
|
|
8144d2ea01 | ||
|
|
b32629c3bf | ||
|
|
220e404203 | ||
|
|
8f55a1307d | ||
|
|
e459e8bdd4 | ||
|
|
b558bd9b16 | ||
|
|
3c16c3c0da | ||
|
|
a9d7f7be13 | ||
|
|
23c4eb42a3 | ||
|
|
6d7f70f200 | ||
|
|
67844bacc3 | ||
|
|
7e7d230d8c | ||
|
|
c1ece40f41 | ||
|
|
a732539eee | ||
|
|
3bc0805a89 | ||
|
|
c72e35c769 | ||
|
|
2d9c5e99a1 | ||
|
|
ca22d50831 | ||
|
|
4972803ce2 | ||
|
|
3b7e348a8c | ||
|
|
00a974ce52 | ||
|
|
490c504736 | ||
|
|
49371cfe00 | ||
|
|
06ad4a0d70 | ||
|
|
a2ae07dfcd | ||
|
|
b539ced6d5 | ||
|
|
1b332361e7 | ||
|
|
5cb91d9f6d | ||
|
|
116c90c2ea | ||
|
|
3f3696fb91 | ||
|
|
91ce807e8b | ||
|
|
3d88316eab | ||
|
|
b9443f8813 | ||
|
|
05a3699b49 | ||
| 2b4a9632b7 | |||
| 396cf4ee3f | |||
| e50c468512 | |||
| 428a8f57e9 | |||
| 29795656e6 | |||
| b2d6b67b06 | |||
| 1e9826d187 | |||
| 0691fc5f57 | |||
| 8a3080c16f | |||
| d19afc73af | |||
| adf5375616 | |||
| 7d836d9554 | |||
| 51e492fbb1 |
@@ -17,7 +17,7 @@ ticker() {
|
||||
|
||||
CACHEKEY=1
|
||||
|
||||
EPICS_HOST_ARCH=`sh startup/EpicsHostArch`
|
||||
EPICS_HOST_ARCH=`perl src/tools/EpicsHostArch.pl`
|
||||
|
||||
[ -e configure/os/CONFIG_SITE.Common.linux-x86 ] || die "Wrong location: $PWD"
|
||||
|
||||
|
||||
@@ -20,11 +20,15 @@ else
|
||||
endif
|
||||
|
||||
# Provide a default if the user hasn't set EPICS_HOST_ARCH
|
||||
ifeq ($(origin EPICS_HOST_ARCH), undefined)
|
||||
# NB: We use a simply expanded variable here for performance:
|
||||
EPICS_HOST_ARCH := $(shell $(CONFIG)/../startup/EpicsHostArch.pl)
|
||||
endif
|
||||
#
|
||||
ifeq ($(origin EPICS_HOST_ARCH), undefined)
|
||||
# Bootstrapping ...
|
||||
EHA := $(firstword $(wildcard $(EPICS_BASE)/lib/perl/EpicsHostArch.pl \
|
||||
$(TOP)/src/tools/EpicsHostArch.pl))
|
||||
# NB: We use a simply expanded variable here for performance:
|
||||
export EPICS_HOST_ARCH := $(shell perl $(EHA))
|
||||
EHA :=
|
||||
endif
|
||||
|
||||
-include $(CONFIG)/RELEASE
|
||||
-include $(CONFIG)/RELEASE.$(EPICS_HOST_ARCH)
|
||||
|
||||
@@ -27,14 +27,14 @@ EPICS_VERSION = 3
|
||||
EPICS_REVISION = 15
|
||||
|
||||
# EPICS_MODIFICATION must be a number >=0 and <256
|
||||
EPICS_MODIFICATION = 5
|
||||
EPICS_MODIFICATION = 6
|
||||
|
||||
# EPICS_PATCH_LEVEL must be a number (win32 resource file requirement)
|
||||
# Not included if zero
|
||||
EPICS_PATCH_LEVEL = 0
|
||||
|
||||
# This will end in -DEV between official releases
|
||||
EPICS_DEV_SNAPSHOT=-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre1
|
||||
#EPICS_DEV_SNAPSHOT=-pre1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-pre2
|
||||
@@ -43,7 +43,7 @@ EPICS_DEV_SNAPSHOT=-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-rc1-DEV
|
||||
#EPICS_DEV_SNAPSHOT=-rc2
|
||||
#EPICS_DEV_SNAPSHOT=-rc2-DEV
|
||||
#EPICS_DEV_SNAPSHOT=
|
||||
EPICS_DEV_SNAPSHOT=
|
||||
|
||||
# No changes should be needed below here
|
||||
|
||||
|
||||
@@ -256,15 +256,13 @@ YACCOPT ?= $($*_YACCOPT)
|
||||
$(MV) $*.tab.c $*.c
|
||||
$(if $(findstring -d, $(YACCOPT)),$(MV) $*.tab.h $*.h,)
|
||||
|
||||
# must be a seperate rule since when not using '-d' the
|
||||
# must be a separate rule since when not using '-d' the
|
||||
# prefix for .h will be different then .c
|
||||
%.h : %.c %.y
|
||||
|
||||
%.c: %.l
|
||||
@$(RM) $*.yy.c
|
||||
$(LEX) $(LEXOPT) -t $< > $*.yy.c
|
||||
@$(RM) $@
|
||||
$(MV) $*.yy.c $@
|
||||
$(LEX) $(LEXOPT) -o$@ $<
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Libraries, shared/DLL and stubs
|
||||
|
||||
@@ -65,14 +65,14 @@ GNU = NO
|
||||
#
|
||||
# Darwin shared libraries
|
||||
#
|
||||
SHRLIB_LDFLAGS = -dynamiclib -flat_namespace -undefined suppress \
|
||||
SHRLIB_LDFLAGS = -dynamiclib -undefined dynamic_lookup \
|
||||
-install_name $(shell $(FULLPATHNAME) $(INSTALL_LIB))/$@ \
|
||||
$(addprefix -compatibility_version , $(SHRLIB_VERSION)) \
|
||||
$(addprefix -current_version , $(SHRLIB_VERSION))
|
||||
SHRLIB_SUFFIX_BASE = .dylib
|
||||
SHRLIB_SUFFIX = $(addprefix ., $(SHRLIB_VERSION))$(SHRLIB_SUFFIX_BASE)
|
||||
|
||||
LOADABLE_SHRLIB_LDFLAGS = -bundle -flat_namespace -undefined suppress
|
||||
LOADABLE_SHRLIB_LDFLAGS = -bundle -undefined dynamic_lookup
|
||||
|
||||
#
|
||||
# Position-independent code is the default on Darwin.
|
||||
|
||||
@@ -79,16 +79,20 @@ CPP = cl -nologo -C -E
|
||||
|
||||
# Configure OS vendor C++ compiler
|
||||
#
|
||||
# __STDC__=0 gives us both:
|
||||
# 1) define STDC for code (pretend ANSI conformance)
|
||||
# 2) set it to 0 to use MS C "extensions" (open for _open etc.)
|
||||
# because MS uses: if __STDC__ ... disable many nice things
|
||||
#
|
||||
# -EHsc - generate code for exceptions
|
||||
# -GR - generate code for run time type identification
|
||||
#
|
||||
CCC = cl -EHsc -GR
|
||||
CODE_CPPFLAGS += -nologo -D__STDC__=0
|
||||
|
||||
# Other compiler flags, used for CPP, C and C++
|
||||
#
|
||||
# -FC - Show absolute path of source file in diagnostics
|
||||
# -D__STDC__=0 gives us both:
|
||||
# 1) define STDC for code (pretend ANSI conformance)
|
||||
# 2) set it to 0 to use MS C "extensions" (open for _open etc.)
|
||||
# because MS uses: if __STDC__ ... disable many nice things
|
||||
#
|
||||
CODE_CPPFLAGS += -nologo -FC -D__STDC__=0
|
||||
CODE_CPPFLAGS += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
|
||||
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ base-3.15.6 tree. Download them, then use the GNU Patch program as
|
||||
follows:</p>
|
||||
|
||||
<blockquote><pre>% <b>cd <i>/path/to/</i>base-3.15.6</b>
|
||||
% <b>patch -p0 < <i>/path/to/</i>file.patch</b></pre></blockquote>
|
||||
% <b>patch -p1 < <i>/path/to/</i>file.patch</b></pre></blockquote>
|
||||
|
||||
<p>The following significant problems have been reported with this
|
||||
version of EPICS Base:</p>
|
||||
|
||||
@@ -6,19 +6,19 @@
|
||||
|
||||
Table of Contents
|
||||
|
||||
* What is EPICS base?
|
||||
* What is new in this release?
|
||||
* Copyright
|
||||
* Supported platforms
|
||||
* Supported compilers
|
||||
* Software requirements
|
||||
* Host system storage requirements
|
||||
* Documentation
|
||||
* Directory Structure
|
||||
* Build related components
|
||||
* Building EPICS base (Unix and Win32)
|
||||
* Example application and extension
|
||||
* Multiple host platforms
|
||||
* What is EPICS base?
|
||||
* What is new in this release?
|
||||
* Copyright
|
||||
* Supported platforms
|
||||
* Supported compilers
|
||||
* Software requirements
|
||||
* Host system storage requirements
|
||||
* Documentation
|
||||
* Directory Structure
|
||||
* Build related components
|
||||
* Building EPICS base (Unix and Win32)
|
||||
* Example application and extension
|
||||
* Multiple host platforms
|
||||
|
||||
--------------------------------------------------------------------------
|
||||
|
||||
@@ -166,12 +166,11 @@
|
||||
|
||||
base/startup directory - contains scripts to set environment and path
|
||||
|
||||
EpicsHostArch C shell script to set EPICS_HOST_ARCH env variable
|
||||
EpicsHostArch.pl Perl script to set EPICS_HOST_ARCH env variable
|
||||
Site.profile bourne shell script to set path and env variables
|
||||
Site.cshrc c shell script to set path and env variables
|
||||
cygwin.bat WIN32 bat file to set cygwin path and env variables
|
||||
win32.bat WIN32 bat file to set path and env variables
|
||||
EpicsHostArch Shell script to set EPICS_HOST_ARCH env variable
|
||||
unix.csh C shell script to set path and env variables
|
||||
unix.sh Bourne shell script to set path and env variables
|
||||
win32.bat Bat file example to configure win32-x86 target
|
||||
windows.bat Bat file example to configure windows-x64 target
|
||||
|
||||
base/configure directory - contains build definitions and rules
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ of my Bash login script (~/.bash_login):
|
||||
#
|
||||
EPICS_BASE="${HOME}/src/EPICS/base"
|
||||
EPICS_EXTENSIONS="${HOME}/src/EPICS/extensions"
|
||||
<strong>.</strong> "${EPICS_BASE}"/startup/Site.profile
|
||||
<strong>.</strong> "${EPICS_BASE}"/startup/unix.sh
|
||||
</pre>
|
||||
</li>
|
||||
<li>
|
||||
|
||||
@@ -177,12 +177,11 @@
|
||||
|
||||
<H4>base/startup directory - contains scripts to set environment and path</H4>
|
||||
<PRE>
|
||||
EpicsHostArch C shell script to set EPICS_HOST_ARCH env variable
|
||||
EpicsHostArch.pl Perl script to set EPICS_HOST_ARCH env variable
|
||||
Site.profile bourne shell script to set path and env variables
|
||||
Site.cshrc c shell script to set path and env variables
|
||||
cygwin.bat WIN32 bat file to set cygwin path and env variables
|
||||
win32.bat WIN32 bat file to set path and env variables
|
||||
EpicsHostArch Shell script to set EPICS_HOST_ARCH env variable
|
||||
unix.csh C shell script to set path and env variables
|
||||
unix.sh Bourne shell script to set path and env variables
|
||||
win32.bat Bat file example to configure win32-x86 target
|
||||
windows.bat Bat file example to configure windows-x64 target
|
||||
</PRE>
|
||||
|
||||
<H4>base/configure directory - contains build definitions and rules</H4>
|
||||
|
||||
@@ -9,13 +9,59 @@
|
||||
<body lang="en">
|
||||
<h1 align="center">EPICS Base Release 3.15.6</h1>
|
||||
|
||||
<p style="color:red">This version of EPICS Base has not been released yet.</p>
|
||||
|
||||
|
||||
<h2 align="center">Changes made on the 3.15 branch since 3.15.5</h2>
|
||||
|
||||
<!-- Insert new items immediately below here ... -->
|
||||
|
||||
<h3>Unsetting environment variables</h3>
|
||||
|
||||
<p>The new command <code>epicsEnvUnset <i>varname</i></code> can be used to
|
||||
unset an environment variable.</p>
|
||||
|
||||
<h3>Warning indicators in msi (and macLib) output</h3>
|
||||
|
||||
<p>The libCom macro expansion library has been modified so that when the
|
||||
SUPPRESS_WARNINGS flag is set it will no longer include any <tt>,undefined</tt>
|
||||
or <tt>,recursive</tt> indicators in its output when undefined or recursive
|
||||
macros are encountered. These indicators were harmless when the output was fed
|
||||
into an IOC along with a definition for the macro, but when the <tt>msi</tt>
|
||||
tool was used to generate other kinds of files they caused problems. If the
|
||||
<tt>msi -V</tt> flag is used the markers will still be present in the output
|
||||
whenever the appropriate condition is seen.</p>
|
||||
|
||||
<h3>Improvements to msi</h3>
|
||||
|
||||
<p>In addition to fixing its response to discovering parsing errors in its
|
||||
substitution input file (reported as Launchpad
|
||||
<a href="https://bugs.launchpad.net/epics-base/+bug/1503661">bug #1503661</a>)
|
||||
so it now deletes the incomplete output file, the msi program has been cleaned
|
||||
up a little bit internally.</p>
|
||||
|
||||
<h3>All array records now post monitors on their array-length fields</h3>
|
||||
|
||||
<p>The waveform record has been posting monitors on its NORD field since Base
|
||||
3.15.0.1; we finally got around to doing the equivalent in all the other
|
||||
built-in record types, which even required modifying device support in some
|
||||
cases. This fixes <a href="https://bugs.launchpad.net/epics-base/+bug/1730727">
|
||||
Launchpad bug #1730727</a>.</p>
|
||||
|
||||
<h3>HOWTO: Converting Wiki Record Reference to POD</h3>
|
||||
|
||||
<p>Some documentation has been added to the <tt>dbdToHtml.pl</tt> script
|
||||
explaining how Perl POD (Plain Old Documentation) markup can be added to
|
||||
<tt>.dbd</tt> files to generate HTML documentation for the record types. To see
|
||||
these instructions, run <tt>perl bin/<host>/dbdToHtml.pl -H</tt>
|
||||
or <tt>perldoc bin/<host>/dbdToHtml.pl</tt>.</p>
|
||||
|
||||
<h3>Fix problem with numeric soft events</h3>
|
||||
|
||||
<p>Changing from numeric to named soft events introduced an incompatibility
|
||||
when a numeric event 1-255 is converted from a DOUBLE, e.g. from a calc record.
|
||||
The <tt>post_event()</tt> API is not marked deprecated any more.
|
||||
|
||||
<p>Also <code>scanpel</code> has been modified to accept a glob pattern for
|
||||
event name filtering and to show events with no connected records as well.</p>
|
||||
|
||||
<h3>Add osiSockOptMcastLoop_t and osiSockTest</h3>
|
||||
|
||||
<p>Added a new OS-independent typedef for multicast socket options, and a test
|
||||
@@ -34,6 +80,114 @@ tells git to ignore all configure/*.local files.</p>
|
||||
|
||||
<!-- Insert inherited items immediately below here ... -->
|
||||
|
||||
<h3>Fix broken <tt>EPICS_IOC_LOG_FILE_LIMIT=0</tt> setting</h3>
|
||||
|
||||
<p>The Application Developers' Guide says this is allowed and disables the
|
||||
limit on the log-file, but it hasn't actually worked for some time (if ever).
|
||||
Note that the iocLogServer will be removed from newer Base release sometime
|
||||
soon as its functionality can be implemented by other dedicated log servers
|
||||
such as logstash or syslog-ng.</p>
|
||||
|
||||
<p>Fixes <a href="https://bugs.launchpad.net/bugs/1786858">lp:1786858</a>
|
||||
and part of <a href="https://bugs.launchpad.net/bugs/1786966">lp:1786966</a>.
|
||||
</p>
|
||||
|
||||
<h3>Cleanup of startup directory</h3>
|
||||
|
||||
<p>The files in the startup directory have not been maintained in recent years
|
||||
and have grown crufty (technical term). This release includes the following
|
||||
updates to these files:</p>
|
||||
|
||||
<ul>
|
||||
|
||||
<li>The Perl <tt>EpicsHostArch.pl</tt> script has been rewritten, and support
|
||||
for a few previously missing host architectures has been added to it.</li>
|
||||
|
||||
<li>The <tt>EpicsHostArch.pl</tt> script has also been moved into the standard
|
||||
<tt>src/tools</tt> directory, from where it will be installed into
|
||||
<tt>lib/perl</tt>. In this new location it is no longer executable, so it must
|
||||
be run by the <tt>perl</tt> executable.</li>
|
||||
|
||||
<li>The build system has been adjusted to look for <tt>EpicsHostArch.pl</tt> in
|
||||
both places if the <tt>EPICS_HOST_ARCH</tt> environment variable has not been
|
||||
set at build-time.</li>
|
||||
|
||||
<li>Sites that used the original Perl script to set <tt>EPICS_HOST_ARCH</tt> as
|
||||
part of their standard environment will need to adjust their scripts when they
|
||||
upgrade to this release.</li>
|
||||
|
||||
<li>The <tt>EpicsHostArch</tt> shell script has been replaced with a wrapper
|
||||
routine that calls the Perl <tt>EpicsHostArch.pl</tt> script. Sites that rely on
|
||||
this script to set <tt>EPICS_HOST_ARCH</tt> should consider switching to the
|
||||
Perl script instead.</li>
|
||||
|
||||
<li>The <tt>Site.cshrc</tt> and <tt>Site.profile</tt> files have been renamed to
|
||||
<tt>unix.csh</tt> and <tt>unix.sh</tt>, respectively.</li>
|
||||
|
||||
<li>The existing <tt>win32.bat</tt> file has been cleaned up and a new
|
||||
<tt>windows.bat</tt> file added for 64-bit targets. The contents of these files
|
||||
should be seen as examples, don't uncomment or install parts for software that
|
||||
you don't explicitly know that you need.</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<h3>Recent Apple XCode Build Issues</h3>
|
||||
|
||||
<p>The latest version of XCode will not compile calls to <tt>system()</tt> or
|
||||
<tt>clock_settime()</tt> for iOS targets. There were several places in Base
|
||||
where these were being compiled, although there were probably never called. The
|
||||
code has now been modified to permit iOS builds to complete again.</p>
|
||||
|
||||
<h3>Prevent illegal alarm severities</h3>
|
||||
|
||||
<p>A check has been added to <tt>recGblResetAlarms()</tt> that prevents records
|
||||
from getting an alarm severity higher than INVALID_ALARM. It is still possible
|
||||
for a field like HSV to get set to a value that is not a legal alarm severity,
|
||||
but the core IOC code should never copy such a value into a record's SEVR or
|
||||
ACKS fields. With this fix the record's alarm severity will be limited to
|
||||
INVALID_ALARM.</p>
|
||||
|
||||
<h3>Fixes for Launchpad bugs</h3>
|
||||
|
||||
<p>The following launchpad bugs have fixes included:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1786320">
|
||||
lp: #1786320</a>, dbCa subscribes twice to ENUM</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/541221">
|
||||
lp: #541221</a>, 'assert (pca->pgetNative)' failed in ../dbCa.c</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1747091">
|
||||
lp: #1747091</a>, epicsTimeGetEvent() / generalTime bug</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1743076">
|
||||
lp: #1743076</a>, Segfault in ca_attach_context() during exits</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1751380">
|
||||
lp: #1751380</a>, Deadlock in ca_clear_subscription()</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1597809">
|
||||
lp: #1597809</a>, Setting NAME field in DB file may break IOC</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1770292">
|
||||
lp: #1770292</a>, get_alarm_double() inconsistent across record types</li>
|
||||
<li><a href="https://bugs.launchpad.net/epics-base/+bug/1771298">
|
||||
lp: #1771298</a>, Conversion of NaN to integer relies on undefined
|
||||
behavior</li>
|
||||
</ul>
|
||||
|
||||
<h3>Updated VxWorks Timezone settings</h3>
|
||||
|
||||
<p>Removed the settings for 2017; fixed the hour of the change for MET.</p>
|
||||
|
||||
<h3>Fixed camonitor server side relative timestamps bug</h3>
|
||||
|
||||
<p>Initialize the first time-stamp from the first monitor, not the client-side
|
||||
current time in this configuration.</p>
|
||||
|
||||
<h3>Build changes for MSVC</h3>
|
||||
|
||||
<p>Windows builds using Visual Studio 2015 and later now use the <tt>-FS</tt>
|
||||
compiler option to allow parallel builds to work properly.</p>
|
||||
|
||||
<p>We now give the <tt>-FC</tt> option to tell the compiler to print absolute
|
||||
paths for source files in diagnostic messages.</p>
|
||||
|
||||
<h3>Extend maximum Posix epicsEventWaitWithTimeout() delay</h3>
|
||||
|
||||
<p>The Posix implementation of epicsEventWaitWithTimeout() was limiting the
|
||||
|
||||
@@ -91,7 +91,7 @@ relevent roles unless the Release Manager designates otherwise:</p>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Release Manager</td>
|
||||
<td>Set the Feature Freeze date, by which time all Bazaar commits for
|
||||
<td>Set the Feature Freeze date, by which time all Git commits for
|
||||
enhancements and new functionality should have been completed. After
|
||||
this date, commits should only be made to fix problems that show up
|
||||
during testing.</td>
|
||||
@@ -133,7 +133,7 @@ relevent roles unless the Release Manager designates otherwise:</p>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Release Manager</td>
|
||||
<td>Tag the module in Bazaar, using these tag conventions:
|
||||
<td>Tag the module in Git, using these tag conventions:
|
||||
<ul>
|
||||
<li>
|
||||
<tt>R3.15.6-pre1</tt>
|
||||
@@ -145,23 +145,20 @@ relevent roles unless the Release Manager designates otherwise:</p>
|
||||
</li>
|
||||
</ul>
|
||||
<blockquote><tt>
|
||||
cd ~/base/mirror-3.15<br />
|
||||
bzr tag R3.15.6-rc1
|
||||
cd base-3.15<br />
|
||||
git tag -m 'RL: Tagged for 3.15.6-rc1' R3.15.6-rc1
|
||||
</tt></blockquote>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Release Manager</td>
|
||||
<td>Export the tagged version into a tarfile. Note that this command
|
||||
generates a gzipped tarfile directly from the repository:
|
||||
<td>Export the tagged version into a tarfile. The <tt>make-tar.sh</tt>
|
||||
script generates a gzipped tarfile directly from the tag, excluding the
|
||||
files and directories that are only used for continuous integration:
|
||||
<blockquote><tt>
|
||||
cd ~/base<br />
|
||||
bzr export
|
||||
--root=base-3.15.6-rc1
|
||||
-r tag:R3.15.6-rc1
|
||||
base-3.15.6-rc1.tar.gz
|
||||
mirror-3.15
|
||||
cd base-3.15<br />
|
||||
git archive --prefix=base-3.15.6-rc1/ --output=base-3.15.6-rc1.tar.gz R3.15.6-rc1 configure documentation LICENSE Makefile README src startup
|
||||
</tt></blockquote>
|
||||
Create a GPG signature file of the tarfile as follows:
|
||||
<blockquote><tt>
|
||||
@@ -274,10 +271,10 @@ relevent roles unless the Release Manager designates otherwise:</p>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>Release Manager</td>
|
||||
<td>Tag the module in Bazaar:
|
||||
<td>Tag the module in Git:
|
||||
<blockquote><tt>
|
||||
cd ~/base/mirror-3.15<br />
|
||||
bzr tag R3.15.6</i>
|
||||
cd base-3.15<br />
|
||||
git tag -m 'RL: Tagged for 3.15.6' R3.15.6
|
||||
</tt></blockquote>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -287,12 +284,8 @@ relevent roles unless the Release Manager designates otherwise:</p>
|
||||
<td>Export the tagged version into a tarfile. Note that this command
|
||||
generates a gzipped tarfile directly from the repository:
|
||||
<blockquote><tt>
|
||||
cd ~/base<br />
|
||||
bzr export
|
||||
--root=base-3.15.6
|
||||
-r tag:R3.15.6
|
||||
base-3.15.6.tar.gz
|
||||
mirror-3.15
|
||||
cd base-3.15<br />
|
||||
git archive --prefix=base-3.15.6/ --output=base-3.15.6.tar.gz R3.15.6 configure documentation LICENSE Makefile README src startup
|
||||
</tt></blockquote>
|
||||
Create a GPG signature file of the tarfile as follows:
|
||||
<blockquote><tt>
|
||||
|
||||
@@ -1009,7 +1009,7 @@ d:/user/epics/base-3.15/lib/win32-x86/Com.lib</code></p>
|
||||
<h2><a name="CommandUtils">Command Line Utilities</a></h2>
|
||||
|
||||
<h3><a name="acctst">acctst</a></h3>
|
||||
<pre>acctst <PV name> [progress logging level] [channel duplication count]
|
||||
<pre>acctst <PV name> [progress logging level] [channel duplication count]
|
||||
[test repetition count] [enable preemptive callback]</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
@@ -2079,7 +2079,7 @@ example, be beneficial when tuning an archiver installation.</p>
|
||||
<p>Significant performance gains can be realized when the CA client library
|
||||
doesn't wait for a response to return from the server after each request. All
|
||||
requests which require interaction with a CA server are accumulated (buffered)
|
||||
and not forwarded to the IOC until one of <code>ca_flush_io()</code>,
|
||||
and not forwarded to the IOC until one of <code>ca_flush_io()</code>,
|
||||
<code>ca_pend_io()</code>, <code>ca_pend_event()</code>, or
|
||||
<code>ca_sg_block()</code> are called allowing several operations to be
|
||||
efficiently sent over the network together. Any process variable values written
|
||||
@@ -2103,16 +2103,16 @@ shouldn't test the success of a CA function call by checking to see if the
|
||||
returned value is zero as is the UNIX convention. Below are several methods to
|
||||
test CA function returns. See <a href="#ca_signal"><code>ca_signal()</code> and
|
||||
<code>SEVCHK()</code></a> for more information on this topic.</p>
|
||||
<pre>status = ca_XXXX();
|
||||
SEVCHK( status, "ca_XXXX() returned failure status");
|
||||
<pre>status = ca_XXXX();
|
||||
SEVCHK( status, "ca_XXXX() returned failure status");
|
||||
|
||||
if ( status & CA_M_SUCCESS ) {
|
||||
printf ( "The requested ca_XXXX() operation didn't complete successfully");
|
||||
}
|
||||
if ( status & CA_M_SUCCESS ) {
|
||||
printf ( "The requested ca_XXXX() operation didn't complete successfully");
|
||||
}
|
||||
|
||||
if ( status != ECA_NORMAL ) {
|
||||
if ( status != ECA_NORMAL ) {
|
||||
printf("The requested ca_XXXX() operation didn't complete successfully because \"%s\"\n",
|
||||
ca_message ( status ) );
|
||||
ca_message ( status ) );
|
||||
}</pre>
|
||||
|
||||
<h3><a name="Channel">Channel Access Data Types</a></h3>
|
||||
@@ -2285,7 +2285,7 @@ int main ( int argc, char ** argv )
|
||||
unsigned nBytes;
|
||||
unsigned elementCount;
|
||||
char timeString[32];
|
||||
unsigned i;
|
||||
unsigned i;
|
||||
chid chan;
|
||||
double sum;
|
||||
int status;
|
||||
@@ -2328,7 +2328,7 @@ int main ( int argc, char ** argv )
|
||||
epicsTimeToStrftime ( timeString, sizeof ( timeString ),
|
||||
"%a %b %d %Y %H:%M:%S.%f", & pTD->stamp );
|
||||
|
||||
printf ( "The sum of elements in %s at %s was %f\n",
|
||||
printf ( "The sum of elements in %s at %s was %f\n",
|
||||
argv[1], timeString, sum );
|
||||
|
||||
ca_clear_channel ( chan );
|
||||
@@ -2359,7 +2359,7 @@ executing within the user's callback function.</p>
|
||||
<pre>typedef struct event_handler_args {
|
||||
void *usr; /* user argument supplied with request */
|
||||
chanId chid; /* channel id */
|
||||
long type; /* the type of the item returned */
|
||||
long type; /* the type of the item returned */
|
||||
long count; /* the element count of the item returned */
|
||||
const void *dbr; /* a pointer to the item returned */
|
||||
int status; /* ECA_XXX status of the requested op from the server */
|
||||
@@ -2382,7 +2382,7 @@ attached to the request, an exception handler is executed in the client. The
|
||||
default exception handler prints a message on the console and exits if the
|
||||
exception condition is severe. Certain internal exceptions within the CA client
|
||||
library, and failures detected by the SEVCHK macro may also cause the exception
|
||||
handler to be invoked. To modify this behavior see
|
||||
handler to be invoked. To modify this behavior see
|
||||
<code><a href="#ca_add_exception_event">ca_add_exception_event</a>()</code>.</p>
|
||||
|
||||
<h3><a name="Server">Server and Client Share the Same Address Space on The Same
|
||||
@@ -2674,6 +2674,14 @@ automatically released by the system when the process exits and
|
||||
vxWorks or RTEMS no cleanup occurs unless the application calls
|
||||
<code>ca_context_destroy()</code>.</p>
|
||||
|
||||
<p>Note: This operation blocks until any user callbacks for any channel
|
||||
created in the current context have run to completion. If callbacks take a
|
||||
lock (mutex) then it is the user's responsibility to ensure that this lock
|
||||
is not held when <code>ca_clear_context()</code> is called, otherwise a
|
||||
deadlock may ensue. (See also
|
||||
<code><a href="#ca_clear_channel">ca_clear_channel</a>()</code> and
|
||||
<code><a href="#ca_clear_event">ca_clear_subscription</a>()</code>.)</p>
|
||||
|
||||
<h4>Returns</h4>
|
||||
|
||||
<p>ECA_NORMAL - Normal successful completion</p>
|
||||
@@ -2819,6 +2827,12 @@ efficiently sent over the network in one message.</p>
|
||||
clearing a channel does shutdown and reclaim any channel state change event
|
||||
subscriptions (monitors) registered with the channel.</p>
|
||||
|
||||
<p>Note: This operation blocks until any user callbacks for this channel
|
||||
have run to completion. If callbacks take a lock (mutex) then it is the
|
||||
user's responsibility to ensure that this lock is not held when
|
||||
<code>ca_clear_channel()</code> is called, otherwise a deadlock may ensue.
|
||||
(See also <code><a href="#ca_clear_event">ca_clear_subscription</a>()</code>.)</p>
|
||||
|
||||
<h4>Arguments</h4>
|
||||
<dl>
|
||||
<dt><code>CHID</code></dt>
|
||||
@@ -2833,16 +2847,16 @@ subscriptions (monitors) registered with the channel.</p>
|
||||
|
||||
<h3><code><a name="ca_put">ca_put()</a></code></h3>
|
||||
<pre>#include <cadef.h>
|
||||
int ca_put ( chtype TYPE,
|
||||
chid CHID, void *PVALUE );
|
||||
int ca_array_put ( chtype TYPE, unsigned long COUNT,
|
||||
int ca_put ( chtype TYPE,
|
||||
chid CHID, void *PVALUE );
|
||||
int ca_array_put ( chtype TYPE, unsigned long COUNT,
|
||||
chid CHID, const void *PVALUE);
|
||||
typedef void ( caEventCallBackFunc ) (struct event_handler_args);
|
||||
int ca_put_callback ( chtype TYPE,
|
||||
chid CHID, const void *PVALUE,
|
||||
caEventCallBackFunc PFUNC, void *USERARG );
|
||||
int ca_array_put_callback ( chtype TYPE, unsigned long COUNT,
|
||||
chid CHID, const void *PVALUE,
|
||||
int ca_put_callback ( chtype TYPE,
|
||||
chid CHID, const void *PVALUE,
|
||||
caEventCallBackFunc PFUNC, void *USERARG );
|
||||
int ca_array_put_callback ( chtype TYPE, unsigned long COUNT,
|
||||
chid CHID, const void *PVALUE,
|
||||
caEventCallBackFunc PFUNC, void *USERARG );</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
@@ -3069,7 +3083,7 @@ when a CA get request is initiated.</p>
|
||||
typedef void ( caEventCallBackFunc ) (struct event_handler_args);
|
||||
int ca_create_subscription ( chtype TYPE, unsigned long COUNT,
|
||||
chid CHID, unsigned long MASK,
|
||||
caEventCallBackFunc USERFUNC, void *USERARG,
|
||||
caEventCallBackFunc USERFUNC, void *USERARG,
|
||||
evid *PEVID );</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
@@ -3153,7 +3167,7 @@ indicating the current state of the channel.</p>
|
||||
<dt><code>MASK</code></dt>
|
||||
<dd>A mask with bits set for each of the event trigger types requested. The
|
||||
event trigger mask must be a <em>bitwise or</em> of one or more of the
|
||||
following constants.
|
||||
following constants.
|
||||
<ul>
|
||||
<li>DBE_VALUE - Trigger events when the channel value exceeds the
|
||||
monitor dead band</li>
|
||||
@@ -3200,6 +3214,13 @@ and not forwarded to the server until one of <code>ca_flush_io()</code>, <code>c
|
||||
<code>ca_pend_event()</code>, or <code>ca_sg_block()</code> are called. This allows several requests to be
|
||||
efficiently sent together in one message.</p>
|
||||
|
||||
<p>Note: This operation blocks until any user callbacks for this channel
|
||||
have run to completion. If callbacks take a lock (mutex) then it is the
|
||||
user's responsibility to ensure that this lock is not held when
|
||||
<code>ca_clear_subscription()</code> is called, otherwise a deadlock may
|
||||
ensue. (See also <code><a
|
||||
href="#ca_clear_channel">ca_clear_channel</a>()</code>.)</p>
|
||||
|
||||
<h4>Arguments</h4>
|
||||
<dl>
|
||||
<dt>EVID</dt>
|
||||
@@ -3364,7 +3385,7 @@ becomes full.</p>
|
||||
|
||||
<h3><code><a name="ca_signal">ca_signal()</a></code></h3>
|
||||
<pre>#include <cadef.h>
|
||||
int ca_signal ( long CA_STATUS, const char * CONTEXT_STRING );
|
||||
int ca_signal ( long CA_STATUS, const char * CONTEXT_STRING );
|
||||
void SEVCHK( CA_STATUS, CONTEXT_STRING );</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
@@ -3381,7 +3402,7 @@ recommended error handler for simple applications which do not wish to write
|
||||
code testing the status returned from each channel access call.</p>
|
||||
|
||||
<h4>Examples</h4>
|
||||
<pre>status = ca_context_create (...);
|
||||
<pre>status = ca_context_create (...);
|
||||
SEVCHK ( status, "Unable to create a CA client context" );</pre>
|
||||
|
||||
<p>If the application only wishes to print the message associated with an error
|
||||
@@ -3405,7 +3426,7 @@ this purpose.</p>
|
||||
|
||||
<h3><code><a
|
||||
name="ca_add_exception_event">ca_add_exception_event()</a></code></h3>
|
||||
<pre>#include <cadef.h>
|
||||
<pre>#include <cadef.h>
|
||||
typedef void (*pCallback) ( struct exception_handler_args HANDLERARGS );
|
||||
int ca_add_exception_event ( pCallback USERFUNC, void *USERARG );</pre>
|
||||
|
||||
@@ -3614,7 +3635,7 @@ specified channel.</p>
|
||||
<dt><code>PFUNC</code></dt>
|
||||
<dd>Pointer to a user supplied callback function. A null pointer uninstalls
|
||||
the current handler. The following arguments are passed <em>by value</em>
|
||||
to the supplied callback handler.
|
||||
to the supplied callback handler.
|
||||
<pre>typedef struct ca_access_rights {
|
||||
unsigned read_access:1;
|
||||
unsigned write_access:1;
|
||||
@@ -3954,8 +3975,8 @@ type.</p>
|
||||
prints diagnostics to standard out.</p>
|
||||
|
||||
<h4>Examples</h4>
|
||||
<pre>void ca_test_event ();
|
||||
status = ca_create_subscription ( type, chid, ca_test_event, NULL, NULL );
|
||||
<pre>void ca_test_event ();
|
||||
status = ca_create_subscription ( type, chid, ca_test_event, NULL, NULL );
|
||||
SEVCHK ( status, .... );</pre>
|
||||
|
||||
<h4>See Also</h4>
|
||||
@@ -3989,8 +4010,8 @@ outstanding within them at any given time.</p>
|
||||
</dl>
|
||||
|
||||
<h4>Examples</h4>
|
||||
<pre>CA_SYNC_GID gid;
|
||||
status = ca_sg_create ( &gid );
|
||||
<pre>CA_SYNC_GID gid;
|
||||
status = ca_sg_create ( &gid );
|
||||
SEVCHK ( status, Sync group create failed );</pre>
|
||||
|
||||
<h4>Returns</h4>
|
||||
@@ -4028,8 +4049,8 @@ int ca_sg_delete ( CA_SYNC_GID GID );</pre>
|
||||
</dl>
|
||||
|
||||
<h4>Examples</h4>
|
||||
<pre>CA_SYNC_GID gid;
|
||||
status = ca_sg_delete ( gid );
|
||||
<pre>CA_SYNC_GID gid;
|
||||
status = ca_sg_delete ( gid );
|
||||
SEVCHK ( status, Sync group delete failed );</pre>
|
||||
|
||||
<h4>Returns</h4>
|
||||
@@ -4140,7 +4161,7 @@ will not block unless additional subsequent requests are made.</p>
|
||||
</dl>
|
||||
|
||||
<h4>Examples</h4>
|
||||
<pre>CA_SYNC_GID gid;
|
||||
<pre>CA_SYNC_GID gid;
|
||||
status = ca_sg_reset(gid);</pre>
|
||||
|
||||
<h4>Returns</h4>
|
||||
@@ -4153,7 +4174,7 @@ status = ca_sg_reset(gid);</pre>
|
||||
<pre>#include <cadef.h>
|
||||
int ca_sg_put ( CA_SYNC_GID GID, chtype TYPE,
|
||||
chid CHID, void *PVALUE );
|
||||
int ca_sg_array_put ( CA_SYNC_GID GID, chtype TYPE,
|
||||
int ca_sg_array_put ( CA_SYNC_GID GID, chtype TYPE,
|
||||
unsigned long COUNT, chid CHID, void *PVALUE );</pre>
|
||||
|
||||
<p>Write a value, or array of values, to a channel and increment the outstanding
|
||||
@@ -4294,7 +4315,7 @@ reissued.</p>
|
||||
|
||||
<h3><code><a name="ca_client_status">ca_client_status()</a></code></h3>
|
||||
<pre>int ca_client_status ( unsigned level );
|
||||
int ca_context_status ( struct ca_client_context *CONTEXT,
|
||||
int ca_context_status ( struct ca_client_context *CONTEXT,
|
||||
unsigned LEVEL );</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
@@ -140,6 +140,10 @@ sub display {
|
||||
printf " Lo ctrl limit: %g\n", $data->{lower_ctrl_limit};
|
||||
printf " Hi ctrl limit: %g\n", $data->{upper_ctrl_limit};
|
||||
}
|
||||
if (exists $data->{ackt}) {
|
||||
printf " Ack transients: %s\n", $data->{ackt} ? 'YES' : 'NO';
|
||||
printf " Ack severity: %s\n", $data->{acks};
|
||||
}
|
||||
} else {
|
||||
my $value = format_number($data, $type);
|
||||
if ($opt_t) {
|
||||
|
||||
@@ -644,6 +644,11 @@ caStatus casDGClient::processDG ()
|
||||
if ( status != S_cas_success ) {
|
||||
break;
|
||||
}
|
||||
|
||||
if ( this->in.bytesPresent () > 0 && dgInBytesConsumed == 0 && status == S_cas_success ) {
|
||||
this->in.removeMsg ( this->in.bytesPresent() );
|
||||
}
|
||||
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/*
|
||||
* Author Jeffrey O. Hill
|
||||
@@ -26,33 +26,39 @@
|
||||
#include "casAsyncIOI.h"
|
||||
#include "casMonitor.h"
|
||||
|
||||
casPVI::casPVI ( casPV & intf ) :
|
||||
pCAS ( NULL ), pPV ( & intf ), nMonAttached ( 0u ),
|
||||
|
||||
// Use casErrMessage instead of errMessage to show PV name
|
||||
#define casErrMessage(S, PM) \
|
||||
errPrintf(S, __FILE__, __LINE__, ", %s, %s", getName(), PM)
|
||||
|
||||
casPVI::casPVI ( casPV & intf ) :
|
||||
pCAS ( NULL ), pPV ( & intf ), nMonAttached ( 0u ),
|
||||
nIOAttached ( 0u ), deletePending ( false ) {}
|
||||
|
||||
casPVI::~casPVI ()
|
||||
{
|
||||
//
|
||||
// all channels should have been destroyed
|
||||
// (otherwise the server tool is yanking the
|
||||
//
|
||||
// all channels should have been destroyed
|
||||
// (otherwise the server tool is yanking the
|
||||
// PV out from under the server)
|
||||
//
|
||||
casVerify ( this->chanList.count() == 0u );
|
||||
//
|
||||
casVerify ( this->chanList.count() == 0u );
|
||||
|
||||
//
|
||||
// all outstanding IO should have been deleted
|
||||
// when we destroyed the channels
|
||||
//
|
||||
casVerify ( this->nIOAttached == 0u );
|
||||
//
|
||||
// all outstanding IO should have been deleted
|
||||
// when we destroyed the channels
|
||||
//
|
||||
casVerify ( this->nIOAttached == 0u );
|
||||
if ( this->nIOAttached ) {
|
||||
errlogPrintf ( "The number of IO objected attached is %u\n", this->nIOAttached );
|
||||
errlogPrintf ( "%u IO objects still attached in destructor\n",
|
||||
this->nIOAttached );
|
||||
}
|
||||
|
||||
//
|
||||
// all monitors should have been deleted
|
||||
// when we destroyed the channels
|
||||
//
|
||||
casVerify ( this->nMonAttached == 0u );
|
||||
//
|
||||
// all monitors should have been deleted
|
||||
// when we destroyed the channels
|
||||
//
|
||||
casVerify ( this->nMonAttached == 0u );
|
||||
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
@@ -139,26 +145,26 @@ caStatus casPVI::attachToServer ( caServerI & cas )
|
||||
caStatus casPVI::updateEnumStringTable ( casCtx & ctxIn )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
|
||||
//
|
||||
// create a gdd with the "enum string table" application type
|
||||
//
|
||||
// gddArray(int app, aitEnum prim, int dimen, ...);
|
||||
gdd * pTmp = new gddScalar ( gddAppType_enums );
|
||||
if ( pTmp == NULL ) {
|
||||
errMessage ( S_cas_noMemory,
|
||||
casErrMessage ( S_cas_noMemory,
|
||||
"unable to create gdd for read of application type \"enums\" string"
|
||||
" conversion table for enumerated PV" );
|
||||
return S_cas_noMemory;
|
||||
}
|
||||
|
||||
caStatus status = convertContainerMemberToAtomic ( *pTmp,
|
||||
caStatus status = convertContainerMemberToAtomic ( *pTmp,
|
||||
gddAppType_enums, MAX_ENUM_STATES );
|
||||
if ( status != S_cas_success ) {
|
||||
pTmp->unreference ();
|
||||
errMessage ( status,
|
||||
"unable to to config gdd for read of application type \"enums\" string"
|
||||
" conversion table for enumerated PV");
|
||||
casErrMessage ( status,
|
||||
"unable to config gdd for read of application type \"enums\" string"
|
||||
" conversion table for enumerated PV" );
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -169,12 +175,11 @@ caStatus casPVI::updateEnumStringTable ( casCtx & ctxIn )
|
||||
if ( status == S_cas_success ) {
|
||||
updateEnumStringTableAsyncCompletion ( *pTmp );
|
||||
}
|
||||
else if ( status != S_casApp_asyncCompletion &&
|
||||
else if ( status != S_casApp_asyncCompletion &&
|
||||
status != S_casApp_postponeAsyncIO ) {
|
||||
errPrintf ( status, __FILE__, __LINE__,
|
||||
"- unable to read application type \"enums\" "
|
||||
" (string conversion table) from enumerated native type PV \"%s\"",
|
||||
this->getName() );
|
||||
casErrMessage ( status,
|
||||
"unable to read application type \"enums\" "
|
||||
" (string conversion table) from enumerated native type PV" );
|
||||
}
|
||||
|
||||
pTmp->unreference ();
|
||||
@@ -185,40 +190,39 @@ caStatus casPVI::updateEnumStringTable ( casCtx & ctxIn )
|
||||
void casPVI::updateEnumStringTableAsyncCompletion ( const gdd & resp )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
|
||||
if ( resp.isContainer() ) {
|
||||
errMessage ( S_cas_badType,
|
||||
"application type \"enums\" string conversion table for"
|
||||
" enumerated PV was a container (expected vector of strings)" );
|
||||
casErrMessage ( S_cas_badType,
|
||||
"Invalid \"enums\" string conversion table for"
|
||||
" enumerated PV (container instead of vector of strings)" );
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ( resp.dimension() == 0 ) {
|
||||
if ( resp.primitiveType() == aitEnumString ) {
|
||||
aitString *pStr = (aitString *) resp.dataVoid ();
|
||||
if ( ! this->enumStrTbl.setString ( 0, pStr->string() ) ) {
|
||||
errMessage ( S_cas_noMemory,
|
||||
casErrMessage ( S_cas_noMemory,
|
||||
"no memory to set enumerated PV string cache" );
|
||||
}
|
||||
}
|
||||
else if ( resp.primitiveType() == aitEnumFixedString ) {
|
||||
aitFixedString *pStr = (aitFixedString *) resp.dataVoid ();
|
||||
if ( ! this->enumStrTbl.setString ( 0, pStr->fixed_string ) ) {
|
||||
errMessage ( S_cas_noMemory,
|
||||
casErrMessage ( S_cas_noMemory,
|
||||
"no memory to set enumerated PV string cache" );
|
||||
}
|
||||
}
|
||||
else {
|
||||
errPrintf ( S_cas_badType, __FILE__, __LINE__,
|
||||
casErrMessage ( S_cas_badType,
|
||||
"application type \"enums\" string conversion"
|
||||
" table for enumerated PV \"%s\" isnt a string type?",
|
||||
getName() );
|
||||
" table for enumerated PV isnt a string type?" );
|
||||
}
|
||||
}
|
||||
else if ( resp.dimension() == 1 ) {
|
||||
gddStatus gdd_status;
|
||||
aitIndex index, first, count;
|
||||
|
||||
|
||||
gdd_status = resp.getBound ( 0, first, count );
|
||||
assert ( gdd_status == 0 );
|
||||
|
||||
@@ -232,7 +236,7 @@ void casPVI::updateEnumStringTableAsyncCompletion ( const gdd & resp )
|
||||
aitString *pStr = (aitString *) resp.dataVoid ();
|
||||
for ( index = 0; index<count; index++ ) {
|
||||
if ( ! this->enumStrTbl.setString ( index, pStr[index].string() ) ) {
|
||||
errMessage ( S_cas_noMemory,
|
||||
casErrMessage ( S_cas_noMemory,
|
||||
"no memory to set enumerated PV string cache" );
|
||||
}
|
||||
}
|
||||
@@ -241,19 +245,18 @@ void casPVI::updateEnumStringTableAsyncCompletion ( const gdd & resp )
|
||||
aitFixedString *pStr = (aitFixedString *) resp.dataVoid ();
|
||||
for ( index = 0; index < count; index++ ) {
|
||||
if ( ! this->enumStrTbl.setString ( index, pStr[index].fixed_string ) ) {
|
||||
errMessage ( S_cas_noMemory,
|
||||
casErrMessage ( S_cas_noMemory,
|
||||
"no memory to set enumerated PV string cache" );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
errMessage ( S_cas_badType,
|
||||
"application type \"enums\" string conversion"
|
||||
" table for enumerated PV isnt a string type?" );
|
||||
casErrMessage( S_cas_badType,
|
||||
"bad \"enums\" string conversion table for enumerated PV" );
|
||||
}
|
||||
}
|
||||
else {
|
||||
errMessage ( S_cas_badType,
|
||||
casErrMessage ( S_cas_badType,
|
||||
"application type \"enums\" string conversion table"
|
||||
" for enumerated PV was multi-dimensional"
|
||||
" (expected vector of strings)" );
|
||||
@@ -287,7 +290,7 @@ void casPVI::postEvent ( const casEventMask & select, const gdd & event )
|
||||
}
|
||||
}
|
||||
|
||||
caStatus casPVI::installMonitor (
|
||||
caStatus casPVI::installMonitor (
|
||||
casMonitor & mon, tsDLList < casMonitor > & monitorList )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
@@ -303,14 +306,14 @@ caStatus casPVI::installMonitor (
|
||||
}
|
||||
}
|
||||
|
||||
casMonitor * casPVI::removeMonitor (
|
||||
casMonitor * casPVI::removeMonitor (
|
||||
tsDLList < casMonitor > & list, ca_uint32_t clientIdIn )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
casMonitor * pMon = 0;
|
||||
//
|
||||
// (it is reasonable to do a linear search here because
|
||||
// sane clients will require only one or two monitors
|
||||
// sane clients will require only one or two monitors
|
||||
// per channel)
|
||||
//
|
||||
tsDLIter < casMonitor > iter = list.firstIter ();
|
||||
@@ -359,9 +362,9 @@ void casPVI::installChannel ( chanIntfForPV & chan )
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
this->chanList.add ( chan );
|
||||
}
|
||||
|
||||
void casPVI::removeChannel (
|
||||
chanIntfForPV & chan, tsDLList < casMonitor > & src,
|
||||
|
||||
void casPVI::removeChannel (
|
||||
chanIntfForPV & chan, tsDLList < casMonitor > & src,
|
||||
tsDLList < casMonitor > & dest )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
@@ -380,8 +383,8 @@ void casPVI::clearOutstandingReads ( tsDLList < casAsyncIOI > & ioList )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
|
||||
// cancel any pending asynchronous IO
|
||||
tsDLIter < casAsyncIOI > iterIO =
|
||||
// cancel any pending asynchronous IO
|
||||
tsDLIter < casAsyncIOI > iterIO =
|
||||
ioList.firstIter ();
|
||||
while ( iterIO.valid () ) {
|
||||
tsDLIter < casAsyncIOI > tmp = iterIO;
|
||||
@@ -407,7 +410,7 @@ void casPVI::destroyAllIO ( tsDLList < casAsyncIOI > & ioList )
|
||||
}
|
||||
}
|
||||
|
||||
void casPVI::installIO (
|
||||
void casPVI::installIO (
|
||||
tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io )
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
@@ -416,7 +419,7 @@ void casPVI::installIO (
|
||||
this->nIOAttached++;
|
||||
}
|
||||
|
||||
void casPVI::uninstallIO (
|
||||
void casPVI::uninstallIO (
|
||||
tsDLList < casAsyncIOI > & ioList, casAsyncIOI & io )
|
||||
{
|
||||
{
|
||||
@@ -517,8 +520,8 @@ aitEnum casPVI::bestExternalType () const
|
||||
}
|
||||
}
|
||||
|
||||
// CA only does 1D arrays for now
|
||||
aitIndex casPVI::nativeCount ()
|
||||
// CA only does 1D arrays for now
|
||||
aitIndex casPVI::nativeCount ()
|
||||
{
|
||||
epicsGuard < epicsMutex > guard ( this->mutex );
|
||||
if ( this->pPV ) {
|
||||
@@ -542,4 +545,3 @@ const char * casPVI::getName () const
|
||||
return "<disconnected>";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include "epicsExport.h"
|
||||
#include "link.h"
|
||||
#include "recSup.h"
|
||||
#include "dbUnitTest.h" /* for testSyncCallback() */
|
||||
|
||||
|
||||
static int callbackQueueSize = 2000;
|
||||
@@ -353,3 +354,86 @@ void callbackRequestProcessCallbackDelayed(CALLBACK *pcallback,
|
||||
callbackSetProcess(pcallback, Priority, pRec);
|
||||
callbackRequestDelayed(pcallback, seconds);
|
||||
}
|
||||
|
||||
/* Sync. process of testSyncCallback()
|
||||
*
|
||||
* 1. For each priority, make a call to callbackRequest() for each worker.
|
||||
* 2. Wait until all callbacks are concurrently being executed
|
||||
* 3. Last worker to begin executing signals success and begins waking up other workers
|
||||
* 4. Last worker to wake signals testSyncCallback() to complete
|
||||
*/
|
||||
typedef struct {
|
||||
epicsEventId wait_phase2, wait_phase4;
|
||||
int nphase2, nphase3;
|
||||
epicsCallback cb;
|
||||
} sync_helper;
|
||||
|
||||
static void sync_callback(epicsCallback *cb)
|
||||
{
|
||||
sync_helper *helper;
|
||||
callbackGetUser(helper, cb);
|
||||
|
||||
testGlobalLock();
|
||||
|
||||
assert(helper->nphase2 > 0);
|
||||
if(--helper->nphase2!=0) {
|
||||
/* we are _not_ the last to start. */
|
||||
testGlobalUnlock();
|
||||
epicsEventMustWait(helper->wait_phase2);
|
||||
testGlobalLock();
|
||||
}
|
||||
|
||||
/* we are either the last to start, or have been
|
||||
* woken by the same and must pass the wakeup along
|
||||
*/
|
||||
epicsEventMustTrigger(helper->wait_phase2);
|
||||
|
||||
assert(helper->nphase2 == 0);
|
||||
assert(helper->nphase3 > 0);
|
||||
|
||||
if(--helper->nphase3==0) {
|
||||
/* we are the last to wake up. wake up testSyncCallback() */
|
||||
epicsEventMustTrigger(helper->wait_phase4);
|
||||
}
|
||||
|
||||
testGlobalUnlock();
|
||||
}
|
||||
|
||||
void testSyncCallback(void)
|
||||
{
|
||||
sync_helper helper[NUM_CALLBACK_PRIORITIES];
|
||||
unsigned i;
|
||||
|
||||
testDiag("Begin testSyncCallback()");
|
||||
|
||||
for(i=0; i<NUM_CALLBACK_PRIORITIES; i++) {
|
||||
helper[i].wait_phase2 = epicsEventMustCreate(epicsEventEmpty);
|
||||
helper[i].wait_phase4 = epicsEventMustCreate(epicsEventEmpty);
|
||||
|
||||
/* no real need to lock here, but do so anyway so that valgrind can establish
|
||||
* the locking requirements for sync_helper.
|
||||
*/
|
||||
testGlobalLock();
|
||||
helper[i].nphase2 = helper[i].nphase3 = callbackQueue[i].threadsRunning;
|
||||
testGlobalUnlock();
|
||||
|
||||
callbackSetUser(&helper[i], &helper[i].cb);
|
||||
callbackSetPriority(i, &helper[i].cb);
|
||||
callbackSetCallback(sync_callback, &helper[i].cb);
|
||||
|
||||
callbackRequest(&helper[i].cb);
|
||||
}
|
||||
|
||||
for(i=0; i<NUM_CALLBACK_PRIORITIES; i++) {
|
||||
epicsEventMustWait(helper[i].wait_phase4);
|
||||
}
|
||||
|
||||
for(i=0; i<NUM_CALLBACK_PRIORITIES; i++) {
|
||||
testGlobalLock();
|
||||
epicsEventDestroy(helper[i].wait_phase2);
|
||||
epicsEventDestroy(helper[i].wait_phase4);
|
||||
testGlobalUnlock();
|
||||
}
|
||||
|
||||
testDiag("Complete testSyncCallback()");
|
||||
}
|
||||
|
||||
@@ -42,7 +42,9 @@ typedef struct callbackPvt {
|
||||
int priority;
|
||||
void *user; /*for use by callback user*/
|
||||
void *timer; /*for use by callback itself*/
|
||||
}CALLBACK;
|
||||
}epicsCallback;
|
||||
|
||||
typedef epicsCallback CALLBACK;
|
||||
|
||||
typedef void (*CALLBACKFUNC)(struct callbackPvt*);
|
||||
|
||||
|
||||
@@ -291,10 +291,14 @@ static void get_alarm(DBADDR *paddr, char **ppbuffer,
|
||||
if (*options & DBR_AL_LONG) {
|
||||
struct dbr_alLong *pal = (struct dbr_alLong*) pbuffer;
|
||||
|
||||
pal->upper_alarm_limit = (epicsInt32) ald.upper_alarm_limit;
|
||||
pal->upper_warning_limit = (epicsInt32) ald.upper_warning_limit;
|
||||
pal->lower_warning_limit = (epicsInt32) ald.lower_warning_limit;
|
||||
pal->lower_alarm_limit = (epicsInt32) ald.lower_alarm_limit;
|
||||
pal->upper_alarm_limit = finite(ald.upper_alarm_limit) ?
|
||||
(epicsInt32) ald.upper_alarm_limit : 0;
|
||||
pal->upper_warning_limit = finite(ald.upper_warning_limit) ?
|
||||
(epicsInt32) ald.upper_warning_limit : 0;
|
||||
pal->lower_warning_limit = finite(ald.lower_warning_limit) ?
|
||||
(epicsInt32) ald.lower_warning_limit : 0;
|
||||
pal->lower_alarm_limit = finite(ald.lower_alarm_limit) ?
|
||||
(epicsInt32) ald.lower_alarm_limit : 0;
|
||||
|
||||
if (no_data)
|
||||
*options ^= DBR_AL_LONG; /*Turn off option*/
|
||||
|
||||
@@ -649,11 +649,16 @@ static void connectionCallback(struct connection_handler_args arg)
|
||||
if (pca->gotFirstConnection) {
|
||||
if (pca->nelements != ca_element_count(arg.chid) ||
|
||||
pca->dbrType != ca_field_type(arg.chid)) {
|
||||
/* BUG: We have no way to clear any old subscription with the
|
||||
* originally chosen data type/size. That will continue
|
||||
* to send us data and will result in an assert() fail.
|
||||
*/
|
||||
/* Let next dbCaGetLink and/or dbCaPutLink determine options */
|
||||
/* Size or type changed, clear everything and let the next call
|
||||
to dbCaGetLink() and/or dbCaPutLink() reset everything */
|
||||
if (pca->evidNative) {
|
||||
ca_clear_event(pca->evidNative);
|
||||
pca->evidNative = 0;
|
||||
}
|
||||
if (pca->evidString) {
|
||||
ca_clear_event(pca->evidString);
|
||||
pca->evidString = 0;
|
||||
}
|
||||
plink->value.pv_link.pvlMask &=
|
||||
~(pvlOptInpNative | pvlOptInpString |
|
||||
pvlOptOutNative | pvlOptOutString);
|
||||
@@ -701,6 +706,7 @@ static void eventCallback(struct event_handler_args arg)
|
||||
struct dbr_time_double *pdbr_time_double;
|
||||
dbCaCallback monitor = 0;
|
||||
void *userPvt = 0;
|
||||
int doScan = 1;
|
||||
|
||||
assert(pca);
|
||||
epicsMutexMustLock(pca->lock);
|
||||
@@ -729,10 +735,13 @@ static void eventCallback(struct event_handler_args arg)
|
||||
memcpy(pca->pgetString, dbr_value_ptr(arg.dbr, arg.type), size);
|
||||
pca->gotInString = TRUE;
|
||||
} else switch (arg.type){
|
||||
case DBR_TIME_ENUM:
|
||||
/* Disable the record scan if we also have a string monitor */
|
||||
doScan = !(plink->value.pv_link.pvlMask & pvlOptInpString);
|
||||
/* fall through */
|
||||
case DBR_TIME_STRING:
|
||||
case DBR_TIME_SHORT:
|
||||
case DBR_TIME_FLOAT:
|
||||
case DBR_TIME_ENUM:
|
||||
case DBR_TIME_CHAR:
|
||||
case DBR_TIME_LONG:
|
||||
case DBR_TIME_DOUBLE:
|
||||
@@ -748,7 +757,7 @@ static void eventCallback(struct event_handler_args arg)
|
||||
pca->sevr = pdbr_time_double->severity;
|
||||
pca->stat = pdbr_time_double->status;
|
||||
memcpy(&pca->timeStamp, &pdbr_time_double->stamp, sizeof(epicsTimeStamp));
|
||||
if (precord) {
|
||||
if (doScan && precord) {
|
||||
struct pv_link *ppv_link = &plink->value.pv_link;
|
||||
|
||||
if ((ppv_link->pvlMask & pvlOptCP) ||
|
||||
@@ -1005,7 +1014,8 @@ static void dbCaTask(void *arg)
|
||||
status = ca_add_array_event(
|
||||
ca_field_type(pca->chid)+DBR_TIME_STRING,
|
||||
ca_element_count(pca->chid),
|
||||
pca->chid, eventCallback, pca, 0.0, 0.0, 0.0, 0);
|
||||
pca->chid, eventCallback, pca, 0.0, 0.0, 0.0,
|
||||
&pca->evidNative);
|
||||
if (status != ECA_NORMAL) {
|
||||
errlogPrintf("dbCaTask ca_add_array_event %s\n",
|
||||
ca_message(status));
|
||||
@@ -1017,7 +1027,8 @@ static void dbCaTask(void *arg)
|
||||
pca->pgetString = dbCalloc(1, MAX_STRING_SIZE);
|
||||
epicsMutexUnlock(pca->lock);
|
||||
status = ca_add_array_event(DBR_TIME_STRING, 1,
|
||||
pca->chid, eventCallback, pca, 0.0, 0.0, 0.0, 0);
|
||||
pca->chid, eventCallback, pca, 0.0, 0.0, 0.0,
|
||||
&pca->evidString);
|
||||
if (status != ECA_NORMAL) {
|
||||
errlogPrintf("dbCaTask ca_add_array_event %s\n",
|
||||
ca_message(status));
|
||||
|
||||
@@ -78,6 +78,8 @@ typedef struct caLink
|
||||
char *pgetString;
|
||||
void *pputNative;
|
||||
char *pputString;
|
||||
evid evidNative;
|
||||
evid evidString;
|
||||
char gotInNative;
|
||||
char gotInString;
|
||||
char gotOutNative;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* Copyright (c) 2013 Helmholtz-Zentrum Berlin
|
||||
* für Materialien und Energie GmbH.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* dbScan.c */
|
||||
/* tasks and subroutines to scan the database */
|
||||
@@ -111,8 +111,8 @@ static char *priorityName[NUM_CALLBACK_PRIORITIES] = {
|
||||
typedef struct event_list {
|
||||
CALLBACK callback[NUM_CALLBACK_PRIORITIES];
|
||||
scan_list scan_list[NUM_CALLBACK_PRIORITIES];
|
||||
struct event_list *next;
|
||||
char event_name[MAX_STRING_SIZE];
|
||||
struct event_list *next;
|
||||
char eventname[1]; /* actually arbitrary size */
|
||||
} event_list;
|
||||
static event_list * volatile pevent_list[256];
|
||||
static epicsMutexId event_lock;
|
||||
@@ -249,11 +249,6 @@ void scanAdd(struct dbCommon *precord)
|
||||
event_list *pel;
|
||||
|
||||
eventname = precord->evnt;
|
||||
if (strlen(eventname) >= MAX_STRING_SIZE) {
|
||||
recGblRecordError(S_db_badField, (void *)precord,
|
||||
"scanAdd: too long EVNT value");
|
||||
return;
|
||||
}
|
||||
prio = precord->prio;
|
||||
if (prio < 0 || prio >= NUM_CALLBACK_PRIORITIES) {
|
||||
recGblRecordError(-1, (void *)precord,
|
||||
@@ -317,24 +312,17 @@ void scanDelete(struct dbCommon *precord)
|
||||
recGblRecordError(-1, (void *)precord,
|
||||
"scanDelete detected illegal SCAN value");
|
||||
} else if (scan == menuScanEvent) {
|
||||
char* eventname;
|
||||
int prio;
|
||||
event_list *pel;
|
||||
scan_list *psl = 0;
|
||||
|
||||
eventname = precord->evnt;
|
||||
prio = precord->prio;
|
||||
if (prio < 0 || prio >= NUM_CALLBACK_PRIORITIES) {
|
||||
recGblRecordError(-1, (void *)precord,
|
||||
"scanDelete detected illegal PRIO field");
|
||||
return;
|
||||
}
|
||||
do /* multithreading: make sure pel is consistent */
|
||||
pel = pevent_list[0];
|
||||
while (pel != pevent_list[0]);
|
||||
for (; pel; pel=pel->next) {
|
||||
if (strcmp(pel->event_name, eventname) == 0) break;
|
||||
}
|
||||
pel = eventNameToHandle(precord->evnt);
|
||||
if (pel && (psl = &pel->scan_list[prio]))
|
||||
deleteFromList(precord, psl);
|
||||
} else if (scan == menuScanI_O_Intr) {
|
||||
@@ -422,14 +410,12 @@ int scanpel(const char* eventname) /* print event list */
|
||||
int prio;
|
||||
event_list *pel;
|
||||
|
||||
do /* multithreading: make sure pel is consistent */
|
||||
pel = pevent_list[0];
|
||||
while (pel != pevent_list[0]);
|
||||
for (; pel; pel = pel->next) {
|
||||
if (!eventname || strcmp(pel->event_name, eventname) == 0) {
|
||||
for (pel = pevent_list[0]; pel; pel = pel->next) {
|
||||
if (!eventname || epicsStrGlobMatch(pel->eventname, eventname)) {
|
||||
printf("Event \"%s\"\n", pel->eventname);
|
||||
for (prio = 0; prio < NUM_CALLBACK_PRIORITIES; prio++) {
|
||||
if (ellCount(&pel->scan_list[prio].list) == 0) continue;
|
||||
sprintf(message, "Event \"%s\" Priority %s", pel->event_name, priorityName[prio]);
|
||||
sprintf(message, " Priority %s", priorityName[prio]);
|
||||
printList(&pel->scan_list[prio], message);
|
||||
}
|
||||
}
|
||||
@@ -480,18 +466,52 @@ event_list *eventNameToHandle(const char *eventname)
|
||||
int prio;
|
||||
event_list *pel;
|
||||
static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT;
|
||||
double eventnumber = 0;
|
||||
size_t namelength;
|
||||
|
||||
if (!eventname || eventname[0] == 0)
|
||||
return NULL;
|
||||
if (!eventname) return NULL;
|
||||
while (isspace((unsigned char)eventname[0])) eventname++;
|
||||
if (!eventname[0]) return NULL;
|
||||
namelength = strlen(eventname);
|
||||
while (isspace((unsigned char)eventname[namelength-1])) namelength--;
|
||||
|
||||
/* Backward compatibility with numeric events:
|
||||
Treat any string that represents a double with an
|
||||
integer part between 0 and 255 the same as the integer
|
||||
because it is most probably a conversion from double
|
||||
like from a calc record.
|
||||
*/
|
||||
if (epicsParseDouble(eventname, &eventnumber, NULL) == 0)
|
||||
{
|
||||
if (eventnumber >= 0 && eventnumber < 256)
|
||||
{
|
||||
if (eventnumber < 1)
|
||||
return NULL; /* 0 is no event */
|
||||
if ((pel = pevent_list[(int)eventnumber]) != NULL)
|
||||
return pel;
|
||||
}
|
||||
else
|
||||
eventnumber = 0; /* not a numeric event between 1 and 255 */
|
||||
}
|
||||
|
||||
epicsThreadOnce(&onceId, eventOnce, NULL);
|
||||
epicsMutexMustLock(event_lock);
|
||||
for (pel = pevent_list[0]; pel; pel=pel->next) {
|
||||
if (strcmp(pel->event_name, eventname) == 0) break;
|
||||
if (strncmp(pel->eventname, eventname, namelength) == 0
|
||||
&& pel->eventname[namelength] == 0)
|
||||
break;
|
||||
}
|
||||
if (pel == NULL) {
|
||||
pel = dbCalloc(1, sizeof(event_list));
|
||||
strcpy(pel->event_name, eventname);
|
||||
pel = calloc(1, sizeof(event_list) + namelength);
|
||||
if (!pel)
|
||||
goto done;
|
||||
if (eventnumber > 0) {
|
||||
/* backward compatibility: make all numeric events look like integers */
|
||||
sprintf(pel->eventname, "%i", (int)eventnumber);
|
||||
pevent_list[(int)eventnumber] = pel;
|
||||
}
|
||||
else
|
||||
strncpy(pel->eventname, eventname, namelength);
|
||||
for (prio = 0; prio < NUM_CALLBACK_PRIORITIES; prio++) {
|
||||
callbackSetUser(&pel->scan_list[prio], &pel->callback[prio]);
|
||||
callbackSetPriority(prio, &pel->callback[prio]);
|
||||
@@ -501,13 +521,8 @@ event_list *eventNameToHandle(const char *eventname)
|
||||
}
|
||||
pel->next=pevent_list[0];
|
||||
pevent_list[0]=pel;
|
||||
{ /* backward compatibility */
|
||||
char* p;
|
||||
long e = strtol(eventname, &p, 0);
|
||||
if (*p == 0 && e > 0 && e <= 255)
|
||||
pevent_list[e] = pel;
|
||||
}
|
||||
}
|
||||
done:
|
||||
epicsMutexUnlock(event_lock);
|
||||
return pel;
|
||||
}
|
||||
@@ -527,13 +542,8 @@ void postEvent(event_list *pel)
|
||||
/* backward compatibility */
|
||||
void post_event(int event)
|
||||
{
|
||||
event_list* pel;
|
||||
|
||||
if (event <= 0 || event > 255) return;
|
||||
do { /* multithreading: make sure pel is consistent */
|
||||
pel = pevent_list[event];
|
||||
} while (pel != pevent_list[event]);
|
||||
postEvent(pel);
|
||||
postEvent(pevent_list[event]);
|
||||
}
|
||||
|
||||
static void ioscanOnce(void *arg)
|
||||
|
||||
@@ -50,7 +50,7 @@ epicsShareFunc void scanCleanup(void);
|
||||
|
||||
epicsShareFunc EVENTPVT eventNameToHandle(const char* event);
|
||||
epicsShareFunc void postEvent(EVENTPVT epvt);
|
||||
epicsShareFunc void post_event(int event) EPICS_DEPRECATED;
|
||||
epicsShareFunc void post_event(int event);
|
||||
epicsShareFunc void scanAdd(struct dbCommon *);
|
||||
epicsShareFunc void scanDelete(struct dbCommon *);
|
||||
epicsShareFunc double scanPeriod(int scan);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "epicsUnitTest.h"
|
||||
#include "osiFileName.h"
|
||||
#include "registry.h"
|
||||
#include "epicsThread.h"
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "dbAccess.h"
|
||||
@@ -268,3 +269,26 @@ dbCommon* testdbRecordPtr(const char* pv)
|
||||
|
||||
return addr.precord;
|
||||
}
|
||||
|
||||
static
|
||||
epicsMutexId test_global;
|
||||
|
||||
static
|
||||
epicsThreadOnceId test_global_once = EPICS_THREAD_ONCE_INIT;
|
||||
|
||||
static
|
||||
void test_global_init(void* ignored)
|
||||
{
|
||||
test_global = epicsMutexMustCreate();
|
||||
}
|
||||
|
||||
void testGlobalLock(void)
|
||||
{
|
||||
epicsThreadOnce(&test_global_once, &test_global_init, NULL);
|
||||
epicsMutexMustLock(test_global);
|
||||
}
|
||||
|
||||
void testGlobalUnlock(void)
|
||||
{
|
||||
epicsMutexUnlock(test_global);
|
||||
}
|
||||
|
||||
@@ -74,6 +74,65 @@ epicsShareFunc void testdbGetArrFieldEqual(const char* pv, short dbfType, long n
|
||||
|
||||
epicsShareFunc dbCommon* testdbRecordPtr(const char* pv);
|
||||
|
||||
/** Synchronize the shared callback queues.
|
||||
*
|
||||
* Block until all callback queue jobs which were queued, or running,
|
||||
* have completed.
|
||||
*/
|
||||
epicsShareFunc void testSyncCallback(void);
|
||||
|
||||
/** Global mutex for use by test code.
|
||||
*
|
||||
* This utility mutex is intended to be used to avoid races in situations
|
||||
* where some other syncronization primitive is being destroyed (epicsEvent,
|
||||
* epicsMutex, ...).
|
||||
*
|
||||
* For example. The following has a subtle race where the event may be
|
||||
* destroyed (free()'d) before the call to epicsEventMustSignal() has
|
||||
* returned. On some targets this leads to a use after free() error.
|
||||
*
|
||||
@code
|
||||
epicsEventId evt;
|
||||
void thread1() {
|
||||
evt = epicsEventMustCreate(...);
|
||||
// spawn thread2()
|
||||
epicsEventMustWait(evt);
|
||||
epicsEventDestroy(evt);
|
||||
}
|
||||
// ...
|
||||
void thread2() {
|
||||
epicsEventMustSignal(evt);
|
||||
}
|
||||
@endcode
|
||||
*
|
||||
* One way to avoid this race is to use a global mutex to ensure
|
||||
* that epicsEventMustSignal() has returned before destroying
|
||||
* the event.
|
||||
*
|
||||
@code
|
||||
epicsEventId evt;
|
||||
void thread1() {
|
||||
evt = epicsEventMustCreate(...);
|
||||
// spawn thread2()
|
||||
epicsEventMustWait(evt);
|
||||
testGlobalLock(); // <-- added
|
||||
epicsEventDestroy(evt);
|
||||
testGlobalUnlock(); // <-- added
|
||||
}
|
||||
// ...
|
||||
void thread2() {
|
||||
testGlobalLock(); // <-- added
|
||||
epicsEventMustSignal(evt);
|
||||
testGlobalUnlock(); // <-- added
|
||||
}
|
||||
@endcode
|
||||
*
|
||||
* This must be a global mutex to avoid simply shifting the race
|
||||
* from the event to a locally allocated mutex.
|
||||
*/
|
||||
epicsShareFunc void testGlobalLock(void);
|
||||
epicsShareFunc void testGlobalUnlock(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <limits.h>
|
||||
|
||||
#include "dbDefs.h"
|
||||
#include "alarm.h"
|
||||
#include "epicsMath.h"
|
||||
#include "epicsPrint.h"
|
||||
#include "epicsStdlib.h"
|
||||
@@ -181,6 +182,9 @@ unsigned short recGblResetAlarms(void *precord)
|
||||
epicsEnum16 val_mask = 0;
|
||||
epicsEnum16 stat_mask = 0;
|
||||
|
||||
if (new_sevr > INVALID_ALARM)
|
||||
new_sevr = INVALID_ALARM;
|
||||
|
||||
pdbc->stat = new_stat;
|
||||
pdbc->sevr = new_sevr;
|
||||
pdbc->nsta = 0;
|
||||
|
||||
@@ -1036,23 +1036,29 @@ static void dbRecordHead(char *recordType, char *name, int visible)
|
||||
|
||||
static void dbRecordField(char *name,char *value)
|
||||
{
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
|
||||
if(duplicate) return;
|
||||
if (duplicate) return;
|
||||
ptempListNode = (tempListNode *)ellFirst(&tempList);
|
||||
pdbentry = ptempListNode->item;
|
||||
status = dbFindField(pdbentry,name);
|
||||
if(status) {
|
||||
epicsPrintf("Record \"%s\" does not have a field \"%s\"\n",
|
||||
dbGetRecordName(pdbentry), name);
|
||||
yyerror(NULL);
|
||||
return;
|
||||
if (status) {
|
||||
epicsPrintf("Record \"%s\" does not have a field \"%s\"\n",
|
||||
dbGetRecordName(pdbentry), name);
|
||||
yyerror(NULL);
|
||||
return;
|
||||
}
|
||||
if (pdbentry->indfield == 0) {
|
||||
epicsPrintf("Can't set \"NAME\" field of record \"%s\"\n",
|
||||
dbGetRecordName(pdbentry));
|
||||
yyerror(NULL);
|
||||
return;
|
||||
}
|
||||
dbTranslateEscape(value, value); /* yuck: in-place, but safe */
|
||||
status = dbPutString(pdbentry,value);
|
||||
if(status) {
|
||||
if (status) {
|
||||
epicsPrintf("Can't set \"%s.%s\" to \"%s\"\n",
|
||||
dbGetRecordName(pdbentry), name, value);
|
||||
yyerror(NULL);
|
||||
@@ -1062,34 +1068,34 @@ static void dbRecordField(char *name,char *value)
|
||||
|
||||
static void dbRecordInfo(char *name, char *value)
|
||||
{
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
|
||||
if(duplicate) return;
|
||||
if (duplicate) return;
|
||||
ptempListNode = (tempListNode *)ellFirst(&tempList);
|
||||
pdbentry = ptempListNode->item;
|
||||
dbTranslateEscape(value, value); /* yuck: in-place, but safe */
|
||||
status = dbPutInfo(pdbentry,name,value);
|
||||
if(status) {
|
||||
epicsPrintf("Can't set \"%s\" info \"%s\" to \"%s\"\n",
|
||||
if (status) {
|
||||
epicsPrintf("Can't set \"%s\" info \"%s\" to \"%s\"\n",
|
||||
dbGetRecordName(pdbentry), name, value);
|
||||
yyerror(NULL);
|
||||
return;
|
||||
yyerror(NULL);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void dbRecordAlias(char *name)
|
||||
{
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
DBENTRY *pdbentry;
|
||||
tempListNode *ptempListNode;
|
||||
long status;
|
||||
|
||||
if(duplicate) return;
|
||||
if (duplicate) return;
|
||||
ptempListNode = (tempListNode *)ellFirst(&tempList);
|
||||
pdbentry = ptempListNode->item;
|
||||
status = dbCreateAlias(pdbentry, name);
|
||||
if(status) {
|
||||
if (status) {
|
||||
epicsPrintf("Can't create alias \"%s\" for \"%s\"\n",
|
||||
name, dbGetRecordName(pdbentry));
|
||||
yyerror(NULL);
|
||||
@@ -1099,15 +1105,16 @@ static void dbRecordAlias(char *name)
|
||||
|
||||
static void dbAlias(char *name, char *alias)
|
||||
{
|
||||
DBENTRY dbEntry;
|
||||
DBENTRY *pdbEntry = &dbEntry;
|
||||
DBENTRY dbEntry;
|
||||
DBENTRY *pdbEntry = &dbEntry;
|
||||
|
||||
dbInitEntry(pdbbase, pdbEntry);
|
||||
if (dbFindRecord(pdbEntry, name)) {
|
||||
epicsPrintf("Alias \"%s\" refers to unknown record \"%s\"\n",
|
||||
alias, name);
|
||||
yyerror(NULL);
|
||||
} else if (dbCreateAlias(pdbEntry, alias)) {
|
||||
}
|
||||
else if (dbCreateAlias(pdbEntry, alias)) {
|
||||
epicsPrintf("Can't create alias \"%s\" referring to \"%s\"\n",
|
||||
alias, name);
|
||||
yyerror(NULL);
|
||||
@@ -1117,14 +1124,14 @@ static void dbAlias(char *name, char *alias)
|
||||
|
||||
static void dbRecordBody(void)
|
||||
{
|
||||
DBENTRY *pdbentry;
|
||||
DBENTRY *pdbentry;
|
||||
|
||||
if(duplicate) {
|
||||
duplicate = FALSE;
|
||||
return;
|
||||
if (duplicate) {
|
||||
duplicate = FALSE;
|
||||
return;
|
||||
}
|
||||
pdbentry = (DBENTRY *)popFirstTemp();
|
||||
if(ellCount(&tempList))
|
||||
yyerrorAbort("dbRecordBody: tempList not empty");
|
||||
if (ellCount(&tempList))
|
||||
yyerrorAbort("dbRecordBody: tempList not empty");
|
||||
dbFreeEntry(pdbentry);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -34,10 +34,10 @@ be written to stdout unless the -o option is given.</p>
|
||||
|
||||
<dl>
|
||||
<dt><tt>-V</tt></dt>
|
||||
<dd>Verbose warnings; if this parameter is specified then any undefined
|
||||
macro discovered in the template file which does not have an associated
|
||||
default value is considered an error. An error message is generated, and
|
||||
when msi terminates it will do so with an exit status of 2.</dd>
|
||||
<dd>Verbose warnings; if this parameter is specified then any undefined or
|
||||
recursive macros discovered in the template will be considered an error and
|
||||
will be marked in the output file. An error message will be shown, and when
|
||||
msi terminates it will do so with an exit status of 2.</dd>
|
||||
|
||||
<dt><tt>-g</tt></dt>
|
||||
<dd>When this flag is given all macros defined in a substitution file will
|
||||
|
||||
@@ -31,18 +31,18 @@ ok(msi('-S ../t5-substitute.txt ../t5-template.txt'), slurp('../t5-result.txt'))
|
||||
# Substitution file, pattern format
|
||||
ok(msi('-S../t6-substitute.txt ../t6-template.txt'), slurp('../t6-result.txt'));
|
||||
|
||||
# Output option -o
|
||||
# Output option -o and verbose option -V
|
||||
my $out = 't7-output.txt';
|
||||
my $count = 5; # Try up to 5 times...
|
||||
my $result;
|
||||
do {
|
||||
unlink $out;
|
||||
msi("-I.. -o $out ../t1-template.txt");
|
||||
msi("-I.. -V -o $out ../t1-template.txt");
|
||||
$result = slurp($out);
|
||||
print "# msi output file empty, retrying\n"
|
||||
if $result eq '';
|
||||
} while ($result eq '') && (--$count > 0);
|
||||
ok($result, slurp('../t1-result.txt'));
|
||||
ok($result, slurp('../t7-result.txt'));
|
||||
|
||||
# Dependency generation, include/substitute model
|
||||
ok(msi('-I.. -D -o t8.txt ../t1-template.txt'), slurp('../t8-result.txt'));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
This is t1-template.txt
|
||||
|
||||
With $(a,undefined) & $(b,undefined):
|
||||
With $(a) & $(b):
|
||||
This is t1-include.txt
|
||||
a = default value used when a is undefined
|
||||
b = default value used when b is undefined
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
a = va1-a b = def-b c = def-c d = $(d,undefined)
|
||||
a = va2-a b = va2-b c = def-c d = $(d,undefined)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d,undefined)
|
||||
a = va4-a b = va4-b c = def-c d = $(d,undefined)
|
||||
a = va5-a b = def-b c = def-c d = $(d,undefined)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d,undefined)
|
||||
a = va1-a b = def-b c = def-c d = $(d)
|
||||
a = va2-a b = va2-b c = def-c d = $(d)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d)
|
||||
a = va4-a b = va4-b c = def-c d = $(d)
|
||||
a = va5-a b = def-b c = def-c d = $(d)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d)
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
a = gb1-a b = gb1-b c = def-c d = $(d,undefined)
|
||||
a = va1-a b = gb1-b c = def-c d = $(d,undefined)
|
||||
a = va2-a b = va2-b c = def-c d = $(d,undefined)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d,undefined)
|
||||
a = va4-a b = va4-b c = def-c d = $(d,undefined)
|
||||
a = va5-a b = gb1-b c = def-c d = $(d,undefined)
|
||||
a = gb1-a b = gb1-b c = def-c d = $(d,undefined)
|
||||
a = gb2-a b = gb2-b c = def-c d = $(d,undefined)
|
||||
a = va1-a b = gb2-b c = def-c d = $(d,undefined)
|
||||
a = va2-a b = va2-b c = def-c d = $(d,undefined)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d,undefined)
|
||||
a = va4-a b = va4-b c = def-c d = $(d,undefined)
|
||||
a = va5-a b = gb2-b c = def-c d = $(d,undefined)
|
||||
a = gb2-a b = gb2-b c = def-c d = $(d,undefined)
|
||||
a = gb3-a b = gb3-b c = def-c d = $(d,undefined)
|
||||
a = pt1-a b = gb3-b c = def-c d = $(d,undefined)
|
||||
a = pt2-a b = pt2-b c = def-c d = $(d,undefined)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d,undefined)
|
||||
a = pt4-a b = pt4-b c = def-c d = $(d,undefined)
|
||||
a = pt5-a b = gb3-b c = def-c d = $(d,undefined)
|
||||
a = gb3-a b = gb3-b c = def-c d = $(d,undefined)
|
||||
a = gb4-a b = gb4-b c = def-c d = $(d,undefined)
|
||||
a = pt1-a b = gb4-b c = def-c d = $(d,undefined)
|
||||
a = pt2-a b = pt2-b c = def-c d = $(d,undefined)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d,undefined)
|
||||
a = pt4-a b = pt4-b c = def-c d = $(d,undefined)
|
||||
a = pt5-a b = gb4-b c = def-c d = $(d,undefined)
|
||||
a = gb4-a b = gb4-b c = def-c d = $(d,undefined)
|
||||
a = gb1-a b = gb1-b c = def-c d = $(d)
|
||||
a = va1-a b = gb1-b c = def-c d = $(d)
|
||||
a = va2-a b = va2-b c = def-c d = $(d)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d)
|
||||
a = va4-a b = va4-b c = def-c d = $(d)
|
||||
a = va5-a b = gb1-b c = def-c d = $(d)
|
||||
a = gb1-a b = gb1-b c = def-c d = $(d)
|
||||
a = gb2-a b = gb2-b c = def-c d = $(d)
|
||||
a = va1-a b = gb2-b c = def-c d = $(d)
|
||||
a = va2-a b = va2-b c = def-c d = $(d)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d)
|
||||
a = va4-a b = va4-b c = def-c d = $(d)
|
||||
a = va5-a b = gb2-b c = def-c d = $(d)
|
||||
a = gb2-a b = gb2-b c = def-c d = $(d)
|
||||
a = gb3-a b = gb3-b c = def-c d = $(d)
|
||||
a = pt1-a b = gb3-b c = def-c d = $(d)
|
||||
a = pt2-a b = pt2-b c = def-c d = $(d)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d)
|
||||
a = pt4-a b = pt4-b c = def-c d = $(d)
|
||||
a = pt5-a b = gb3-b c = def-c d = $(d)
|
||||
a = gb3-a b = gb3-b c = def-c d = $(d)
|
||||
a = gb4-a b = gb4-b c = def-c d = $(d)
|
||||
a = pt1-a b = gb4-b c = def-c d = $(d)
|
||||
a = pt2-a b = pt2-b c = def-c d = $(d)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d)
|
||||
a = pt4-a b = pt4-b c = def-c d = $(d)
|
||||
a = pt5-a b = gb4-b c = def-c d = $(d)
|
||||
a = gb4-a b = gb4-b c = def-c d = $(d)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
a = va1-a b = def-b c = def-c d = $(d,undefined)
|
||||
a = va2-a b = va2-b c = def-c d = $(d,undefined)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d,undefined)
|
||||
a = va4-a b = va4-b c = va3-c d = $(d,undefined)
|
||||
a = va5-a b = va4-b c = va3-c d = $(d,undefined)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d,undefined)
|
||||
a = va1-a b = def-b c = def-c d = $(d)
|
||||
a = va2-a b = va2-b c = def-c d = $(d)
|
||||
a = va3-a b = va3-b c = va3-c d = $(d)
|
||||
a = va4-a b = va4-b c = va3-c d = $(d)
|
||||
a = va5-a b = va4-b c = va3-c d = $(d)
|
||||
a = pt3-a b = pt3-b c = pt3-c d = $(d)
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
a = 111
|
||||
b = 222
|
||||
c = xx
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = aaa
|
||||
b = bbb
|
||||
c = ccc
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = AA
|
||||
b = BB
|
||||
c = xx
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = aaa
|
||||
b = bbb
|
||||
c = yy
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
a = 111
|
||||
b = 222
|
||||
c = xx
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = aaa
|
||||
b = bbb
|
||||
c = ccc
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = AA
|
||||
b = BB
|
||||
c = xx
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
# comment line
|
||||
a = aaa
|
||||
b = bbb
|
||||
c = yy
|
||||
d = $(d,undefined)
|
||||
d = $(d)
|
||||
|
||||
21
src/ioc/dbtemplate/test/t7-result.txt
Normal file
21
src/ioc/dbtemplate/test/t7-result.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
This is t1-template.txt
|
||||
|
||||
With $(a,undefined) & $(b,undefined):
|
||||
This is t1-include.txt
|
||||
a = default value used when a is undefined
|
||||
b = default value used when b is undefined
|
||||
End of t1-include.txt
|
||||
|
||||
On defining a=aaa & b=bbb:
|
||||
This is t1-include.txt again
|
||||
a = aaa
|
||||
b = bbb
|
||||
End of t1-include.txt
|
||||
|
||||
On setting a="aa":
|
||||
This is t1-include.txt again
|
||||
a = "aa"
|
||||
b = bbb
|
||||
End of t1-include.txt
|
||||
|
||||
End of t1-template.txt
|
||||
@@ -26,3 +26,4 @@ dbCore_SRCS += miscIocRegister.c
|
||||
dbCore_SRCS += dlload.c
|
||||
dbCore_SRCS += iocshRegisterCommon.c
|
||||
|
||||
miscIocRegister_CFLAGS_iOS = -DSYSTEM_UNAVAILABLE
|
||||
|
||||
@@ -66,10 +66,12 @@ void miscIocRegister(void)
|
||||
|
||||
/* system -- escape to system command interpreter.
|
||||
*
|
||||
* Disabled by default, for security reasons. To enable this command, add
|
||||
* Disabled by default for security reasons, not available on all OSs.
|
||||
* To enable this command, add
|
||||
* registrar(iocshSystemCommand)
|
||||
* to an application dbd file.
|
||||
* to an application dbd file, or include system.dbd
|
||||
*/
|
||||
#ifndef SYSTEM_UNAVAILABLE
|
||||
static const iocshArg systemArg0 = { "command string",iocshArgString};
|
||||
static const iocshArg * const systemArgs[] = {&systemArg0};
|
||||
static const iocshFuncDef systemFuncDef = {"system",1,systemArgs};
|
||||
@@ -77,12 +79,15 @@ static void systemCallFunc(const iocshArgBuf *args)
|
||||
{
|
||||
system(args[0].sval);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void iocshSystemCommand(void)
|
||||
{
|
||||
#ifndef SYSTEM_UNAVAILABLE
|
||||
if (system(NULL))
|
||||
iocshRegister(&systemFuncDef, systemCallFunc);
|
||||
else
|
||||
#endif
|
||||
errlogPrintf ("Can't register 'system' command -- no command interpreter available.\n");
|
||||
}
|
||||
epicsExportRegistrar(iocshSystemCommand);
|
||||
|
||||
1
src/libCom/env/envDefs.h
vendored
1
src/libCom/env/envDefs.h
vendored
@@ -95,6 +95,7 @@ epicsShareFunc long epicsShareAPI
|
||||
envGetBoolConfigParam(const ENV_PARAM *pParam, int *pBool);
|
||||
epicsShareFunc long epicsShareAPI epicsPrtEnvParams(void);
|
||||
epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *value);
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name);
|
||||
epicsShareFunc void epicsShareAPI epicsEnvShow (const char *name);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* flex - tool to generate fast lexical analyzers */
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Vern Paxson.
|
||||
*
|
||||
*
|
||||
* The United States Government has rights in this work pursuant
|
||||
* to contract no. DE-AC03-76SF00098 between the United States
|
||||
* Department of Energy and the University of California.
|
||||
@@ -495,6 +495,13 @@ void flexinit(int argc, char **argv)
|
||||
/* stupid do-nothing deprecated option */
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
if ( i != 1 )
|
||||
flexerror( "-o flag must be given separately" );
|
||||
|
||||
outfile = arg + i + 1;
|
||||
goto get_next_arg;
|
||||
|
||||
case 'p':
|
||||
performance_report = true;
|
||||
break;
|
||||
|
||||
@@ -110,6 +110,21 @@ static void epicsEnvSetCallFunc(const iocshArgBuf *args)
|
||||
epicsEnvSet (name, value);
|
||||
}
|
||||
|
||||
/* epicsEnvUnset */
|
||||
static const iocshArg epicsEnvUnsetArg0 = { "name",iocshArgString};
|
||||
static const iocshArg * const epicsEnvUnsetArgs[1] = {&epicsEnvUnsetArg0};
|
||||
static const iocshFuncDef epicsEnvUnsetFuncDef = {"epicsEnvUnset",1,epicsEnvUnsetArgs};
|
||||
static void epicsEnvUnsetCallFunc(const iocshArgBuf *args)
|
||||
{
|
||||
char *name = args[0].sval;
|
||||
|
||||
if (name == NULL) {
|
||||
fprintf(stderr, "Missing environment variable name argument.\n");
|
||||
return;
|
||||
}
|
||||
epicsEnvUnset (name);
|
||||
}
|
||||
|
||||
/* epicsParamShow */
|
||||
static const iocshFuncDef epicsParamShowFuncDef = {"epicsParamShow",0,NULL};
|
||||
static void epicsParamShowCallFunc(const iocshArgBuf *args)
|
||||
@@ -367,6 +382,7 @@ void epicsShareAPI libComRegister(void)
|
||||
iocshRegister(&pwdFuncDef, pwdCallFunc);
|
||||
|
||||
iocshRegister(&epicsEnvSetFuncDef, epicsEnvSetCallFunc);
|
||||
iocshRegister(&epicsEnvUnsetFuncDef, epicsEnvUnsetCallFunc);
|
||||
iocshRegister(&epicsParamShowFuncDef, epicsParamShowCallFunc);
|
||||
iocshRegister(&epicsPrtEnvParamsFuncDef, epicsPrtEnvParamsCallFunc);
|
||||
iocshRegister(&epicsEnvShowFuncDef, epicsEnvShowCallFunc);
|
||||
|
||||
@@ -347,11 +347,6 @@ static int openLogFile (struct ioc_log_server *pserver)
|
||||
{
|
||||
enum TF_RETURN ret;
|
||||
|
||||
if (ioc_log_file_limit==0u) {
|
||||
pserver->poutfile = stderr;
|
||||
return IOCLS_ERROR;
|
||||
}
|
||||
|
||||
if (pserver->poutfile && pserver->poutfile != stderr){
|
||||
fclose (pserver->poutfile);
|
||||
pserver->poutfile = NULL;
|
||||
@@ -627,7 +622,7 @@ static void writeMessagesToLog (struct iocLogClient *pclient)
|
||||
strlen(pclient->ascii_time) + nchar + 3u;
|
||||
assert (nTotChar <= INT_MAX);
|
||||
ntci = (int) nTotChar;
|
||||
if ( pclient->pserver->filePos+ntci >= pclient->pserver->max_file_size ) {
|
||||
if ( pclient->pserver->max_file_size && pclient->pserver->filePos+ntci >= pclient->pserver->max_file_size ) {
|
||||
if ( pclient->pserver->max_file_size >= pclient->pserver->filePos ) {
|
||||
unsigned nPadChar;
|
||||
/*
|
||||
@@ -771,7 +766,7 @@ static int getConfig(void)
|
||||
&EPICS_IOC_LOG_FILE_LIMIT,
|
||||
&ioc_log_file_limit);
|
||||
if(status>=0){
|
||||
if (ioc_log_file_limit<=0) {
|
||||
if (ioc_log_file_limit < 0) {
|
||||
envFailureNotify (&EPICS_IOC_LOG_FILE_LIMIT);
|
||||
return IOCLS_ERROR;
|
||||
}
|
||||
|
||||
@@ -902,11 +902,16 @@ static void refer ( MAC_HANDLE *handle, MAC_ENTRY *entry, int level,
|
||||
}
|
||||
}
|
||||
|
||||
/* Bad reference, insert $(name,errval) */
|
||||
/* Bad reference, insert either $(name,<error>) or $(name) */
|
||||
if ( v < valend ) *v++ = '$';
|
||||
if ( v < valend ) *v++ = '(';
|
||||
cpy2val( refname, &v, valend );
|
||||
cpy2val( errval, &v, valend );
|
||||
if (handle->flags & FLAG_SUPPRESS_WARNINGS) {
|
||||
if ( v < valend ) *v++ = ')';
|
||||
*v = '\0';
|
||||
}
|
||||
else
|
||||
cpy2val( errval, &v, valend );
|
||||
|
||||
cleanup:
|
||||
if (pop) {
|
||||
|
||||
@@ -34,20 +34,22 @@ extern "C" {
|
||||
|
||||
/* Make printf, puts and putchar use *our* version of stdout */
|
||||
|
||||
#ifdef printf
|
||||
# undef printf
|
||||
#endif /* printf */
|
||||
#define printf epicsStdoutPrintf
|
||||
#ifndef epicsStdioStdPrintfEtc
|
||||
# ifdef printf
|
||||
# undef printf
|
||||
# endif
|
||||
# define printf epicsStdoutPrintf
|
||||
|
||||
#ifdef puts
|
||||
# undef puts
|
||||
#endif /* puts */
|
||||
#define puts epicsStdoutPuts
|
||||
# ifdef puts
|
||||
# undef puts
|
||||
# endif
|
||||
# define puts epicsStdoutPuts
|
||||
|
||||
#ifdef putchar
|
||||
# undef putchar
|
||||
#endif /* putchar */
|
||||
#define putchar epicsStdoutPutchar
|
||||
# ifdef putchar
|
||||
# undef putchar
|
||||
# endif
|
||||
# define putchar epicsStdoutPutchar
|
||||
#endif
|
||||
|
||||
epicsShareFunc int epicsShareAPI epicsSnprintf(
|
||||
char *str, size_t size, const char *format, ...) EPICS_PRINTF_STYLE(3,4);
|
||||
@@ -87,6 +89,19 @@ epicsShareFunc int epicsShareAPI epicsStdoutPutchar(int c);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Also pull functions into the std namespace (see lp:1786927) */
|
||||
#if !defined(__GNUC__) || (__GNUC__ > 2)
|
||||
namespace std {
|
||||
using ::epicsGetStdin;
|
||||
using ::epicsGetStdout;
|
||||
using ::epicsGetStderr;
|
||||
using ::epicsStdoutPrintf;
|
||||
using ::epicsStdoutPuts;
|
||||
using ::epicsStdoutPutchar;
|
||||
}
|
||||
#endif /* __GNUC__ > 2 */
|
||||
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* epicsStdioh */
|
||||
|
||||
@@ -39,6 +39,16 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
|
||||
setenv(name, value, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
unsetenv(name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
|
||||
89
src/libCom/osi/os/WIN32/osdEnv.c
Normal file
89
src/libCom/osi/os/WIN32/osdEnv.c
Normal file
@@ -0,0 +1,89 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Saskatchewan
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* osdEnv.c */
|
||||
/*
|
||||
* Author: Eric Norum
|
||||
* Date: May 7, 2001
|
||||
*
|
||||
* Routines to modify/display environment variables and EPICS parameters
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "epicsStdio.h"
|
||||
#include "errlog.h"
|
||||
#include "cantProceed.h"
|
||||
#include "envDefs.h"
|
||||
#include "osiUnistd.h"
|
||||
#include "epicsFindSymbol.h"
|
||||
#include "iocsh.h"
|
||||
|
||||
/*
|
||||
* Set the value of an environment variable
|
||||
* Leaks memory, but the assumption is that this routine won't be
|
||||
* called often enough for the leak to be a problem.
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *value)
|
||||
{
|
||||
char *cp;
|
||||
|
||||
iocshEnvClear(name);
|
||||
|
||||
cp = mallocMustSucceed (strlen (name) + strlen (value) + 2, "epicsEnvSet");
|
||||
strcpy (cp, name);
|
||||
strcat (cp, "=");
|
||||
strcat (cp, value);
|
||||
if (putenv (cp) < 0) {
|
||||
errPrintf(
|
||||
-1L,
|
||||
__FILE__,
|
||||
__LINE__,
|
||||
"Failed to set environment parameter \"%s\" to \"%s\": %s\n",
|
||||
name,
|
||||
value,
|
||||
strerror (errno));
|
||||
free (cp);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
* Using putenv with a an existing name plus "=" (without value) deletes
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
if (getenv(name) != NULL)
|
||||
epicsEnvSet((char*)name, "");
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsEnvShow (const char *name)
|
||||
{
|
||||
if (name == NULL) {
|
||||
extern char **environ;
|
||||
char **sp;
|
||||
|
||||
for (sp = environ ; (sp != NULL) && (*sp != NULL) ; sp++)
|
||||
printf ("%s\n", *sp);
|
||||
}
|
||||
else {
|
||||
const char *cp = getenv (name);
|
||||
if (cp == NULL)
|
||||
printf ("%s is not an environment variable.\n", name);
|
||||
else
|
||||
printf ("%s=%s\n", name, cp);
|
||||
}
|
||||
}
|
||||
@@ -19,13 +19,13 @@
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define STRICT
|
||||
#include <windows.h>
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "osiProcess.h"
|
||||
#include "errlog.h"
|
||||
|
||||
epicsShareFunc osiGetUserNameReturn epicsShareAPI osiGetUserName (char *pBuf, unsigned bufSizeIn)
|
||||
{
|
||||
@@ -94,16 +94,11 @@ epicsShareFunc osiSpawnDetachedProcessReturn epicsShareAPI osiSpawnDetachedProce
|
||||
pFmtArgs[1] = (char *) pBaseExecutableName;
|
||||
pFmtArgs[2] = errStrMsgBuf;
|
||||
pFmtArgs[3] = "Changes may be required in your \"path\" environment variable.";
|
||||
pFmtArgs[4] = "PATH = ";
|
||||
pFmtArgs[5] = getenv ("path");
|
||||
if ( pFmtArgs[5] == NULL ) {
|
||||
pFmtArgs[5] = "<empty string>";
|
||||
}
|
||||
|
||||
W32status = FormatMessage(
|
||||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING |
|
||||
FORMAT_MESSAGE_ARGUMENT_ARRAY | 80,
|
||||
"%1 \"%2\". %3 %4 %5 \"%6\"",
|
||||
"%1 \"%2\". %3 %4",
|
||||
0,
|
||||
MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */
|
||||
(LPTSTR) &complteMsgBuf,
|
||||
@@ -111,24 +106,20 @@ epicsShareFunc osiSpawnDetachedProcessReturn epicsShareAPI osiSpawnDetachedProce
|
||||
pFmtArgs
|
||||
);
|
||||
if (W32status) {
|
||||
/* Display the string. */
|
||||
MessageBox (NULL, complteMsgBuf, "Configuration Problem",
|
||||
MB_OK | MB_ICONINFORMATION);
|
||||
fprintf (stderr, "%s\n", (char *) complteMsgBuf);
|
||||
LocalFree (complteMsgBuf);
|
||||
}
|
||||
else {
|
||||
/* Display the string. */
|
||||
MessageBox (NULL, errStrMsgBuf, "Failed to start executable",
|
||||
MB_OK | MB_ICONINFORMATION);
|
||||
fprintf (stderr, "%s\n", (char *) errStrMsgBuf);
|
||||
}
|
||||
|
||||
/* Free the buffer. */
|
||||
LocalFree (errStrMsgBuf);
|
||||
}
|
||||
else {
|
||||
errlogPrintf ("!!WARNING!!\n");
|
||||
errlogPrintf ("Unable to locate executable \"%s\".\n", pBaseExecutableName);
|
||||
errlogPrintf ("You may need to modify your \"path\" environment variable.\n");
|
||||
fprintf (stderr, "!!WARNING!!\n");
|
||||
fprintf (stderr, "Unable to locate executable \"%s\".\n", pBaseExecutableName);
|
||||
fprintf (stderr, "You may need to modify your \"path\" environment variable.\n");
|
||||
}
|
||||
return osiSpawnDetachedProcessFail;
|
||||
}
|
||||
|
||||
@@ -55,6 +55,18 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
* Using putenv with a an existing name but without "=..." deletes
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
if (getenv(name) != NULL)
|
||||
putenv((char*)name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
|
||||
@@ -36,6 +36,16 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
|
||||
setenv(name, value, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
unsetenv(name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
|
||||
62
src/libCom/osi/os/solaris/osdEnv.c
Normal file
62
src/libCom/osi/os/solaris/osdEnv.c
Normal file
@@ -0,0 +1,62 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2002 The University of Saskatchewan
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* osdEnv.c */
|
||||
/*
|
||||
* Author: Eric Norum
|
||||
* Date: May 7, 2001
|
||||
*
|
||||
* Routines to modify/display environment variables and EPICS parameters
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#define epicsExportSharedSymbols
|
||||
#include "epicsStdio.h"
|
||||
#include "envDefs.h"
|
||||
#include "osiUnistd.h"
|
||||
#include "iocsh.h"
|
||||
|
||||
/*
|
||||
* Set the value of an environment variable
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *value)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
setenv(name, value, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
iocshEnvClear(name);
|
||||
unsetenv(name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
epicsShareFunc void epicsShareAPI epicsEnvShow (const char *name)
|
||||
{
|
||||
if (name == NULL) {
|
||||
extern char **environ;
|
||||
char **sp;
|
||||
|
||||
for (sp = environ ; (sp != NULL) && (*sp != NULL) ; sp++)
|
||||
printf ("%s\n", *sp);
|
||||
}
|
||||
else {
|
||||
const char *cp = getenv (name);
|
||||
if (cp == NULL)
|
||||
printf ("%s is not an environment variable.\n", name);
|
||||
else
|
||||
printf ("%s=%s\n", name, cp);
|
||||
}
|
||||
}
|
||||
@@ -51,6 +51,25 @@ epicsShareFunc void epicsShareAPI epicsEnvSet (const char *name, const char *val
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Unset an environment variable
|
||||
* Basically destroy the name of that variable because vxWorks does not
|
||||
* support to really unset an environment variable.
|
||||
*/
|
||||
|
||||
epicsShareFunc void epicsShareAPI epicsEnvUnset (const char *name)
|
||||
{
|
||||
char* var;
|
||||
|
||||
if (!name) return;
|
||||
iocshEnvClear(name);
|
||||
var = getenv(name);
|
||||
if (!var) return;
|
||||
var -= strlen(name);
|
||||
var --;
|
||||
*var = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Show the value of the specified, or all, environment variables
|
||||
*/
|
||||
|
||||
@@ -41,16 +41,18 @@ static epicsThreadOnceId onceId = EPICS_THREAD_ONCE_INIT;
|
||||
|
||||
|
||||
#ifdef CLOCK_REALTIME
|
||||
/* This code is not used on systems without Posix CLOCK_REALTIME such
|
||||
* as Darwin, but the only way to detect that is from the OS headers,
|
||||
* so the Makefile can't exclude building this file on those systems.
|
||||
/* This code is not used on systems without Posix CLOCK_REALTIME,
|
||||
* but the only way to detect that is from the OS headers, so the
|
||||
* Makefile can't exclude compiling this file on those systems.
|
||||
*/
|
||||
|
||||
/* Forward references */
|
||||
|
||||
static int ClockTimeGetCurrent(epicsTimeStamp *pDest);
|
||||
static void ClockTimeSync(void *dummy);
|
||||
|
||||
#if defined(vxWorks) || defined(__rtems__)
|
||||
static void ClockTimeSync(void *dummy);
|
||||
#endif
|
||||
|
||||
/* ClockTime_Report iocsh command */
|
||||
static const iocshArg ReportArg0 = { "interest_level", iocshArgArgv};
|
||||
@@ -98,12 +100,18 @@ void ClockTime_Init(int synchronize)
|
||||
|
||||
if (synchronize == CLOCKTIME_SYNC) {
|
||||
if (ClockTimePvt.synchronize == CLOCKTIME_NOSYNC) {
|
||||
|
||||
#if defined(vxWorks) || defined(__rtems__)
|
||||
/* Start synchronizing */
|
||||
ClockTimePvt.synchronize = synchronize;
|
||||
|
||||
epicsThreadCreate("ClockTimeSync", epicsThreadPriorityHigh,
|
||||
epicsThreadGetStackSize(epicsThreadStackSmall),
|
||||
ClockTimeSync, NULL);
|
||||
#else
|
||||
errlogPrintf("Clock synchronization must be performed by the OS\n");
|
||||
#endif
|
||||
|
||||
}
|
||||
else {
|
||||
/* No change, sync thread should already be running */
|
||||
@@ -139,6 +147,7 @@ void ClockTime_GetProgramStart(epicsTimeStamp *pDest)
|
||||
|
||||
/* Synchronization thread */
|
||||
|
||||
#if defined(vxWorks) || defined(__rtems__)
|
||||
static void ClockTimeSync(void *dummy)
|
||||
{
|
||||
taskwdInsert(0, NULL, NULL);
|
||||
@@ -177,6 +186,7 @@ static void ClockTimeSync(void *dummy)
|
||||
ClockTimePvt.synchronized = 0;
|
||||
taskwdRemove(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* Time Provider Routine */
|
||||
@@ -188,6 +198,7 @@ static int ClockTimeGetCurrent(epicsTimeStamp *pDest)
|
||||
/* If a Hi-Res clock is available and works, use it */
|
||||
#ifdef CLOCK_REALTIME_HR
|
||||
clock_gettime(CLOCK_REALTIME_HR, &clockNow) &&
|
||||
/* Note: Uses the lo-res clock below if the above call fails */
|
||||
#endif
|
||||
clock_gettime(CLOCK_REALTIME, &clockNow);
|
||||
|
||||
@@ -195,9 +206,15 @@ static int ClockTimeGetCurrent(epicsTimeStamp *pDest)
|
||||
clockNow.tv_sec < POSIX_TIME_AT_EPICS_EPOCH) {
|
||||
clockNow.tv_sec = POSIX_TIME_AT_EPICS_EPOCH + 86400;
|
||||
clockNow.tv_nsec = 0;
|
||||
|
||||
#if defined(vxWorks) || defined(__rtems__)
|
||||
clock_settime(CLOCK_REALTIME, &clockNow);
|
||||
errlogPrintf("WARNING: OS Clock time was read before being set.\n"
|
||||
"Using 1990-01-02 00:00:00.000000 UTC\n");
|
||||
#else
|
||||
errlogPrintf("WARNING: OS Clock pre-dates the EPICS epoch!\n"
|
||||
"Using 1990-01-02 00:00:00.000000 UTC\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
epicsTimeFromTimespec(pDest, &clockNow);
|
||||
|
||||
@@ -62,6 +62,11 @@ epicsEnvTest_SRCS += epicsEnvTest.c
|
||||
testHarness_SRCS += epicsEnvTest.c
|
||||
TESTS += epicsEnvTest
|
||||
|
||||
TESTPROD_HOST += epicsEnvUnsetTest
|
||||
epicsEnvUnsetTest_SRCS += epicsEnvUnsetTest.c
|
||||
testHarness_SRCS += epicsEnvUnsetTest.c
|
||||
TESTS += epicsEnvUnsetTest
|
||||
|
||||
TESTPROD_HOST += epicsErrlogTest
|
||||
epicsErrlogTest_SRCS += epicsErrlogTest.c
|
||||
testHarness_SRCS += epicsErrlogTest.c
|
||||
|
||||
@@ -391,7 +391,7 @@ MAIN(epicsCalcTest)
|
||||
testExpr(isnan(0.));
|
||||
testExpr(isnan(Inf));
|
||||
testExpr(isnan(-Inf));
|
||||
testExpr(isnan(NaN));
|
||||
testExpr(!!isnan(NaN)); // As above
|
||||
testCalc("isnan(0,1,2)", 0);
|
||||
testCalc("isnan(0,1,NaN)", 1);
|
||||
testCalc("isnan(0,NaN,2)", 1);
|
||||
|
||||
37
src/libCom/test/epicsEnvUnsetTest.c
Normal file
37
src/libCom/test/epicsEnvUnsetTest.c
Normal file
@@ -0,0 +1,37 @@
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "macLib.h"
|
||||
#include "envDefs.h"
|
||||
#include "errlog.h"
|
||||
#include "epicsUnitTest.h"
|
||||
#include "testMain.h"
|
||||
|
||||
static void check(const char* variable, const char* expected)
|
||||
{
|
||||
const char* value;
|
||||
|
||||
value = getenv(variable);
|
||||
if (!testOk((!expected && !value) || (expected && value && strcmp(expected, value) == 0),
|
||||
"%s = \"%s\"", variable, value))
|
||||
{
|
||||
testDiag("should have been \"%s\"", expected);
|
||||
}
|
||||
}
|
||||
|
||||
MAIN(epicsEnvUnsetTest)
|
||||
{
|
||||
eltc(0);
|
||||
testPlan(3);
|
||||
|
||||
check("TEST_VAR_A",NULL);
|
||||
epicsEnvSet("TEST_VAR_A","test value");
|
||||
check("TEST_VAR_A","test value");
|
||||
epicsEnvUnset("TEST_VAR_A");
|
||||
check("TEST_VAR_A",NULL);
|
||||
|
||||
testDone();
|
||||
return 0;
|
||||
}
|
||||
@@ -65,11 +65,11 @@ static void ovcheck(void)
|
||||
|
||||
MAIN(macLibTest)
|
||||
{
|
||||
testPlan(91);
|
||||
testPlan(93);
|
||||
|
||||
if (macCreateHandle(&h, NULL))
|
||||
testAbort("macCreateHandle() failed");
|
||||
macSuppressWarning(h, TRUE);
|
||||
eltc(0);
|
||||
|
||||
check("FOO", " FOO");
|
||||
|
||||
@@ -215,6 +215,10 @@ MAIN(macLibTest)
|
||||
check("${FOO,FOO=${FOO}}", "!$(FOO,recursive)");
|
||||
check("${FOO=GRIBBLE,FOO=${FOO}}", "!$(FOO,recursive)");
|
||||
|
||||
macSuppressWarning(h, TRUE);
|
||||
check("$(CRUX)", "!$(CRUX)");
|
||||
check("${FOO}", "!$(BAR)");
|
||||
|
||||
ovcheck();
|
||||
|
||||
return testDone();
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "alarm.h"
|
||||
#include "dbDefs.h"
|
||||
#include "dbAccess.h"
|
||||
#include "dbEvent.h"
|
||||
#include "recGbl.h"
|
||||
#include "devSup.h"
|
||||
#include "cantProceed.h"
|
||||
@@ -71,13 +72,18 @@ static long init_record(aaiRecord *prec)
|
||||
|
||||
static long read_aai(aaiRecord *prec)
|
||||
{
|
||||
epicsUInt32 nord = prec->nord;
|
||||
long nRequest = prec->nelm;
|
||||
|
||||
dbGetLink(prec->simm == menuYesNoYES ? &prec->siol : &prec->inp,
|
||||
prec->ftvl, prec->bptr, 0, &nRequest);
|
||||
|
||||
if (nRequest > 0) {
|
||||
prec->nord = nRequest;
|
||||
prec->udf=FALSE;
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
|
||||
prec->udf = FALSE;
|
||||
if (prec->tsel.type == CONSTANT &&
|
||||
prec->tse == epicsTimeEventDeviceTime)
|
||||
dbGetTimeStamp(&prec->inp, &prec->time);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 Lawrence Berkeley Laboratory,The Control Systems
|
||||
* Group, Systems Engineering Department
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "alarm.h"
|
||||
#include "dbDefs.h"
|
||||
#include "dbAccess.h"
|
||||
#include "dbEvent.h"
|
||||
#include "recGbl.h"
|
||||
#include "devSup.h"
|
||||
#include "subArrayRecord.h"
|
||||
@@ -67,6 +68,7 @@ static long init_record(subArrayRecord *prec)
|
||||
static long read_sa(subArrayRecord *prec)
|
||||
{
|
||||
long nRequest = prec->indx + prec->nelm;
|
||||
epicsUInt32 nord = prec->nord;
|
||||
long ecount;
|
||||
|
||||
if (nRequest > prec->malm)
|
||||
@@ -89,6 +91,8 @@ static long read_sa(subArrayRecord *prec)
|
||||
ecount = 0;
|
||||
|
||||
prec->nord = ecount;
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
|
||||
if (nRequest > 0 &&
|
||||
prec->tsel.type == CONSTANT &&
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
@@ -67,11 +67,16 @@ static long init_record(waveformRecord *prec)
|
||||
|
||||
static long read_wf(waveformRecord *prec)
|
||||
{
|
||||
epicsUInt32 nord = prec->nord;
|
||||
long nRequest = prec->nelm;
|
||||
|
||||
dbGetLink(&prec->inp, prec->ftvl, prec->bptr, 0, &nRequest);
|
||||
|
||||
if (nRequest > 0) {
|
||||
prec->nord = nRequest;
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
|
||||
if (prec->tsel.type == CONSTANT &&
|
||||
prec->tse == epicsTimeEventDeviceTime)
|
||||
dbGetTimeStamp(&prec->inp, &prec->time);
|
||||
|
||||
@@ -146,9 +146,9 @@ Note: Negative index numbers address from the end of the array, with C<-1> being
|
||||
|
||||
=item Square bracket notation C<[start:increment:end]> (shorthand)
|
||||
|
||||
The common square bracket notation with can be used in place of JSON.
|
||||
The common square bracket notation which can be used in place of JSON.
|
||||
Any parameter may be omitted (keeping the colons) to use the default value.
|
||||
If only one colon is included, this means C<[start:end]> with a increment of 1.
|
||||
If only one colon is included, this means C<[start:end]> with an increment of 1.
|
||||
If only a single parameter is used C<[index]> the filter returns one element.
|
||||
|
||||
=item Start index C<"s">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2002 Southeastern Universities Research Association, as
|
||||
* Operator of Thomas Jefferson National Accelerator Facility.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* recAai.c */
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* Original Author: Dave Barker
|
||||
*
|
||||
* C E B A F
|
||||
*
|
||||
*
|
||||
* Continuous Electron Beam Accelerator Facility
|
||||
* Newport News, Virginia, USA.
|
||||
*
|
||||
@@ -139,12 +139,12 @@ static long init_record(aaiRecord *prec, int pass)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* SIML must be a CONSTANT or a PV_LINK or a DB_LINK */
|
||||
if (prec->siml.type == CONSTANT) {
|
||||
recGblInitConstantLink(&prec->siml,DBF_USHORT,&prec->simm);
|
||||
}
|
||||
|
||||
|
||||
/* must have read_aai function defined */
|
||||
if (pdset->number < 5 || pdset->read_aai == NULL) {
|
||||
recGblRecordError(S_dev_missingSup, prec, "aai: init_record");
|
||||
@@ -204,10 +204,14 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
static long put_array_info(DBADDR *paddr, long nNew)
|
||||
{
|
||||
aaiRecord *prec = (aaiRecord *)paddr->precord;
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
prec->nord = nNew;
|
||||
if (prec->nord > prec->nelm)
|
||||
prec->nord = prec->nelm;
|
||||
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -220,7 +224,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
@@ -314,12 +318,11 @@ static void monitor(aaiRecord *prec)
|
||||
|
||||
static long readValue(aaiRecord *prec)
|
||||
{
|
||||
long status;
|
||||
struct aaidset *pdset = (struct aaidset *)prec->dset;
|
||||
long status;
|
||||
|
||||
if (prec->pact == TRUE){
|
||||
status = pdset->read_aai(prec);
|
||||
return status;
|
||||
return pdset->read_aai(prec);
|
||||
}
|
||||
|
||||
status = dbGetLink(&prec->siml, DBR_ENUM, &prec->simm, 0, 0);
|
||||
@@ -327,10 +330,16 @@ static long readValue(aaiRecord *prec)
|
||||
return status;
|
||||
|
||||
if (prec->simm == menuYesNoNO){
|
||||
return pdset->read_aai(prec);
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
status = pdset->read_aai(prec);
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
if (prec->simm == menuYesNoYES){
|
||||
epicsUInt32 nord = prec->nord;
|
||||
/* Device suport is responsible for buffer
|
||||
which might be read-only so we may not be
|
||||
allowed to call dbGetLink on it.
|
||||
@@ -339,10 +348,13 @@ static long readValue(aaiRecord *prec)
|
||||
Thus call device now.
|
||||
*/
|
||||
recGblSetSevr(prec, SIMM_ALARM, prec->sims);
|
||||
return pdset->read_aai(prec);
|
||||
|
||||
status = pdset->read_aai(prec);
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return status;
|
||||
}
|
||||
|
||||
recGblSetSevr(prec, SOFT_ALARM, INVALID_ALARM);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
* Copyright (c) 2002 Southeastern Universities Research Association, as
|
||||
* Operator of Thomas Jefferson National Accelerator Facility.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
/* recAao.c */
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
* Original Author: Dave Barker
|
||||
*
|
||||
* C E B A F
|
||||
*
|
||||
*
|
||||
* Continuous Electron Beam Accelerator Facility
|
||||
* Newport News, Virginia, USA.
|
||||
*
|
||||
@@ -204,10 +204,14 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
static long put_array_info(DBADDR *paddr, long nNew)
|
||||
{
|
||||
aaoRecord *prec = (aaoRecord *)paddr->precord;
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
prec->nord = nNew;
|
||||
if (prec->nord > prec->nelm)
|
||||
prec->nord = prec->nelm;
|
||||
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -220,7 +224,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
@@ -343,4 +347,3 @@ static long writeValue(aaoRecord *prec)
|
||||
recGblSetSevr(prec, SOFT_ALARM, INVALID_ALARM);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
* Original Author: Bob Dalesio
|
||||
* Date: 7-14-89
|
||||
* Date: 7-14-89
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
@@ -405,11 +405,15 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
static long put_array_info(DBADDR *paddr, long nNew)
|
||||
{
|
||||
compressRecord *prec = (compressRecord *) paddr->precord;
|
||||
epicsUInt32 nuse = prec->nuse;
|
||||
|
||||
prec->off = (prec->off + nNew) % prec->nsam;
|
||||
prec->nuse += nNew;
|
||||
if (prec->nuse > prec->nsam)
|
||||
prec->nuse = prec->nsam;
|
||||
|
||||
if (nuse != prec->nuse)
|
||||
db_post_events(prec, &prec->nuse, DBE_VALUE | DBE_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "dbDefs.h"
|
||||
#include "epicsPrint.h"
|
||||
#include "epicsMath.h"
|
||||
#include "alarm.h"
|
||||
#include "dbAccess.h"
|
||||
#include "dbEvent.h"
|
||||
@@ -225,15 +226,17 @@ static long get_alarm_double(DBADDR *paddr, struct dbr_alDouble *pad)
|
||||
{
|
||||
longinRecord *prec=(longinRecord *)paddr->precord;
|
||||
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)){
|
||||
pad->upper_alarm_limit = prec->hihi;
|
||||
pad->upper_warning_limit = prec->high;
|
||||
pad->lower_warning_limit = prec->low;
|
||||
pad->lower_alarm_limit = prec->lolo;
|
||||
} else recGblGetAlarmDouble(paddr,pad);
|
||||
return(0);
|
||||
if (dbGetFieldIndex(paddr) == indexof(VAL)){
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
}
|
||||
else
|
||||
recGblGetAlarmDouble(paddr,pad);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void checkAlarms(longinRecord *prec, epicsTimeStamp *timeLast)
|
||||
{
|
||||
enum {
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "dbDefs.h"
|
||||
#include "epicsPrint.h"
|
||||
#include "epicsMath.h"
|
||||
#include "alarm.h"
|
||||
#include "dbAccess.h"
|
||||
#include "dbEvent.h"
|
||||
@@ -256,15 +257,17 @@ static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
|
||||
{
|
||||
longoutRecord *prec=(longoutRecord *)paddr->precord;
|
||||
|
||||
if(dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hihi;
|
||||
pad->upper_warning_limit = prec->high;
|
||||
pad->lower_warning_limit = prec->low;
|
||||
pad->lower_alarm_limit = prec->lolo;
|
||||
} else recGblGetAlarmDouble(paddr,pad);
|
||||
return(0);
|
||||
if (dbGetFieldIndex(paddr) == indexof(VAL)) {
|
||||
pad->upper_alarm_limit = prec->hhsv ? prec->hihi : epicsNAN;
|
||||
pad->upper_warning_limit = prec->hsv ? prec->high : epicsNAN;
|
||||
pad->lower_warning_limit = prec->lsv ? prec->low : epicsNAN;
|
||||
pad->lower_alarm_limit = prec->llsv ? prec->lolo : epicsNAN;
|
||||
}
|
||||
else
|
||||
recGblGetAlarmDouble(paddr,pad);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void checkAlarms(longoutRecord *prec)
|
||||
{
|
||||
epicsInt32 val, hyst, lalm;
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
* Copyright (c) 2002 Lawrence Berkeley Laboratory,The Control Systems
|
||||
* Group, Systems Engineering Department
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/* recSubArray.c - Record Support Routines for SubArray records
|
||||
/* recSubArray.c - Record Support Routines for SubArray records
|
||||
*
|
||||
*
|
||||
* Author: Carl Lionberger
|
||||
* Date: 090293
|
||||
*
|
||||
* NOTES:
|
||||
* Derived from waveform record.
|
||||
* Derived from waveform record.
|
||||
* Modification Log:
|
||||
* -----------------
|
||||
*/
|
||||
@@ -124,7 +124,7 @@ static long init_record(subArrayRecord *prec, int pass)
|
||||
}
|
||||
|
||||
if (pdset->init_record)
|
||||
return (*pdset->init_record)(prec);
|
||||
return pdset->init_record(prec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -191,11 +191,14 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
static long put_array_info(DBADDR *paddr, long nNew)
|
||||
{
|
||||
subArrayRecord *prec = (subArrayRecord *) paddr->precord;
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
if (nNew > prec->malm)
|
||||
nNew = prec->malm;
|
||||
prec->nord = nNew;
|
||||
if (prec->nord > prec->malm)
|
||||
prec->nord = prec->malm;
|
||||
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -208,7 +211,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
@@ -318,4 +321,3 @@ static long readValue(subArrayRecord *prec)
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# Copyright (c) 2002 The Regents of the University of California, as
|
||||
# Operator of Los Alamos National Laboratory.
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in the file LICENSE that is included with this distribution.
|
||||
# in the file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
TOP=../../../..
|
||||
|
||||
@@ -37,6 +37,17 @@ testHarness_SRCS += analogMonitorTest_registerRecordDeviceDriver.cpp
|
||||
TESTFILES += $(COMMON_DIR)/analogMonitorTest.dbd ../analogMonitorTest.db
|
||||
TESTS += analogMonitorTest
|
||||
|
||||
TARGETS += $(COMMON_DIR)/scanEventTest.dbd
|
||||
DBDDEPENDS_FILES += scanEventTest.dbd$(DEP)
|
||||
scanEventTest_DBD += base.dbd
|
||||
TESTPROD_HOST += scanEventTest
|
||||
scanEventTest_SRCS += scanEventTest.c
|
||||
scanEventTest_SRCS += scanEventTest_registerRecordDeviceDriver.cpp
|
||||
testHarness_SRCS += scanEventTest.c
|
||||
testHarness_SRCS += scanEventTest_registerRecordDeviceDriver.cpp
|
||||
TESTFILES += $(COMMON_DIR)/scanEventTest.dbd ../scanEventTest.db
|
||||
TESTS += scanEventTest
|
||||
|
||||
TARGETS += $(COMMON_DIR)/regressTest.dbd
|
||||
DBDDEPENDS_FILES += regressTest.dbd$(DEP)
|
||||
regressTest_DBD += base.dbd
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
int analogMonitorTest(void);
|
||||
int arrayOpTest(void);
|
||||
int scanEventTest(void);
|
||||
|
||||
void epicsRunRecordTests(void)
|
||||
{
|
||||
@@ -23,5 +24,7 @@ void epicsRunRecordTests(void)
|
||||
|
||||
runTest(arrayOpTest);
|
||||
|
||||
runTest(scanEventTest);
|
||||
|
||||
epicsExit(0); /* Trigger test harness */
|
||||
}
|
||||
|
||||
143
src/std/rec/test/scanEventTest.c
Normal file
143
src/std/rec/test/scanEventTest.c
Normal file
@@ -0,0 +1,143 @@
|
||||
/*************************************************************************\
|
||||
* Copyright (c) 2018 Paul Scherrer Institut
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/*
|
||||
* Author: Dirk Zimoch <dirk.zimoch@psi.ch>
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "dbStaticLib.h"
|
||||
#include "dbAccessDefs.h"
|
||||
#include "dbUnitTest.h"
|
||||
#include "testMain.h"
|
||||
#include "osiFileName.h"
|
||||
#include "epicsThread.h"
|
||||
#include "dbScan.h"
|
||||
|
||||
void scanEventTest_registerRecordDeviceDriver(struct dbBase *);
|
||||
|
||||
/* test name to event number:
|
||||
num = 0 is no event,
|
||||
num > 0 is numeric event
|
||||
num < 0 is string event (use same unique number for aliases)
|
||||
*/
|
||||
const struct {char* name; int num;} events[] = {
|
||||
/* No events */
|
||||
{NULL, 0},
|
||||
{"", 0},
|
||||
{" ", 0},
|
||||
{"0", 0},
|
||||
{"0.000000", 0},
|
||||
{"-0.00000", 0},
|
||||
{"0.9", 0},
|
||||
/* Numeric events */
|
||||
{"2", 2},
|
||||
{"2.000000", 2},
|
||||
{"2.5", 2},
|
||||
{" 2.5 ", 2},
|
||||
{"+0x02", 2},
|
||||
{"3", 3},
|
||||
/* Named events */
|
||||
{"info 1", -1},
|
||||
{" info 1 ", -1},
|
||||
{"-0.9", -2},
|
||||
{"-2", -3},
|
||||
{"-2.000000", -4},
|
||||
{"-2.5", -5},
|
||||
{" -2.5 ", -5},
|
||||
{"nan", -6},
|
||||
{"NaN", -7},
|
||||
{"-NAN", -8},
|
||||
{"-inf", -9},
|
||||
{"inf", -10},
|
||||
};
|
||||
|
||||
MAIN(scanEventTest)
|
||||
{
|
||||
int i, e;
|
||||
int aliases[512] ;
|
||||
int expected_count[512];
|
||||
#define INDX(i) 256-events[i].num
|
||||
#define MAXEV 5
|
||||
|
||||
testPlan(NELEMENTS(events)*2+(MAXEV+1)*5);
|
||||
|
||||
testdbPrepare();
|
||||
|
||||
memset(aliases, 0, sizeof(aliases));
|
||||
memset(expected_count, 0, sizeof(expected_count));
|
||||
|
||||
testdbReadDatabase("scanEventTest.dbd", NULL, NULL);
|
||||
|
||||
scanEventTest_registerRecordDeviceDriver(pdbbase);
|
||||
for (i = 0; i < NELEMENTS(events); i++) {
|
||||
char substitutions[256];
|
||||
sprintf(substitutions, "N=%d,EVENT=%s", i, events[i].name);
|
||||
testdbReadDatabase("scanEventTest.db", NULL, substitutions);
|
||||
}
|
||||
testIocInitOk();
|
||||
testDiag("Test if eventNameToHandle() strips spaces and handles numeric events");
|
||||
for (i = 0; i < NELEMENTS(events); i++) {
|
||||
EVENTPVT pev = eventNameToHandle(events[i].name);
|
||||
/* test that some names are not events (num=0) */
|
||||
if (events[i].num == 0)
|
||||
testOk(pev == NULL, "\"%s\" -> no event", events[i].name);
|
||||
else
|
||||
{
|
||||
expected_count[INDX(i)]++; /* +1 for postEvent */
|
||||
if (events[i].num > 0)
|
||||
{
|
||||
testOk(pev != NULL, "\"%s\" -> numeric event %d", events[i].name, events[i].num);
|
||||
expected_count[INDX(i)]++; /* +1 for post_event */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* test that some strings resolve the same event (num!=0) */
|
||||
if (!aliases[INDX(i)])
|
||||
{
|
||||
aliases[INDX(i)] = i;
|
||||
testOk(pev != NULL, "\"%s\" -> new named event", events[i].name);
|
||||
}
|
||||
else
|
||||
{
|
||||
testOk(pev == eventNameToHandle(events[aliases[INDX(i)]].name),
|
||||
"\"%s\" alias for \"%s\"", events[i].name, events[aliases[INDX(i)]].name);
|
||||
}
|
||||
}
|
||||
}
|
||||
post_event(events[i].num); /* triggers numeric events only */
|
||||
postEvent(pev);
|
||||
}
|
||||
|
||||
testDiag("Check calculated numeric events (backward compatibility)");
|
||||
for (e = 0; e <= MAXEV; e++) {
|
||||
testdbPutFieldOk("eventnum", DBR_LONG, e);
|
||||
testdbGetFieldEqual("e1", DBR_LONG, e);
|
||||
testdbGetFieldEqual("e2", DBR_LONG, e);
|
||||
testdbPutFieldOk("e3", DBR_LONG, e);
|
||||
testdbPutFieldOk("e3.PROC", DBR_LONG, 1);
|
||||
for (i = 0; i < NELEMENTS(events); i++)
|
||||
if (e > 0 && e < 256 && events[i].num == e) { /* numeric events */
|
||||
expected_count[INDX(i)]+=3; /* +1 for eventnum->e1, +1 for e2<-eventnum, +1 for e3 */
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Allow records to finish processing */
|
||||
testSyncCallback();
|
||||
testDiag("Check if events have been processed the expected number of times");
|
||||
for (i = 0; i < NELEMENTS(events); i++) {
|
||||
char pvname[100];
|
||||
sprintf(pvname, "c%d", i);
|
||||
testDiag("Event \"%s\" expected %d times", events[i].name, expected_count[INDX(i)]);
|
||||
testdbGetFieldEqual(pvname, DBR_LONG, expected_count[INDX(i)]);
|
||||
}
|
||||
|
||||
testIocShutdownOk();
|
||||
|
||||
testdbCleanup();
|
||||
|
||||
return testDone();
|
||||
}
|
||||
16
src/std/rec/test/scanEventTest.db
Normal file
16
src/std/rec/test/scanEventTest.db
Normal file
@@ -0,0 +1,16 @@
|
||||
record(calc, "c$(N)") {
|
||||
field(SCAN, "Event")
|
||||
field(EVNT, "$(EVENT)")
|
||||
field(CALC, "VAL+1")
|
||||
}
|
||||
record(dfanout, "eventnum") {
|
||||
field(OUTA, "e1 PP")
|
||||
field(FLNK, "e2")
|
||||
}
|
||||
record(event, "e1") {
|
||||
}
|
||||
record(event, "e2") {
|
||||
field(INP, "eventnum")
|
||||
}
|
||||
record(event, "e3") {
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
* Copyright (c) 2002 The Regents of the University of California, as
|
||||
* Operator of Los Alamos National Laboratory.
|
||||
* EPICS BASE is distributed subject to a Software License Agreement found
|
||||
* in file LICENSE that is included with this distribution.
|
||||
* in file LICENSE that is included with this distribution.
|
||||
\*************************************************************************/
|
||||
|
||||
/* recWaveform.c - Record Support Routines for Waveform records */
|
||||
@@ -184,12 +184,14 @@ static long get_array_info(DBADDR *paddr, long *no_elements, long *offset)
|
||||
static long put_array_info(DBADDR *paddr, long nNew)
|
||||
{
|
||||
waveformRecord *prec = (waveformRecord *) paddr->precord;
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
prec->nord = nNew;
|
||||
if (prec->nord > prec->nelm)
|
||||
prec->nord = prec->nelm;
|
||||
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -202,7 +204,7 @@ static long get_units(DBADDR *paddr, char *units)
|
||||
switch (dbGetFieldIndex(paddr)) {
|
||||
case indexof(VAL):
|
||||
if (prec->ftvl == DBF_STRING || prec->ftvl == DBF_ENUM)
|
||||
break;
|
||||
break;
|
||||
case indexof(HOPR):
|
||||
case indexof(LOPR):
|
||||
strncpy(units,prec->egu,DB_UNITS_SIZE);
|
||||
@@ -305,36 +307,37 @@ static void monitor(waveformRecord *prec)
|
||||
|
||||
static long readValue(waveformRecord *prec)
|
||||
{
|
||||
long status;
|
||||
struct wfdset *pdset = (struct wfdset *) prec->dset;
|
||||
long status;
|
||||
|
||||
if (prec->pact == TRUE){
|
||||
return (*pdset->read_wf)(prec);
|
||||
return pdset->read_wf(prec);
|
||||
}
|
||||
|
||||
status = dbGetLink(&(prec->siml), DBR_ENUM, &(prec->simm),0,0);
|
||||
status = dbGetLink(&prec->siml, DBR_ENUM, &prec->simm, 0, 0);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
if (prec->simm == menuYesNoNO){
|
||||
epicsUInt32 nord = prec->nord;
|
||||
|
||||
status = (*pdset->read_wf)(prec);
|
||||
status = pdset->read_wf(prec);
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
return status;
|
||||
}
|
||||
|
||||
if (prec->simm == menuYesNoYES){
|
||||
epicsUInt32 nord = prec->nord;
|
||||
long nRequest = prec->nelm;
|
||||
|
||||
status = dbGetLink(&(prec->siol), prec->ftvl, prec->bptr, 0, &nRequest);
|
||||
/* nord set only for db links: needed for old db_access */
|
||||
status = dbGetLink(&prec->siol, prec->ftvl, prec->bptr, 0, &nRequest);
|
||||
if (prec->siol.type != CONSTANT) {
|
||||
prec->nord = nRequest;
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
if (nord != prec->nord)
|
||||
db_post_events(prec, &prec->nord, DBE_VALUE | DBE_LOG);
|
||||
if (status == 0)
|
||||
prec->udf=FALSE;
|
||||
prec->udf = FALSE;
|
||||
}
|
||||
} else {
|
||||
recGblSetSevr(prec, SOFT_ALARM, INVALID_ALARM);
|
||||
@@ -344,4 +347,3 @@ static long readValue(waveformRecord *prec)
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
if $running_under_some_shell;
|
||||
#!/usr/bin/env perl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2010 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
|
||||
@@ -198,8 +198,8 @@ static long get_alarm_double(DBADDR *paddr,struct dbr_alDouble *pad)
|
||||
|
||||
static void checkAlarms(xxxRecord *prec)
|
||||
{
|
||||
double val;
|
||||
float hyst, lalm, hihi, high, low, lolo;
|
||||
double val, hyst, lalm;
|
||||
float hihi, high, low, lolo;
|
||||
unsigned short hhsv, llsv, hsv, lsv;
|
||||
|
||||
if(prec->udf == TRUE ){
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = $(EPICS_HOST_ARCH)
|
||||
TARGETS = envPaths
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = $(EPICS_HOST_ARCH)
|
||||
TARGETS = envPaths
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
|
||||
55
src/tools/EpicsHostArch.pl
Normal file
55
src/tools/EpicsHostArch.pl
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/usr/bin/env perl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2018 UChicago Argonne LLC, as Operator of Argonne
|
||||
# National Laboratory.
|
||||
# EPICS BASE is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
# Returns an architecture name for EPICS_HOST_ARCH that should be
|
||||
# appropriate for the CPU that this version of Perl was built for.
|
||||
# Any arguments to the program will be appended with separator '-'
|
||||
# to allow flags like -gnu -debug and/or -static to be added.
|
||||
|
||||
# Before Base has been built, use a command like this:
|
||||
# bash$ export EPICS_HOST_ARCH=`perl src/tools/EpicsHostArch.pl`
|
||||
#
|
||||
# If Base is already built, use
|
||||
# tcsh% setenv EPICS_HOST_ARCH `perl base/lib/perl/EpicsHostArch.pl`
|
||||
|
||||
# If your architecture is not recognized by this script, please send
|
||||
# the output from running 'perl --version' to the EPICS tech-talk
|
||||
# mailing list to have it added.
|
||||
|
||||
use strict;
|
||||
|
||||
use Config;
|
||||
use POSIX;
|
||||
|
||||
print join('-', HostArch(), @ARGV), "\n";
|
||||
|
||||
sub HostArch {
|
||||
my $arch = $Config{archname};
|
||||
for ($arch) {
|
||||
return 'linux-x86_64' if m/^x86_64-linux/;
|
||||
return 'linux-x86' if m/^i[3-6]86-linux/;
|
||||
return 'linux-arm' if m/^arm-linux/;
|
||||
return 'windows-x64' if m/^MSWin32-x64/;
|
||||
return 'win32-x86' if m/^MSWin32-x86/;
|
||||
return "cygwin-x86_64" if m/^x86_64-cygwin/;
|
||||
return "cygwin-x86" if m/^i[3-6]86-cygwin/;
|
||||
return 'solaris-sparc' if m/^sun4-solaris/;
|
||||
return 'solaris-x86' if m/^i86pc-solaris/;
|
||||
|
||||
my ($kernel, $hostname, $release, $version, $cpu) = uname;
|
||||
if (m/^darwin/) {
|
||||
for ($cpu) {
|
||||
return 'darwin-x86' if m/^(i386|x86_64)/;
|
||||
return 'darwin-ppc' if m/Power Macintosh/;
|
||||
}
|
||||
die "$0: macOS CPU type '$cpu' not recognized\n";
|
||||
}
|
||||
|
||||
die "$0: Architecture '$arch' not recognized\n";
|
||||
}
|
||||
}
|
||||
@@ -32,6 +32,9 @@ PERL_MODULES += DBD/Recordtype.pm
|
||||
PERL_MODULES += DBD/Registrar.pm
|
||||
PERL_MODULES += DBD/Variable.pm
|
||||
|
||||
# This goes into lib/perl, not bin/<host>
|
||||
PERL_MODULES += EpicsHostArch.pl
|
||||
|
||||
PERL_SCRIPTS += assembleSnippets.pl
|
||||
PERL_SCRIPTS += convertRelease.pl
|
||||
PERL_SCRIPTS += cvsclean.pl
|
||||
|
||||
@@ -21,8 +21,7 @@ use Getopt::Std;
|
||||
use EPICS::Path;
|
||||
use EPICS::Release;
|
||||
|
||||
use vars qw($arch $top $iocroot $root);
|
||||
|
||||
our ($arch, $top, $iocroot, $root);
|
||||
our ($opt_a, $opt_t, $opt_T);
|
||||
|
||||
$Getopt::Std::OUTPUT_HELP_VERSION = 1;
|
||||
|
||||
@@ -41,19 +41,69 @@ BEGIN {
|
||||
}
|
||||
}
|
||||
|
||||
my $tool = 'dbdToHtml';
|
||||
use Pod::Usage;
|
||||
|
||||
use vars qw($opt_D @opt_I $opt_o);
|
||||
getopts('DI@o:') or
|
||||
die "Usage: $tool [-D] [-I dir] [-o file.html] file.dbd.pod\n";
|
||||
=head1 NAME
|
||||
|
||||
dbdToHtml.pl - Convert DBD file with POD to HTML
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<dbdToHtml.pl> [B<-h>] [B<-D>] [B<-I> dir] [B<-o> file] file.dbd.pod
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
Generates HTML documentation from a B<.dbd.pod> file.
|
||||
|
||||
=head1 OPTIONS
|
||||
|
||||
B<dbdToHtml.pl> understands the following options:
|
||||
|
||||
=over 4
|
||||
|
||||
=item B<-h>
|
||||
|
||||
Help, display usage information.
|
||||
|
||||
=item B<-H>
|
||||
|
||||
Conversion help, display information about converting reference documentation
|
||||
from the EPICS Wiki into a B<.dbd.pod> file for use with this tool.
|
||||
|
||||
=item B<-D>
|
||||
|
||||
Instead of creating the output file as described, read the input file(s) and
|
||||
print a B<Makefile> dependency rule for the output file(s) to stdout.
|
||||
|
||||
=item B<-o> file
|
||||
|
||||
Name of the output file to be created.
|
||||
|
||||
=back
|
||||
|
||||
If no output filename is set, the file created will be named after the input
|
||||
file, removing any directory components in the path and replacing any
|
||||
B<.dbd.pod> file extension with B<.html>.
|
||||
|
||||
=cut
|
||||
|
||||
our ($opt_h, $opt_H, $opt_D, @opt_I, $opt_o);
|
||||
|
||||
my $tool = 'dbdToHtml.pl';
|
||||
|
||||
getopts('hHDI@o:') or
|
||||
pod2usage(2);
|
||||
pod2usage(-verbose => 2) if $opt_H;
|
||||
pod2usage(1) if $opt_h;
|
||||
pod2usage("$tool: No input file given.\n") if @ARGV != 1;
|
||||
|
||||
my $dbd = DBD->new();
|
||||
|
||||
my $infile = shift @ARGV;
|
||||
$infile =~ m/\.dbd.pod$/ or
|
||||
die "$tool: Input file '$infile' must have '.dbd.pod' extension\n";
|
||||
pod2usage("$tool: Input file '$infile' must have '.dbd.pod' extension.\n");
|
||||
|
||||
&ParseDBD($dbd, &Readfile($infile, 0, \@opt_I));
|
||||
ParseDBD($dbd, Readfile($infile, 0, \@opt_I));
|
||||
|
||||
if (!$opt_o) {
|
||||
($opt_o = $infile) =~ s/\.dbd\.pod$/.html/;
|
||||
@@ -243,3 +293,87 @@ sub DBD::Recfield::writable {
|
||||
return $fld->dbf_type eq "DBF_NOACCESS" ? 'No' : 'Yes';
|
||||
}
|
||||
|
||||
=pod
|
||||
|
||||
=head1 Converting Wiki Record Reference to POD
|
||||
|
||||
If you open the src/std/rec/aiRecord.dbd.pod file in your favourite plain text
|
||||
editor you'll see what input was required to generate the aiRecord.html file.
|
||||
The text markup language we're using is a standard called POD (Plain Old
|
||||
Documentation) which is used by Perl developers, but you don't need to know Perl
|
||||
at all to be able to use it.
|
||||
|
||||
When we add POD markup to a record type, we rename its *Record.dbd file to
|
||||
.dbd.pod in the src/std/rec directory; no other changes are needed for the build
|
||||
system to find it by its new name. The POD content is effectively just a new
|
||||
kind of comment that appears in .dbd.pod files, which the formatter knows how to
|
||||
convert into HTML. The build also generates a plain *Record.dbd file from this
|
||||
same input file by stripping out all of the POD markup.
|
||||
|
||||
Documentation for Perl's POD markup standard can be found online at
|
||||
L<https://perldoc.perl.org/perlpod.html> or you may be able to type 'perldoc
|
||||
perlpod' into a Linux command-line to see the same text. We added a few POD
|
||||
keywords of our own to handle the table generation, and I'll cover those briefly
|
||||
below.
|
||||
|
||||
POD text can appear almost anywhere in a dbd.pod file. It always starts with a
|
||||
line "=[keyword] [additional text...]" where [keyword] is "title", "head1"
|
||||
through "head4" etc.. The POD text ends with a line "=cut". There must be a
|
||||
blank line above every POD line, and in many cases below it as well.
|
||||
|
||||
The POD keywords we have added are "title", "recordtype", "menu", "fields",
|
||||
"type", "read" and "write". The last 3 are less common but are used in some of
|
||||
the other record types such as the waveform and aSub records.
|
||||
|
||||
The most interesting of our new keywords is "fields", which takes a list of
|
||||
record field names on the same line after the keyword and generates an HTML
|
||||
Table describing those fields based on the field description found in the DBD
|
||||
parts. In the ai documentation the first such table covers the DTYP and INP
|
||||
fields, so the line
|
||||
|
||||
=fields DTYP, INP
|
||||
|
||||
generates all this in the output:
|
||||
|
||||
<blockquote><table border="1">
|
||||
<tr>
|
||||
<th>Field</th><th>Summary</th><th>Type</th><th>DCT</th>
|
||||
<th>Default</th><th>Read</th><th>Write</th><th>CA PP</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="cell">DTYP</td><td class="cell">Device Type</td>
|
||||
<td class="cell">DEVICE</td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell"> </td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell">No</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="cell">INP</td>
|
||||
<td class="cell">Input Specification</td>
|
||||
<td class="cell">INLINK</td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell"> </td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell">Yes</td>
|
||||
<td class="cell">No</td>
|
||||
</tr>
|
||||
</table></blockquote>
|
||||
|
||||
Note that the "=fields" line must appear inside the DBD's declaration of the
|
||||
record type, i.e. after the line
|
||||
|
||||
recordtype(ai) {
|
||||
|
||||
The "type", "read" and "write" POD keywords are used inside an individual record
|
||||
field declaration and provide information for the "Type", "Read" and "Write"
|
||||
columns of the field's table output for fields where this information is
|
||||
normally supplied by the record support code. Usage examples for these keywords
|
||||
can be found in the aai and aSub record types.
|
||||
|
||||
If you look at the L<aoRecord.dbd.pod> file you'll see that the POD there starts
|
||||
by documenting a record-specific menu definition. The "menu" keyword generates a
|
||||
table that lists all the choices found in the named menu.
|
||||
|
||||
=cut
|
||||
|
||||
@@ -19,7 +19,7 @@ use EPICS::Readfile;
|
||||
|
||||
my $tool = 'dbdToMenuH.pl';
|
||||
|
||||
use vars qw($opt_D @opt_I $opt_o $opt_s);
|
||||
our ($opt_D, @opt_I, $opt_o, $opt_s);
|
||||
getopts('DI@o:') or
|
||||
die "Usage: $tool: [-D] [-I dir] [-o menu.h] menu.dbd [menu.h]\n";
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ use EPICS::Readfile;
|
||||
|
||||
my $tool = 'dbdToRecordtypeH.pl';
|
||||
|
||||
use vars qw($opt_D @opt_I $opt_o $opt_s);
|
||||
our ($opt_D, @opt_I, $opt_o, $opt_s);
|
||||
getopts('DI@o:s') or
|
||||
die "Usage: $tool [-D] [-I dir] [-o xRecord.h] xRecord.dbd [xRecord.h]\n";
|
||||
|
||||
|
||||
@@ -1,84 +1,21 @@
|
||||
#!/bin/sh
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, 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 is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
#
|
||||
# EpicsHostArch - returns the Epics host architecture suitable
|
||||
# for assigning to the EPICS_HOST_ARCH variable
|
||||
# Script to find and run the Perl EpicsHostArch.pl script.
|
||||
|
||||
if [ "x${1}" != "x" ]
|
||||
then
|
||||
suffix="-"${1}
|
||||
else
|
||||
suffix=""
|
||||
fi
|
||||
# This script is provided for backwards-compatibility only and may be
|
||||
# dropped from future releases of Base. Please adjust callers to run
|
||||
# the Perl version directly as this startup directory isn't copied to
|
||||
# INSTALL_LOCATION by the EPICS build system.
|
||||
|
||||
sysname=`uname`
|
||||
EHA=EpicsHostArch.pl
|
||||
|
||||
case $sysname in
|
||||
Linux )
|
||||
os=linux
|
||||
cpu=`uname -m`
|
||||
case $cpu in
|
||||
i386 | i486 | i586 | i686 )
|
||||
cpu=x86 ;;
|
||||
x86_64 )
|
||||
;; # $cpu is correct
|
||||
armv6l | armv7l )
|
||||
cpu=arm ;;
|
||||
esac
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
Darwin )
|
||||
os=darwin
|
||||
cpu=`uname -m`
|
||||
case $cpu in
|
||||
"Power Macintosh")
|
||||
cpu=ppc ;;
|
||||
i386 | x86_64 )
|
||||
cpu=x86 ;;
|
||||
esac
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
SunOS )
|
||||
version=`uname -r | sed '1s/^\([0-9]*\).*$/\1/'`
|
||||
if [ ${version} -ge 5 ]; then
|
||||
os=solaris
|
||||
else
|
||||
os=sun4
|
||||
fi
|
||||
cpu=`uname -m`
|
||||
case $cpu in
|
||||
sun4*)
|
||||
cpu=sparc
|
||||
;;
|
||||
i86pc)
|
||||
cpu=x86
|
||||
;;
|
||||
esac
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
* )
|
||||
sysname=`uname -o`
|
||||
case $sysname in
|
||||
Cygwin )
|
||||
os=cygwin
|
||||
cpu=`uname -m`
|
||||
case $cpu in i386 | i486 | i586 | i686 )
|
||||
cpu=x86
|
||||
;;
|
||||
esac
|
||||
echo ${os}-${cpu}${suffix}
|
||||
;;
|
||||
* )
|
||||
echo unsupported
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
# Perl script will be installed into lib/perl
|
||||
[ -f lib/perl/$EHA ] && exec perl lib/perl/$EHA "$@"
|
||||
|
||||
# If Base hasn't been built yet, use the source Luke
|
||||
[ -f src/tools/$EHA ] && exec perl src/tools/$EHA "$@"
|
||||
|
||||
# Die with an error message
|
||||
echo "$0: Can't find $EHA" >&2
|
||||
exit 1
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
eval 'exec perl -S $0 ${1+"$@"}' # -*- Mode: perl -*-
|
||||
if $running_under_some_shell; # EpicsHostArch.pl
|
||||
#*************************************************************************
|
||||
# Copyright (c) 2011 UChicago Argonne LLC, 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 is distributed subject to a Software License Agreement found
|
||||
# in file LICENSE that is included with this distribution.
|
||||
#*************************************************************************
|
||||
|
||||
# Returns the Epics host architecture suitable
|
||||
# for assigning to the EPICS_HOST_ARCH variable
|
||||
|
||||
use Config;
|
||||
use POSIX;
|
||||
|
||||
$suffix="";
|
||||
$suffix="-".$ARGV[0] if ($ARGV[0] ne "");
|
||||
|
||||
$EpicsHostArch = GetEpicsHostArch();
|
||||
print "$EpicsHostArch$suffix";
|
||||
|
||||
sub GetEpicsHostArch { # no args
|
||||
$arch=$Config{'archname'};
|
||||
if ($arch =~ /sun4-solaris/) { return "solaris-sparc";
|
||||
} elsif ($arch =~ m/i86pc-solaris/) { return "solaris-x86";
|
||||
} elsif ($arch =~ m/i[3-6]86-linux/){ return "linux-x86";
|
||||
} elsif ($arch =~ m/x86_64-linux/) { return "linux-x86_64";
|
||||
} elsif ($arch =~ m/arm-linux/) { return "linux-arm";
|
||||
} elsif ($arch =~ m/MSWin32-x86/) { return "win32-x86";
|
||||
} elsif ($arch =~ m/MSWin32-x64/) { return "windows-x64";
|
||||
} elsif ($arch =~ m/cygwin/) {
|
||||
my($kernel, $hostname, $release, $version, $cpu) = POSIX::uname();
|
||||
if ($cpu =~ m/x86_64/) { return "cygwin-x86_64"; }
|
||||
return "cygwin-x86";
|
||||
} elsif ($arch =~ m/darwin/) {
|
||||
my($kernel, $hostname, $release, $version, $cpu) = POSIX::uname();
|
||||
if ($cpu =~ m/Power Macintosh/) { return "darwin-ppc"; }
|
||||
elsif ($cpu =~ m/i386/) { return "darwin-x86"; }
|
||||
elsif ($cpu =~ m/x86_64/) { return "darwin-x86"; }
|
||||
else { return "unsupported"; }
|
||||
} else { return "unsupported"; }
|
||||
}
|
||||
|
||||
#EOF EpicsHostArch.pl
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/bin/csh -f
|
||||
#*************************************************************************
|
||||
# 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.
|
||||
#*************************************************************************
|
||||
# Site-specific EPICS environment settings
|
||||
#
|
||||
# sites should modify these definitions
|
||||
|
||||
# Location of epics base
|
||||
if ( ! $?EPICS_BASE ) then
|
||||
set EPICS_BASE=/usr/local/epics/base
|
||||
endif
|
||||
|
||||
# Location of epics extensions
|
||||
if ( ! $?EPICS_EXTENSIONS ) then
|
||||
setenv EPICS_EXTENSIONS /usr/local/epics/extensions
|
||||
endif
|
||||
|
||||
# Postscript printer definition needed by some extensions (eg medm, dp, dm, ...)
|
||||
if ( ! $?PSPRINTTER ) then
|
||||
setenv PSPRINTER lp
|
||||
endif
|
||||
|
||||
# Needed only by medm extension
|
||||
#setenv EPICS_DISPLAY_PATH
|
||||
# Needed only by medm extension
|
||||
setenv BROWSER firefox
|
||||
|
||||
# Needed only by orbitscreen extension
|
||||
if ( ! $?ORBITSCREENHOME ) then
|
||||
setenv ORBITSCREENHOME $EPICS_EXTENSIONS/src/orbitscreen
|
||||
endif
|
||||
|
||||
# Needed only by adt extension
|
||||
if ( ! $?ADTHOME ) then
|
||||
setenv ADTHOME /usr/local/oag/apps/src/appconfig/adt
|
||||
echo $ADTHOME
|
||||
endif
|
||||
|
||||
# Needed only by ar extension (archiver)
|
||||
setenv EPICS_AR_PORT 7002
|
||||
|
||||
# Needed for java extensions
|
||||
if ( $?CLASSPATH ) then
|
||||
setenv CLASSPATH "${CLASSPATH}:${EPICS_EXTENSIONS}/javalib"
|
||||
else
|
||||
setenv CLASSPATH "${EPICS_EXTENSIONS}/javalib"
|
||||
endif
|
||||
|
||||
# Allow private versions of extensions without a bin subdir
|
||||
if ( $?EPICS_EXTENSIONS_PVT ) then
|
||||
set path = ( $path $EPICS_EXTENSIONS_PVT)
|
||||
endif
|
||||
|
||||
##################################################################
|
||||
|
||||
# Start of set R3.14 environment variables
|
||||
|
||||
setenv EPICS_HOST_ARCH `$EPICS_BASE/startup/EpicsHostArch.pl`
|
||||
|
||||
# Allow private versions of base
|
||||
if ( $?EPICS_BASE_PVT ) then
|
||||
if ( -e $EPICS_BASE_PVT/bin/$EPICS_HOST_ARCH ) then
|
||||
set path = ( $path $EPICS_BASE_PVT/bin/$EPICS_HOST_ARCH)
|
||||
endif
|
||||
endif
|
||||
|
||||
# Allow private versions of extensions
|
||||
if ( $?EPICS_EXTENSIONS_PVT ) then
|
||||
if ( -e $EPICS_EXTENSIONS_PVT/bin/$EPICS_HOST_ARCH ) then
|
||||
set path = ( $path $EPICS_EXTENSIONS_PVT/bin/$EPICS_HOST_ARCH)
|
||||
endif
|
||||
endif
|
||||
set path = ( $path $EPICS_EXTENSIONS/bin/$EPICS_HOST_ARCH )
|
||||
|
||||
# End of set R3.14 environment variables
|
||||
##################################################################
|
||||
@@ -1,88 +0,0 @@
|
||||
#!/bin/sh
|
||||
#*************************************************************************
|
||||
# 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.
|
||||
#*************************************************************************
|
||||
# Site-specific EPICS environment settings
|
||||
#
|
||||
# sites should modify these definitions
|
||||
|
||||
# Location of epics base
|
||||
if [ -z "${MY_EPICS_BASE}" ] ; then
|
||||
MY_EPICS_BASE=/usr/local/epics/base
|
||||
fi
|
||||
|
||||
# Location of epics extensions (medm, msi, etc.)
|
||||
if [ -z "${EPICS_EXTENSIONS}" ] ; then
|
||||
EPICS_EXTENSIONS=/usr/local/epics/extensions
|
||||
fi
|
||||
|
||||
# Postscript printer definition needed by some extensions (eg medm, dp, dm, ...)
|
||||
if [ -z "${PSPRINTER}" ] ; then
|
||||
export PSPRINTER=lp
|
||||
fi
|
||||
|
||||
#Needed only by the idl and ezcaIDL extensions.
|
||||
#export EPICS_EXTENSIONS
|
||||
|
||||
# Needed only by medm extension
|
||||
#export EPICS_DISPLAY_PATH=/path/to/adl/files
|
||||
export BROWSER=firefox
|
||||
|
||||
# Needed only by orbitscreen extension
|
||||
#if [ -z "${ORBITSCREENHOME}" ] ; then
|
||||
# export "ORBITSCREENHOME=${EPICS_EXTENSIONS/src/orbitscreen}"
|
||||
#fi
|
||||
|
||||
# Needed only by adt extension
|
||||
#if [ -z "${ADTHOME}" ] ; then
|
||||
# ADTHOME=
|
||||
# export ADTHOME
|
||||
#fi
|
||||
|
||||
# Needed only by ar extension (archiver)
|
||||
#EPICS_AR_PORT=7002
|
||||
#export EPICS_AR_PORT
|
||||
|
||||
# Needed for java extensions
|
||||
if [ -z "${CLASSPATH}" ] ; then
|
||||
CLASSPATH="${EPICS_EXTENSIONS}/javalib"
|
||||
else
|
||||
CLASSPATH="${CLASSPATH}:${EPICS_EXTENSIONS}/javalib"
|
||||
fi
|
||||
export CLASSPATH
|
||||
|
||||
# Allow private versions of extensions without a bin subdir
|
||||
if [ -n "${EPICS_EXTENSIONS_PVT}" ] ; then
|
||||
PATH="${PATH}:${EPICS_EXTENSIONS_PVT}"
|
||||
fi
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# Start of set R3.14 environment variables
|
||||
#
|
||||
EPICS_HOST_ARCH=`"${MY_EPICS_BASE}"/startup/EpicsHostArch.pl`
|
||||
export EPICS_HOST_ARCH
|
||||
|
||||
# Allow private versions of base
|
||||
if [ -n "${EPICS_BASE_PVT}" ] ; then
|
||||
if [ -d "${EPICS_BASE_PVT}/bin/${EPICS_HOST_ARCH}" ]; then
|
||||
PATH="${PATH}:${EPICS_BASE_PVT}/bin/${EPICS_HOST_ARCH}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Allow private versions of extensions
|
||||
if [ -n "${EPICS_EXTENSIONS_PVT}" ] ; then
|
||||
if [ -d "${EPICS_EXTENSIONS_PVT}/bin/${EPICS_HOST_ARCH}" ]; then
|
||||
PATH="${PATH}:${EPICS_EXTENSIONS_PVT}/bin/${EPICS_HOST_ARCH}"
|
||||
fi
|
||||
fi
|
||||
PATH="${PATH}:${EPICS_EXTENSIONS}/bin/${EPICS_HOST_ARCH}"
|
||||
|
||||
# End of set R3.14 environment variables
|
||||
|
||||
#---------------------------------------------------------------
|
||||
@@ -1,122 +0,0 @@
|
||||
@ECHO OFF
|
||||
REM *************************************************************************
|
||||
REM Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
REM National Laboratory.
|
||||
REM Copyright (c) 2002 The Regents of the University of California, as
|
||||
REM Operator of Los Alamos National Laboratory.
|
||||
REM EPICS BASE Versions 3.13.7
|
||||
REM and higher are distributed subject to a Software License Agreement found
|
||||
REM in file LICENSE that is included with this distribution.
|
||||
REM *************************************************************************
|
||||
REM
|
||||
REM Site-specific EPICS environment settings
|
||||
REM
|
||||
REM sites should modify these definitions
|
||||
|
||||
REM ======================================================
|
||||
REM ====== REQUIRED ENVIRONMENT VARIABLES FOLLOW ======
|
||||
REM ======================================================
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- WINDOWS ---------------------------
|
||||
REM ======================================================
|
||||
REM ----- WIN95 -----
|
||||
REM set PATH=C:\WINDOWS;C:\WINDOWS\COMMAND
|
||||
REM ----- WINNT, WIN2000 -----
|
||||
REM set PATH=C:\WINNT;C:\WINNT\SYSTEM32
|
||||
REM ----- WINXP, Vista, Windows 7 -----
|
||||
set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\Wbem
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- make and perl ---------------------
|
||||
REM ======================================================
|
||||
|
||||
REM --------------- ActiveState perl -------------------
|
||||
set PATH=C:\Perl\bin;%PATH%
|
||||
|
||||
REM --------------- mingw make ------------------------
|
||||
REM set PATH=C:\mingw-make\bin;%PATH%
|
||||
REM set PATH=C:\mingw-make82-3\bin;%PATH%
|
||||
|
||||
REM --------------- gnuwin32 make ----------------------
|
||||
set PATH=C:\gnuwin32\bin;%PATH%
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- cygwin tools ------------------------
|
||||
REM ======================================================
|
||||
REM (make & perl if above perl and make are REMs)
|
||||
REM Dont use cygwin GNU make and Perl!
|
||||
REM cygwin contains tk/tcl, vim, perl, and many unix tools
|
||||
REM need grep from here NOT from cvs directory
|
||||
set PATH=%PATH%;.;..
|
||||
set PATH=%PATH%;c:\cygwin\bin
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- EPICS --------------------------------
|
||||
REM ======================================================
|
||||
set EPICS_HOST_ARCH=cygwin-x86
|
||||
set PATH=%PATH%;G:\epics\base\bin\%EPICS_HOST_ARCH%
|
||||
set PATH=%PATH%;G:\epics\extensions\bin\%EPICS_HOST_ARCH%
|
||||
|
||||
REM ======================================================
|
||||
REM ------- OPTIONAL ENVIRONMENT VARIABLES FOLLOW --------
|
||||
REM ======================================================
|
||||
|
||||
REM ======================================================
|
||||
REM ----------------- remote CVS -------------------------
|
||||
REM ======================================================
|
||||
REM set CVS_RSH=c:/cygwin/bin/ssh.exe
|
||||
REM set CVSROOT=:ext:jba@aps.anl.gov:/usr/local/epicsmgr/cvsroot
|
||||
REM set HOME=c:/users/%USERNAME%
|
||||
REM set HOME=c:/users/jba
|
||||
|
||||
REM ======================================================
|
||||
REM ------------------- Bazaar ---------------------------
|
||||
REM ======================================================
|
||||
set PATH=%PATH%;C:\Program files\Bazaar
|
||||
|
||||
REM ======================================================
|
||||
REM ----------------- GNU make flags ---------------------
|
||||
REM ======================================================
|
||||
set MAKEFLAGS=-w
|
||||
|
||||
REM ======================================================
|
||||
REM -------------- vim (use cygwin vim ) -----------------
|
||||
REM ======================================================
|
||||
REM HOME needed by vim to write .viminfo file.
|
||||
REM VIM needed by vim to find _vimrc file.
|
||||
REM set VIM=c:\cygwin
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- Epics Channel Access -----------------
|
||||
REM Modify and uncomment the following lines
|
||||
REM to override the base/configure/CONFIG_ENV defaults
|
||||
REM ======================================================
|
||||
REM set EPICS_CA_ADDR_LIST=n.n.n.n n.n.n.n
|
||||
REM set EPICS_CA_AUTO_ADDR_LIST=YES
|
||||
|
||||
REM set EPICS_CA_CONN_TMO=30.0
|
||||
REM set EPICS_CA_BEACON_PERIOD=15.0
|
||||
REM set EPICS_CA_REPEATER_PORT=5065
|
||||
REM set EPICS_CA_SERVER_PORT=5064
|
||||
REM set EPICS_TS_MIN_WEST=420
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- JAVA ---------------------------------
|
||||
REM ======================================================
|
||||
REM Needed for java extensions
|
||||
REM set CLASSPATH=G:\epics\extensions\javalib
|
||||
REM set PATH=%PATH%;C:\j2sdk1.4.1_01\bin
|
||||
REM set CLASSPATH=%CLASSPATH%;C:\j2sdk1.4.1_01\lib\tools.jar
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- Exceed -------------------------------
|
||||
REM Needed for X11 extensions
|
||||
REM ======================================================
|
||||
REM set EX_VER=7.10
|
||||
REM set EX_VER=12.00
|
||||
REM set EX_VER=14.00
|
||||
REM set PATH=%PATH%;C:\Exceed%EX_VER%\XDK\
|
||||
REM set PATH=%PATH%;C:\Program Files\Hummingbird\Connectivity\%EX_VER%\Exceed\
|
||||
|
||||
|
||||
96
startup/unix.csh
Normal file
96
startup/unix.csh
Normal file
@@ -0,0 +1,96 @@
|
||||
#*************************************************************************
|
||||
# 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.
|
||||
#*************************************************************************
|
||||
#
|
||||
# Site-specific EPICS environment settings
|
||||
#
|
||||
# Attempts to set EPICS_HOST_ARCH. Optionally, adds the EPICS Base
|
||||
# install host architecture bin directory to PATH.
|
||||
#
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Site serviceable parts (These definitions may be modified)
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
# Automatically set up the environment when possible ("yes" or "no").
|
||||
# If set to yes, as much of the environment will be set up as possible.
|
||||
# If set to no, just the minimum environment will be set up. More
|
||||
# specific _auto_* definitions take precedence over this definition.
|
||||
set _auto=no
|
||||
|
||||
# Automatically append to PATH ("yes" or "no"). If set to yes, the
|
||||
# EPICS Base install host architecture bin directory will be added to
|
||||
# PATH if possible. If set to no, the bin directory will not be added
|
||||
# to PATH.
|
||||
set _auto_path_append=$_auto
|
||||
|
||||
# The program used to run Perl scripts (pathname).
|
||||
set _perl_prog=perl
|
||||
|
||||
# The EPICS host architecture specification for EPICS_HOST_ARCH
|
||||
# (<os>-<arch>[-<toolset>] as defined in configure/CONFIG_SITE). If
|
||||
# nonempty, the value will be used as the value of EPICS_HOST_ARCH. If
|
||||
# empty, an attempt will be made to automatically determine the value
|
||||
# with EpicsHostArch.pl.
|
||||
set _epics_host_arch=
|
||||
|
||||
# The install location of EPICS Base (pathname). If nonempty, the
|
||||
# EpicsHostArch.pl script from it, if it exists, will be used to
|
||||
# determine EPICS_HOST_ARCH. If nonempty and EPICS_HOST_ARCH was
|
||||
# determined successfully, it will be used to add the host architecture
|
||||
# bin directory to PATH if _auto_path_append is yes.
|
||||
set _epics_base=
|
||||
|
||||
# The source location of EPICS Base (pathname). If nonempty, the
|
||||
# EpicsHostArch.pl script from it, if it exists and _epics_base is empty
|
||||
# or it did not exist in the _epics_base location, will be used to
|
||||
# determine EPICS_HOST_ARCH.
|
||||
set _epics_base_src=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Internal parts (There is typically no need to modify these)
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
# Define the possible locations of EpicsHostArch.pl
|
||||
set _epics_host_arch_pl=
|
||||
set _src_epics_host_arch_pl=
|
||||
if ("$_epics_base" != '') then
|
||||
set _epics_host_arch_pl="$_epics_base/lib/perl/EpicsHostArch.pl"
|
||||
endif
|
||||
if ("$_epics_base_src" != '') then
|
||||
set _src_epics_host_arch_pl="$_epics_base_src/src/tools/EpicsHostArch.pl"
|
||||
endif
|
||||
|
||||
# Set the EPICS host architecture specification
|
||||
if ("$_epics_host_arch" != '') then
|
||||
setenv EPICS_HOST_ARCH "$_epics_host_arch"
|
||||
else if (-e "$_epics_host_arch_pl") then
|
||||
set _epics_host_arch=`"$_perl_prog" "$_epics_host_arch_pl"`
|
||||
setenv EPICS_HOST_ARCH "$_epics_host_arch"
|
||||
else if (-e "$_src_epics_host_arch_pl") then
|
||||
set _epics_host_arch=`"$_perl_prog" "$_src_epics_host_arch_pl"`
|
||||
setenv EPICS_HOST_ARCH "$_epics_host_arch"
|
||||
endif
|
||||
|
||||
# Add the EPICS Base host architecture bin directory to PATH
|
||||
if ("$_auto_path_append" == yes) then
|
||||
if ("$_epics_base" != '' && "$_epics_host_arch" != '') then
|
||||
setenv PATH "${PATH}:$_epics_base/bin/$_epics_host_arch"
|
||||
endif
|
||||
endif
|
||||
|
||||
# Don't leak variables into the environment
|
||||
unset _auto
|
||||
unset _auto_path_append
|
||||
unset _perl_prog
|
||||
unset _epics_host_arch
|
||||
unset _epics_base
|
||||
unset _epics_base_src
|
||||
unset _epics_host_arch_pl
|
||||
unset _src_epics_host_arch_pl
|
||||
100
startup/unix.sh
Normal file
100
startup/unix.sh
Normal file
@@ -0,0 +1,100 @@
|
||||
#*************************************************************************
|
||||
# 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.
|
||||
#*************************************************************************
|
||||
#
|
||||
# Site-specific EPICS environment settings
|
||||
#
|
||||
# Attempts to set EPICS_HOST_ARCH. Optionally, adds the EPICS Base
|
||||
# install host architecture bin directory to PATH.
|
||||
#
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Site serviceable parts (These definitions may be modified)
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
# Automatically set up the environment when possible ("yes" or "no").
|
||||
# If set to yes, as much of the environment will be set up as possible.
|
||||
# If set to no, just the minimum environment will be set up. More
|
||||
# specific _auto_* definitions take precedence over this definition.
|
||||
_auto=no
|
||||
|
||||
# Automatically append to PATH ("yes" or "no"). If set to yes, the
|
||||
# EPICS Base install host architecture bin directory will be added to
|
||||
# PATH if possible. If set to no, the bin directory will not be added
|
||||
# to PATH.
|
||||
_auto_path_append=$_auto
|
||||
|
||||
# The program used to run Perl scripts (pathname).
|
||||
_perl_prog=perl
|
||||
|
||||
# The EPICS host architecture specification for EPICS_HOST_ARCH
|
||||
# (<os>-<arch>[-<toolset>] as defined in configure/CONFIG_SITE). If
|
||||
# nonempty, the value will be used as the value of EPICS_HOST_ARCH. If
|
||||
# empty, an attempt will be made to automatically determine the value
|
||||
# with EpicsHostArch.pl.
|
||||
_epics_host_arch=
|
||||
|
||||
# The install location of EPICS Base (pathname). If nonempty, the
|
||||
# EpicsHostArch.pl script from it, if it exists, will be used to
|
||||
# determine EPICS_HOST_ARCH. If nonempty and EPICS_HOST_ARCH was
|
||||
# determined successfully, it will be used to add the host architecture
|
||||
# bin directory to PATH if _auto_path_append is yes.
|
||||
_epics_base=
|
||||
|
||||
# The source location of EPICS Base (pathname). If nonempty, the
|
||||
# EpicsHostArch.pl script from it, if it exists and _epics_base is empty
|
||||
# or it did not exist in the _epics_base location, will be used to
|
||||
# determine EPICS_HOST_ARCH.
|
||||
_epics_base_src=
|
||||
|
||||
#-----------------------------------------------------------------------
|
||||
# Internal parts (There is typically no need to modify these)
|
||||
#-----------------------------------------------------------------------
|
||||
|
||||
# Define the possible locations of EpicsHostArch.pl
|
||||
_epics_host_arch_pl=
|
||||
_src_epics_host_arch_pl=
|
||||
if [ -n "$_epics_base" ]; then
|
||||
_epics_host_arch_pl="$_epics_base/lib/perl/EpicsHostArch.pl"
|
||||
fi
|
||||
if [ -n "$_epics_base_src" ]; then
|
||||
_src_epics_host_arch_pl="$_epics_base_src/src/tools/EpicsHostArch.pl"
|
||||
fi
|
||||
|
||||
# Set the EPICS host architecture specification
|
||||
if [ -n "$_epics_host_arch" ]; then
|
||||
EPICS_HOST_ARCH=$_epics_host_arch
|
||||
export EPICS_HOST_ARCH
|
||||
elif [ -e "$_epics_host_arch_pl" ]; then
|
||||
_epics_host_arch=$("$_perl_prog" "$_epics_host_arch_pl")
|
||||
EPICS_HOST_ARCH=$_epics_host_arch
|
||||
export EPICS_HOST_ARCH
|
||||
elif [ -e "$_src_epics_host_arch_pl" ]; then
|
||||
_epics_host_arch=$("$_perl_prog" "$_src_epics_host_arch_pl")
|
||||
EPICS_HOST_ARCH=$_epics_host_arch
|
||||
export EPICS_HOST_ARCH
|
||||
fi
|
||||
|
||||
# Add the EPICS Base host architecture bin directory to PATH
|
||||
if [ "$_auto_path_append" = yes ]; then
|
||||
if [ -n "$_epics_base" ] && [ -n "$_epics_host_arch" ]; then
|
||||
PATH="$PATH:$_epics_base/bin/$_epics_host_arch"
|
||||
export PATH
|
||||
fi
|
||||
fi
|
||||
|
||||
# Don't leak variables into the environment
|
||||
unset _auto
|
||||
unset _auto_path_append
|
||||
unset _perl_prog
|
||||
unset _epics_host_arch
|
||||
unset _epics_base
|
||||
unset _epics_base_src
|
||||
unset _epics_host_arch_pl
|
||||
unset _src_epics_host_arch_pl
|
||||
@@ -1,147 +1,105 @@
|
||||
@ECHO OFF
|
||||
REM *************************************************************************
|
||||
REM Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
||||
REM National Laboratory.
|
||||
REM Copyright (c) 2002 The Regents of the University of California, as
|
||||
REM Operator of Los Alamos National Laboratory.
|
||||
REM EPICS BASE Versions 3.13.7
|
||||
REM and higher are distributed subject to a Software License Agreement found
|
||||
REM in file LICENSE that is included with this distribution.
|
||||
REM *************************************************************************
|
||||
REM
|
||||
REM Site-specific EPICS environment settings
|
||||
REM
|
||||
REM sites should modify these definitions
|
||||
|
||||
REM ======================================================
|
||||
REM ====== REQUIRED ENVIRONMENT VARIABLES FOLLOW ======
|
||||
REM ======================================================
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- WINDOWS ---------------------------
|
||||
REM ======================================================
|
||||
REM ----- WIN95 -----
|
||||
REM set PATH=C:\WINDOWS;C:\WINDOWS\COMMAND
|
||||
REM ----- WINNT, WIN2000 -----
|
||||
REM set PATH=C:\WINNT;C:\WINNT\SYSTEM32
|
||||
REM ----- WINXP, Vista, Windows 7 -----
|
||||
set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\SYSTEM32\Wbem
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- make and perl ---------------------
|
||||
REM ======================================================
|
||||
|
||||
REM --------------- ActiveState perl -------------------
|
||||
set PATH=C:\Perl\bin;%PATH%
|
||||
|
||||
REM --------------- mingw make ------------------------
|
||||
REM set PATH=C:\mingw-make\bin;%PATH%
|
||||
REM set PATH=C:\mingw-make82-3\bin;%PATH%
|
||||
|
||||
REM --------------- gnuwin32 make ----------------------
|
||||
set PATH=C:\gnuwin32\bin;%PATH%
|
||||
|
||||
REM ======================================================
|
||||
REM ---------------- cygwin tools ------------------------
|
||||
REM ======================================================
|
||||
REM (make & perl if above perl and make are REMs)
|
||||
REM Dont use cygwin GNU make and Perl!
|
||||
REM cygwin contains tk/tcl, vim, perl, and many unix tools
|
||||
REM need grep from here NOT from cvs directory
|
||||
REM set PATH=%PATH%;.;..
|
||||
REM set PATH=%PATH%;c:\cygwin\bin
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- Visual c++ -------------------------
|
||||
REM ======================================================
|
||||
|
||||
REM ------ Microsoft Visual Studio 2005 ------
|
||||
REM call "C:\Program files\Microsoft Visual Studio 8\VC\vcvarsall.bat" x86_amd64
|
||||
REM set PATH=%PATH%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin
|
||||
REM set INCLUDE=%INCLUDE%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\include
|
||||
REM REM set LIBPATH=%LIBPATH%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib
|
||||
REM set LIB=%LIB%;C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib
|
||||
|
||||
REM ------ Microsoft Visual Studio 2008 ------
|
||||
REM call "C:\Program files\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat"
|
||||
REM call "C:\Program files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86_amd64
|
||||
REM set PATH=C:\Program Files\Microsoft SDKs\Windows\v7.0\bin;%PATH%
|
||||
REM set INCLUDE=C:\Program Files\Microsoft SDKs\Windows\v7.0\include;%INCLUDE%
|
||||
REM set LIBPATH=C:\Program Files\Microsoft SDKs\Windows\v7.0\lib;%LIBPATH%
|
||||
REM set LIB=C:\Program Files\Microsoft SDKs\Windows\v7.0\lib;%LIB%
|
||||
|
||||
REM ----- Visual Studion 2010 -----
|
||||
REM -- windows-x64 ---
|
||||
REM call "C:\Program files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x64
|
||||
REM -- win32-x86 ---
|
||||
call "C:\Program files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- EPICS --------------------------------
|
||||
REM ======================================================
|
||||
REM set EPICS_HOST_ARCH=windows-x64
|
||||
set EPICS_HOST_ARCH=win32-x86
|
||||
set PATH=%PATH%;G:\epics\base\bin\%EPICS_HOST_ARCH%
|
||||
set PATH=%PATH%;G:\epics\extensions\bin\%EPICS_HOST_ARCH%
|
||||
|
||||
REM ======================================================
|
||||
REM ------- OPTIONAL ENVIRONMENT VARIABLES FOLLOW --------
|
||||
REM ======================================================
|
||||
|
||||
REM ======================================================
|
||||
REM ----------------- remote CVS -------------------------
|
||||
REM ======================================================
|
||||
REM set CVS_RSH=c:/cygwin/bin/ssh.exe
|
||||
REM set CVSROOT=:ext:jba@aps.anl.gov:/usr/local/epicsmgr/cvsroot
|
||||
REM set HOME=c:/users/%USERNAME%
|
||||
REM set HOME=c:/users/jba
|
||||
|
||||
REM ======================================================
|
||||
REM ------------------- Bazaar ---------------------------
|
||||
REM ======================================================
|
||||
set PATH=%PATH%;C:\Program files\Bazaar
|
||||
|
||||
REM ======================================================
|
||||
REM ----------------- GNU make flags ---------------------
|
||||
REM ======================================================
|
||||
set MAKEFLAGS=-w
|
||||
|
||||
REM ======================================================
|
||||
REM -------------- vim (use cygwin vim ) -----------------
|
||||
REM ======================================================
|
||||
REM HOME needed by vim to write .viminfo file.
|
||||
REM VIM needed by vim to find _vimrc file.
|
||||
REM set VIM=c:\cygwin
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- Epics Channel Access -----------------
|
||||
REM Modify and uncomment the following lines
|
||||
REM to override the base/configure/CONFIG_ENV defaults
|
||||
REM ======================================================
|
||||
REM set EPICS_CA_ADDR_LIST=n.n.n.n n.n.n.n
|
||||
REM set EPICS_CA_AUTO_ADDR_LIST=YES
|
||||
|
||||
REM set EPICS_CA_CONN_TMO=30.0
|
||||
REM set EPICS_CA_BEACON_PERIOD=15.0
|
||||
REM set EPICS_CA_REPEATER_PORT=5065
|
||||
REM set EPICS_CA_SERVER_PORT=5064
|
||||
REM set EPICS_TS_MIN_WEST=420
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- JAVA ---------------------------------
|
||||
REM ======================================================
|
||||
REM Needed for java extensions
|
||||
REM set CLASSPATH=G:\epics\extensions\javalib
|
||||
REM set PATH=%PATH%;C:\j2sdk1.4.1_01\bin
|
||||
REM set CLASSPATH=%CLASSPATH%;C:\j2sdk1.4.1_01\lib\tools.jar
|
||||
|
||||
REM ======================================================
|
||||
REM --------------- Exceed -------------------------------
|
||||
REM Needed for X11 extensions
|
||||
REM ======================================================
|
||||
REM set EX_VER=7.10
|
||||
REM set EX_VER=12.00
|
||||
REM set EX_VER=14.00
|
||||
REM set PATH=%PATH%;C:\Exceed%EX_VER%\XDK\
|
||||
REM set PATH=%PATH%;C:\Program Files\Hummingbird\Connectivity\%EX_VER%\Exceed\
|
||||
|
||||
@echo off
|
||||
rem *************************************************************************
|
||||
rem Copyright (c) 2017 UChicago Argonne LLC, as Operator of Argonne
|
||||
rem National Laboratory.
|
||||
rem Copyright (c) 2002 The Regents of the University of California, as
|
||||
rem Operator of Los Alamos National Laboratory.
|
||||
rem EPICS BASE is distributed subject to a Software License Agreement found
|
||||
rem in file LICENSE that is included with this distribution.
|
||||
rem *************************************************************************
|
||||
rem
|
||||
rem Site-specific EPICS environment settings
|
||||
rem
|
||||
rem Sets EPICS_HOST_ARCH and the environment for Microsoft Visual Studio.
|
||||
rem Optionally, resets PATH, adds Strawberry Perl to PATH, and adds the
|
||||
rem EPICS Base install host architecture bin directory to PATH.
|
||||
rem
|
||||
|
||||
rem ----------------------------------------------------------------------
|
||||
rem Site serviceable parts (These definitions may be modified)
|
||||
rem ----------------------------------------------------------------------
|
||||
|
||||
rem The values of the definitions in this section must not contain
|
||||
rem double-quotes.
|
||||
rem
|
||||
rem * Right: set _foo=C:\foo
|
||||
rem * Right: set "_foo=C:\foo"
|
||||
rem * Wrong: set _foo="C:\foo"
|
||||
|
||||
rem Automatically set up the environment when possible ("yes" or "no").
|
||||
rem If set to yes, as much of the environment will be set up as possible.
|
||||
rem If set to no, just the minimum environment will be set up. More
|
||||
rem specific _auto_* definitions take precedence over this definition.
|
||||
set _auto=no
|
||||
|
||||
rem Automatically reset PATH ("yes" or "no"). If set to yes, PATH will
|
||||
rem be reset to the value of _path_new. If set to no, PATH will not be
|
||||
rem reset.
|
||||
set _auto_path_reset=%_auto%
|
||||
|
||||
rem Automatically append to PATH ("yes" or "no"). If set to yes, the
|
||||
rem EPICS Base install host architecture bin directory will be added to
|
||||
rem PATH if possible. If set to no, the bin directory will not be added
|
||||
rem to PATH.
|
||||
set _auto_path_append=%_auto%
|
||||
|
||||
rem The new value for PATH. If _auto_path_reset is yes, PATH will be set
|
||||
rem to it.
|
||||
set _path_new=C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem
|
||||
|
||||
rem The location of Strawberry Perl (pathname). If empty, Strawberry Perl
|
||||
rem is assumed to already be in PATH and will not be added. If nonempty,
|
||||
rem Strawberry Perl will be added to PATH.
|
||||
set _strawberry_perl_home=C:\Strawberry
|
||||
|
||||
rem The location of Microsoft Visual Studio (pathname).
|
||||
set _visual_studio_home=C:\Program Files (x86)\Microsoft Visual Studio 14.0
|
||||
|
||||
rem The EPICS host architecture specification for EPICS_HOST_ARCH
|
||||
rem (<os>-<arch>[-<toolset>] as defined in configure/CONFIG_SITE).
|
||||
set _epics_host_arch=win32-x86
|
||||
|
||||
rem The install location of EPICS Base (pathname). If nonempty and
|
||||
rem _auto_path_append is yes, it will be used to add the host architecture
|
||||
rem bin directory to PATH.
|
||||
set _epics_base=
|
||||
|
||||
rem ----------------------------------------------------------------------
|
||||
rem Internal parts (There is typically no need to modify these)
|
||||
rem ----------------------------------------------------------------------
|
||||
|
||||
rem Reset PATH
|
||||
if "%_auto_path_reset%" == "yes" (
|
||||
set "PATH=%_path_new%"
|
||||
)
|
||||
|
||||
rem Add Strawberry Perl to PATH
|
||||
if "%_strawberry_perl_home%" == "" goto after_add_strawberry_perl
|
||||
rem Can't do this inside parentheses because PATH would be read only once
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\c\bin"
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\perl\site\bin"
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\perl\bin"
|
||||
:after_add_strawberry_perl
|
||||
|
||||
rem Set the environment for Microsoft Visual Studio
|
||||
call "%_visual_studio_home%\VC\vcvarsall.bat" x86
|
||||
|
||||
rem Set the EPICS host architecture specification
|
||||
set "EPICS_HOST_ARCH=%_epics_host_arch%"
|
||||
|
||||
rem Add the EPICS Base host architecture bin directory to PATH
|
||||
if "%_auto_path_append%" == "yes" (
|
||||
if not "%_epics_base%" == "" (
|
||||
set "PATH=%PATH%;%_epics_base%\bin\%_epics_host_arch%"
|
||||
)
|
||||
)
|
||||
|
||||
rem Don't leak variables into the environment
|
||||
set _auto=
|
||||
set _auto_path_reset=
|
||||
set _auto_path_append=
|
||||
set _path_new=
|
||||
set _strawberry_perl_home=
|
||||
set _visual_studio_home=
|
||||
set _epics_host_arch=
|
||||
set _epics_base=
|
||||
|
||||
105
startup/windows.bat
Normal file
105
startup/windows.bat
Normal file
@@ -0,0 +1,105 @@
|
||||
@echo off
|
||||
rem *************************************************************************
|
||||
rem Copyright (c) 2017 UChicago Argonne LLC, as Operator of Argonne
|
||||
rem National Laboratory.
|
||||
rem Copyright (c) 2002 The Regents of the University of California, as
|
||||
rem Operator of Los Alamos National Laboratory.
|
||||
rem EPICS BASE is distributed subject to a Software License Agreement found
|
||||
rem in file LICENSE that is included with this distribution.
|
||||
rem *************************************************************************
|
||||
rem
|
||||
rem Site-specific EPICS environment settings
|
||||
rem
|
||||
rem Sets EPICS_HOST_ARCH and the environment for Microsoft Visual Studio.
|
||||
rem Optionally, resets PATH, adds Strawberry Perl to PATH, and adds the
|
||||
rem EPICS Base install host architecture bin directory to PATH.
|
||||
rem
|
||||
|
||||
rem ----------------------------------------------------------------------
|
||||
rem Site serviceable parts (These definitions may be modified)
|
||||
rem ----------------------------------------------------------------------
|
||||
|
||||
rem The values of the definitions in this section must not contain
|
||||
rem double-quotes.
|
||||
rem
|
||||
rem * Right: set _foo=C:\foo
|
||||
rem * Right: set "_foo=C:\foo"
|
||||
rem * Wrong: set _foo="C:\foo"
|
||||
|
||||
rem Automatically set up the environment when possible ("yes" or "no").
|
||||
rem If set to yes, as much of the environment will be set up as possible.
|
||||
rem If set to no, just the minimum environment will be set up. More
|
||||
rem specific _auto_* definitions take precedence over this definition.
|
||||
set _auto=no
|
||||
|
||||
rem Automatically reset PATH ("yes" or "no"). If set to yes, PATH will
|
||||
rem be reset to the value of _path_new. If set to no, PATH will not be
|
||||
rem reset.
|
||||
set _auto_path_reset=%_auto%
|
||||
|
||||
rem Automatically append to PATH ("yes" or "no"). If set to yes, the
|
||||
rem EPICS Base install host architecture bin directory will be added to
|
||||
rem PATH if possible. If set to no, the bin directory will not be added
|
||||
rem to PATH.
|
||||
set _auto_path_append=%_auto%
|
||||
|
||||
rem The new value for PATH. If _auto_path_reset is yes, PATH will be set
|
||||
rem to it.
|
||||
set _path_new=C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem
|
||||
|
||||
rem The location of Strawberry Perl (pathname). If empty, Strawberry Perl
|
||||
rem is assumed to already be in PATH and will not be added. If nonempty,
|
||||
rem Strawberry Perl will be added to PATH.
|
||||
set _strawberry_perl_home=C:\Strawberry
|
||||
|
||||
rem The location of Microsoft Visual Studio (pathname).
|
||||
set _visual_studio_home=C:\Program Files (x86)\Microsoft Visual Studio 14.0
|
||||
|
||||
rem The EPICS host architecture specification for EPICS_HOST_ARCH
|
||||
rem (<os>-<arch>[-<toolset>] as defined in configure/CONFIG_SITE).
|
||||
set _epics_host_arch=windows-x64
|
||||
|
||||
rem The install location of EPICS Base (pathname). If nonempty and
|
||||
rem _auto_path_append is yes, it will be used to add the host architecture
|
||||
rem bin directory to PATH.
|
||||
set _epics_base=
|
||||
|
||||
rem ----------------------------------------------------------------------
|
||||
rem Internal parts (There is typically no need to modify these)
|
||||
rem ----------------------------------------------------------------------
|
||||
|
||||
rem Reset PATH
|
||||
if "%_auto_path_reset%" == "yes" (
|
||||
set "PATH=%_path_new%"
|
||||
)
|
||||
|
||||
rem Add Strawberry Perl to PATH
|
||||
if "%_strawberry_perl_home%" == "" goto after_add_strawberry_perl
|
||||
rem Can't do this inside parentheses because PATH would be read only once
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\c\bin"
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\perl\site\bin"
|
||||
set "PATH=%PATH%;%_strawberry_perl_home%\perl\bin"
|
||||
:after_add_strawberry_perl
|
||||
|
||||
rem Set the environment for Microsoft Visual Studio
|
||||
call "%_visual_studio_home%\VC\vcvarsall.bat" x64
|
||||
|
||||
rem Set the EPICS host architecture specification
|
||||
set "EPICS_HOST_ARCH=%_epics_host_arch%"
|
||||
|
||||
rem Add the EPICS Base host architecture bin directory to PATH
|
||||
if "%_auto_path_append%" == "yes" (
|
||||
if not "%_epics_base%" == "" (
|
||||
set "PATH=%PATH%;%_epics_base%\bin\%_epics_host_arch%"
|
||||
)
|
||||
)
|
||||
|
||||
rem Don't leak variables into the environment
|
||||
set _auto=
|
||||
set _auto_path_reset=
|
||||
set _auto_path_append=
|
||||
set _path_new=
|
||||
set _strawberry_perl_home=
|
||||
set _visual_studio_home=
|
||||
set _epics_host_arch=
|
||||
set _epics_base=
|
||||
Reference in New Issue
Block a user