Merged changes from 3.14 branch
Up to revno 12504.
This commit is contained in:
@@ -18,16 +18,17 @@ ifeq ($(filter $(ARCH),$(BUILD_ARCHS)),$(ARCH))
|
||||
buildInstall$(DIVIDER)$(ARCH) buildInstall: $(TARGETS)
|
||||
|
||||
clean$(DIVIDER)$(ARCH) clean:
|
||||
$(RM) cdCommands envPaths dllPath.bat
|
||||
$(RM) cdCommands envPaths dllPath.bat relPaths.sh
|
||||
else
|
||||
buildInstall$(DIVIDER)$(ARCH) buildInstall:
|
||||
clean$(DIVIDER)$(ARCH) clean:
|
||||
endif
|
||||
|
||||
cdCommands envPaths dllPath.bat: $(wildcard $(TOP)/configure/RELEASE*) \
|
||||
cdCommands envPaths dllPath.bat relPaths.sh: \
|
||||
$(wildcard $(TOP)/configure/RELEASE*) \
|
||||
$(wildcard $(TOP)/configure/CONFIG_SITE*) $(INSTALL_BIN)
|
||||
$(CONVERTRELEASE) -a $(ARCH) -t $(IOCS_APPL_TOP) $@
|
||||
|
||||
realclean:
|
||||
$(RM) cdCommands envPaths dllPath.bat
|
||||
$(RM) cdCommands envPaths dllPath.bat relPaths.sh
|
||||
|
||||
|
||||
12
configure/os/CONFIG.windows-x64.windows-x64-debug
Normal file
12
configure/os/CONFIG.windows-x64.windows-x64-debug
Normal file
@@ -0,0 +1,12 @@
|
||||
# CONFIG.windows-x64.windows-x64-debug
|
||||
#
|
||||
# $Revision-Id$
|
||||
# This file is maintained by the build community.
|
||||
#
|
||||
# Definitions for windows-x64 compiler host - windows-x64 debug compiler target builds
|
||||
# Sites may override these definitions in CONFIG_SITE.windows-x64.windows-x64-debug
|
||||
#-------------------------------------------------------
|
||||
|
||||
include $(CONFIG)/os/CONFIG.windows-x64.windows-x64
|
||||
|
||||
HOST_OPT=NO
|
||||
@@ -109,7 +109,7 @@ $Date$</span></small></p>
|
||||
<ul>
|
||||
<li><a href="#When">When Clients Do Not Connect to Their Server</a>
|
||||
<ul>
|
||||
<li><a href="#Broadcast">Client and Server Broadcast Addresses Dont
|
||||
<li><a href="#Broadcast">Client and Server Broadcast Addresses Don't
|
||||
Match</a></li>
|
||||
<li><a href="#Client">Client Isnt Configured to Use the Server's
|
||||
Port</a></li>
|
||||
@@ -370,7 +370,7 @@ to operate over a wide area network (WAN).</p>
|
||||
|
||||
<h3><a name="Network">IP Network Administration Background Information</a></h3>
|
||||
|
||||
<p>Channel Access is implemented using internet protocols (IP). IP addresses
|
||||
<p>Channel Access is implemented using Internet protocols (IP). IP addresses
|
||||
are divided into host and network portions. The boundary between each portion
|
||||
is determined by the IP netmask. Portions of the IP address corresponding to
|
||||
zeros in the netmask specify the hosts address within an IP subnet. Portions of
|
||||
@@ -380,7 +380,7 @@ limited to one IP subnet. Addresses with the host address portion set to all
|
||||
zeros or all ones are special. Modern IP kernel implementations reserve
|
||||
destination addresses with the host portion set to all ones for the purpose of
|
||||
addressing broadcasts to a particular subnet. In theory we can issue a
|
||||
broadcast frame on any broadcast capable LAN within the interconnected internet
|
||||
broadcast frame on any broadcast capable LAN within the interconnected Internet
|
||||
by specifying the proper subnet address combined with a host portion set to all
|
||||
ones. In practice these "directed broadcasts" are frequently limited by the
|
||||
default router configuration. The proper directed broadcast address required to
|
||||
@@ -586,7 +586,7 @@ restarted or because the IP kernel's internal TCP circuit inactivity keep alive
|
||||
timer has expired after a typically long duration (as is appropriate for IP
|
||||
based systems that need to avoid thrashing during periods of excessive load).
|
||||
The net result is less search and TCP circuit setup and shutdown activity
|
||||
suring periods of excessive load.</p>
|
||||
during periods of excessive load.</p>
|
||||
|
||||
<h3><a name="Dynamic">Dynamic Changes in the CA Client Library Search
|
||||
Interval</a></h3>
|
||||
@@ -613,7 +613,7 @@ doubles the delay between name resolution attempts and reduces the number of
|
||||
requests per interval. The maximum delay between attempts is limited by
|
||||
EPICS_CA_MAX_SEARCH_PERIOD (see <a href="#Configurin3">Configuring the Maximum
|
||||
Search Period</a>). Note however that prior to R3.14.7, if the client library
|
||||
did not receive any responses over a long interval it stoped sending name
|
||||
did not receive any responses over a long interval it stopped sending name
|
||||
resolution attempts altogether until a beacon anomaly was detected (see
|
||||
below).</p>
|
||||
|
||||
@@ -688,7 +688,7 @@ the correct time zone. Nevertheless, several programs commonly used with EPICS
|
||||
still use the original "tssubr" library and therefore they still rely on proper
|
||||
configuration of EPICS_TS_MIN_WEST.</em></p>
|
||||
|
||||
<p>While the CA client library does not translate inbetween the local time and
|
||||
<p>While the CA client library does not translate between the local time and
|
||||
the time zone independent internal storage of EPICS time stamps, many EPICS
|
||||
client side applications call core EPICS libraries which provide these
|
||||
services. To set the correct time zone users must compute the number of
|
||||
@@ -954,7 +954,7 @@ and Windows systems.</p>
|
||||
<p></p>
|
||||
|
||||
<p>The above libraries are located in "<EPICS
|
||||
base>/lib/<architechture>".</p>
|
||||
base>/lib/<architecture>".</p>
|
||||
|
||||
<h3><a name="Compiler">Compiler and System Specific Build
|
||||
Options</a></h3>
|
||||
@@ -1556,7 +1556,7 @@ command line is used.</p>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>-t</td>
|
||||
<td>Terse mode - print only sucessfully written value, without name</td>
|
||||
<td>Terse mode - print only successfully written value, without name</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
@@ -1646,7 +1646,7 @@ etc.</p>
|
||||
<p>excas [options]</p>
|
||||
|
||||
<p>This is an example CA server that is sometimes used for testing purposes. An
|
||||
example server can be created with the makeBaseApp perl script, as descibed in
|
||||
example server can be created with the makeBaseApp Perl script, as described in
|
||||
the application Developer's Guide.</p>
|
||||
|
||||
<table border="1">
|
||||
@@ -1830,7 +1830,7 @@ the application Developer's Guide.</p>
|
||||
|
||||
<h3><a name="When">When Clients Do Not Connect to Their Server</a></h3>
|
||||
|
||||
<h4><a name="Broadcast">Client and Server Broadcast Addresses Dont
|
||||
<h4><a name="Broadcast">Client and Server Broadcast Addresses Don't
|
||||
Match</a></h4>
|
||||
|
||||
<p>Verify that the broadcast addresses are identical on the server's host and
|
||||
@@ -1880,10 +1880,10 @@ EPICS_CA_MAX_SEARCH_PERIOD to find that newly introduced server.</em> Also,
|
||||
starting with EPICS R3.14.7 the client library does <em>not</em> suspend
|
||||
searching for a channel after 100 unsuccessful attempts until a beacon anomaly
|
||||
is seen. Therefore, if the client library is from before version R3.14.7 of
|
||||
EPICS and it timed out attempting to find a server whoose beacon cant be seen
|
||||
EPICS and it timed out attempting to find a server whose beacon can't be seen
|
||||
by the client library then the client application might need to be restarted in
|
||||
order to connect to this new beacon-out-of-range server. The typical situation
|
||||
where a client would not see the server's beacon might be when the client isnt
|
||||
where a client would not see the server's beacon might be when the client isn't
|
||||
on the same IP subnet as the server, and the client's EPICS_CA_ADDR_LIST was
|
||||
modified to include a destination address for the server, but the server's
|
||||
beacon address list was not modified so that its beacons are received by the
|
||||
@@ -1898,7 +1898,7 @@ disconnected until TCP/IP's internal, typically long duration, keep alive timer
|
||||
expires. The disconnected channels remain attached to the beleaguered circuit
|
||||
and no attempt is made to search for, or to reestablish, a new circuit. If, at
|
||||
some time in the future, the circuit becomes responsive again, then the
|
||||
attached channels enter a connected state again and reconnect call back
|
||||
attached channels enter a connected state again and reconnect callback
|
||||
handlers are called. Any monitor subscriptions that received an update message
|
||||
while the channel was disconnected are also refreshed. If at any time the
|
||||
library receives an indication from the operating system that a beleaguered
|
||||
@@ -2294,7 +2294,7 @@ int main ( int argc, char ** argv )
|
||||
SEVCHK ( status, "ca_array_get()" );
|
||||
status = ca_pend_io ( 15.0 );
|
||||
if ( status != ECA_NORMAL ) {
|
||||
fprintf ( stderr, "\"%s\" didnt return a value.\n", argv[1] );
|
||||
fprintf ( stderr, "\"%s\" didn't return a value.\n", argv[1] );
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2320,7 +2320,7 @@ int main ( int argc, char ** argv )
|
||||
<h3><a name="User">User Supplied Callback Functions</a></h3>
|
||||
|
||||
<p>Certain CA client initiated requests asynchronously execute an application
|
||||
supplied call back in the client process when a response arrives. The functions
|
||||
supplied callback in the client process when a response arrives. The functions
|
||||
ca_put_callback, ca_get_callback, and ca_create_subscription all request notification of
|
||||
asynchronous completion via this mechanism. The <code>event_handler_args
|
||||
</code>structure is passed <em>by value</em> to the application supplied
|
||||
@@ -2328,8 +2328,8 @@ callback. In this structure the <code>dbr</code> field is a void pointer to any
|
||||
data that might be returned. The <code>status</code> field will be
|
||||
set to one of the CA error codes in caerr.h and will indicate the status of the
|
||||
operation performed in the IOC. If the status field isn't set to ECA_NORMAL or
|
||||
data isn't normally returned from the operation (i.e. put call back) then you
|
||||
should expect that the <code>dbr</code> field will be set to a nill pointer
|
||||
data isn't normally returned from the operation (i.e. put callback) then you
|
||||
should expect that the <code>dbr</code> field will be set to a null pointer
|
||||
(zero). The fields <code>usr</code>, <code>chid</code>, and <code>type</code>
|
||||
are set to the values specified when the request was made by the application.
|
||||
The "dbr" pointer, and any data that it points to, are valid only when
|
||||
@@ -2355,7 +2355,7 @@ void myCallback ( struct event_handler_args args )
|
||||
|
||||
<h3><a name="Channel1">Channel Access Exceptions</a></h3>
|
||||
|
||||
<p>When the server detects a failure, and there is no client call back function
|
||||
<p>When the server detects a failure, and there is no client callback function
|
||||
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
|
||||
@@ -2412,7 +2412,7 @@ method is best suited to toolkit components with long runtime duration. Use of
|
||||
<code><a href="#ca_state">ca_state</a></code> is appropriate only in programs
|
||||
that prefer to poll for connection state changes instead of opting for
|
||||
asynchronous notification. The <code>ca_pend_io</code> function blocks only for
|
||||
channels created specifying a nill connection handler callback function. The
|
||||
channels created specifying a null connection handler callback function. The
|
||||
user's connection state change function will be run immediately from within
|
||||
<code><a href="#ca_create_channel">ca_create_channel</a></code> if the CA
|
||||
client and CA server are both hosted within the same address space (within the
|
||||
@@ -2488,11 +2488,11 @@ both part of the same context.</p>
|
||||
<h3><a name="Polling">Polling the CA Client Library From Single Threaded
|
||||
Applications</a></h3>
|
||||
|
||||
<p>If preemptive call back is not enabled, then for proper operation CA must
|
||||
<p>If preemptive callback is not enabled, then for proper operation CA must
|
||||
periodically be polled to take care of background activity. This requires that
|
||||
your application must either wait in one of ca_pend_event(), ca_pend_io(), or
|
||||
ca_sg_block() or alternatively it must call ca_poll() at least every 100
|
||||
milli-seconds. In single threaded applications a file descriptor manager like
|
||||
milliseconds. In single threaded applications a file descriptor manager like
|
||||
Xt or the interface described in fdManager.h can be used to monitor both mouse
|
||||
clicks and also CA's file descriptors so that ca_poll() can be called
|
||||
immediately when CA server messages arrives over the network.</p>
|
||||
@@ -2558,8 +2558,8 @@ questionable practice for the following reasons.</p>
|
||||
<h3><a name="Calling1">Calling CA Functions from POSIX signal
|
||||
handlers</a></h3>
|
||||
|
||||
<p>As you might expect, it isnt safe to call the CA client library from a POSIX
|
||||
signal handler. Likewise, it isnt safe to call the CA client library from
|
||||
<p>As you might expect, it isn't safe to call the CA client library from a POSIX
|
||||
signal handler. Likewise, it isn't safe to call the CA client library from
|
||||
interrupt context.</p>
|
||||
<hr>
|
||||
|
||||
@@ -2690,7 +2690,7 @@ a connected state.</p>
|
||||
<ul>
|
||||
<li>The first and simplest method requires that you call ca_pend_io(), and
|
||||
wait for successful completion, prior to using a channel that was created
|
||||
specifying a nill connection call back function pointer.</li>
|
||||
specifying a null connection callback function pointer.</li>
|
||||
<li>The second method requires that you register a connection handler by
|
||||
supplying a valid connection callback function pointer. This connection
|
||||
handler is called whenever the connection state of the channel changes. If
|
||||
@@ -2703,7 +2703,7 @@ channel. Valid connections may be isolated from invalid ones with this function
|
||||
if ca_pend_io() times out.</p>
|
||||
|
||||
<p>Due to the inherently transient nature of network connections the order of
|
||||
connection call backs relative to the order that ca_create_channel() calls are
|
||||
connection callbacks relative to the order that ca_create_channel() calls are
|
||||
made by the application can't be guaranteed, and application programs may need
|
||||
to be prepared for a connected channel to enter a disconnected state at any
|
||||
time.</p>
|
||||
@@ -2724,9 +2724,9 @@ time.</p>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>USERFUNC</code></dt>
|
||||
<dd>Optional address of the user's call back function to be run when the
|
||||
<dd>Optional address of the user's callback function to be run when the
|
||||
connection state changes. Casual users of channel access may decide to
|
||||
set this field to nill or 0 if they do not need to have a call back
|
||||
set this field to null or 0 if they do not need to have a callback
|
||||
function run in response to each connection state change event.
|
||||
<p>The following structure is passed <em>by value </em>to the user's
|
||||
connection callback function. The <code>op</code> field will
|
||||
@@ -2746,7 +2746,7 @@ time.</p>
|
||||
<dd>The value of this void pointer argument is retained in
|
||||
storage associated with the specified channel. See the MACROS manual page
|
||||
for reading and writing this field. Casual users of channel access may
|
||||
wish to set this field to nill or 0.</dd>
|
||||
wish to set this field to null or 0.</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>PRIORITY</code></dt>
|
||||
@@ -2832,14 +2832,14 @@ unless the request can not be fulfilled in the server. If unsuccessful an
|
||||
exception handler is run on the client side.</p>
|
||||
|
||||
<p>When ca_put_callback or ca_array_put_callback are invoked the user supplied
|
||||
asynchronous call back is called only after the initiated write operation, and
|
||||
asynchronous callback is called only after the initiated write operation, and
|
||||
all actions resulting from the initiating write operation, complete.</p>
|
||||
|
||||
<p>If unsuccessful the call back function is invoked indicating failure status.
|
||||
<p>If unsuccessful the callback function is invoked indicating failure status.
|
||||
</p>
|
||||
|
||||
<p>If the channel disconnects before a put callback request can be completed,
|
||||
then the client's call back function is called with failure status, but this
|
||||
then the client's callback function is called with failure status, but this
|
||||
does not guarantee that the server did not receive and process the request
|
||||
before the disconnect. If a connection is lost and then resumed outstanding ca
|
||||
put requests are not automatically reissued following reconnect.</p>
|
||||
@@ -2961,7 +2961,7 @@ requests are not automatically reissued following reconnect.</p>
|
||||
from the channel and then the user's callback is invoked with a pointer to the
|
||||
retrieved value. Note that ca_pend_io will not block for the delivery of values
|
||||
requested by ca_get_callback. If the channel disconnects before a ca get
|
||||
callback request can be completed, then the clients call back function is
|
||||
callback request can be completed, then the clients callback function is
|
||||
called with failure status.</p>
|
||||
|
||||
<p>All of these functions return ECA_DISCONN if the channel is currently
|
||||
@@ -3013,7 +3013,7 @@ when a CA get request is initiated.</p>
|
||||
<dl>
|
||||
<dt><code>USERARG</code></dt>
|
||||
<dd>Pointer sized variable retained and then passed back to user supplied
|
||||
call back function above.</dd>
|
||||
callback function above.</dd>
|
||||
</dl>
|
||||
|
||||
<h4>Returns</h4>
|
||||
@@ -3052,7 +3052,7 @@ int ca_create_subscription ( chtype TYPE, unsigned long COUNT,
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Register a state change subscription and specify a call back function to be
|
||||
<p>Register a state change subscription and specify a callback function to be
|
||||
invoked whenever the process variable undergoes significant state changes. A
|
||||
significant change can be a change in the process variable's value, alarm
|
||||
status, or alarm severity. In the process control function block database the
|
||||
@@ -3080,7 +3080,7 @@ or ca_sg_pend are called. This allows several requests to be efficiently sent
|
||||
over the network in one message.</p>
|
||||
|
||||
<p>If at any time after subscribing, read access to the specified process
|
||||
variable is lost, then the call back will be invoked immediately indicating
|
||||
variable is lost, then the callback will be invoked immediately indicating
|
||||
that read access was lost via the status argument. When read access is restored
|
||||
normal event processing will resume starting always with at least one update
|
||||
indicating the current state of the channel.</p>
|
||||
@@ -3094,7 +3094,7 @@ indicating the current state of the channel.</p>
|
||||
<h4>Arguments</h4>
|
||||
<dl>
|
||||
<dt><code>TYPE</code></dt>
|
||||
<dd>The type of value presented to the call back funstion. Conversion will
|
||||
<dd>The type of value presented to the callback function. Conversion will
|
||||
occur if it does not match native type. Specify one from the set of
|
||||
DBR_XXXX in db_access.h</dd>
|
||||
</dl>
|
||||
@@ -3125,7 +3125,7 @@ indicating the current state of the channel.</p>
|
||||
<dt><code>PEVID</code></dt>
|
||||
<dd>This is a pointer to user supplied event id which is overwritten if
|
||||
successful. This event id can later be used to clear a specific event.
|
||||
This option may be omitted by passing a nill pointer.</dd>
|
||||
This option may be omitted by passing a null pointer.</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>MASK</code></dt>
|
||||
@@ -3202,12 +3202,12 @@ int ca_pend_io ( double TIMEOUT );</pre>
|
||||
|
||||
<p>This function flushes the send buffer and then blocks until outstanding <a
|
||||
href="#ca_get">ca_get</a> requests complete, and until channels created
|
||||
specifying nill connection handler function pointers connect for the first
|
||||
specifying null connection handler function pointers connect for the first
|
||||
time.</p>
|
||||
<ul>
|
||||
<li>If ECA_NORMAL is returned then it can be safely assumed that all
|
||||
outstanding <a href="#ca_get">ca_get</a> requests have completed
|
||||
successfully and channels created specifying nill connection handler
|
||||
successfully and channels created specifying null connection handler
|
||||
function pointers have connected for the first time.</li>
|
||||
<li>If ECA_TIMEOUT is returned then it must be assumed for all previous <a
|
||||
href="#ca_get">ca_get</a> requests and properly qualified first time
|
||||
@@ -3217,7 +3217,7 @@ time.</p>
|
||||
<p>If ECA_TIMEOUT is returned then get requests may be reissued followed by a
|
||||
subsequent call to ca_pend_io(). Specifically, the function will block only for
|
||||
outstanding <a href="#ca_get">ca_get</a> requests issued, and also any channels
|
||||
created specifying a nill connection handler function pointer, after the last
|
||||
created specifying a null connection handler function pointer, after the last
|
||||
call to ca_pend_io() or ca client context creation whichever is later. Note
|
||||
that <a href="#ca_create_channel">ca_create_channel</a> requests generally
|
||||
should not be reissued for the same process variable unless <a
|
||||
@@ -3247,7 +3247,7 @@ are pending.</p>
|
||||
|
||||
<p>ECA_NORMAL - Normal successful completion</p>
|
||||
|
||||
<p>ECA_TIMEOUT - Selected IO requests didnt complete before specified
|
||||
<p>ECA_TIMEOUT - Selected IO requests didn't complete before specified
|
||||
timeout</p>
|
||||
|
||||
<p>ECA_EVDISALLOW - Function inappropriate for use within an event handler</p>
|
||||
@@ -3267,10 +3267,10 @@ int ca_test_io();</pre>
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>This function tests to see if all <a href="#ca_get">ca_get</a> requests are
|
||||
complete and channels created specifying a nill connection callback function
|
||||
complete and channels created specifying a null connection callback function
|
||||
pointer are connected. It will report the status of outstanding <a
|
||||
href="#ca_get">ca_get</a> requests issued, and channels created specifying a
|
||||
nill connection callback function pointer, after the last call to ca_pend_io()
|
||||
null connection callback function pointer, after the last call to ca_pend_io()
|
||||
or CA context initialization whichever is later.</p>
|
||||
|
||||
<h4>Returns</h4>
|
||||
@@ -3320,7 +3320,7 @@ Code</a>.</p>
|
||||
|
||||
<p>ECA_TIMEOUT - The operation timed out</p>
|
||||
|
||||
<p>ECA_EVDISALLOW - Function inappropriate for use within a call back
|
||||
<p>ECA_EVDISALLOW - Function inappropriate for use within a callback
|
||||
handler</p>
|
||||
|
||||
<h3><code><a name="ca_flush_io">ca_flush_io()</a></code></h3>
|
||||
@@ -3389,8 +3389,7 @@ int ca_add_exception_event ( pCallback USERFUNC, void *USERARG );</pre>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Replace the currently installed CA context global exception handler call
|
||||
back.</p>
|
||||
<p>Replace the currently installed CA context global exception handler callback.</p>
|
||||
|
||||
<p>When an error occurs in the server asynchronous to the clients thread then
|
||||
information about this type of error is passed from the server to the client in
|
||||
@@ -3409,14 +3408,14 @@ field should not be used.</p>
|
||||
<dl>
|
||||
<dt><code>USERFUNC</code></dt>
|
||||
<dd>Address of user callback function to be executed when an exceptions
|
||||
occur. Passing a nill value causes the default exception handler to be
|
||||
occur. Passing a null value causes the default exception handler to be
|
||||
reinstalled. The following structure is passed by value to the user's
|
||||
callback function. Currently, the <code>op</code> field can be one of
|
||||
<code>CA_OP_GET, CA_OP_PUT, CA_OP_CREATE_CHANNEL, CA_OP_ADD_EVENT,
|
||||
CA_OP_CLEAR_EVENT, or CA_OP_OTHER.</code>
|
||||
<pre>struct exception_handler_args {
|
||||
void *usr; /* user argument supplied when installed */
|
||||
chanId chid; /* channel id (may be nill) */
|
||||
chanId chid; /* channel id (may be null) */
|
||||
long type; /* type requested */
|
||||
long count; /* count requested */
|
||||
void *addr; /* user's address to write results of CA_OP_GET */
|
||||
@@ -3543,9 +3542,9 @@ default handler uses fprintf to send messages to 'stderr'.</p>
|
||||
<h4>Arguments</h4>
|
||||
<dl>
|
||||
<dt><code>PFUNC</code></dt>
|
||||
<dd>The address of a user supplied call back handler to be invoked when CA
|
||||
prints diagnostic messages. Installing a nill pointer will cause the
|
||||
default call back handler to be reinstalled.</dd>
|
||||
<dd>The address of a user supplied callback handler to be invoked when CA
|
||||
prints diagnostic messages. Installing a null pointer will cause the
|
||||
default callback handler to be reinstalled.</dd>
|
||||
</dl>
|
||||
|
||||
<h4>Examples</h4>
|
||||
@@ -3577,7 +3576,7 @@ specified channel.</p>
|
||||
<li>whenever CA connects the channel immediately before the channel's
|
||||
connection handler is called</li>
|
||||
<li>whenever CA disconnects the channel immediately after the channel's
|
||||
disconnect call back is called</li>
|
||||
disconnect callback is called</li>
|
||||
<li>once immediately after installation if the channel is connected.</li>
|
||||
<li>whenever the access rights state of a connected channel changes</li>
|
||||
</ul>
|
||||
@@ -3591,7 +3590,7 @@ specified channel.</p>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><code>PFUNC</code></dt>
|
||||
<dd>Address of user supplied call back function. A nill pointer uninstalls
|
||||
<dd>Address of 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.
|
||||
<pre>typedef struct ca_access_rights {
|
||||
@@ -3929,7 +3928,7 @@ type.</p>
|
||||
<h4>Description</h4>
|
||||
<pre>void ca_test_event ( struct event_handler_args );</pre>
|
||||
|
||||
<p>A built-in subscription update call back handler for debugging purposes that
|
||||
<p>A built-in subscription update callback handler for debugging purposes that
|
||||
prints diagnostics to standard out.</p>
|
||||
|
||||
<h4>Examples</h4>
|
||||
@@ -4285,7 +4284,7 @@ ca_client_status() prints information about the calling threads CA context.</p>
|
||||
|
||||
<h4>Description</h4>
|
||||
|
||||
<p>Returns a pointer to the current thread's CA context. If none then nill is
|
||||
<p>Returns a pointer to the current thread's CA context. If none then null is
|
||||
returned.</p>
|
||||
|
||||
<h4>See Also</h4>
|
||||
|
||||
@@ -95,8 +95,8 @@ CA - Perl 5 interface to EPICS Channel Access
|
||||
} else {
|
||||
printf " Value: %g\n", $data->{value};
|
||||
printf " Severity: %s\n", $data->{severity};
|
||||
printf " Timestamp: %d.%09d\n",
|
||||
$data->{stamp}, $data->{stamp_fraction};
|
||||
printf " Timestamp: %.6f\n",
|
||||
$data->{stamp} + $data->{stamp_fraction};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@ C<die> with an exception object in the callback and catch that using C<eval> in
|
||||
the main thread are not likely to succeed and will probably result in a crash.
|
||||
Callbacks should not perform any operations that would block for more than a
|
||||
fraction of a second as this will hold up network communications with the
|
||||
relevent server and could cause the Perl program and/or the Channel Access
|
||||
relevant server and could cause the Perl program and/or the Channel Access
|
||||
server to crash. Calling C<< CA->pend_event >> from within a callback is not
|
||||
permitted by the underlying Channel Access library.
|
||||
|
||||
@@ -291,7 +291,7 @@ apply to the callback subroutine as described in C<get_callback> above.
|
||||
|
||||
=item put_acks( I<SEVR>, I<SUB> )
|
||||
|
||||
Applications that need to ackowledge alarms by doing a C<ca_put()> with type
|
||||
Applications that need to acknowledge alarms by doing a C<ca_put()> with type
|
||||
C<DBR_PUT_ACKS> can do so using the C<put_acks> method. The severity argument
|
||||
may be provided as an integer from zero through three or as a string containing
|
||||
one of the corresponding EPICS severity names C<NO_ALARM>, C<MINOR>, C<MAJOR> or
|
||||
@@ -338,11 +338,12 @@ The data provided to a callback function registered with either C<get_callback>
|
||||
or C<create_subscription> can be a scalar value or a reference to an array or a
|
||||
hash, depending on the data type that was used for the data transfer. If the
|
||||
request was for a single item of one of the basic data types, the data argument
|
||||
will be a perl scalar that holds the value directly. If the request was for
|
||||
will be a Perl scalar that holds the value directly. If the request was for
|
||||
multiple items of one of the basic types, the data argument will be a reference
|
||||
to an array holding the data. There is one exception though; if the data type
|
||||
requested was for an array of C<DBF_CHAR> values that array will be represented
|
||||
as a single Perl string contining all the characters before the first zero byte.
|
||||
as a single Perl string containing all the characters before the first zero
|
||||
byte.
|
||||
|
||||
If the request was for one of the compound data types, the data argument will be
|
||||
a reference to a hash with keys as described below. Keys that are not classed
|
||||
@@ -368,7 +369,7 @@ widened from the original type used to request or subscribe for the data.
|
||||
The number of elements in the data returned by the server. If the data type is
|
||||
C<DBF_CHAR> the value given for C<COUNT> is the number of bytes (including any
|
||||
trailing zeros) returned by the server, although the value field is given as a
|
||||
Perl string contining all the characters before the first zero byte.
|
||||
Perl string containing all the characters before the first zero byte.
|
||||
|
||||
=back
|
||||
|
||||
@@ -430,7 +431,7 @@ Present only when I<TYPE> is C<DBR_GR_ENUM> or C<DBR_CTRL_ENUM>.
|
||||
=item stamp
|
||||
|
||||
The process variable timestamp, converted to a local C<time_t>. This value is
|
||||
suitable for passing to the perl C<localtime> or C<gmtime> functions.
|
||||
suitable for passing to the Perl C<localtime> or C<gmtime> functions.
|
||||
|
||||
Present only when I<TYPE> is C<DBR_TIME_yyy>.
|
||||
|
||||
@@ -633,15 +634,15 @@ passing C<undef> as the subroutine reference.
|
||||
|
||||
Errors in using the library will be indicated by the module throwing an
|
||||
exception, i.e. calling C<croak()> with an appropriate error message. These
|
||||
exceptions can be caught using the standard Parl C<eval {}> statement and
|
||||
exceptions can be caught using the standard Perl C<eval {}> statement and
|
||||
testing the C<$@> variable afterwards; if not caught, they will cause the
|
||||
running program to C<die> with an appropriate error message pointing to the
|
||||
program line that called the C<CA> library.
|
||||
|
||||
Errors messages reported by the underlying CA client library all start with the
|
||||
Error messages reported by the underlying CA client library all start with the
|
||||
string C<ECA_> and the remainder of the symbol for the associated CA error
|
||||
number, and are followed after a space-hyphen-space by a human-readable message
|
||||
describing the error. Errors that are detected by the perl interface layer do
|
||||
describing the error. Errors that are detected by the Perl interface layer do
|
||||
not follow this pattern, but are still printable strings.
|
||||
|
||||
|
||||
|
||||
@@ -954,16 +954,18 @@ SV * CA_create_subscription(SV *ca_ref, const char *mask_str, SV *sub, ...) {
|
||||
|
||||
dbr_text_to_type(treq, type);
|
||||
if (type < 0) {
|
||||
croak_msg = "Unknown data type";
|
||||
croak_msg = "Unknown CA data type";
|
||||
goto exit_croak;
|
||||
}
|
||||
if (type == DBR_PUT_ACKT ||
|
||||
type == DBR_PUT_ACKS) {
|
||||
croak_msg = "DBR_PUT_ACK types are write-only";
|
||||
goto exit_croak;
|
||||
} else if (type == DBR_CLASS_NAME ||
|
||||
} else if (type == DBR_GR_ENUM ||
|
||||
type == DBR_CTRL_ENUM ||
|
||||
type == DBR_CLASS_NAME ||
|
||||
type == DBR_STSACK_STRING)
|
||||
/* These break the dbr_type_is macros */ ;
|
||||
/* These above types are supported */ ;
|
||||
else if (dbr_type_is_SHORT(type))
|
||||
type += (DBR_LONG - DBR_SHORT);
|
||||
else if (dbr_type_is_FLOAT(type))
|
||||
|
||||
@@ -160,11 +160,21 @@ char *val2str (const void *v, unsigned type, int index)
|
||||
case DBR_ENUM:
|
||||
{
|
||||
dbr_enum_t *val = (dbr_enum_t *)val_ptr;
|
||||
if (dbr_type_is_GR(type) && !enumAsNr)
|
||||
sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]);
|
||||
else if (dbr_type_is_CTRL(type) && !enumAsNr)
|
||||
sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]);
|
||||
else
|
||||
if (dbr_type_is_GR(type) && !enumAsNr) {
|
||||
if (val[index] >= MAX_ENUM_STATES)
|
||||
sprintf(str, "Illegal Value (%d)", val[index]);
|
||||
else if (val[index] >= ((struct dbr_gr_enum *)v)->no_str)
|
||||
sprintf(str, "Enum Index Overflow (%d)", val[index]);
|
||||
else
|
||||
sprintf(str, "%s", ((struct dbr_gr_enum *)v)->strs[val[index]]);
|
||||
} else if (dbr_type_is_CTRL(type) && !enumAsNr) {
|
||||
if (val[index] >= MAX_ENUM_STATES)
|
||||
sprintf(str, "Illegal Value (%d)", val[index]);
|
||||
else if (val[index] >= ((struct dbr_ctrl_enum *)v)->no_str)
|
||||
sprintf(str, "Enum Index Overflow (%d)", val[index]);
|
||||
else
|
||||
sprintf(str, "%s", ((struct dbr_ctrl_enum *)v)->strs[val[index]]);
|
||||
} else
|
||||
sprintf(str, "%d", val[index]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,9 @@ int epicsStrnRawFromEscaped(char *to, size_t outsize, const char *from,
|
||||
char c;
|
||||
size_t nto = 0, nfrom = 0;
|
||||
|
||||
if (outsize == 0)
|
||||
return 0;
|
||||
|
||||
while ((c = *pfrom++) && nto < outsize && nfrom < inlen) {
|
||||
nfrom++;
|
||||
if (c == '\\') {
|
||||
@@ -100,7 +103,9 @@ int epicsStrnRawFromEscaped(char *to, size_t outsize, const char *from,
|
||||
*pto++ = c; nto++;
|
||||
}
|
||||
}
|
||||
*pto = '\0'; /* NOTE that nto does not have to be incremented */
|
||||
if (nto == outsize)
|
||||
pto--;
|
||||
*pto = '\0';
|
||||
return nto;
|
||||
}
|
||||
|
||||
|
||||
@@ -84,9 +84,11 @@ MAIN(epicsStringTest)
|
||||
const char * const a = "a";
|
||||
const char * const abcd = "abcd";
|
||||
const char * const abcde = "abcde";
|
||||
char result[8];
|
||||
char *s;
|
||||
int status;
|
||||
|
||||
testPlan(305);
|
||||
testPlan(323);
|
||||
|
||||
testChars();
|
||||
|
||||
@@ -123,5 +125,41 @@ MAIN(epicsStringTest)
|
||||
|
||||
testGlob();
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnEscapedFromRaw(result, 4, ABCD, 3);
|
||||
testOk(status == 3, "epicsStrnEscapedFromRaw returned %d (exp. 3)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnEscapedFromRaw(result, 4, ABCD, 4);
|
||||
testOk(status == 4, "epicsStrnEscapedFromRaw returned %d (exp. 4)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnEscapedFromRaw(result, 4, ABCDE, 5);
|
||||
testOk(status == 5, "epicsStrnEscapedFromRaw returned %d (exp. 5)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnEscapedFromRaw no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnEscapedFromRaw 0-terminated");
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnRawFromEscaped(result, 4, ABCD, 3);
|
||||
testOk(status == 3, "epicsStrnRawFromEscaped returned %d (exp. 3)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnRawFromEscaped(result, 4, ABCD, 4);
|
||||
testOk(status == 4, "epicsStrnRawFromEscaped returned %d (exp. 4)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
|
||||
|
||||
memset(result, 'x', sizeof(result));
|
||||
status = epicsStrnRawFromEscaped(result, 4, ABCDE, 5);
|
||||
testOk(status == 4, "epicsStrnRawFromEscaped returned %d (exp. 4)", status);
|
||||
testOk(result[4] == 'x', "epicsStrnRawFromEscaped no buffer overrun");
|
||||
testOk(result[3] == 0, "epicsStrnRawFromEscaped 0-terminated");
|
||||
|
||||
return testDone();
|
||||
}
|
||||
|
||||
@@ -52,6 +52,8 @@ TEMPLATES += top/exampleBoot/nfsCommands@RTEMS
|
||||
TEMPLATES += top/exampleBoot/ioc/Makefile@Common
|
||||
TEMPLATES += top/exampleBoot/ioc/Makefile@vxWorks
|
||||
TEMPLATES += top/exampleBoot/ioc/Makefile@win32
|
||||
TEMPLATES += top/exampleBoot/ioc/Makefile@windows
|
||||
TEMPLATES += top/exampleBoot/ioc/Makefile@cygwin
|
||||
TEMPLATES += top/exampleBoot/ioc/st.cmd@Common
|
||||
TEMPLATES += top/exampleBoot/ioc/st.cmd@vxWorks
|
||||
TEMPLATES += top/exampleBoot/ioc/st.cmd@RTEMS
|
||||
@@ -81,6 +83,8 @@ TEMPLATES += top/iocBoot/nfsCommands@RTEMS
|
||||
TEMPLATES += top/iocBoot/ioc/Makefile@Common
|
||||
TEMPLATES += top/iocBoot/ioc/Makefile@vxWorks
|
||||
TEMPLATES += top/iocBoot/ioc/Makefile@win32
|
||||
TEMPLATES += top/iocBoot/ioc/Makefile@windows
|
||||
TEMPLATES += top/iocBoot/ioc/Makefile@cygwin
|
||||
TEMPLATES += top/iocBoot/ioc/st.cmd@Common
|
||||
TEMPLATES += top/iocBoot/ioc/st.cmd@Cross
|
||||
TEMPLATES += top/iocBoot/ioc/st.cmd@vxWorks
|
||||
|
||||
5
src/template/base/top/exampleBoot/ioc/Makefile@cygwin
Normal file
5
src/template/base/top/exampleBoot/ioc/Makefile@cygwin
Normal file
@@ -0,0 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = _ARCH_
|
||||
TARGETS = envPaths relPaths.sh
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
5
src/template/base/top/exampleBoot/ioc/Makefile@windows
Normal file
5
src/template/base/top/exampleBoot/ioc/Makefile@windows
Normal file
@@ -0,0 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = _ARCH_
|
||||
TARGETS = envPaths dllPath.bat
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
5
src/template/base/top/iocBoot/ioc/Makefile@cygwin
Normal file
5
src/template/base/top/iocBoot/ioc/Makefile@cygwin
Normal file
@@ -0,0 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = _ARCH_
|
||||
TARGETS = envPaths relPaths.sh
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
5
src/template/base/top/iocBoot/ioc/Makefile@windows
Normal file
5
src/template/base/top/iocBoot/ioc/Makefile@windows
Normal file
@@ -0,0 +1,5 @@
|
||||
TOP = ../..
|
||||
include $(TOP)/configure/CONFIG
|
||||
ARCH = _ARCH_
|
||||
TARGETS = envPaths dllPath.bat
|
||||
include $(TOP)/configure/RULES.ioc
|
||||
@@ -82,6 +82,7 @@ expandRelease(\%macros, \@apps);
|
||||
for ($outfile) {
|
||||
m/releaseTops/ and do { &releaseTops; last; };
|
||||
m/dllPath\.bat/ and do { &dllPath; last; };
|
||||
m/relPaths\.sh/ and do { &relPaths; last; };
|
||||
m/cdCommands/ and do { &cdCommands; last; };
|
||||
m/envPaths/ and do { &envPaths; last; };
|
||||
m/checkRelease/ and do { &checkRelease; last; };
|
||||
@@ -96,7 +97,8 @@ sub HELP_MESSAGE {
|
||||
Usage: convertRelease.pl [-a arch] [-T top] [-t ioctop] outfile
|
||||
where outfile is one of:
|
||||
releaseTops - lists the module names defined in RELEASE*s
|
||||
dllPath.bat - path changes for cmd.exe to find WIN32 DLLs
|
||||
dllPath.bat - path changes for cmd.exe to find Windows DLLs
|
||||
relPaths.sh - path changes for bash to add RELEASE bin dir's
|
||||
cdCommands - generate cd path strings for vxWorks IOCs
|
||||
envPaths - generate epicsEnvSet commands for other IOCs
|
||||
checkRelease - checks consistency with support modules
|
||||
@@ -113,13 +115,21 @@ sub releaseTops {
|
||||
}
|
||||
|
||||
#
|
||||
# Generate Path files so Windows can find our DLLs
|
||||
# Generate Path files so Windows/Cygwin can find our DLLs
|
||||
#
|
||||
sub dllPath {
|
||||
unlink $outfile;
|
||||
open(OUT, ">$outfile") or die "$! creating $outfile";
|
||||
print OUT "\@ECHO OFF\n";
|
||||
print OUT "PATH %PATH%;", join(';', binDirs()), "\n";
|
||||
print OUT "PATH \%PATH\%;", join(';', binDirs()), "\n";
|
||||
close OUT;
|
||||
}
|
||||
|
||||
sub relPaths {
|
||||
unlink $outfile;
|
||||
open(OUT, ">$outfile") or die "$! creating $outfile";
|
||||
print OUT "export PATH=\$PATH:",
|
||||
join(':', map {m/\s/ ? "\"$_\"" : $_ } binDirs()), "\n";
|
||||
close OUT;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user