Merge branch '7.0' release 7.4.0.1 into PSI-7.0

Conflicts:
	.gitmodules
	modules/database/src/ioc/db/Makefile
	modules/libcom/test/epicsAtomicTest.cpp
	modules/pvAccess
	modules/pvData
	modules/pvDatabase
	modules/pva2pva
This commit is contained in:
2020-06-02 14:55:30 +02:00
868 changed files with 33281 additions and 27367 deletions

View File

@@ -18,7 +18,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "syncGroup.h"
#include "oldAccess.h"
@@ -83,7 +82,7 @@ int CASG::block (
return ECA_TIMEOUT;
}
cur_time = epicsTime::getMonotonic ();
cur_time = epicsTime::getCurrent ();
this->client.flush ( guard );
@@ -121,7 +120,7 @@ int CASG::block (
/*
* force a time update
*/
cur_time = epicsTime::getMonotonic ();
cur_time = epicsTime::getCurrent ();
delay = cur_time - beg_time;
}
@@ -209,23 +208,23 @@ bool CASG::ioComplete (
return this->ioPendingList.count () == 0u;
}
void CASG::put ( epicsGuard < epicsMutex > & guard, chid pChan,
void CASG::put ( epicsGuard < epicsMutex > & guard, chid pChan,
unsigned type, arrayElementCount count, const void * pValue )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
sgAutoPtr < syncGroupWriteNotify > pNotify ( guard, *this );
pNotify = syncGroupWriteNotify::factory (
pNotify = syncGroupWriteNotify::factory (
this->freeListWriteOP, *this, & CASG :: recycleWriteNotifyIO, pChan );
pNotify->begin ( guard, type, count, pValue );
pNotify.release ();
}
void CASG::get ( epicsGuard < epicsMutex > & guard, chid pChan,
void CASG::get ( epicsGuard < epicsMutex > & guard, chid pChan,
unsigned type, arrayElementCount count, void *pValue )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
sgAutoPtr < syncGroupReadNotify > pNotify ( guard, *this );
pNotify = syncGroupReadNotify::factory (
pNotify = syncGroupReadNotify::factory (
this->freeListReadOP, *this, & CASG :: recycleReadNotifyIO, pChan, pValue );
pNotify->begin ( guard, type, count );
pNotify.release ();
@@ -242,14 +241,14 @@ void CASG::completionNotify (
}
}
void CASG :: recycleReadNotifyIO ( epicsGuard < epicsMutex > & guard,
void CASG :: recycleReadNotifyIO ( epicsGuard < epicsMutex > & guard,
syncGroupReadNotify & io )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );
this->freeListReadOP.release ( & io );
}
void CASG :: recycleWriteNotifyIO ( epicsGuard < epicsMutex > & guard,
void CASG :: recycleWriteNotifyIO ( epicsGuard < epicsMutex > & guard,
syncGroupWriteNotify & io )
{
guard.assertIdenticalMutex ( this->client.mutexRef() );

View File

@@ -26,7 +26,13 @@ INC += cacIO.h
INC += caDiagnostics.h
INC += net_convert.h
INC += caVersion.h
INC += caVersionNum.h
EXPAND_COMMON += caVersion.h@
EXPAND_ME += EPICS_CA_MAJOR_VERSION
EXPAND_ME += EPICS_CA_MINOR_VERSION
EXPAND_ME += EPICS_CA_MAINTENANCE_VERSION
EXPAND_ME += EPICS_CA_DEVELOPMENT_FLAG
LIBSRCS += cac.cpp
LIBSRCS += cacChannel.cpp
@@ -74,6 +80,9 @@ LIBSRCS += hostNameCache.cpp
LIBSRCS += msgForMultiplyDefinedPV.cpp
LIBSRCS_vxWorks += templateInstances.cpp
API_HEADER = libCaAPI.h
ca_API = libCa
LIBRARY=ca
ca_RCS = ca.rc
@@ -118,20 +127,7 @@ ca_test_SYS_LIBS_WIN32 = ws2_32 advapi32 user32
OBJS_vxWorks += ca_test
EXPANDVARS += EPICS_CA_MAJOR_VERSION
EXPANDVARS += EPICS_CA_MINOR_VERSION
EXPANDVARS += EPICS_CA_MAINTENANCE_VERSION
EXPANDVARS += EPICS_CA_DEVELOPMENT_FLAG
EXPANDFLAGS += $(foreach var,$(EXPANDVARS),-D$(var)="$(strip $($(var)))")
# shared library ABI version.
SHRLIB_VERSION = $(EPICS_CA_MAJOR_VERSION).$(EPICS_CA_MINOR_VERSION).$(EPICS_CA_MAINTENANCE_VERSION)
include $(TOP)/configure/RULES
# Can't use EXPAND as generated headers must appear
# in O.Common, but EXPAND emits rules for O.$(T_A)
../O.Common/caVersionNum.h: ../caVersionNum.h@
$(EXPAND_TOOL) $(EXPANDFLAGS) $($@_EXPANDFLAGS) $< $@

View File

@@ -5,11 +5,11 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef SearchDest_h
#define SearchDest_h
#ifndef INC_SearchDest_H
#define INC_SearchDest_H
#include <osiSock.h>
#include <epicsTime.h>
@@ -28,7 +28,7 @@ struct SearchDest :
virtual void notify (
const caHdr & msg, const void * pPayload,
const osiSockAddr & addr, const epicsTime & ) = 0;
virtual void show (
virtual void show (
epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
virtual void searchRequest ( epicsGuard < epicsMutex > &,
@@ -36,4 +36,4 @@ struct SearchDest :
virtual void show ( epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
#endif // SearchDest_h
#endif // ifndef INC_SearchDest_H

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
@@ -40,7 +39,6 @@
*/
#define CAC_VERSION_GLOBAL
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
@@ -165,13 +163,13 @@ int fetchClientContext ( ca_client_context **ppcac )
* ca_task_initialize ()
*/
// extern "C"
int epicsShareAPI ca_task_initialize ( void )
int epicsStdCall ca_task_initialize ( void )
{
return ca_context_create ( ca_disable_preemptive_callback );
}
// extern "C"
int epicsShareAPI ca_context_create (
int epicsStdCall ca_context_create (
ca_preemptive_callback_select premptiveCallbackSelect )
{
ca_client_context *pcac;
@@ -183,19 +181,19 @@ int epicsShareAPI ca_context_create (
}
pcac = ( ca_client_context * ) epicsThreadPrivateGet ( caClientContextId );
if ( pcac ) {
if ( pcac ) {
if ( premptiveCallbackSelect == ca_enable_preemptive_callback &&
! pcac->preemptiveCallbakIsEnabled() ) {
return ECA_NOTTHREADED;
}
return ECA_NORMAL;
}
return ECA_NORMAL;
}
pcac = new ca_client_context (
premptiveCallbackSelect == ca_enable_preemptive_callback );
if ( ! pcac ) {
return ECA_ALLOCMEM;
}
if ( ! pcac ) {
return ECA_ALLOCMEM;
}
epicsThreadPrivateSet ( caClientContextId, (void *) pcac );
}
@@ -211,7 +209,7 @@ int epicsShareAPI ca_context_create (
// defunct
//
// extern "C"
int epicsShareAPI ca_modify_host_name ( const char * )
int epicsStdCall ca_modify_host_name ( const char * )
{
return ECA_NORMAL;
}
@@ -222,7 +220,7 @@ int epicsShareAPI ca_modify_host_name ( const char * )
// defunct
//
// extern "C"
int epicsShareAPI ca_modify_user_name ( const char * )
int epicsStdCall ca_modify_user_name ( const char * )
{
return ECA_NORMAL;
}
@@ -231,7 +229,7 @@ int epicsShareAPI ca_modify_user_name ( const char * )
// ca_context_destroy ()
//
// extern "C"
void epicsShareAPI ca_context_destroy ()
void epicsStdCall ca_context_destroy ()
{
ca_client_context *pcac;
@@ -250,7 +248,7 @@ void epicsShareAPI ca_context_destroy ()
* releases all resources alloc to a channel access client
*/
// extern "C"
int epicsShareAPI ca_task_exit ()
int epicsStdCall ca_task_exit ()
{
ca_context_destroy ();
return ECA_NORMAL;
@@ -263,7 +261,7 @@ int epicsShareAPI ca_task_exit ()
* backwards compatible entry point to ca_search_and_connect()
*/
// extern "C"
int epicsShareAPI ca_build_and_connect ( const char *name_str, chtype get_type,
int epicsStdCall ca_build_and_connect ( const char *name_str, chtype get_type,
arrayElementCount get_count, chid * chan, void *pvalue,
caCh *conn_func, void *puser )
{
@@ -278,7 +276,7 @@ int epicsShareAPI ca_build_and_connect ( const char *name_str, chtype get_type,
* ca_search_and_connect()
*/
// extern "C"
int epicsShareAPI ca_search_and_connect (
int epicsStdCall ca_search_and_connect (
const char * name_str, chid * chanptr,
caCh * conn_func, void * puser )
{
@@ -287,7 +285,7 @@ int epicsShareAPI ca_search_and_connect (
}
// extern "C"
int epicsShareAPI ca_create_channel (
int epicsStdCall ca_create_channel (
const char * name_str, caCh * conn_func, void * puser,
capri priority, chid * chanptr )
{
@@ -362,7 +360,7 @@ int epicsShareAPI ca_create_channel (
* its context
*/
// extern "C"
int epicsShareAPI ca_clear_channel ( chid pChan )
int epicsStdCall ca_clear_channel ( chid pChan )
{
ca_client_context & cac = pChan->getClientCtx ();
{
@@ -401,7 +399,7 @@ int epicsShareAPI ca_clear_channel ( chid pChan )
* Specify an event subroutine to be run for asynch exceptions
*/
// extern "C"
int epicsShareAPI ca_add_exception_event ( caExceptionHandler *pfunc, void *arg )
int epicsStdCall ca_add_exception_event ( caExceptionHandler *pfunc, void *arg )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -417,7 +415,7 @@ int epicsShareAPI ca_add_exception_event ( caExceptionHandler *pfunc, void *arg
/*
* ca_add_masked_array_event
*/
int epicsShareAPI ca_add_masked_array_event (
int epicsStdCall ca_add_masked_array_event (
chtype type, arrayElementCount count, chid pChan,
caEventCallBackFunc *pCallBack, void *pCallBackArg,
ca_real, ca_real, ca_real,
@@ -430,19 +428,19 @@ int epicsShareAPI ca_add_masked_array_event (
/*
* ca_clear_event ()
*/
int epicsShareAPI ca_clear_event ( evid pMon )
int epicsStdCall ca_clear_event ( evid pMon )
{
return ca_clear_subscription ( pMon );
}
// extern "C"
chid epicsShareAPI ca_evid_to_chid ( evid pMon )
chid epicsStdCall ca_evid_to_chid ( evid pMon )
{
return & pMon->channel ();
}
// extern "C"
int epicsShareAPI ca_pend ( ca_real timeout, int early )
int epicsStdCall ca_pend ( ca_real timeout, int early )
{
if ( early ) {
return ca_pend_io ( timeout );
@@ -456,7 +454,7 @@ int epicsShareAPI ca_pend ( ca_real timeout, int early )
* ca_pend_event ()
*/
// extern "C"
int epicsShareAPI ca_pend_event ( ca_real timeout )
int epicsStdCall ca_pend_event ( ca_real timeout )
{
ca_client_context *pcac;
int status = fetchClientContext ( &pcac );
@@ -467,7 +465,7 @@ int epicsShareAPI ca_pend_event ( ca_real timeout )
try {
// preserve past odd ball behavior of waiting forever when
// the delay is zero
if ( timeout == 0.0 ) {
if ( timeout == 0.0 ) {
while ( true ) {
pcac->pendEvent ( 60.0 );
}
@@ -483,7 +481,7 @@ int epicsShareAPI ca_pend_event ( ca_real timeout )
* ca_pend_io ()
*/
// extern "C"
int epicsShareAPI ca_pend_io ( ca_real timeout )
int epicsStdCall ca_pend_io ( ca_real timeout )
{
ca_client_context *pcac;
int status = fetchClientContext ( &pcac );
@@ -508,7 +506,7 @@ int epicsShareAPI ca_pend_io ( ca_real timeout )
/*
* ca_flush_io ()
*/
int epicsShareAPI ca_flush_io ()
int epicsStdCall ca_flush_io ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext (&pcac);
@@ -525,7 +523,7 @@ int epicsShareAPI ca_flush_io ()
/*
* CA_TEST_IO ()
*/
int epicsShareAPI ca_test_io ()
int epicsStdCall ca_test_io ()
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -545,7 +543,7 @@ int epicsShareAPI ca_test_io ()
* CA_SIGNAL()
*/
// extern "C"
void epicsShareAPI ca_signal ( long ca_status, const char *message )
void epicsStdCall ca_signal ( long ca_status, const char *message )
{
ca_signal_with_file_and_lineno ( ca_status, message, NULL, 0 );
}
@@ -560,7 +558,7 @@ void epicsShareAPI ca_signal ( long ca_status, const char *message )
* (if they call this routine again).
*/
// extern "C"
const char * epicsShareAPI ca_message ( long ca_status )
const char * epicsStdCall ca_message ( long ca_status )
{
unsigned msgNo = CA_EXTRACT_MSG_NO ( ca_status );
@@ -576,7 +574,7 @@ const char * epicsShareAPI ca_message ( long ca_status )
* ca_signal_with_file_and_lineno()
*/
// extern "C"
void epicsShareAPI ca_signal_with_file_and_lineno ( long ca_status,
void epicsStdCall ca_signal_with_file_and_lineno ( long ca_status,
const char *message, const char *pfilenm, int lineno )
{
ca_signal_formated ( ca_status, pfilenm, lineno, message );
@@ -586,7 +584,7 @@ void epicsShareAPI ca_signal_with_file_and_lineno ( long ca_status,
* ca_signal_formated()
*/
// extern "C"
void epicsShareAPI ca_signal_formated ( long ca_status, const char *pfilenm,
void epicsStdCall ca_signal_formated ( long ca_status, const char *pfilenm,
int lineno, const char *pFormat, ... )
{
ca_client_context *pcac;
@@ -622,7 +620,7 @@ void epicsShareAPI ca_signal_formated ( long ca_status, const char *pfilenm,
*
*/
// extern "C"
int epicsShareAPI ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
int epicsStdCall ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -640,7 +638,7 @@ int epicsShareAPI ca_add_fd_registration ( CAFDHANDLER * func, void * arg )
* function that returns the CA version string
*/
// extern "C"
const char * epicsShareAPI ca_version ()
const char * epicsStdCall ca_version ()
{
return CA_VERSION_STRING ( CA_MINOR_PROTOCOL_REVISION );
}
@@ -649,7 +647,7 @@ const char * epicsShareAPI ca_version ()
* ca_replace_printf_handler ()
*/
// extern "C"
int epicsShareAPI ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
int epicsStdCall ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
{
ca_client_context *pcac;
int caStatus = fetchClientContext (&pcac);
@@ -669,7 +667,7 @@ int epicsShareAPI ca_replace_printf_handler ( caPrintfFunc *ca_printf_func )
* (for testing purposes only)
*/
// extern "C"
unsigned epicsShareAPI ca_get_ioc_connection_count ()
unsigned epicsStdCall ca_get_ioc_connection_count ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( & pcac );
@@ -680,7 +678,7 @@ unsigned epicsShareAPI ca_get_ioc_connection_count ()
return pcac->circuitCount ();
}
unsigned epicsShareAPI ca_beacon_anomaly_count ()
unsigned epicsStdCall ca_beacon_anomaly_count ()
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( & pcac );
@@ -692,15 +690,15 @@ unsigned epicsShareAPI ca_beacon_anomaly_count ()
}
// extern "C"
int epicsShareAPI ca_channel_status ( epicsThreadId /* tid */ )
int epicsStdCall ca_channel_status ( epicsThreadId /* tid */ )
{
::printf ("The R3.14 EPICS OS abstraction API does not allow peeking at thread private storage of another thread.\n");
::printf ("Please call \"ca_client_status ( unsigned level )\" from the subsystem specific diagnostic code.\n");
return ECA_ANACHRONISM;
return ECA_ANACHRONISM;
}
// extern "C"
int epicsShareAPI ca_client_status ( unsigned level )
int epicsStdCall ca_client_status ( unsigned level )
{
ca_client_context *pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -712,7 +710,7 @@ int epicsShareAPI ca_client_status ( unsigned level )
return ECA_NORMAL;
}
int epicsShareAPI ca_context_status ( ca_client_context * pcac, unsigned level )
int epicsStdCall ca_context_status ( ca_client_context * pcac, unsigned level )
{
pcac->show ( level );
return ECA_NORMAL;
@@ -725,7 +723,7 @@ int epicsShareAPI ca_context_status ( ca_client_context * pcac, unsigned level )
* by another thread
*/
// extern "C"
struct ca_client_context * epicsShareAPI ca_current_context ()
struct ca_client_context * epicsStdCall ca_current_context ()
{
struct ca_client_context *pCtx;
if ( caClientContextId ) {
@@ -745,7 +743,7 @@ struct ca_client_context * epicsShareAPI ca_current_context ()
* by another thread
*/
// extern "C"
int epicsShareAPI ca_attach_context ( struct ca_client_context * pCtx )
int epicsStdCall ca_attach_context ( struct ca_client_context * pCtx )
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( pcac && pCtx != 0 ) {
@@ -758,14 +756,14 @@ int epicsShareAPI ca_attach_context ( struct ca_client_context * pCtx )
return ECA_NORMAL;
}
void epicsShareAPI ca_detach_context ()
void epicsStdCall ca_detach_context ()
{
if ( caClientContextId ) {
epicsThreadPrivateSet ( caClientContextId, 0 );
}
}
int epicsShareAPI ca_preemtive_callback_is_enabled ()
int epicsStdCall ca_preemtive_callback_is_enabled ()
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( ! pcac ) {
@@ -776,7 +774,7 @@ int epicsShareAPI ca_preemtive_callback_is_enabled ()
// extern "C"
void epicsShareAPI ca_self_test ()
void epicsStdCall ca_self_test ()
{
ca_client_context *pcac = (ca_client_context *) epicsThreadPrivateGet ( caClientContextId );
if ( ! pcac ) {
@@ -785,8 +783,7 @@ void epicsShareAPI ca_self_test ()
pcac->selfTest ();
}
// extern "C"
epicsShareDef const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
DBR_SHORT, /* forces conversion fronm uint8 to int16 */
DBR_CHAR,
DBR_SHORT,
@@ -800,265 +797,257 @@ epicsShareDef const int epicsTypeToDBR_XXXX [lastEpicsType+1] = {
DBR_STRING
};
// extern "C"
epicsShareDef const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1] = {
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
const epicsType DBR_XXXXToEpicsType [LAST_BUFFER_TYPE+1] = {
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsOldStringT,
epicsInt16T,
epicsFloat32T,
epicsEnum16T,
epicsUInt8T,
epicsInt32T,
epicsFloat64T,
epicsUInt16T,
epicsUInt16T,
epicsOldStringT,
epicsOldStringT
epicsUInt16T,
epicsUInt16T,
epicsOldStringT,
epicsOldStringT
};
// extern "C"
epicsShareDef const unsigned short dbr_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
const unsigned short dbr_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(struct dbr_sts_string), /* string field with status */
sizeof(struct dbr_sts_short), /* short field with status */
sizeof(struct dbr_sts_float), /* float field with status */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(struct dbr_sts_string), /* string field with status */
sizeof(struct dbr_sts_short), /* short field with status */
sizeof(struct dbr_sts_float), /* float field with status */
sizeof(struct dbr_sts_enum), /* item number with status */
sizeof(struct dbr_sts_char), /* char field with status */
sizeof(struct dbr_sts_long), /* long field with status */
sizeof(struct dbr_sts_double), /* double field with time */
sizeof(struct dbr_time_string), /* string field with time */
sizeof(struct dbr_sts_enum), /* item number with status */
sizeof(struct dbr_sts_char), /* char field with status */
sizeof(struct dbr_sts_long), /* long field with status */
sizeof(struct dbr_sts_double), /* double field with time */
sizeof(struct dbr_time_string), /* string field with time */
sizeof(struct dbr_time_short), /* short field with time */
sizeof(struct dbr_time_float), /* float field with time */
sizeof(struct dbr_time_enum), /* item number with time */
sizeof(struct dbr_time_char), /* char field with time */
sizeof(struct dbr_time_long), /* long field with time */
sizeof(struct dbr_time_short), /* short field with time */
sizeof(struct dbr_time_float), /* float field with time */
sizeof(struct dbr_time_enum), /* item number with time */
sizeof(struct dbr_time_char), /* char field with time */
sizeof(struct dbr_time_long), /* long field with time */
sizeof(struct dbr_time_double), /* double field with time */
sizeof(struct dbr_sts_string), /* graphic string info */
sizeof(struct dbr_gr_short), /* graphic short info */
sizeof(struct dbr_gr_float), /* graphic float info */
sizeof(struct dbr_gr_enum), /* graphic item info */
sizeof(struct dbr_time_double), /* double field with time */
sizeof(struct dbr_sts_string), /* graphic string info */
sizeof(struct dbr_gr_short), /* graphic short info */
sizeof(struct dbr_gr_float), /* graphic float info */
sizeof(struct dbr_gr_enum), /* graphic item info */
sizeof(struct dbr_gr_char), /* graphic char info */
sizeof(struct dbr_gr_long), /* graphic long info */
sizeof(struct dbr_gr_double), /* graphic double info */
sizeof(struct dbr_sts_string), /* control string info */
sizeof(struct dbr_ctrl_short), /* control short info */
sizeof(struct dbr_gr_char), /* graphic char info */
sizeof(struct dbr_gr_long), /* graphic long info */
sizeof(struct dbr_gr_double), /* graphic double info */
sizeof(struct dbr_sts_string), /* control string info */
sizeof(struct dbr_ctrl_short), /* control short info */
sizeof(struct dbr_ctrl_float), /* control float info */
sizeof(struct dbr_ctrl_enum), /* control item info */
sizeof(struct dbr_ctrl_char), /* control char info */
sizeof(struct dbr_ctrl_long), /* control long info */
sizeof(struct dbr_ctrl_double), /* control double info */
sizeof(struct dbr_ctrl_float), /* control float info */
sizeof(struct dbr_ctrl_enum), /* control item info */
sizeof(struct dbr_ctrl_char), /* control char info */
sizeof(struct dbr_ctrl_long), /* control long info */
sizeof(struct dbr_ctrl_double), /* control double info */
sizeof(dbr_put_ackt_t), /* put ackt */
sizeof(dbr_put_acks_t), /* put acks */
sizeof(struct dbr_stsack_string),/* string field with status/ack*/
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_put_ackt_t), /* put ackt */
sizeof(dbr_put_acks_t), /* put acks */
sizeof(struct dbr_stsack_string),/* string field with status/ack*/
sizeof(dbr_string_t), /* string max size */
};
// extern "C"
epicsShareDef const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
const unsigned short dbr_value_size[LAST_BUFFER_TYPE+1] = {
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_short_t), /* short */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_float_t), /* IEEE Float */
sizeof(dbr_enum_t), /* item number */
sizeof(dbr_char_t), /* character */
sizeof(dbr_long_t), /* long */
sizeof(dbr_double_t), /* double */
sizeof(dbr_ushort_t), /* put_ackt */
sizeof(dbr_ushort_t), /* put_acks */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_ushort_t), /* put_ackt */
sizeof(dbr_ushort_t), /* put_acks */
sizeof(dbr_string_t), /* string max size */
sizeof(dbr_string_t), /* string max size */
};
//extern "C"
epicsShareDef const enum dbr_value_class dbr_value_class[LAST_BUFFER_TYPE+1] = {
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
const enum dbr_value_class dbr_value_class[LAST_BUFFER_TYPE+1] = {
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_int,
dbr_class_int,
dbr_class_string,
dbr_class_string, /* string max size */
dbr_class_string, /* string max size */
dbr_class_int, /* short */
dbr_class_float, /* IEEE Float */
dbr_class_int, /* item number */
dbr_class_int, /* character */
dbr_class_int, /* long */
dbr_class_float, /* double */
dbr_class_int,
dbr_class_int,
dbr_class_string,
dbr_class_string, /* string max size */
};
// extern "C"
epicsShareDef const unsigned short dbr_value_offset[LAST_BUFFER_TYPE+1] = {
0, /* string */
0, /* short */
0, /* IEEE Float */
0, /* item number */
0, /* character */
0, /* long */
0, /* IEEE double */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* string field with status */
(unsigned short) offsetof(dbr_sts_short,value), /* short field with status */
(unsigned short) offsetof(dbr_sts_float,value), /* float field with status */
(unsigned short) offsetof(dbr_sts_enum,value), /* item number with status */
(unsigned short) offsetof(dbr_sts_char,value), /* char field with status */
(unsigned short) offsetof(dbr_sts_long,value), /* long field with status */
(unsigned short) offsetof(dbr_sts_double,value), /* double field with time */
(unsigned short) offsetof(dbr_time_string,value[0] ),/* string field with time */
(unsigned short) offsetof(dbr_time_short,value), /* short field with time */
(unsigned short) offsetof(dbr_time_float,value), /* float field with time */
(unsigned short) offsetof(dbr_time_enum,value), /* item number with time */
(unsigned short) offsetof(dbr_time_char,value), /* char field with time */
(unsigned short) offsetof(dbr_time_long,value), /* long field with time */
(unsigned short) offsetof(dbr_time_double,value), /* double field with time */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* graphic string info */
(unsigned short) offsetof(dbr_gr_short,value), /* graphic short info */
(unsigned short) offsetof(dbr_gr_float,value), /* graphic float info */
(unsigned short) offsetof(dbr_gr_enum,value), /* graphic item info */
(unsigned short) offsetof(dbr_gr_char,value), /* graphic char info */
(unsigned short) offsetof(dbr_gr_long,value), /* graphic long info */
(unsigned short) offsetof(dbr_gr_double,value), /* graphic double info */
(unsigned short) offsetof(dbr_sts_string,value[0]),/* control string info */
(unsigned short) offsetof(dbr_ctrl_short,value), /* control short info */
(unsigned short) offsetof(dbr_ctrl_float,value), /* control float info */
(unsigned short) offsetof(dbr_ctrl_enum,value), /* control item info */
(unsigned short) offsetof(dbr_ctrl_char,value), /* control char info */
(unsigned short) offsetof(dbr_ctrl_long,value), /* control long info */
(unsigned short) offsetof(dbr_ctrl_double,value), /* control double info */
0, /* put ackt */
0, /* put acks */
(unsigned short) offsetof(dbr_stsack_string,value[0]),/* string field with status */
0, /* string */
const unsigned short dbr_value_offset[LAST_BUFFER_TYPE+1] = {
0, /* string */
0, /* short */
0, /* IEEE Float */
0, /* item number */
0, /* character */
0, /* long */
0, /* IEEE double */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* string field with status */
(unsigned short) offsetof(dbr_sts_short,value), /* short field with status */
(unsigned short) offsetof(dbr_sts_float,value), /* float field with status */
(unsigned short) offsetof(dbr_sts_enum,value), /* item number with status */
(unsigned short) offsetof(dbr_sts_char,value), /* char field with status */
(unsigned short) offsetof(dbr_sts_long,value), /* long field with status */
(unsigned short) offsetof(dbr_sts_double,value), /* double field with time */
(unsigned short) offsetof(dbr_time_string,value[0] ), /* string field with time */
(unsigned short) offsetof(dbr_time_short,value), /* short field with time */
(unsigned short) offsetof(dbr_time_float,value), /* float field with time */
(unsigned short) offsetof(dbr_time_enum,value), /* item number with time */
(unsigned short) offsetof(dbr_time_char,value), /* char field with time */
(unsigned short) offsetof(dbr_time_long,value), /* long field with time */
(unsigned short) offsetof(dbr_time_double,value), /* double field with time */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* graphic string info */
(unsigned short) offsetof(dbr_gr_short,value), /* graphic short info */
(unsigned short) offsetof(dbr_gr_float,value), /* graphic float info */
(unsigned short) offsetof(dbr_gr_enum,value), /* graphic item info */
(unsigned short) offsetof(dbr_gr_char,value), /* graphic char info */
(unsigned short) offsetof(dbr_gr_long,value), /* graphic long info */
(unsigned short) offsetof(dbr_gr_double,value), /* graphic double info */
(unsigned short) offsetof(dbr_sts_string,value[0]), /* control string info */
(unsigned short) offsetof(dbr_ctrl_short,value), /* control short info */
(unsigned short) offsetof(dbr_ctrl_float,value), /* control float info */
(unsigned short) offsetof(dbr_ctrl_enum,value), /* control item info */
(unsigned short) offsetof(dbr_ctrl_char,value), /* control char info */
(unsigned short) offsetof(dbr_ctrl_long,value), /* control long info */
(unsigned short) offsetof(dbr_ctrl_double,value), /* control double info */
0, /* put ackt */
0, /* put acks */
(unsigned short) offsetof(dbr_stsack_string,value[0]), /* string field with status */
0, /* string */
};
// extern "C"
epicsShareDef const char *dbf_text[LAST_TYPE+3] = {
"TYPENOTCONN",
"DBF_STRING",
"DBF_SHORT",
"DBF_FLOAT",
"DBF_ENUM",
"DBF_CHAR",
"DBF_LONG",
"DBF_DOUBLE",
"DBF_NO_ACCESS"
const char *dbf_text[LAST_TYPE+3] = {
"TYPENOTCONN",
"DBF_STRING",
"DBF_SHORT",
"DBF_FLOAT",
"DBF_ENUM",
"DBF_CHAR",
"DBF_LONG",
"DBF_DOUBLE",
"DBF_NO_ACCESS"
};
// extern "C"
epicsShareDef const char *dbf_text_invalid = "DBF_invalid";
const char *dbf_text_invalid = "DBF_invalid";
// extern "C"
epicsShareDef const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *));
const short dbf_text_dim = (sizeof dbf_text)/(sizeof (char *));
// extern "C"
epicsShareDef const char *dbr_text[LAST_BUFFER_TYPE+1] = {
const char *dbr_text[LAST_BUFFER_TYPE+1] = {
"DBR_STRING",
"DBR_SHORT",
"DBR_FLOAT",
@@ -1100,8 +1089,6 @@ epicsShareDef const char *dbr_text[LAST_BUFFER_TYPE+1] = {
"DBR_CLASS_NAME"
};
// extern "C"
epicsShareDef const char *dbr_text_invalid = "DBR_invalid";
const char *dbr_text_invalid = "DBR_invalid";
// extern "C"
epicsShareDef const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1;
const short dbr_text_dim = (sizeof dbr_text) / (sizeof (char *)) + 1;

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@@ -19,15 +19,15 @@ int main ( int argc, char **argv )
unsigned progressLoggingLevel;
unsigned channelCount;
unsigned repetitionCount;
enum ca_preemptive_callback_select preempt;
int aBoolean;
enum ca_preemptive_callback_select preempt;
int aBoolean;
if ( argc < 2 || argc > 6 ) {
printf ("usage: %s <PV name> [progress logging level] [channel count] "
"[repetition count] [enable preemptive callback]\n",
"[repetition count] [enable preemptive callback]\n",
argv[0] );
return 1;
return 1;
}
if ( argc >= 3 ) {
@@ -57,12 +57,12 @@ int main ( int argc, char **argv )
else {
aBoolean = 0;
}
if ( aBoolean ) {
preempt = ca_enable_preemptive_callback;
}
else {
preempt = ca_disable_preemptive_callback;
}
if ( aBoolean ) {
preempt = ca_enable_preemptive_callback;
}
else {
preempt = ca_disable_preemptive_callback;
}
acctst ( argv[1], progressLoggingLevel, channelCount, repetitionCount, preempt );

View File

@@ -60,7 +60,7 @@ struct AutoInit {
AutoInit ();
};
AutoInit :: AutoInit ()
AutoInit :: AutoInit ()
{
iocshRegister ( &acctstFuncDef, acctstCallFunc );
}

View File

@@ -3,38 +3,38 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef addrListh
#define addrListh
#ifndef INC_addrList_H
#define INC_addrList_H
#include "shareLib.h"
#include "envDefs.h"
#include "envDefs.h"
#include "osiSock.h"
#include "libCaAPI.h"
#ifdef __cplusplus
extern "C" {
#endif
epicsShareFunc void epicsShareAPI configureChannelAccessAddressList
LIBCA_API void epicsStdCall configureChannelAccessAddressList
( struct ELLLIST *pList, SOCKET sock, unsigned short port );
epicsShareFunc int epicsShareAPI addAddrToChannelAccessAddressList
( struct ELLLIST *pList, const ENV_PARAM *pEnv,
LIBCA_API int epicsStdCall addAddrToChannelAccessAddressList
( struct ELLLIST *pList, const ENV_PARAM *pEnv,
unsigned short port, int ignoreNonDefaultPort );
epicsShareFunc void epicsShareAPI printChannelAccessAddressList
LIBCA_API void epicsStdCall printChannelAccessAddressList
( const struct ELLLIST *pList );
epicsShareFunc void epicsShareAPI removeDuplicateAddresses
LIBCA_API void epicsStdCall removeDuplicateAddresses
( struct ELLLIST *pDestList, ELLLIST *pSrcList, int silent);
#ifdef __cplusplus
}
#endif
#endif /* ifndef addrListh */
#endif /* ifndef INC_addrList_H */

View File

@@ -3,41 +3,31 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef autoPtrFreeListh
#define autoPtrFreeListh
#ifdef epicsExportSharedSymbols
# define autoPtrFreeListh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_autoPtrFreeList_H
#define INC_autoPtrFreeList_H
#include "tsFreeList.h"
#include "compilerDependencies.h"
#ifdef autoPtrFreeListh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
template < class T, unsigned N = 0x400, class MUTEX = epicsMutex >
class autoPtrFreeList {
public:
@@ -56,7 +46,7 @@ private:
};
template < class T, unsigned N, class MUTEX >
inline autoPtrFreeList < T, N, MUTEX >::autoPtrFreeList (
inline autoPtrFreeList < T, N, MUTEX >::autoPtrFreeList (
tsFreeList < T, N, MUTEX > & freeListIn, T * pIn ) :
p ( pIn ), freeList ( freeListIn ) {}
@@ -101,4 +91,4 @@ inline T * autoPtrFreeList < T, N, MUTEX >::release ()
return pTmp;
}
#endif // #ifdef autoPtrFreeListh
#endif // #ifndef INC_autoPtrFreeList_H

View File

@@ -5,22 +5,22 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef autoPtrRecycleh
@@ -29,7 +29,7 @@
template < class T >
class autoPtrRecycle {
public:
autoPtrRecycle (
autoPtrRecycle (
epicsGuard < epicsMutex > &, chronIntIdResTable < baseNMIU > &,
cacRecycle &, T * );
~autoPtrRecycle ();
@@ -43,12 +43,12 @@ private:
chronIntIdResTable < baseNMIU > & ioTable;
epicsGuard < epicsMutex > & guard;
// not implemented
autoPtrRecycle ( const autoPtrRecycle & );
autoPtrRecycle & operator = ( const autoPtrRecycle & );
autoPtrRecycle ( const autoPtrRecycle & );
autoPtrRecycle & operator = ( const autoPtrRecycle & );
};
template < class T >
inline autoPtrRecycle<T>::autoPtrRecycle (
inline autoPtrRecycle<T>::autoPtrRecycle (
epicsGuard < epicsMutex > & guardIn, chronIntIdResTable < baseNMIU > & tbl,
cacRecycle & rIn, T * pIn ) :
p ( pIn ), r ( rIn ), ioTable ( tbl ), guard ( guardIn ) {}

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -28,7 +27,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "virtualCircuit.h"
#include "bhe.h"
@@ -42,12 +40,12 @@
* start up
*
* if creating this in response to a search reply
* and not in response to a beacon then
* and not in response to a beacon then
* we set the beacon time stamp to
* zero (so we can correctly compute the period
* between the 1st and 2nd beacons)
*/
bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp,
bhe::bhe ( epicsMutex & mutexIn, const epicsTime & initialTimeStamp,
unsigned initialBeaconNumber, const inetAddrID & addr ) :
inetAddrID ( addr ), timeStamp ( initialTimeStamp ), averagePeriod ( - DBL_MAX ),
mutex ( mutexIn ), pIIU ( 0 ), lastBeaconNumber ( initialBeaconNumber )
@@ -74,7 +72,7 @@ void bhe::beaconAnomalyNotify ( epicsGuard < epicsMutex > & guard )
}
#ifdef DEBUG
void bhe::logBeacon ( const char * pDiagnostic,
void bhe::logBeacon ( const char * pDiagnostic,
const double & currentPeriod,
const epicsTime & currentTime )
{
@@ -82,10 +80,10 @@ void bhe::logBeacon ( const char * pDiagnostic,
char name[64];
this->name ( name, sizeof ( name ) );
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%a %b %d %Y %H:%M:%S.%f");
::printf ( "%s cp=%g ap=%g %s %s\n",
pDiagnostic, currentPeriod,
pDiagnostic, currentPeriod,
this->averagePeriod, name, date );
}
}
@@ -105,7 +103,7 @@ void bhe::logBeaconDiscard ( unsigned beaconAdvance,
char name[64];
this->name ( name, sizeof ( name ) );
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%a %b %d %Y %H:%M:%S.%f");
::printf ( "bb %u %s %s\n",
beaconAdvance, name, date );
@@ -123,16 +121,16 @@ void bhe::logBeaconDiscard ( unsigned /* beaconAdvance */,
*
* updates beacon period, and looks for beacon anomalies
*/
bool bhe::updatePeriod (
epicsGuard < epicsMutex > & guard, const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
bool bhe::updatePeriod (
epicsGuard < epicsMutex > & guard, const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
unsigned protocolRevision )
{
guard.assertIdenticalMutex ( this->mutex );
//
// this block is enetered if the beacon was created as a side effect of
// creating a connection and so we dont yet know the first beacon time
// creating a connection and so we dont yet know the first beacon time
// and sequence number
//
if ( this->timeStamp == epicsTime () ) {
@@ -142,7 +140,7 @@ bool bhe::updatePeriod (
this->beaconAnomalyNotify ( guard );
/*
/*
* this is the 1st beacon seen - the beacon time stamp
* was not initialized during BHE create because
* a TCP/IP connection created the beacon.
@@ -167,15 +165,15 @@ bool bhe::updatePeriod (
}
this->lastBeaconNumber = beaconNumber;
// throw out sequence numbers just prior to, or the same as, the last one received
// throw out sequence numbers just prior to, or the same as, the last one received
// (this situation is probably caused by a temporary duplicate route )
if ( beaconSeqAdvance == 0 || beaconSeqAdvance > ca_uint32_max - 256 ) {
logBeaconDiscard ( beaconSeqAdvance, currentTime );
return false;
}
// throw out sequence numbers that jump forward by only a few numbers
// (this situation is probably caused by a duplicate route
// throw out sequence numbers that jump forward by only a few numbers
// (this situation is probably caused by a duplicate route
// or a beacon due to input queue overun)
if ( beaconSeqAdvance > 1 && beaconSeqAdvance < 4 ) {
logBeaconDiscard ( beaconSeqAdvance, currentTime );
@@ -205,7 +203,7 @@ bool bhe::updatePeriod (
/*
* ignore beacons seen for the first time shortly after
* init, but do not ignore beacons arriving with a short
* period because the IOC was rebooted soon after the
* period because the IOC was rebooted soon after the
* client starts up.
*/
totalRunningTime = this->timeStamp - programBeginTime;
@@ -217,24 +215,24 @@ bool bhe::updatePeriod (
/*
* Is this an IOC seen because of a restored
* network segment?
* network segment?
*
* It may be possible to get false triggers here
* It may be possible to get false triggers here
* if the client is busy, but this does not cause
* problems because the echo response will tell us
* problems because the echo response will tell us
* that the server is available
*/
if ( currentPeriod >= this->averagePeriod * 1.25 ) {
/*
* trigger on any missing beacon
/*
* trigger on any missing beacon
* if connected to this server
*/
*/
this->beaconAnomalyNotify ( guard );
if ( currentPeriod >= this->averagePeriod * 3.25 ) {
/*
* trigger on any 3 contiguous missing beacons
/*
* trigger on any 3 contiguous missing beacons
* if not connected to this server
*/
netChange = true;
@@ -248,9 +246,9 @@ bool bhe::updatePeriod (
* IOC reboots). Lower tolarance here because we
* dont have to worry about lost beacons.
*
* It may be possible to get false triggers here
* It may be possible to get false triggers here
* if the client is busy, but this does not cause
* problems because the echo response will tell us
* problems because the echo response will tell us
* that the server is available
*/
else if ( currentPeriod <= this->averagePeriod * 0.80 ) {
@@ -259,14 +257,14 @@ bool bhe::updatePeriod (
logBeacon ( "bal", currentPeriod, currentTime );
}
else if ( this->pIIU ) {
// update state of health for active virtual circuits
// update state of health for active virtual circuits
// if the beacon looks ok
this->pIIU->beaconArrivalNotify ( guard );
logBeacon ( "vb", currentPeriod, currentTime );
}
// update a running average period
this->averagePeriod = currentPeriod * 0.125 +
this->averagePeriod = currentPeriod * 0.125 +
this->averagePeriod * 0.875;
}
@@ -286,22 +284,22 @@ void bhe::show ( epicsGuard < epicsMutex > &, unsigned level ) const
char host [64];
this->name ( host, sizeof ( host ) );
if ( this->averagePeriod == -DBL_MAX ) {
::printf ( "CA beacon hash entry for %s <no period estimate>\n",
::printf ( "CA beacon hash entry for %s <no period estimate>\n",
host );
}
else {
::printf ( "CA beacon hash entry for %s with period estimate %f\n",
::printf ( "CA beacon hash entry for %s with period estimate %f\n",
host, this->averagePeriod );
}
if ( level > 0u ) {
char date[64];
this->timeStamp.strftime ( date, sizeof ( date ), "%a %b %d %Y %H:%M:%S");
::printf ( "\tbeacon number %u, on %s\n",
::printf ( "\tbeacon number %u, on %s\n",
this->lastBeaconNumber, date );
}
}
double bhe::period ( epicsGuard < epicsMutex > & guard ) const
double bhe::period ( epicsGuard < epicsMutex > & guard ) const
{
guard.assertIdenticalMutex ( this->mutex );
return this->averagePeriod;
@@ -313,14 +311,14 @@ epicsTime bhe::updateTime ( epicsGuard < epicsMutex > & guard ) const
return this->timeStamp;
}
void bhe::registerIIU (
void bhe::registerIIU (
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
{
guard.assertIdenticalMutex ( this->mutex );
this->pIIU = & iiu;
}
void bhe::unregisterIIU (
void bhe::unregisterIIU (
epicsGuard < epicsMutex > & guard, tcpiiu & iiu )
{
guard.assertIdenticalMutex ( this->mutex );

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -19,24 +18,15 @@
* Author: Jeff Hill
*/
#ifndef bheh
#define bheh
#ifdef epicsExportSharedSymbols
# define bhehEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_bhe_H
#define INC_bhe_H
#include "tsDLList.h"
#include "tsFreeList.h"
#include "epicsTime.h"
#include "compilerDependencies.h"
#ifdef bhehEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "inetAddrID.h"
#include "caProto.h"
@@ -45,7 +35,7 @@ class bheMemoryManager;
// using a pure abstract wrapper class around the free list avoids
// Tornado 2.0.1 GNU compiler bugs
class epicsShareClass bheMemoryManager {
class LIBCA_API bheMemoryManager {
public:
virtual ~bheMemoryManager ();
virtual void * allocate ( size_t ) = 0;
@@ -54,24 +44,24 @@ public:
class bhe : public tsSLNode < bhe >, public inetAddrID {
public:
epicsShareFunc bhe (
epicsMutex &, const epicsTime & initialTimeStamp,
LIBCA_API bhe (
epicsMutex &, const epicsTime & initialTimeStamp,
unsigned initialBeaconNumber, const inetAddrID & addr );
epicsShareFunc ~bhe ();
epicsShareFunc bool updatePeriod (
LIBCA_API ~bhe ();
LIBCA_API bool updatePeriod (
epicsGuard < epicsMutex > &,
const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
const epicsTime & programBeginTime,
const epicsTime & currentTime, ca_uint32_t beaconNumber,
unsigned protocolRevision );
epicsShareFunc double period ( epicsGuard < epicsMutex > & ) const;
epicsShareFunc epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
epicsShareFunc void show ( unsigned level ) const;
epicsShareFunc void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
epicsShareFunc void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
epicsShareFunc void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
epicsShareFunc void * operator new ( size_t size, bheMemoryManager & );
LIBCA_API double period ( epicsGuard < epicsMutex > & ) const;
LIBCA_API epicsTime updateTime ( epicsGuard < epicsMutex > & ) const;
LIBCA_API void show ( unsigned level ) const;
LIBCA_API void show ( epicsGuard < epicsMutex > &, unsigned /* level */ ) const;
LIBCA_API void registerIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
LIBCA_API void unregisterIIU ( epicsGuard < epicsMutex > &, tcpiiu & );
LIBCA_API void * operator new ( size_t size, bheMemoryManager & );
#ifdef CXX_PLACEMENT_DELETE
epicsShareFunc void operator delete ( void *, bheMemoryManager & );
LIBCA_API void operator delete ( void *, bheMemoryManager & );
#endif
private:
epicsTime timeStamp;
@@ -80,14 +70,14 @@ private:
tcpiiu * pIIU;
ca_uint32_t lastBeaconNumber;
void beaconAnomalyNotify ( epicsGuard < epicsMutex > & );
void logBeacon ( const char * pDiagnostic,
void logBeacon ( const char * pDiagnostic,
const double & currentPeriod,
const epicsTime & currentTime );
void logBeaconDiscard ( unsigned beaconAdvance,
const epicsTime & currentTime );
bhe ( const bhe & );
bhe & operator = ( const bhe & );
epicsShareFunc void operator delete ( void * );
bhe ( const bhe & );
bhe & operator = ( const bhe & );
LIBCA_API void operator delete ( void * );
};
// using a wrapper class around the free list avoids
@@ -99,24 +89,24 @@ public:
void release ( void * );
private:
tsFreeList < bhe, 0x100 > freeList;
bheFreeStore ( const bheFreeStore & );
bheFreeStore & operator = ( const bheFreeStore & );
bheFreeStore ( const bheFreeStore & );
bheFreeStore & operator = ( const bheFreeStore & );
};
inline void * bhe::operator new ( size_t size,
inline void * bhe::operator new ( size_t size,
bheMemoryManager & mgr )
{
{
return mgr.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
inline void bhe::operator delete ( void * pCadaver,
inline void bhe::operator delete ( void * pCadaver,
bheMemoryManager & mgr )
{
{
mgr.release ( pCadaver );
}
#endif
#endif // ifdef bheh
#endif // ifndef INC_bhe_H

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@@ -60,50 +59,50 @@ void caConnTest ( const char *pNameIn, unsigned channelCountIn, double delayIn )
{
unsigned iteration = 0u;
int status;
unsigned i;
chid *pChans;
unsigned i;
chid *pChans;
channelCount = channelCountIn;
pChans = new chid [channelCount];
while ( 1 ) {
while ( 1 ) {
connCount = 0u;
subsequentConnect = false;
begin = epicsTime::getCurrent ();
printf ( "initializing CA client library\n" );
status = ca_task_initialize();
SEVCHK ( status, "CA init failed" );
status = ca_task_initialize();
SEVCHK ( status, "CA init failed" );
printf ( "creating channels\n" );
for ( i = 0u; i < channelCount; i++ ) {
status = ca_search_and_connect ( pNameIn,
for ( i = 0u; i < channelCount; i++ ) {
status = ca_search_and_connect ( pNameIn,
&pChans[i], caConnTestConnHandler, 0 );
SEVCHK ( status, "CA search problems" );
}
SEVCHK ( status, "CA search problems" );
}
printf ( "all channels were created\n" );
ca_pend_event ( delayIn );
ca_pend_event ( delayIn );
if ( iteration & 1 ) {
for ( i = 0u; i < channelCount; i++ ) {
status = ca_clear_channel ( pChans[i] );
SEVCHK ( status, "ca_clear_channel() problems" );
}
for ( i = 0u; i < channelCount; i++ ) {
status = ca_clear_channel ( pChans[i] );
SEVCHK ( status, "ca_clear_channel() problems" );
}
printf ( "all channels were destroyed\n" );
}
printf ( "shutting down CA client library\n" );
status = ca_task_exit ();
SEVCHK ( status, "task exit problems" );
status = ca_task_exit ();
SEVCHK ( status, "task exit problems" );
iteration++;
}
}
//delete [] pChans;
}

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@@ -3,13 +3,12 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef caDiagnosticsh
#define caDiagnosticsh
#ifndef INC_caDiagnostics_H
#define INC_caDiagnostics_H
#include "cadef.h"
@@ -20,8 +19,8 @@ extern "C" {
enum appendNumberFlag {appendNumber, dontAppendNumber};
int catime ( const char *channelName, unsigned channelCount, enum appendNumberFlag appNF );
int acctst ( const char *pname, unsigned logggingInterestLevel,
unsigned channelCount, unsigned repetitionCount,
int acctst ( const char *pname, unsigned logggingInterestLevel,
unsigned channelCount, unsigned repetitionCount,
enum ca_preemptive_callback_select select );
#define CATIME_OK 0
@@ -33,6 +32,6 @@ int acctst ( const char *pname, unsigned logggingInterestLevel,
void caConnTest ( const char *pNameIn, unsigned channelCountIn, double delayIn );
#endif /* caDiagnosticsh */
#endif /* ifndef INC_caDiagnostics_H */

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@@ -38,50 +37,50 @@ void caEventRate ( const char *pName, unsigned count )
chid * pChidTable = new chid [ count ];
{
printf ( "Connecting to CA Channel \"%s\" %u times.",
printf ( "Connecting to CA Channel \"%s\" %u times.",
pName, count );
fflush ( stdout );
epicsTime begin = epicsTime::getCurrent ();
for ( unsigned i = 0u; i < count; i++ ) {
int status = ca_search ( pName, & pChidTable[i] );
SEVCHK ( status, NULL );
}
int status = ca_pend_io ( 10000.0 );
if ( status != ECA_NORMAL ) {
fprintf ( stderr, " not found.\n" );
return;
}
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
{
printf ( "Subscribing %u times.", count );
fflush ( stdout );
epicsTime begin = epicsTime::getCurrent ();
for ( unsigned i = 0u; i < count; i++ ) {
int addEventStatus = ca_add_event ( DBR_FLOAT,
int addEventStatus = ca_add_event ( DBR_FLOAT,
pChidTable[i], eventCallBack, &eventCount, NULL);
SEVCHK ( addEventStatus, __FILE__ );
}
int status = ca_flush_io ();
SEVCHK ( status, __FILE__ );
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
{
printf ( "Waiting for initial value events." );
fflush ( stdout );
// let the first one go by
// let the first one go by
epicsTime begin = epicsTime::getCurrent ();
while ( eventCount < count ) {
int status = ca_pend_event ( 0.01 );
@@ -90,7 +89,7 @@ void caEventRate ( const char *pName, unsigned count )
}
}
epicsTime end = epicsTime::getCurrent ();
printf ( " done(%f sec).\n", end - begin );
}
@@ -128,7 +127,7 @@ void caEventRate ( const char *pName, unsigned count )
double mean = X / N;
double stdDev = sqrt ( XX / N - mean * mean );
printf ( "CA Event Rate (Hz): current %g mean %g std dev %g\n",
printf ( "CA Event Rate (Hz): current %g mean %g std dev %g\n",
Hz, mean, stdDev );
if ( samplePeriod < maxSamplePeriod ) {

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -14,15 +13,15 @@
* 505 665 1831
*/
#ifndef __CAPROTO__
#define __CAPROTO__
#ifndef INC_caProto_H
#define INC_caProto_H
#define capStrOf(A) #A
#define capStrOfX(A) capStrOf ( A )
/*
/*
* CA protocol revision
* TCP/UDP port number (bumped each major protocol change)
* TCP/UDP port number (bumped each major protocol change)
*/
#define CA_MAJOR_PROTOCOL_REVISION 4
#define CA_VERSION_STRING( MINOR_REVISION ) \
@@ -30,7 +29,7 @@
#define CA_UKN_MINOR_VERSION 0u /* unknown minor version */
#define CA_MINIMUM_SUPPORTED_VERSION 4u
# define CA_VSUPPORTED(MINOR) ((MINOR)>=CA_MINIMUM_SUPPORTED_VERSION)
# define CA_V41(MINOR) ((MINOR)>=1u)
# define CA_V41(MINOR) ((MINOR)>=1u)
# define CA_V42(MINOR) ((MINOR)>=2u)
# define CA_V43(MINOR) ((MINOR)>=3u)
# define CA_V44(MINOR) ((MINOR)>=4u)
@@ -45,8 +44,8 @@
# define CA_V413(MINOR) ((MINOR)>=13u) /* Allow zero length in requests. */
/*
* These port numbers are only used if the CA repeater and
* CA server port numbers cant be obtained from the EPICS
* These port numbers are only used if the CA repeater and
* CA server port numbers cant be obtained from the EPICS
* environment variables "EPICS_CA_REPEATER_PORT" and
* "EPICS_CA_SERVER_PORT"
*/
@@ -54,8 +53,8 @@
#define CA_SERVER_PORT (CA_PORT_BASE+CA_MAJOR_PROTOCOL_REVISION*2u)
#define CA_REPEATER_PORT (CA_PORT_BASE+CA_MAJOR_PROTOCOL_REVISION*2u+1u)
/*
* 1500 (max of ethernet and 802.{2,3} MTU) - 20(IP) - 8(UDP)
/*
* 1500 (max of ethernet and 802.{2,3} MTU) - 20(IP) - 8(UDP)
* (the MTU of Ethernet is currently independent of its speed varient)
*/
#define ETHERNET_MAX_UDP ( 1500u - 20u - 8u )
@@ -89,10 +88,10 @@ typedef ca_uint32_t caResId;
#define CA_PROTO_SNAPSHOT 5u /* snapshot of the system */
#define CA_PROTO_SEARCH 6u /* IOC channel search */
#define CA_PROTO_BUILD 7u /* build - obsolete */
#define CA_PROTO_EVENTS_OFF 8u /* flow control */
#define CA_PROTO_EVENTS_ON 9u /* flow control */
#define CA_PROTO_READ_SYNC 10u /* purge old reads */
#define CA_PROTO_ERROR 11u /* an operation failed */
#define CA_PROTO_EVENTS_OFF 8u /* flow control */
#define CA_PROTO_EVENTS_ON 9u /* flow control */
#define CA_PROTO_READ_SYNC 10u /* purge old reads */
#define CA_PROTO_ERROR 11u /* an operation failed */
#define CA_PROTO_CLEAR_CHANNEL 12u /* free chan resources */
#define CA_PROTO_RSRV_IS_UP 13u /* CA server has joined the net */
#define CA_PROTO_NOT_FOUND 14u /* channel not found */
@@ -172,7 +171,7 @@ typedef struct ca_hdr {
*/
struct mon_info {
ca_float32_t m_lval; /* low delta */
ca_float32_t m_hval; /* high delta */
ca_float32_t m_hval; /* high delta */
ca_float32_t m_toval; /* period btween samples */
ca_uint16_t m_mask; /* event select mask */
ca_uint16_t m_pad; /* extend to 32 bits */
@@ -183,5 +182,5 @@ struct mon_info {
*/
#define unreasonablePVNameSize 500u
#endif /* __CAPROTO__ */
#endif /* ifndef INC_caProto_H */

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -31,12 +30,65 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include <stdio.h>
#if !defined(_WIN32) && !defined(__rtems__) && !defined(vxWorks)
# include <sys/types.h>
# include <sys/stat.h>
# include <fcntl.h>
#define CAN_DETACH_STDINOUT
#endif
#include "epicsAssert.h"
#include "osiUnistd.h"
#include "epicsGetopt.h"
#include "udpiiu.h"
int main()
static void usage(char* argv[])
{
fprintf(stderr, "Usage: %s -hv\n"
"\n"
" -h - Print this message\n"
" -v - Do not replace stdin/out/err with /dev/null\n",
argv[0]);
}
int main(int argc, char* argv[])
{
bool detachinout = true;
int opt;
while ((opt = getopt(argc, argv, "hv")) != -1) {
switch (opt) {
default:
usage(argv);
fprintf(stderr, "\nUnknown argument '%c'\n", opt);
return 1;
case 'h':
usage(argv);
return 0;
case 'v':
detachinout = false;
break;
}
}
#ifdef CAN_DETACH_STDINOUT
if(detachinout) {
int readfd = open("/dev/null", O_RDONLY);
int writefd = open("/dev/null", O_WRONLY);
dup2(readfd, 0);
dup2(writefd, 1);
dup2(writefd, 2);
close(readfd);
close(writefd);
}
#else
(void)detachinout;
#endif
chdir ( "/" );
ca_repeater ();
return ( 0 );

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -18,8 +17,8 @@
* Author: Jeff Hill
*/
#ifndef caServerIDh
#define caServerIDh
#ifndef INC_caServerID_H
#define INC_caServerID_H
#include "osiSock.h"
#include "resourceLib.h"
@@ -37,7 +36,7 @@ private:
ca_uint8_t pri;
};
inline caServerID::caServerID (
inline caServerID::caServerID (
const struct sockaddr_in & addrIn, unsigned priorityIn ) :
addr ( addrIn ), pri ( static_cast <ca_uint8_t> ( priorityIn ) )
{
@@ -46,7 +45,7 @@ inline caServerID::caServerID (
inline bool caServerID::operator == ( const caServerID & rhs ) const
{
if ( this->addr.sin_addr.s_addr == rhs.addr.sin_addr.s_addr &&
if ( this->addr.sin_addr.s_addr == rhs.addr.sin_addr.s_addr &&
this->addr.sin_port == rhs.addr.sin_port &&
this->pri == rhs.pri ) {
return true;
@@ -67,7 +66,7 @@ inline resTableIndex caServerID::hash () const
index ^= this->addr.sin_port;
index ^= this->addr.sin_port >> 8u;
index ^= this->pri;
return integerHash ( caServerMinIndexBitWidth,
return integerHash ( caServerMinIndexBitWidth,
caServerMaxIndexBitWidth, index );
}
@@ -83,6 +82,4 @@ inline unsigned caServerID::priority () const
return this->pri;
}
#endif // ifdef caServerID
#endif // ifdef INC_caServerID_H

View File

@@ -1,28 +0,0 @@
/*************************************************************************\
* Copyright (c) 2017 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.
\*************************************************************************/
#ifndef CAVERSION_H
#define CAVERSION_H
#include <epicsVersion.h>
#include <shareLib.h>
#ifndef VERSION_INT
# define VERSION_INT(V,R,M,P) ( ((V)<<24) | ((R)<<16) | ((M)<<8) | (P))
#endif
/* include generated headers with:
* EPICS_CA_MAJOR_VERSION
* EPICS_CA_MINOR_VERSION
* EPICS_CA_MAINTENANCE_VERSION
* EPICS_CA_DEVELOPMENT_FLAG
*/
#include "caVersionNum.h"
#define CA_VERSION_INT VERSION_INT(EPICS_CA_MAJOR_VERSION, EPICS_CA_MINOR_VERSION, EPICS_CA_MAINTENANCE_VERSION, 0)
#endif // CAVERSION_H

View File

@@ -0,0 +1,21 @@
/*************************************************************************\
* Copyright (c) 2017 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.
\*************************************************************************/
#ifndef INC_caVersion_H
#define INC_caVersion_H
#define EPICS_CA_MAJOR_VERSION @EPICS_CA_MAJOR_VERSION@
#define EPICS_CA_MINOR_VERSION @EPICS_CA_MINOR_VERSION@
#define EPICS_CA_MAINTENANCE_VERSION @EPICS_CA_MAINTENANCE_VERSION@
#define EPICS_CA_DEVELOPMENT_FLAG @EPICS_CA_DEVELOPMENT_FLAG@
#include <epicsVersion.h>
#define CA_VERSION_INT VERSION_INT(EPICS_CA_MAJOR_VERSION, \
EPICS_CA_MINOR_VERSION, EPICS_CA_MAINTENANCE_VERSION, 0)
#endif /* INC_caVersion_H */

View File

@@ -1,7 +0,0 @@
#ifndef CAVERSION_H
# error include caVersion.h, not this header
#endif
#define EPICS_CA_MAJOR_VERSION @EPICS_CA_MAJOR_VERSION@
#define EPICS_CA_MINOR_VERSION @EPICS_CA_MINOR_VERSION@
#define EPICS_CA_MAINTENANCE_VERSION @EPICS_CA_MAINTENANCE_VERSION@
#define EPICS_CA_DEVELOPMENT_FLAG @EPICS_CA_DEVELOPMENT_FLAG@

View File

@@ -17,9 +17,9 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifdef _MSC_VER
@@ -34,12 +34,11 @@
#include "errlog.h"
#include "locationException.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
epicsShareDef epicsThreadPrivateId caClientCallbackThreadId;
epicsThreadPrivateId caClientCallbackThreadId;
static epicsThreadOnceId cacOnce = EPICS_THREAD_ONCE_INIT;
@@ -475,7 +474,7 @@ int ca_client_context::pendIO ( const double & timeout )
}
int status = ECA_NORMAL;
epicsTime beg_time = epicsTime::getMonotonic ();
epicsTime beg_time = epicsTime::getCurrent ();
double remaining = timeout;
epicsGuard < epicsMutex > guard ( this->mutex );
@@ -493,7 +492,7 @@ int ca_client_context::pendIO ( const double & timeout )
this->blockForEventAndEnableCallbacks ( this->ioDone, remaining );
}
double delay = epicsTime::getMonotonic () - beg_time;
double delay = epicsTime::getCurrent () - beg_time;
if ( delay < timeout ) {
remaining = timeout - delay;
}
@@ -522,7 +521,7 @@ int ca_client_context::pendEvent ( const double & timeout )
return ECA_EVDISALLOW;
}
epicsTime current = epicsTime::getMonotonic ();
epicsTime current = epicsTime::getCurrent ();
{
epicsGuard < epicsMutex > guard ( this->mutex );
@@ -563,7 +562,7 @@ int ca_client_context::pendEvent ( const double & timeout )
this->noWakeupSincePend = true;
}
double elapsed = epicsTime::getMonotonic() - current;
double elapsed = epicsTime::getCurrent() - current;
double delay;
if ( timeout > elapsed ) {
@@ -736,12 +735,12 @@ void ca_client_context::installDefaultService ( cacService & service )
ca_client_context::pDefaultService = & service;
}
void epicsShareAPI caInstallDefaultService ( cacService & service )
void epicsStdCall caInstallDefaultService ( cacService & service )
{
ca_client_context::installDefaultService ( service );
}
epicsShareFunc int epicsShareAPI ca_clear_subscription ( evid pMon )
LIBCA_API int epicsStdCall ca_clear_subscription ( evid pMon )
{
oldChannelNotify & chan = pMon->channel ();
ca_client_context & cac = chan.getClientCtx ();

View File

@@ -34,7 +34,6 @@
#include "errlog.h"
#include "epicsExport.h"
#define epicsExportSharedSymbols
#include "addrList.h"
#include "iocinf.h"
#include "cac.h"
@@ -130,7 +129,7 @@ cac::cac (
epicsMutex & callbackControlIn,
cacContextNotify & notifyIn ) :
_refLocalHostName ( localHostNameCache.getReference () ),
programBeginTime ( epicsTime::getMonotonic() ),
programBeginTime ( epicsTime::getCurrent() ),
connTMO ( CA_CONN_VERIFY_PERIOD ),
mutex ( mutualExclusionIn ),
cbMutex ( callbackControlIn ),
@@ -155,7 +154,7 @@ cac::cac (
}
try {
long status;
long status;
/*
* Certain os, such as HPUX, do not unblock a socket system call

View File

@@ -19,13 +19,8 @@
*
*/
#ifndef cach
#define cach
#ifdef epicsExportSharedSymbols
# define cach_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_cac_H
#define INC_cac_H
#include "compilerDependencies.h"
#include "ipAddrToAsciiAsynchronous.h"
@@ -35,11 +30,7 @@
#include "freeList.h"
#include "localHostName.h"
#ifdef cach_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "nciu.h"
#include "comBuf.h"
#include "bhe.h"
@@ -81,8 +72,8 @@ public:
void release ( void * );
private:
tsFreeList < comBuf, 0x20 > freeList;
cacComBufMemoryManager ( const cacComBufMemoryManager & );
cacComBufMemoryManager & operator = ( const cacComBufMemoryManager & );
cacComBufMemoryManager ( const cacComBufMemoryManager & );
cacComBufMemoryManager & operator = ( const cacComBufMemoryManager & );
};
class notifyGuard {
@@ -348,8 +339,8 @@ private:
const char *pCtx, unsigned status );
static const pExcepProtoStubTCP tcpExcepJumpTableCAC [];
cac ( const cac & );
cac & operator = ( const cac & );
cac ( const cac & );
cac & operator = ( const cac & );
friend class tcpiiu;
};
@@ -432,4 +423,4 @@ inline double cac ::
return this->connTMO;
}
#endif // ifdef cach
#endif // ifndef INC_cac_H

View File

@@ -3,13 +3,12 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -27,7 +26,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "localHostName.h"
#include "cacIO.h"
@@ -41,7 +39,7 @@ private:
epicsSingleton < localHostName > :: reference
_refLocalHostName;
};
static epicsThreadOnceId cacChannelIdOnce = EPICS_THREAD_ONCE_INIT;
const cacChannel::priLev cacChannel::priorityMax = 99u;
@@ -55,63 +53,63 @@ cacChannel::~cacChannel ()
{
}
caAccessRights cacChannel::accessRights (
epicsGuard < epicsMutex > & ) const
caAccessRights cacChannel::accessRights (
epicsGuard < epicsMutex > & ) const
{
static caAccessRights ar ( true, true );
return ar;
}
unsigned cacChannel::searchAttempts (
epicsGuard < epicsMutex > & ) const
unsigned cacChannel::searchAttempts (
epicsGuard < epicsMutex > & ) const
{
return 0u;
}
double cacChannel::beaconPeriod (
epicsGuard < epicsMutex > & ) const
double cacChannel::beaconPeriod (
epicsGuard < epicsMutex > & ) const
{
return - DBL_MAX;
}
double cacChannel::receiveWatchdogDelay (
double cacChannel::receiveWatchdogDelay (
epicsGuard < epicsMutex > & ) const
{
return - DBL_MAX;
}
bool cacChannel::ca_v42_ok (
epicsGuard < epicsMutex > & ) const
epicsGuard < epicsMutex > & ) const
{
return true;
}
bool cacChannel::connected (
epicsGuard < epicsMutex > & ) const
epicsGuard < epicsMutex > & ) const
{
return true;
}
CACChannelPrivate ::
CACChannelPrivate ::
CACChannelPrivate() :
_refLocalHostName ( localHostNameCache.getReference () )
{
}
inline unsigned CACChannelPrivate ::
inline unsigned CACChannelPrivate ::
getHostName ( char * pBuf, unsigned bufLength )
{
return _refLocalHostName->getName ( pBuf, bufLength );
}
inline const char * CACChannelPrivate ::
inline const char * CACChannelPrivate ::
pHostName ()
{
return _refLocalHostName->pointer ();
}
static CACChannelPrivate * pCACChannelPrivate = 0;
// runs once only for each process
extern "C" void cacChannelSetup ( void * )
{
@@ -119,7 +117,7 @@ extern "C" void cacChannelSetup ( void * )
}
// the default is to assume that it is a locally hosted channel
unsigned cacChannel::getHostName (
unsigned cacChannel::getHostName (
epicsGuard < epicsMutex > &,
char * pBuf, unsigned bufLength ) const throw ()
{

View File

@@ -3,32 +3,29 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacChannelNotify::~cacChannelNotify ()
cacChannelNotify::~cacChannelNotify ()
{
}

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -23,19 +22,17 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacContextNotify::~cacContextNotify ()
{
}
void cacContextNotify::callbackProcessingInitiateNotify ()
void cacContextNotify::callbackProcessingInitiateNotify ()
{
}
void cacContextNotify::callbackProcessingCompleteNotify ()
void cacContextNotify::callbackProcessingCompleteNotify ()
{
}

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -17,13 +16,13 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef cacIOh
#define cacIOh
#ifndef INC_cacIO_H
#define INC_cacIO_H
//
// Open Issues
@@ -47,20 +46,12 @@
#include <new>
#include <stdarg.h>
#ifdef epicsExportSharedSymbols
# define cacIOh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "tsDLList.h"
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsThread.h"
#ifdef cacIOh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
class cacChannel;
@@ -69,7 +60,7 @@ typedef unsigned long arrayElementCount;
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacWriteNotify {
class LIBCA_API cacWriteNotify {
public:
virtual ~cacWriteNotify () = 0;
virtual void completion ( epicsGuard < epicsMutex > & ) = 0;
@@ -82,7 +73,7 @@ public:
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacReadNotify {
class LIBCA_API cacReadNotify {
public:
virtual ~cacReadNotify () = 0;
virtual void completion (
@@ -97,7 +88,7 @@ public:
// 1) this should not be passing caerr.h status to the exception callback
// 2) needless-to-say the data should be passed here using the new data access API
class epicsShareClass cacStateNotify {
class LIBCA_API cacStateNotify {
public:
virtual ~cacStateNotify () = 0;
virtual void current (
@@ -131,7 +122,7 @@ private:
bool f_operatorConfirmationRequest:1;
};
class epicsShareClass cacChannelNotify {
class LIBCA_API cacChannelNotify {
public:
virtual ~cacChannelNotify () = 0;
virtual void connectNotify ( epicsGuard < epicsMutex > & ) = 0;
@@ -169,7 +160,7 @@ private:
// but perhaps is a bad practice that should be eliminated? If so,
// then the IO should not store or use a pointer to the channel.
//
class epicsShareClass cacChannel {
class LIBCA_API cacChannel {
public:
typedef unsigned priLev;
static const priLev priorityMax;
@@ -273,11 +264,11 @@ protected:
private:
cacChannelNotify & callback;
cacChannel ( const cacChannel & );
cacChannel & operator = ( const cacChannel & );
cacChannel ( const cacChannel & );
cacChannel & operator = ( const cacChannel & );
};
class epicsShareClass cacContext {
class LIBCA_API cacContext {
public:
virtual ~cacContext ();
virtual cacChannel & createChannel (
@@ -296,7 +287,7 @@ public:
epicsGuard < epicsMutex > &, unsigned level ) const = 0;
};
class epicsShareClass cacContextNotify {
class LIBCA_API cacContextNotify {
public:
virtual ~cacContextNotify () = 0;
virtual cacContext & createNetworkContext (
@@ -316,7 +307,7 @@ public:
// **** Lock Hierarchy ****
// callbackControl must be taken before mutualExclusion if both are held at
// the same time
class epicsShareClass cacService {
class LIBCA_API cacService {
public:
virtual ~cacService () = 0;
virtual cacContext & contextCreate (
@@ -325,9 +316,9 @@ public:
cacContextNotify & ) = 0;
};
epicsShareFunc void epicsShareAPI caInstallDefaultService ( cacService & service );
LIBCA_API void epicsStdCall caInstallDefaultService ( cacService & service );
epicsShareExtern epicsThreadPrivateId caClientCallbackThreadId;
LIBCA_API extern epicsThreadPrivateId caClientCallbackThreadId;
inline cacChannel::cacChannel ( cacChannelNotify & notify ) :
callback ( notify )
@@ -389,4 +380,4 @@ inline bool caAccessRights::operatorConfirmationRequest () const
return this->f_operatorConfirmationRequest;
}
#endif // ifndef cacIOh
#endif // ifndef INC_cacIO_H

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacReadNotify::~cacReadNotify ()
{

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacStateNotify::~cacStateNotify ()
{

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -21,9 +20,7 @@
#include "iocinf.h"
#define epicsExportSharedSymbols
#include "cacIO.h"
#undef epicsExportSharedSymbols
cacWriteNotify::~cacWriteNotify ()
{

View File

@@ -3,11 +3,10 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -21,8 +20,8 @@
*
*/
#ifndef INCLcadefh
#define INCLcadefh
#ifndef INC_cadef_H
#define INC_cadef_H
/*
* done in two ifdef steps so that we will remain compatible with
@@ -32,19 +31,9 @@
# include <stdarg.h>
#endif
#ifdef epicsExportSharedSymbols
# define INCLcadefh_accessh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsThread.h"
#ifdef INCLcadefh_accessh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caerr.h"
#include "db_access.h"
#include "caeventmask.h"
@@ -83,8 +72,8 @@ typedef void caArh (struct access_rights_handler_args args);
/* The conversion routine to call for each type */
#define VALID_TYPE(TYPE) (((unsigned short)TYPE)<=LAST_BUFFER_TYPE)
/*
* Arguments passed to event handlers and get/put call back handlers.
/*
* Arguments passed to event handlers and get/put call back handlers.
*
* The status field below is the CA ECA_XXX status of the requested
* operation which is saved from when the operation was attempted in the
@@ -95,14 +84,14 @@ typedef void caArh (struct access_rights_handler_args args);
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 */
} evargs;
typedef void caEventCallBackFunc (struct event_handler_args);
epicsShareFunc void epicsShareAPI ca_test_event
LIBCA_API void epicsStdCall ca_test_event
(
struct event_handler_args
);
@@ -133,8 +122,8 @@ typedef unsigned CA_SYNC_GID;
#define CA_OP_CLEAR_EVENT 4
#define CA_OP_OTHER 5
/*
* used with connection_handler_args
/*
* used with connection_handler_args
*/
#define CA_OP_CONN_UP 6
#define CA_OP_CONN_DOWN 7
@@ -158,46 +147,46 @@ typedef unsigned CA_SYNC_GID;
#define TYPENOTCONN (-1) /* the channel's native type when disconnected */
epicsShareFunc short epicsShareAPI ca_field_type (chid chan);
epicsShareFunc unsigned long epicsShareAPI ca_element_count (chid chan);
epicsShareFunc const char * epicsShareAPI ca_name (chid chan);
epicsShareFunc void epicsShareAPI ca_set_puser (chid chan, void *puser);
epicsShareFunc void * epicsShareAPI ca_puser (chid chan);
epicsShareFunc unsigned epicsShareAPI ca_read_access (chid chan);
epicsShareFunc unsigned epicsShareAPI ca_write_access (chid chan);
LIBCA_API short epicsStdCall ca_field_type (chid chan);
LIBCA_API unsigned long epicsStdCall ca_element_count (chid chan);
LIBCA_API const char * epicsStdCall ca_name (chid chan);
LIBCA_API void epicsStdCall ca_set_puser (chid chan, void *puser);
LIBCA_API void * epicsStdCall ca_puser (chid chan);
LIBCA_API unsigned epicsStdCall ca_read_access (chid chan);
LIBCA_API unsigned epicsStdCall ca_write_access (chid chan);
/*
* cs_ - `channel state'
*
* cs_ - `channel state'
*
* cs_never_conn valid chid, IOC not found
* cs_prev_conn valid chid, IOC was found, but unavailable
* cs_conn valid chid, IOC was found, still available
* cs_closed channel deleted by user
*/
enum channel_state {cs_never_conn, cs_prev_conn, cs_conn, cs_closed};
epicsShareFunc enum channel_state epicsShareAPI ca_state (chid chan);
LIBCA_API enum channel_state epicsStdCall ca_state (chid chan);
/************************************************************************/
/* Perform Library Initialization */
/* */
/* Must be called once before calling any of the other routines */
/************************************************************************/
epicsShareFunc int epicsShareAPI ca_task_initialize (void);
enum ca_preemptive_callback_select
LIBCA_API int epicsStdCall ca_task_initialize (void);
enum ca_preemptive_callback_select
{ ca_disable_preemptive_callback, ca_enable_preemptive_callback };
epicsShareFunc int epicsShareAPI
LIBCA_API int epicsStdCall
ca_context_create (enum ca_preemptive_callback_select select);
epicsShareFunc void epicsShareAPI ca_detach_context ();
LIBCA_API void epicsStdCall ca_detach_context ();
/************************************************************************/
/* Remove CA facility from your task */
/* */
/* Normally called automatically at task exit */
/************************************************************************/
epicsShareFunc int epicsShareAPI ca_task_exit (void);
epicsShareFunc void epicsShareAPI ca_context_destroy (void);
LIBCA_API int epicsStdCall ca_task_exit (void);
LIBCA_API void epicsStdCall ca_context_destroy (void);
typedef unsigned capri;
typedef unsigned capri;
#define CA_PRIORITY_MAX 99
#define CA_PRIORITY_MIN 0
#define CA_PRIORITY_DEFAULT CA_PRIORITY_MIN
@@ -210,7 +199,7 @@ typedef unsigned capri;
* ca_create_channel ()
*
* pChanName R channel name string
* pConnStateCallback R address of connection state change
* pConnStateCallback R address of connection state change
* callback function
* pUserPrivate R placed in the channel's user private field
* o can be fetched later by ca_puser(CHID)
@@ -218,10 +207,10 @@ typedef unsigned capri;
* priority R priority level in the server 0 - 100
* pChanID RW channel id written here
*/
epicsShareFunc int epicsShareAPI ca_create_channel
LIBCA_API int epicsStdCall ca_create_channel
(
const char *pChanName,
caCh *pConnStateCallback,
const char *pChanName,
caCh *pConnStateCallback,
void *pUserPrivate,
capri priority,
chid *pChanID
@@ -230,10 +219,10 @@ epicsShareFunc int epicsShareAPI ca_create_channel
/*
* ca_change_connection_event()
*
* chan R channel identifier
* chan R channel identifier
* pfunc R address of connection call-back function
*/
epicsShareFunc int epicsShareAPI ca_change_connection_event
LIBCA_API int epicsStdCall ca_change_connection_event
(
chid chan,
caCh * pfunc
@@ -242,10 +231,10 @@ epicsShareFunc int epicsShareAPI ca_change_connection_event
/*
* ca_replace_access_rights_event ()
*
* chan R channel identifier
* chan R channel identifier
* pfunc R address of access rights call-back function
*/
epicsShareFunc int epicsShareAPI ca_replace_access_rights_event (
LIBCA_API int epicsStdCall ca_replace_access_rights_event (
chid chan,
caArh *pfunc
);
@@ -256,11 +245,11 @@ epicsShareFunc int epicsShareAPI ca_replace_access_rights_event (
* replace the default exception handler
*
* pfunc R address of exception call-back function
* pArg R copy of this pointer passed to exception
* pArg R copy of this pointer passed to exception
* call-back function
*/
typedef void caExceptionHandler (struct exception_handler_args);
epicsShareFunc int epicsShareAPI ca_add_exception_event
LIBCA_API int epicsStdCall ca_add_exception_event
(
caExceptionHandler *pfunc,
void *pArg
@@ -272,7 +261,7 @@ epicsShareFunc int epicsShareAPI ca_add_exception_event
*
* chanId R channel ID
*/
epicsShareFunc int epicsShareAPI ca_clear_channel
LIBCA_API int epicsStdCall ca_clear_channel
(
chid chanId
);
@@ -283,10 +272,10 @@ epicsShareFunc int epicsShareAPI ca_clear_channel
/*
* ca_bput()
*
* WARNING: this copies the new value from a string (dbr_string_t)
* WARNING: this copies the new value from a string (dbr_string_t)
* (and not as an integer)
*
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value string copied from this location
*/
#define ca_bput(chan, pValue) \
@@ -295,9 +284,9 @@ ca_array_put(DBR_STRING, 1u, chan, (const dbr_string_t *) (pValue))
/*
* ca_rput()
*
* WARNING: this copies the new value from a dbr_float_t
* WARNING: this copies the new value from a dbr_float_t
*
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
#define ca_rput(chan,pValue) \
@@ -307,7 +296,7 @@ ca_array_put(DBR_FLOAT, 1u, chan, (const dbr_float_t *) pValue)
* ca_put()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
#define ca_put(type, chan, pValue) ca_array_put (type, 1u, chan, pValue)
@@ -317,13 +306,13 @@ ca_array_put(DBR_FLOAT, 1u, chan, (const dbr_float_t *) pValue)
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
epicsShareFunc int epicsShareAPI ca_array_put
LIBCA_API int epicsStdCall ca_array_put
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
const void * pValue
);
@@ -331,8 +320,8 @@ epicsShareFunc int epicsShareAPI ca_array_put
/*
* ca_array_put_callback()
*
* This routine functions identically to the original ca put request
* with the addition of a callback to the user supplied function
* This routine functions identically to the original ca put request
* with the addition of a callback to the user supplied function
* after recod processing completes in the IOC. The arguments
* to the user supplied callback function are declared in
* the structure event_handler_args and include the pointer
@@ -340,15 +329,15 @@ epicsShareFunc int epicsShareAPI ca_array_put
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
epicsShareFunc int epicsShareAPI ca_array_put_callback
LIBCA_API int epicsStdCall ca_array_put_callback
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
const void * pValue,
caEventCallBackFunc * pFunc,
@@ -365,10 +354,10 @@ epicsShareFunc int epicsShareAPI ca_array_put_callback
/*
* ca_bget()
*
* WARNING: this copies the new value into a string (dbr_string_t)
* WARNING: this copies the new value into a string (dbr_string_t)
* (and not into an integer)
*
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_bget(chan, pValue) \
@@ -377,9 +366,9 @@ ca_array_get(DBR_STRING, 1u, chan, (dbr_string_t *)(pValue))
/*
* ca_rget()
*
* WARNING: this copies the new value into a 32 bit float (dbr_float_t)
* WARNING: this copies the new value into a 32 bit float (dbr_float_t)
*
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_rget(chan, pValue) \
@@ -389,7 +378,7 @@ ca_array_get(DBR_FLOAT, 1u, chan, (dbr_float_t *)(pValue))
* ca_rget()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
#define ca_get(type, chan, pValue) ca_array_get(type, 1u, chan, pValue)
@@ -399,13 +388,13 @@ ca_array_get(DBR_FLOAT, 1u, chan, (dbr_float_t *)(pValue))
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
epicsShareFunc int epicsShareAPI ca_array_get
LIBCA_API int epicsStdCall ca_array_get
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
void * pValue
);
@@ -419,10 +408,10 @@ epicsShareFunc int epicsShareAPI ca_array_get
/*
* ca_bget_callback()
*
* WARNING: this returns the new value as a string (dbr_string_t)
* WARNING: this returns the new value as a string (dbr_string_t)
* (and not as an integer)
*
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@@ -432,9 +421,9 @@ ca_array_get_callback (DBR_STRING, 1u, chan, pFunc, pArg)
/*
* ca_rget_callback()
*
* WARNING: this returns the new value as a float (dbr_float_t)
* WARNING: this returns the new value as a float (dbr_float_t)
*
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@@ -445,7 +434,7 @@ ca_array_get_callback (DBR_FLOAT, 1u, chan, pFunc, pArg)
* ca_get_callback()
*
* type R data type from db_access.h
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
@@ -457,14 +446,14 @@ ca_array_get_callback (type, 1u, chan, pFunc, pArg)
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
*/
epicsShareFunc int epicsShareAPI ca_array_get_callback
LIBCA_API int epicsStdCall ca_array_get_callback
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
caEventCallBackFunc * pFunc,
void * pArg
@@ -476,7 +465,7 @@ epicsShareFunc int epicsShareAPI ca_array_get_callback
/* NOTES: */
/* 1) Evid may be omited by passing a NULL pointer */
/* */
/* 2) An array count of zero specifies the native db count */
/* 2) An array count of zero specifies the native db count */
/* */
/************************************************************************/
@@ -485,16 +474,16 @@ epicsShareFunc int epicsShareAPI ca_array_get_callback
*
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* mask R event mask - one of {DBE_VALUE, DBE_ALARM, DBE_LOG}
* pFunc R pointer to call-back function
* pArg R copy of this pointer passed to pFunc
* pEventID W event id written at specified address
*/
epicsShareFunc int epicsShareAPI ca_create_subscription
LIBCA_API int epicsStdCall ca_create_subscription
(
chtype type,
unsigned long count,
chtype type,
unsigned long count,
chid chanId,
long mask,
caEventCallBackFunc * pFunc,
@@ -512,12 +501,12 @@ epicsShareFunc int epicsShareAPI ca_create_subscription
*
* eventID R event id
*/
epicsShareFunc int epicsShareAPI ca_clear_subscription
LIBCA_API int epicsStdCall ca_clear_subscription
(
evid eventID
);
epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
LIBCA_API chid epicsStdCall ca_evid_to_chid ( evid id );
/************************************************************************/
@@ -535,24 +524,24 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
/* FLOW OF TYPICAL APPLICATION */
/* */
/* search() ! Obtain Channel ids */
/* . ! " */
/* . ! " */
/* . ! " */
/* pend_io ! wait for channels to connect */
/* */
/* get() ! several requests for remote info */
/* get() ! " */
/* add_event() ! " */
/* get() ! " */
/* get() ! " */
/* add_event() ! " */
/* get() ! " */
/* . */
/* . */
/* . */
/* flush_io() ! send get requests */
/* ! optional parallel processing */
/* . ! " */
/* . ! " */
/* . ! " */
/* . ! " */
/* pend_io() ! wait for replies from get requests */
/* . ! access to requested data */
/* . ! " */
/* . ! " */
/* pend_event() ! wait for requested events */
/* */
/************************************************************************/
@@ -562,7 +551,7 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
/* functions specified with add_event when events occur. If the */
/* timeout is specified as 0 an infinite timeout is assumed. */
/* ca_flush_io() is called by this routine. If ca_pend_io () */
/* is called when no IO is outstanding then it will return immediately */
/* is called when no IO is outstanding then it will return immediately */
/* without processing. */
/************************************************************************/
@@ -571,28 +560,28 @@ epicsShareFunc chid epicsShareAPI ca_evid_to_chid ( evid id );
*
* timeOut R wait for this delay in seconds
*/
epicsShareFunc int epicsShareAPI ca_pend_event (ca_real timeOut);
LIBCA_API int epicsStdCall ca_pend_event (ca_real timeOut);
#define ca_poll() ca_pend_event(1e-12)
/*
* ca_pend_io()
*
* timeOut R wait for this delay in seconds but return early
* if all get requests (or search requests with null
* timeOut R wait for this delay in seconds but return early
* if all get requests (or search requests with null
* connection handler pointer have completed)
*/
epicsShareFunc int epicsShareAPI ca_pend_io (ca_real timeOut);
LIBCA_API int epicsStdCall ca_pend_io (ca_real timeOut);
/* calls ca_pend_io() if early is true otherwise ca_pend_event() is called */
epicsShareFunc int epicsShareAPI ca_pend (ca_real timeout, int early);
LIBCA_API int epicsStdCall ca_pend (ca_real timeout, int early);
/*
* ca_test_io()
*
* returns TRUE when get requests (or search requests with null
* returns TRUE when get requests (or search requests with null
* connection handler pointer) are outstanding
*/
epicsShareFunc int epicsShareAPI ca_test_io (void);
LIBCA_API int epicsStdCall ca_test_io (void);
/************************************************************************/
/* Send out all outstanding messages in the send queue */
@@ -600,7 +589,7 @@ epicsShareFunc int epicsShareAPI ca_test_io (void);
/*
* ca_flush_io()
*/
epicsShareFunc int epicsShareAPI ca_flush_io (void);
LIBCA_API int epicsStdCall ca_flush_io (void);
/*
@@ -609,10 +598,10 @@ epicsShareFunc int epicsShareAPI ca_flush_io (void);
* errorCode R status returned from channel access function
* pCtxStr R context string included with error print out
*/
epicsShareFunc void epicsShareAPI ca_signal
LIBCA_API void epicsStdCall ca_signal
(
long errorCode,
const char *pCtxStr
long errorCode,
const char *pCtxStr
);
/*
@@ -623,12 +612,12 @@ epicsShareFunc void epicsShareAPI ca_signal
* lineNo R line number included with error print out
*
*/
epicsShareFunc void epicsShareAPI ca_signal_with_file_and_lineno
LIBCA_API void epicsStdCall ca_signal_with_file_and_lineno
(
long errorCode,
const char *pCtxStr,
const char *pFileStr,
int lineNo
long errorCode,
const char *pCtxStr,
const char *pFileStr,
int lineNo
);
/*
@@ -639,7 +628,7 @@ epicsShareFunc void epicsShareAPI ca_signal_with_file_and_lineno
* pFormat R printf dtyle format string (and optional arguments)
*
*/
epicsShareFunc void epicsShareAPI ca_signal_formated (long ca_status, const char *pfilenm,
LIBCA_API void epicsStdCall ca_signal_formated (long ca_status, const char *pfilenm,
int lineno, const char *pFormat, ...);
/*
@@ -649,15 +638,15 @@ epicsShareFunc void epicsShareAPI ca_signal_formated (long ca_status, const char
*
* !!!! this function is _not_ thread safe !!!!
*/
epicsShareFunc const char * epicsShareAPI ca_host_name (chid channel);
LIBCA_API const char * epicsStdCall ca_host_name (chid channel);
/* thread safe version */
epicsShareFunc unsigned epicsShareAPI ca_get_host_name ( chid pChan,
LIBCA_API unsigned epicsStdCall ca_get_host_name ( chid pChan,
char *pBuf, unsigned bufLength );
/*
* CA_ADD_FD_REGISTRATION
*
* call their function with their argument whenever
* call their function with their argument whenever
* a new fd is added or removed
* (for use with a manager of the select system call under UNIX)
*
@@ -665,7 +654,7 @@ epicsShareFunc unsigned epicsShareAPI ca_get_host_name ( chid pChan,
* if (!opened) then fd was deleted
*
*/
typedef void CAFDHANDLER (void *parg, int fd, int opened);
typedef void CAFDHANDLER (void *parg, int fd, int opened);
/*
* ca_add_fd_registration()
@@ -674,7 +663,7 @@ typedef void CAFDHANDLER (void *parg, int fd, int opened);
* when an fd is created or deleted
* pArg R argument passed to above function
*/
epicsShareFunc int epicsShareAPI ca_add_fd_registration
LIBCA_API int epicsStdCall ca_add_fd_registration
(
CAFDHANDLER *pHandler,
void *pArg
@@ -696,29 +685,29 @@ epicsShareFunc int epicsShareAPI ca_add_fd_registration
*
* create a sync group
*
* pgid W pointer to sync group id that will be written
* pgid W pointer to sync group id that will be written
*/
epicsShareFunc int epicsShareAPI ca_sg_create (CA_SYNC_GID * pgid);
LIBCA_API int epicsStdCall ca_sg_create (CA_SYNC_GID * pgid);
/*
* ca_sg_delete()
*
* delete a sync group
*
* gid R sync group id
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_delete (const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_delete (const CA_SYNC_GID gid);
/*
* ca_sg_block()
*
* block for IO performed within a sync group to complete
* block for IO performed within a sync group to complete
*
* gid R sync group id
* gid R sync group id
* timeout R wait for this duration prior to timing out
* and returning ECA_TIMEOUT
*/
epicsShareFunc int epicsShareAPI ca_sg_block (const CA_SYNC_GID gid, ca_real timeout);
LIBCA_API int epicsStdCall ca_sg_block (const CA_SYNC_GID gid, ca_real timeout);
/*
* ca_sg_test()
@@ -726,17 +715,17 @@ epicsShareFunc int epicsShareAPI ca_sg_block (const CA_SYNC_GID gid, ca_real tim
* test for sync group IO operations in progress
*
* gid R sync group id
*
*
* returns one of ECA_BADSYNCGRP, ECA_IOINPROGRESS, ECA_IODONE
*/
epicsShareFunc int epicsShareAPI ca_sg_test (const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_test (const CA_SYNC_GID gid);
/*
* ca_sg_reset
*
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_reset(const CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_reset(const CA_SYNC_GID gid);
/*
* ca_sg_array_get()
@@ -747,16 +736,16 @@ epicsShareFunc int epicsShareAPI ca_sg_reset(const CA_SYNC_GID gid);
* gid R sync group id
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue W channel value copied to this location
*/
epicsShareFunc int epicsShareAPI ca_sg_array_get
LIBCA_API int epicsStdCall ca_sg_array_get
(
const CA_SYNC_GID gid,
chtype type,
chtype type,
unsigned long count,
chid chan,
void *pValue
void *pValue
);
#define ca_sg_get(gid, type, chan, pValue) \
@@ -771,16 +760,16 @@ ca_sg_array_get (gid, type, 1u, chan, pValue)
* gid R sync group id
* type R data type from db_access.h
* count R array element count
* chan R channel identifier
* chan R channel identifier
* pValue R new channel value copied from this location
*/
epicsShareFunc int epicsShareAPI ca_sg_array_put
LIBCA_API int epicsStdCall ca_sg_array_put
(
const CA_SYNC_GID gid,
chtype type,
chtype type,
unsigned long count,
chid chan,
const void *pValue
const void *pValue
);
#define ca_sg_put(gid, type, chan, pValue) \
@@ -793,29 +782,29 @@ ca_sg_array_put (gid, type, 1u, chan, pValue)
*
* gid R sync group id
*/
epicsShareFunc int epicsShareAPI ca_sg_stat (CA_SYNC_GID gid);
LIBCA_API int epicsStdCall ca_sg_stat (CA_SYNC_GID gid);
epicsShareFunc void epicsShareAPI ca_dump_dbr (chtype type, unsigned count, const void * pbuffer);
LIBCA_API void epicsStdCall ca_dump_dbr (chtype type, unsigned count, const void * pbuffer);
/*
* ca_v42_ok()
*
* Put call back is available if the CA server is on version is 4.2
* Put call back is available if the CA server is on version is 4.2
* or higher.
*
* chan R channel identifier
*
*
* (returns true or false)
*/
epicsShareFunc int epicsShareAPI ca_v42_ok (chid chan);
LIBCA_API int epicsStdCall ca_v42_ok (chid chan);
/*
* ca_version()
*
* returns the CA version string
*/
epicsShareFunc const char * epicsShareAPI ca_version (void);
LIBCA_API const char * epicsStdCall ca_version (void);
/*
* ca_replace_printf_handler ()
@@ -830,7 +819,7 @@ epicsShareFunc const char * epicsShareAPI ca_version (void);
*/
#ifndef CA_DONT_INCLUDE_STDARGH
typedef int caPrintfFunc (const char *pformat, va_list args);
epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
LIBCA_API int epicsStdCall ca_replace_printf_handler (
caPrintfFunc *ca_printf_func
);
#endif /*CA_DONT_INCLUDE_STDARGH*/
@@ -838,24 +827,24 @@ epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
/*
* (for testing purposes only)
*/
epicsShareFunc unsigned epicsShareAPI ca_get_ioc_connection_count (void);
epicsShareFunc int epicsShareAPI ca_preemtive_callback_is_enabled (void);
epicsShareFunc void epicsShareAPI ca_self_test (void);
epicsShareFunc unsigned epicsShareAPI ca_beacon_anomaly_count (void);
epicsShareFunc unsigned epicsShareAPI ca_search_attempts (chid chan);
epicsShareFunc double epicsShareAPI ca_beacon_period (chid chan);
epicsShareFunc double epicsShareAPI ca_receive_watchdog_delay (chid chan);
LIBCA_API unsigned epicsStdCall ca_get_ioc_connection_count (void);
LIBCA_API int epicsStdCall ca_preemtive_callback_is_enabled (void);
LIBCA_API void epicsStdCall ca_self_test (void);
LIBCA_API unsigned epicsStdCall ca_beacon_anomaly_count (void);
LIBCA_API unsigned epicsStdCall ca_search_attempts (chid chan);
LIBCA_API double epicsStdCall ca_beacon_period (chid chan);
LIBCA_API double epicsStdCall ca_receive_watchdog_delay (chid chan);
/*
* used when an auxillary thread needs to join a CA client context started
* by another thread
*/
epicsShareFunc struct ca_client_context * epicsShareAPI ca_current_context ();
epicsShareFunc int epicsShareAPI ca_attach_context ( struct ca_client_context * context );
LIBCA_API struct ca_client_context * epicsStdCall ca_current_context ();
LIBCA_API int epicsStdCall ca_attach_context ( struct ca_client_context * context );
epicsShareFunc int epicsShareAPI ca_client_status ( unsigned level );
epicsShareFunc int epicsShareAPI ca_context_status ( struct ca_client_context *, unsigned level );
LIBCA_API int epicsStdCall ca_client_status ( unsigned level );
LIBCA_API int epicsStdCall ca_context_status ( struct ca_client_context *, unsigned level );
/*
* deprecated
@@ -864,16 +853,16 @@ epicsShareFunc int epicsShareAPI ca_context_status ( struct ca_client_context *,
ca_build_and_connect(NAME, XXXXX, 1, CHIDPTR, YYYYY, 0, 0)
#define ca_array_build(NAME,XXXXX, ZZZZZZ, CHIDPTR,YYYYY)\
ca_build_and_connect(NAME, XXXXX, ZZZZZZ, CHIDPTR, YYYYY, 0, 0)
epicsShareFunc int epicsShareAPI ca_build_and_connect
( const char *pChanName, chtype, unsigned long,
LIBCA_API int epicsStdCall ca_build_and_connect
( const char *pChanName, chtype, unsigned long,
chid * pChanID, void *, caCh * pFunc, void * pArg );
#define ca_search(pChanName, pChanID)\
ca_search_and_connect (pChanName, pChanID, 0, 0)
epicsShareFunc int epicsShareAPI ca_search_and_connect
( const char * pChanName, chid * pChanID,
LIBCA_API int epicsStdCall ca_search_and_connect
( const char * pChanName, chid * pChanID,
caCh *pFunc, void * pArg );
epicsShareFunc int epicsShareAPI ca_channel_status (epicsThreadId tid);
epicsShareFunc int epicsShareAPI ca_clear_event ( evid eventID );
LIBCA_API int epicsStdCall ca_channel_status (epicsThreadId tid);
LIBCA_API int epicsStdCall ca_clear_event ( evid eventID );
#define ca_add_event(type,chan,pFunc,pArg,pEventID)\
ca_add_array_event(type,1u,chan,pFunc,pArg,0.0,0.0,0.0,pEventID)
#define ca_add_delta_event(TYPE,CHID,ENTRY,ARG,DELTA,EVID)\
@@ -882,7 +871,7 @@ ca_add_array_event(type,1u,chan,pFunc,pArg,0.0,0.0,0.0,pEventID)
ca_add_array_event(TYPE,1,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)
#define ca_add_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID)\
ca_add_masked_array_event(TYPE,COUNT,CHID,ENTRY,ARG,P_DELTA,N_DELTA,TO,EVID, DBE_VALUE | DBE_ALARM)
epicsShareFunc int epicsShareAPI ca_add_masked_array_event
LIBCA_API int epicsStdCall ca_add_masked_array_event
( chtype type, unsigned long count, chid chanId, caEventCallBackFunc * pFunc,
void * pArg, ca_real p_delta, ca_real n_delta, ca_real timeout,
evid * pEventID, long mask );
@@ -890,8 +879,8 @@ epicsShareFunc int epicsShareAPI ca_add_masked_array_event
/*
* defunct
*/
epicsShareFunc int epicsShareAPI ca_modify_user_name ( const char *pUserName );
epicsShareFunc int epicsShareAPI ca_modify_host_name ( const char *pHostName );
LIBCA_API int epicsStdCall ca_modify_user_name ( const char *pUserName );
LIBCA_API int epicsStdCall ca_modify_host_name ( const char *pHostName );
#ifdef __cplusplus
}
@@ -900,5 +889,5 @@ epicsShareFunc int epicsShareAPI ca_modify_host_name ( const char *pHostName );
/*
* no additions below this endif
*/
#endif /* ifndef INCLcadefh */
#endif /* ifndef INC_cadef_H */

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -17,23 +16,15 @@
*
* Author: Jeffrey O. Hill
*
*/
*/
#ifndef INCLcaerrh
#define INCLcaerrh
#ifndef INC_caerr_H
#define INC_caerr_H
#ifdef epicsExportSharedSymbols
# define INCLcaerrh_accessh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsTypes.h"
# include "epicsTypes.h"
#ifdef INCLcaerrh_accessh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
/* CA Status Code Definitions */
@@ -78,9 +69,9 @@
(CA_INSERT_MSG_NO(NUMBER) | CA_INSERT_SEVERITY(SEVERITY))
/*
* In the lines below "defunct" indicates that current release
* In the lines below "defunct" indicates that current release
* servers and client library will not return this error code, but
* servers on earlier releases that communicate with current clients
* servers on earlier releases that communicate with current clients
* might still generate exceptions with these error constants
*/
#define ECA_NORMAL DEFMSG(CA_K_SUCCESS, 0) /* success */
@@ -89,10 +80,10 @@
#define ECA_UKNSERV DEFMSG(CA_K_ERROR, 3) /* defunct */
#define ECA_SOCK DEFMSG(CA_K_ERROR, 4) /* defunct */
#define ECA_CONN DEFMSG(CA_K_WARNING, 5) /* defunct */
#define ECA_ALLOCMEM DEFMSG(CA_K_WARNING, 6)
#define ECA_ALLOCMEM DEFMSG(CA_K_WARNING, 6)
#define ECA_UKNCHAN DEFMSG(CA_K_WARNING, 7) /* defunct */
#define ECA_UKNFIELD DEFMSG(CA_K_WARNING, 8) /* defunct */
#define ECA_TOLARGE DEFMSG(CA_K_WARNING, 9)
#define ECA_TOLARGE DEFMSG(CA_K_WARNING, 9)
#define ECA_TIMEOUT DEFMSG(CA_K_WARNING, 10)
#define ECA_NOSUPPORT DEFMSG(CA_K_WARNING, 11) /* defunct */
#define ECA_STRTOBIG DEFMSG(CA_K_WARNING, 12) /* defunct */
@@ -149,9 +140,9 @@
extern "C" {
#endif
epicsShareFunc const char * epicsShareAPI ca_message(long ca_status);
LIBCA_API const char * epicsStdCall ca_message(long ca_status);
epicsShareExtern const char * ca_message_text [];
LIBCA_API extern const char * ca_message_text [];
#ifdef __cplusplus
}

View File

@@ -5,7 +5,7 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#ifndef INCLcaeventmaskh
@@ -13,12 +13,12 @@
/*
event selections
(If any more than 8 of these are needed then update the
select field in the event_block struct in db_event.c from
(If any more than 8 of these are needed then update the
select field in the event_block struct in db_event.c from
unsigned char to unsigned short)
DBE_VALUE
DBE_VALUE
Trigger an event when a significant change in the channel's value
occurs. Relies on the monitor deadband field under DCT.

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -23,7 +22,7 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include "envDefs.h"
#include "envDefs.h"
#include "errlog.h"
#include "osiWireFormat.h"
@@ -40,8 +39,8 @@ public:
void release ( void * );
private:
tsFreeList < class bhe, 0x100 > freeList;
bheFreeStoreMgr ( const bheFreeStoreMgr & );
bheFreeStoreMgr & operator = ( const bheFreeStoreMgr & );
bheFreeStoreMgr ( const bheFreeStoreMgr & );
bheFreeStoreMgr & operator = ( const bheFreeStoreMgr & );
};
void * bheFreeStoreMgr::allocate ( size_t size )
@@ -59,7 +58,7 @@ int main ( int argc, char ** argv )
epicsMutex mutex;
epicsGuard < epicsMutex > guard ( mutex );
bheFreeStoreMgr bheFreeList;
epicsTime programBeginTime = epicsTime::getMonotonic ();
epicsTime programBeginTime = epicsTime::getCurrent();
bool validCommandLine = false;
unsigned interest = 0u;
SOCKET sock;
@@ -108,7 +107,7 @@ int main ( int argc, char ** argv )
sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if ( sock == INVALID_SOCKET ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
errlogPrintf ("casw: unable to create datagram socket because = \"%s\"\n",
sockErrBuf );
@@ -122,7 +121,7 @@ int main ( int argc, char ** argv )
status = bind ( sock, &addr.sa, sizeof (addr) );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to bind to an unconstrained address because = \"%s\"\n",
@@ -134,7 +133,7 @@ int main ( int argc, char ** argv )
status = socket_ioctl ( sock, FIONBIO, &yes );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to set socket to nonblocking state because \"%s\"\n",
@@ -169,7 +168,7 @@ int main ( int argc, char ** argv )
status = socket_ioctl ( sock, FIONBIO, &no );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ( "casw: unable to set socket to blocking state because \"%s\"\n",
@@ -185,7 +184,7 @@ int main ( int argc, char ** argv )
&addr.sa, &addrSize );
if ( status <= 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
epicsSocketDestroy ( sock );
errlogPrintf ("casw: error from recv was = \"%s\"\n",
@@ -196,7 +195,7 @@ int main ( int argc, char ** argv )
if ( addr.sa.sa_family != AF_INET ) {
continue;
}
unsigned byteCount = static_cast <unsigned> ( status );
pCurMsg = reinterpret_cast < const caHdr * > ( ( pCurBuf = buf ) );
while ( byteCount ) {
@@ -213,9 +212,9 @@ int main ( int argc, char ** argv )
epicsTime previousTime;
struct sockaddr_in ina;
/*
/*
* this allows a fan-out server to potentially
* insert the true address of the CA server
* insert the true address of the CA server
*
* old servers:
* 1) set this field to one of the ip addresses of the host _or_
@@ -244,7 +243,7 @@ int main ( int argc, char ** argv )
ca_uint32_t beaconNumber = ntohl ( pCurMsg->m_cid );
unsigned protocolRevision = ntohs ( pCurMsg->m_dataType );
epicsTime currentTime = epicsTime::getMonotonic();
epicsTime currentTime = epicsTime::getCurrent();
/*
* look for it in the hash table
@@ -252,8 +251,8 @@ int main ( int argc, char ** argv )
bhe *pBHE = beaconTable.lookup ( ina );
if ( pBHE ) {
previousTime = pBHE->updateTime ( guard );
anomaly = pBHE->updatePeriod (
guard, programBeginTime,
anomaly = pBHE->updatePeriod (
guard, programBeginTime,
currentTime, beaconNumber, protocolRevision );
}
else {
@@ -264,7 +263,7 @@ int main ( int argc, char ** argv )
* time that we have seen a server's beacon
* shortly after the program started up)
*/
pBHE = new ( bheFreeList )
pBHE = new ( bheFreeList )
bhe ( mutex, currentTime, beaconNumber, ina );
if ( pBHE ) {
if ( beaconTable.add ( *pBHE ) < 0 ) {
@@ -275,7 +274,7 @@ int main ( int argc, char ** argv )
}
if ( anomaly || interest > 1 ) {
char date[64];
currentTime.strftime ( date, sizeof ( date ),
currentTime.strftime ( date, sizeof ( date ),
"%Y-%m-%d %H:%M:%S.%09f");
char host[64];
ipAddrToA ( &ina, host, sizeof ( host ) );
@@ -288,11 +287,11 @@ int main ( int argc, char ** argv )
pPrefix = " ";
}
}
printf ( "%s%-40s %s\n",
printf ( "%s%-40s %s\n",
pPrefix, host, date );
if ( anomaly && interest > 0 ) {
printf ( "\testimate=%f current=%f\n",
pBHE->period ( guard ),
printf ( "\testimate=%f current=%f\n",
pBHE->period ( guard ),
currentTime - previousTime );
}
fflush(stdout);

View File

@@ -5,17 +5,17 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
* CA performance test
* CA performance test
*
* History
* History
* joh 09-12-89 Initial release
* joh 12-20-94 portability
*
*
*
*/
#include <stdio.h>
@@ -45,7 +45,7 @@ typedef struct testItem {
char name[128];
int type;
int count;
void * pValue;
void * pValue;
} ti;
typedef void tf ( ti *pItems, unsigned iterations, unsigned *pInlineIter );
@@ -144,7 +144,7 @@ unsigned *pInlineIter
{
int status;
unsigned i;
for (i=0u; i<iterations; i++) {
status = ca_clear_channel (pItems[i].chix);
SEVCHK (status, NULL);
@@ -166,7 +166,7 @@ unsigned *pInlineIter
ti *pi;
int status;
dbr_int_t val;
for (pi=pItems; pi < &pItems[iterations]; pi++) {
status = ca_array_put(
pi->type,
@@ -257,7 +257,7 @@ unsigned *pInlineIter
{
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
@@ -337,7 +337,7 @@ unsigned *pInlineIter
{
ti *pi;
int status;
for (pi=pItems; pi<&pItems[iterations]; pi++) {
status = ca_array_get(
pi->type,
@@ -361,9 +361,9 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
epicsTimeStamp start_time;
double delay;
double X = 0u;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double mean;
double stdDev;
ti *pi;
@@ -371,7 +371,7 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
for ( pi = pItems; pi < &pItems[iterations]; pi++ ) {
epicsTimeGetCurrent ( &start_time );
status = ca_array_get ( pi->type, pi->count,
status = ca_array_get ( pi->type, pi->count,
pi->chix, pi->pValue );
SEVCHK ( status, NULL );
status = ca_pend_io ( 100.0 );
@@ -395,13 +395,13 @@ static void measure_get_latency (ti *pItems, unsigned iterations)
mean = X/iterations;
stdDev = sqrt ( XX/iterations - mean*mean );
printf (
printf (
"Get Latency - "
"mean = %3.1f uS, "
"std dev = %3.1f uS, "
"min = %3.1f uS "
"max = %3.1f uS\n",
mean * 1e6, stdDev * 1e6,
mean * 1e6, stdDev * 1e6,
min * 1e6, max * 1e6 );
}
@@ -412,9 +412,9 @@ static void printSearchStat ( const ti * pi, unsigned iterations )
{
unsigned i;
double X = 0u;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double XX = 0u;
double max = DBL_MIN;
double min = DBL_MAX;
double mean;
double stdDev;
@@ -432,7 +432,7 @@ static void printSearchStat ( const ti * pi, unsigned iterations )
mean = X / iterations;
stdDev = sqrt( XX / iterations - mean * mean );
printf (
printf (
"Search tries per chan - "
"mean = %3.1f "
"std dev = %3.1f "
@@ -458,10 +458,10 @@ void timeIt ( tf *pfunc, ti *pItems, unsigned iterations,
delay = epicsTimeDiffInSeconds ( &end_time, &start_time );
if ( delay > 0.0 ) {
double freq = ( iterations * inlineIter ) / delay;
printf ( "Per Op, %8.4f uS ( %8.4f MHz )",
printf ( "Per Op, %8.4f uS ( %8.4f MHz )",
1e6 / freq, freq / 1e6 );
if ( pItems != NULL ) {
printf(", %8.4f snd Mbps, %8.4f rcv Mbps\n",
printf(", %8.4f snd Mbps, %8.4f rcv Mbps\n",
(inlineIter*nBytesSent*CHAR_BIT)/(delay*1e6),
(inlineIter*nBytesRecv*CHAR_BIT)/(delay*1e6) );
}
@@ -479,13 +479,13 @@ static void test ( ti *pItems, unsigned iterations )
unsigned payloadSize, dblPayloadSize;
unsigned nBytesSent, nBytesRecv;
payloadSize =
payloadSize =
dbr_size_n ( pItems[0].type, pItems[0].count );
payloadSize = CA_MESSAGE_ALIGN ( payloadSize );
dblPayloadSize = dbr_size [ DBR_DOUBLE ];
dblPayloadSize = CA_MESSAGE_ALIGN ( dblPayloadSize );
if ( payloadSize > dblPayloadSize ) {
unsigned factor = payloadSize / dblPayloadSize;
while ( factor ) {
@@ -500,15 +500,15 @@ static void test ( ti *pItems, unsigned iterations )
printf ( "\t### async put test ###\n");
nBytesSent = sizeof ( caHdr ) + CA_MESSAGE_ALIGN( payloadSize );
nBytesRecv = 0u;
timeIt ( test_put, pItems, iterations,
nBytesSent * iterations,
timeIt ( test_put, pItems, iterations,
nBytesSent * iterations,
nBytesRecv * iterations );
printf ( "\t### async get test ###\n");
nBytesSent = sizeof ( caHdr );
nBytesRecv = sizeof ( caHdr ) + CA_MESSAGE_ALIGN ( payloadSize );
timeIt ( test_get, pItems, iterations,
nBytesSent * ( iterations ),
timeIt ( test_get, pItems, iterations,
nBytesSent * ( iterations ),
nBytesRecv * ( iterations ) );
printf ("\t### synch get test ###\n");
@@ -520,7 +520,7 @@ static void test ( ti *pItems, unsigned iterations )
else if ( iterations > 10 ) {
iterations /= 10;
}
timeIt ( test_wait, pItems, iterations,
timeIt ( test_wait, pItems, iterations,
nBytesSent * iterations,
nBytesRecv * iterations );
}
@@ -528,7 +528,7 @@ static void test ( ti *pItems, unsigned iterations )
/*
* catime ()
*/
int catime ( const char * channelName,
int catime ( const char * channelName,
unsigned channelCount, enum appendNumberFlag appNF )
{
unsigned i;
@@ -536,7 +536,7 @@ int catime ( const char * channelName,
unsigned strsize;
unsigned nBytesSent, nBytesRecv;
ti *pItemList;
if ( channelCount == 0 ) {
printf ( "channel count was zero\n" );
return 0;
@@ -547,15 +547,15 @@ int catime ( const char * channelName,
return -1;
}
SEVCHK ( ca_context_create ( ca_disable_preemptive_callback ),
SEVCHK ( ca_context_create ( ca_disable_preemptive_callback ),
"Unable to initialize" );
if ( appNF == appendNumber ) {
printf ( "Testing with %u channels named %snnn\n",
printf ( "Testing with %u channels named %snnn\n",
channelCount, channelName );
}
else {
printf ( "Testing with %u channels named %s\n",
printf ( "Testing with %u channels named %s\n",
channelCount, channelName );
}
@@ -573,7 +573,7 @@ int catime ( const char * channelName,
pItemList[i].name[strsize]= '\0';
pItemList[i].count = 0;
pItemList[i].pValue = 0;
nBytesSent += 2 * ( CA_MESSAGE_ALIGN ( strlen ( pItemList[i].name ) )
nBytesSent += 2 * ( CA_MESSAGE_ALIGN ( strlen ( pItemList[i].name ) )
+ sizeof (caHdr) );
nBytesRecv += 2 * sizeof (caHdr);
}
@@ -582,7 +582,7 @@ int catime ( const char * channelName,
printf ( "--------------------\n" );
timeIt ( test_search, pItemList, channelCount, nBytesSent, nBytesRecv );
printSearchStat ( pItemList, channelCount );
for ( i = 0; i < channelCount; i++ ) {
size_t count = ca_element_count ( pItemList[i].chix );
size_t size = sizeof ( dbr_string_t ) * count;
@@ -608,7 +608,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pFltVal[j] = (dbr_float_t) val;
}
pItemList[i].type = DBR_FLOAT;
pItemList[i].type = DBR_FLOAT;
}
printf ( "DBR_FLOAT Test\n" );
printf ( "--------------\n" );
@@ -621,13 +621,13 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pDblVal[j] = (dbr_double_t) val;
}
pItemList[i].type = DBR_DOUBLE;
pItemList[i].type = DBR_DOUBLE;
}
printf ( "DBR_DOUBLE Test\n" );
printf ( "---------------\n" );
test ( pItemList, channelCount );
for ( i = 0; i < channelCount; i++ ) {
dbr_string_t * pStrVal = ( dbr_string_t * ) pItemList[i].pValue;
double val = i;
@@ -635,7 +635,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
sprintf ( pStrVal[j], "%f", val );
}
pItemList[i].type = DBR_STRING;
pItemList[i].type = DBR_STRING;
}
printf ( "DBR_STRING Test\n" );
printf ( "---------------\n" );
@@ -648,7 +648,7 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pIntVal[j] = (dbr_int_t) val;
}
pItemList[i].type = DBR_INT;
pItemList[i].type = DBR_INT;
}
printf ( "DBR_INT Test\n" );
printf ( "------------\n" );
@@ -661,8 +661,8 @@ int catime ( const char * channelName,
for ( j = 0; j < pItemList[i].count; j++ ) {
pDblVal[j] = 0;
}
pItemList[i].type = DBR_DOUBLE;
}
pItemList[i].type = DBR_DOUBLE;
}
measure_get_latency ( pItemList, channelCount );
printf ( "Free Channel Test\n" );
@@ -670,10 +670,10 @@ int catime ( const char * channelName,
timeIt ( test_free, pItemList, channelCount, 0, 0 );
SEVCHK ( ca_task_exit (), "Unable to free resources at exit" );
for ( i = 0; i < channelCount; i++ ) {
free ( pItemList[i].pValue );
}
}
free ( pItemList );

View File

@@ -5,7 +5,7 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>

View File

@@ -3,22 +3,21 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#include <stdexcept>
@@ -33,7 +32,7 @@ bool comBuf::flushToWire ( wireSendAdapter & wire, const epicsTime & currentTime
unsigned index = this->nextReadIndex;
unsigned finalIndex = this->commitIndex;
while ( index < finalIndex ) {
unsigned nBytes = wire.sendBytes (
unsigned nBytes = wire.sendBytes (
&this->buf[index], finalIndex - index, currentTime );
if ( nBytes == 0u ) {
this->nextReadIndex = index;
@@ -45,9 +44,9 @@ bool comBuf::flushToWire ( wireSendAdapter & wire, const epicsTime & currentTime
return true;
}
// throwing the exception from a function that isnt inline
// throwing the exception from a function that isnt inline
// shrinks the GNU compiled object code
void comBuf::throwInsufficentBytesException ()
void comBuf::throwInsufficentBytesException ()
{
throw comBuf::insufficentBytesAvailable ();
}

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -17,12 +16,12 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#ifndef comBufh
#define comBufh
#ifndef INC_comBuf_H
#define INC_comBuf_H
#include <new>
#include <cstring>
@@ -40,23 +39,23 @@ static const unsigned comBufSize = 0x4000;
class comBufMemoryManager {
public:
virtual ~comBufMemoryManager ();
virtual void * allocate ( size_t ) = 0;
virtual void release ( void * ) = 0;
virtual void * allocate ( size_t ) = 0;
virtual void release ( void * ) = 0;
};
class wireSendAdapter {
public:
virtual unsigned sendBytes ( const void * pBuf,
unsigned nBytesInBuf,
virtual unsigned sendBytes ( const void * pBuf,
unsigned nBytesInBuf,
const class epicsTime & currentTime ) = 0;
protected:
virtual ~wireSendAdapter() {}
};
enum swioCircuitState {
swioConnected,
swioPeerHangup,
swioPeerAbort,
enum swioCircuitState {
swioConnected,
swioPeerHangup,
swioPeerAbort,
swioLinkFailure,
swioLocalAbort
};
@@ -67,7 +66,7 @@ struct statusWireIO {
class wireRecvAdapter {
public:
virtual void recvBytes ( void * pBuf,
virtual void recvBytes ( void * pBuf,
unsigned nBytesInBuf, statusWireIO & ) = 0;
protected:
virtual ~wireRecvAdapter() {}
@@ -106,7 +105,7 @@ public:
template < class T >
popStatus pop ( T & );
static void throwInsufficentBytesException ();
void * operator new ( size_t size,
void * operator new ( size_t size,
comBufMemoryManager & );
epicsPlacementDeleteOperator (( void *, comBufMemoryManager & ))
private:
@@ -119,14 +118,14 @@ private:
bool push ( const T * ); // disabled
};
inline void * comBuf::operator new ( size_t size,
inline void * comBuf::operator new ( size_t size,
comBufMemoryManager & mgr )
{
return mgr.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
inline void comBuf::operator delete ( void * pCadaver,
inline void comBuf::operator delete ( void * pCadaver,
comBufMemoryManager & mgr )
{
mgr.release ( pCadaver );
@@ -162,8 +161,8 @@ inline unsigned comBuf :: uncommittedBytes () const
inline unsigned comBuf :: push ( comBuf & bufIn )
{
unsigned nBytes = this->copyInBytes (
& bufIn.buf[ bufIn.nextReadIndex ],
unsigned nBytes = this->copyInBytes (
& bufIn.buf[ bufIn.nextReadIndex ],
bufIn.commitIndex - bufIn.nextReadIndex );
bufIn.nextReadIndex += nBytes;
return nBytes;
@@ -174,11 +173,11 @@ inline unsigned comBuf :: capacityBytes ()
return comBufSize;
}
inline void comBuf :: fillFromWire (
inline void comBuf :: fillFromWire (
wireRecvAdapter & wire, statusWireIO & stat )
{
wire.recvBytes (
& this->buf[this->nextWriteIndex],
wire.recvBytes (
& this->buf[this->nextWriteIndex],
sizeof ( this->buf ) - this->nextWriteIndex, stat );
if ( stat.circuitState == swioConnected ) {
this->nextWriteIndex += stat.bytesCopied;
@@ -332,4 +331,4 @@ comBuf :: popStatus comBuf :: pop ( T & returnVal )
return status;
}
#endif // ifndef comBufh
#endif // ifndef INC_comBuf_H

View File

@@ -3,11 +3,10 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
* L O S A L A M O S
@@ -26,8 +25,8 @@
#include "iocinf.h"
#include "virtualCircuit.h"
comQueRecv::comQueRecv ( comBufMemoryManager & comBufMemoryManagerIn ):
comBufMemMgr ( comBufMemoryManagerIn ), nBytesPending ( 0u )
comQueRecv::comQueRecv ( comBufMemoryManager & comBufMemoryManagerIn ):
comBufMemMgr ( comBufMemoryManagerIn ), nBytesPending ( 0u )
{
}
@@ -101,7 +100,7 @@ void comQueRecv::popString ( epicsOldString *pStr )
}
void comQueRecv::pushLastComBufReceived ( comBuf & bufIn )
{
bufIn.commitIncomming ();
comBuf * pComBuf = this->bufs.last ();
@@ -172,7 +171,7 @@ void comQueRecv::removeAndDestroyBuf ( comBuf & buf )
this->comBufMemMgr.release ( & buf );
}
epicsUInt8 comQueRecv::popUInt8 ()
epicsUInt8 comQueRecv::popUInt8 ()
{
comBuf * pComBuf = this->bufs.first ();
if ( ! pComBuf ) {

View File

@@ -3,28 +3,27 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef comQueRecvh
#define comQueRecvh
#ifndef INC_comQueRecv_H
#define INC_comQueRecv_H
#include "comBuf.h"
@@ -54,8 +53,8 @@ private:
epicsUInt16 multiBufferPopUInt16 ();
epicsUInt32 multiBufferPopUInt32 ();
void removeAndDestroyBuf ( comBuf & );
comQueRecv ( const comQueRecv & );
comQueRecv & operator = ( const comQueRecv & );
comQueRecv ( const comQueRecv & );
comQueRecv & operator = ( const comQueRecv & );
};
inline unsigned comQueRecv::occupiedBytes () const
@@ -108,4 +107,4 @@ inline epicsFloat64 comQueRecv::popFloat64 ()
return AlignedWireRef < epicsFloat64 > ( tmp._fp );
}
#endif // ifndef comQueRecvh
#endif // ifndef INC_comQueRecv_H

View File

@@ -3,23 +3,22 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
//
@@ -35,7 +34,7 @@
// a connection dropped.
// 4) Do not allocate too much memory in exception situatons (such as
// after a circuit disconnect).
// 5) Avoid allocating more memory than is absolutely necessary to meet
// 5) Avoid allocating more memory than is absolutely necessary to meet
// the above requirements.
// 6) Message fragments must never be sent to the IOC when there isnt
// enough memory to queue part of a message (we also must not force
@@ -44,7 +43,7 @@
// protocol stream.
//
// Implementation:
// 1) When queuing a complete message, first test to see if a flush is
// 1) When queuing a complete message, first test to see if a flush is
// required. If it is a receive thread scheduals the flush with the
// send thread, and otherwise directly execute the system call. The
// send thread must run at a higher priority than the receive thread
@@ -52,14 +51,14 @@
// 2) Preallocate space for the entire message prior to copying in the
// message so that message fragments are not flushed out just prior
// to detecting that memory is unavailable.
// 3) Return a special error constant when the following situations
// 3) Return a special error constant when the following situations
// are detected when the user is attempting to queue a request
// from within a user callback executed by a receive thread:
// a) A user is queuing more requests that demand a response from a
// a) A user is queuing more requests that demand a response from a
// callback than are removed by the response that initiated the
// callback, and this situation persists for many callbacks until
// all buffering in the system is exausted.
// b) A user is queuing many requests that demand a response from one
// b) A user is queuing many requests that demand a response from one
// callback until all buffering in the system is exausted.
// c) Some combination of both (a) nad (b).
//
@@ -67,21 +66,20 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "virtualCircuit.h"
#include "db_access.h" // for dbr_short_t etc
// nill message alignment pad bytes
const char cacNillBytes [] =
{
const char cacNillBytes [] =
{
0, 0, 0, 0,
0, 0, 0, 0
};
comQueSend::comQueSend ( wireSendAdapter & wireIn,
comQueSend::comQueSend ( wireSendAdapter & wireIn,
comBufMemoryManager & comBufMemMgrIn ):
comBufMemMgr ( comBufMemMgrIn ), wire ( wireIn ),
comBufMemMgr ( comBufMemMgrIn ), wire ( wireIn ),
nBytesPending ( 0u )
{
}
@@ -91,7 +89,7 @@ comQueSend::~comQueSend ()
this->clear ();
}
void comQueSend::clear ()
void comQueSend::clear ()
{
comBuf *pBuf;
@@ -181,32 +179,32 @@ const comQueSend::copyScalarFunc_t comQueSend::dbrCopyScalar [39] = {
&comQueSend::copy_dbr_invalid // DBR_CLASS_NAME
};
void comQueSend::copy_dbr_string ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_string ( const void *pValue, unsigned nElem )
{
this->push ( static_cast < const char * > ( pValue ), nElem * MAX_STRING_SIZE );
}
void comQueSend::copy_dbr_short ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_short ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_short_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_float ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_float ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_float_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_char ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_char ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_char_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_long ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_long ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_long_t *> ( pValue ), nElem );
}
void comQueSend::copy_dbr_double ( const void *pValue, unsigned nElem )
void comQueSend::copy_dbr_double ( const void *pValue, unsigned nElem )
{
this->push ( static_cast <const dbr_double_t *> ( pValue ), nElem );
}
@@ -258,7 +256,7 @@ const comQueSend::copyVectorFunc_t comQueSend::dbrCopyVector [39] = {
&comQueSend::copy_dbr_invalid // DBR_CLASS_NAME
};
comBuf * comQueSend::popNextComBufToSend ()
comBuf * comQueSend::popNextComBufToSend ()
{
comBuf *pBuf = this->bufs.get ();
if ( pBuf ) {
@@ -279,9 +277,9 @@ comBuf * comQueSend::popNextComBufToSend ()
}
void comQueSend::insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok )
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok )
{
if ( payloadSize < 0xffff && nElem < 0xffff ) {
comBuf * pComBuf = this->bufs.last ();
@@ -289,12 +287,12 @@ void comQueSend::insertRequestHeader (
pComBuf = newComBuf ();
this->pushComBuf ( *pComBuf );
}
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( payloadSize ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( nElem ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( payloadSize ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( nElem ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
}
else if ( v49Ok ) {
comBuf * pComBuf = this->bufs.last ();
@@ -302,14 +300,14 @@ void comQueSend::insertRequestHeader (
pComBuf = newComBuf ();
this->pushComBuf ( *pComBuf );
}
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( 0xffff ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( 0u ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( payloadSize );
pComBuf->push ( nElem );
pComBuf->push ( request );
pComBuf->push ( static_cast < ca_uint16_t > ( 0xffff ) );
pComBuf->push ( dataType );
pComBuf->push ( static_cast < ca_uint16_t > ( 0u ) );
pComBuf->push ( cid );
pComBuf->push ( requestDependent );
pComBuf->push ( payloadSize );
pComBuf->push ( nElem );
}
else {
throw cacChannel::outOfBounds ();
@@ -317,9 +315,9 @@ void comQueSend::insertRequestHeader (
}
void comQueSend::insertRequestWithPayLoad (
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok )
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok )
{
if ( INVALID_DB_REQ ( dataType ) ) {
throw cacChannel::badType ();
@@ -337,16 +335,16 @@ void comQueSend::insertRequestWithPayLoad (
throw cacChannel::outOfBounds();
}
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
nElem, cid, requestDependent, v49Ok );
this->pushString ( pStr, size );
this->pushString ( pStr, size );
}
else {
size = dbr_size[dataType];
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
nElem, cid, requestDependent, v49Ok );
( this->*dbrCopyScalar [dataType] ) ( pPayload );
}
@@ -357,22 +355,22 @@ void comQueSend::insertRequestWithPayLoad (
maxBytes = 0xffffffff;
}
else {
maxBytes = MAX_TCP - sizeof ( caHdr );
maxBytes = MAX_TCP - sizeof ( caHdr );
}
arrayElementCount maxElem =
( maxBytes - sizeof (dbr_double_t) - dbr_size[dataType] ) /
arrayElementCount maxElem =
( maxBytes - sizeof (dbr_double_t) - dbr_size[dataType] ) /
dbr_value_size[dataType];
if ( nElem >= maxElem ) {
throw cacChannel::outOfBounds();
}
// the above checks verify that the total size
// is lest that 0xffffffff
size = static_cast < ca_uint32_t >
size = static_cast < ca_uint32_t >
( dbr_size_n ( dataType, nElem ) );
payloadSize = CA_MESSAGE_ALIGN ( size );
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
static_cast < ca_uint32_t > ( nElem ),
this->insertRequestHeader ( request, payloadSize,
static_cast <ca_uint16_t> ( dataType ),
static_cast < ca_uint32_t > ( nElem ),
cid, requestDependent, v49Ok );
( this->*dbrCopyVector [dataType] ) ( pPayload, nElem );
}
@@ -383,7 +381,7 @@ void comQueSend::insertRequestWithPayLoad (
}
}
void comQueSend::commitMsg ()
void comQueSend::commitMsg ()
{
while ( this->pFirstUncommited.valid() ) {
this->nBytesPending += this->pFirstUncommited->uncommittedBytes ();

View File

@@ -3,31 +3,30 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef comQueSendh
#define comQueSendh
#ifndef INC_comQueSend_H
#define INC_comQueSend_H
#include <new>
#include <new>
#include "tsDLList.h"
#include "comBuf.h"
@@ -39,7 +38,7 @@ template < class T > class epicsGuard;
class comQueSendMsgMinder {
public:
comQueSendMsgMinder (
comQueSendMsgMinder (
class comQueSend &, epicsGuard < epicsMutex > & );
~comQueSendMsgMinder ();
void commit ();
@@ -56,20 +55,20 @@ public:
comQueSend ( wireSendAdapter &, comBufMemoryManager & );
~comQueSend ();
void clear ();
unsigned occupiedBytes () const;
unsigned occupiedBytes () const;
bool flushEarlyThreshold ( unsigned nBytesThisMsg ) const;
bool flushBlockThreshold () const;
bool flushBlockThreshold () const;
void pushUInt16 ( const ca_uint16_t value );
void pushUInt32 ( const ca_uint32_t value );
void pushFloat32 ( const ca_float32_t value );
void pushString ( const char *pVal, unsigned nChar );
void insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
void insertRequestHeader (
ca_uint16_t request, ca_uint32_t payloadSize,
ca_uint16_t dataType, ca_uint32_t nElem, ca_uint32_t cid,
ca_uint32_t requestDependent, bool v49Ok );
void insertRequestWithPayLoad (
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
ca_uint16_t request, unsigned dataType, arrayElementCount nElem,
ca_uint32_t cid, ca_uint32_t requestDependent,
const void * pPayload, bool v49Ok );
comBuf * popNextComBufToSend ();
private:
@@ -79,43 +78,43 @@ private:
wireSendAdapter & wire;
unsigned nBytesPending;
typedef void ( comQueSend::*copyScalarFunc_t ) (
typedef void ( comQueSend::*copyScalarFunc_t ) (
const void * pValue );
static const copyScalarFunc_t dbrCopyScalar [comQueSendCopyDispatchSize];
void copy_dbr_string ( const void * pValue );
void copy_dbr_short ( const void * pValue );
void copy_dbr_float ( const void * pValue );
void copy_dbr_char ( const void * pValue );
void copy_dbr_long ( const void * pValue );
void copy_dbr_double ( const void * pValue );
void copy_dbr_short ( const void * pValue );
void copy_dbr_float ( const void * pValue );
void copy_dbr_char ( const void * pValue );
void copy_dbr_long ( const void * pValue );
void copy_dbr_double ( const void * pValue );
void copy_dbr_invalid ( const void * pValue );
typedef void ( comQueSend::*copyVectorFunc_t ) (
typedef void ( comQueSend::*copyVectorFunc_t ) (
const void * pValue, unsigned nElem );
static const copyVectorFunc_t dbrCopyVector [comQueSendCopyDispatchSize];
void copy_dbr_string ( const void *pValue, unsigned nElem );
void copy_dbr_short ( const void *pValue, unsigned nElem );
void copy_dbr_float ( const void *pValue, unsigned nElem );
void copy_dbr_char ( const void *pValue, unsigned nElem );
void copy_dbr_long ( const void *pValue, unsigned nElem );
void copy_dbr_double ( const void *pValue, unsigned nElem );
void copy_dbr_short ( const void *pValue, unsigned nElem );
void copy_dbr_float ( const void *pValue, unsigned nElem );
void copy_dbr_char ( const void *pValue, unsigned nElem );
void copy_dbr_long ( const void *pValue, unsigned nElem );
void copy_dbr_double ( const void *pValue, unsigned nElem );
void copy_dbr_invalid ( const void * pValue, unsigned nElem );
void pushComBuf ( comBuf & );
comBuf * newComBuf ();
void pushComBuf ( comBuf & );
comBuf * newComBuf ();
void beginMsg ();
void commitMsg ();
void beginMsg ();
void commitMsg ();
void clearUncommitedMsg ();
friend class comQueSendMsgMinder;
//
// visual C++ versions 6 & 7 do not allow out of
// visual C++ versions 6 & 7 do not allow out of
// class member template function definition
//
template < class T >
inline void push ( const T *pVal, const unsigned nElem )
inline void push ( const T *pVal, const unsigned nElem )
{
comBuf * pLastBuf = this->bufs.last ();
unsigned nCopied;
@@ -127,18 +126,18 @@ private:
}
while ( nElem > nCopied ) {
comBuf * pComBuf = newComBuf ();
nCopied += pComBuf->push
nCopied += pComBuf->push
( &pVal[nCopied], nElem - nCopied );
this->pushComBuf ( *pComBuf );
}
}
//
// visual C++ versions 6 and 7 do not allow out of
// visual C++ versions 6 and 7 do not allow out of
// class member template function definition
//
template < class T >
inline void push ( const T & val )
inline void push ( const T & val )
{
comBuf * pComBuf = this->bufs.last ();
if ( pComBuf && pComBuf->push ( val ) ) {
@@ -159,8 +158,8 @@ private:
extern const char cacNillBytes[];
inline comQueSendMsgMinder::comQueSendMsgMinder (
class comQueSend & sendQueIn, epicsGuard < epicsMutex > & ) :
inline comQueSendMsgMinder::comQueSendMsgMinder (
class comQueSend & sendQueIn, epicsGuard < epicsMutex > & ) :
pSendQue ( & sendQueIn )
{
sendQueIn.beginMsg ();
@@ -181,32 +180,32 @@ inline void comQueSendMsgMinder::commit ()
}
}
inline void comQueSend::beginMsg ()
inline void comQueSend::beginMsg ()
{
this->pFirstUncommited = this->bufs.lastIter ();
}
inline void comQueSend::pushUInt16 ( const ca_uint16_t value )
inline void comQueSend::pushUInt16 ( const ca_uint16_t value )
{
this->push ( value );
}
inline void comQueSend::pushUInt32 ( const ca_uint32_t value )
inline void comQueSend::pushUInt32 ( const ca_uint32_t value )
{
this->push ( value );
}
inline void comQueSend::pushFloat32 ( const ca_float32_t value )
inline void comQueSend::pushFloat32 ( const ca_float32_t value )
{
this->push ( value );
}
inline void comQueSend::pushString ( const char *pVal, unsigned nChar )
inline void comQueSend::pushString ( const char *pVal, unsigned nChar )
{
this->push ( pVal, nChar );
}
inline void comQueSend::pushComBuf ( comBuf & cb )
inline void comQueSend::pushComBuf ( comBuf & cb )
{
this->bufs.add ( cb );
if ( ! this->pFirstUncommited.valid() ) {
@@ -214,7 +213,7 @@ inline void comQueSend::pushComBuf ( comBuf & cb )
}
}
inline unsigned comQueSend::occupiedBytes () const
inline unsigned comQueSend::occupiedBytes () const
{
return this->nBytesPending;
}
@@ -235,4 +234,4 @@ inline comBuf * comQueSend::newComBuf ()
return new ( this->comBufMemMgr ) comBuf;
}
#endif // ifndef comQueSendh
#endif // ifndef INC_comQueSend_H

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* C O N V E R T . C
@@ -13,11 +12,11 @@
* Author: D. Kersteins
*
*
* NOTES:
* NOTES:
*
* 1) All routines in this file have an encode argument which
* determines if we are converting from the standard format to
* the local format or vise versa. To date only float and double data
* the local format or vise versa. To date only float and double data
* types must be converted differently depending on the encode
* argument - joh
*
@@ -29,7 +28,6 @@
#include "osiSock.h"
#include "osiWireFormat.h"
#define epicsExportSharedSymbols
#include "net_convert.h"
#include "iocinf.h"
#include "caProto.h"
@@ -46,38 +44,38 @@
*
* net format: big endian and IEEE float
*/
typedef void ( * CACVRTFUNCPTR ) (
typedef void ( * CACVRTFUNCPTR ) (
const void *pSrc, void *pDest, int hton, arrayElementCount count );
inline void dbr_htond (
inline void dbr_htond (
const dbr_double_t * pHost, dbr_double_t * pNet )
{
AlignedWireRef < epicsFloat64 > tmp ( *pNet );
tmp = *pHost;
}
inline void dbr_ntohd (
inline void dbr_ntohd (
const dbr_double_t * pNet, dbr_double_t * pHost )
{
*pHost = AlignedWireRef < const epicsFloat64 > ( *pNet );
}
inline void dbr_htonf (
inline void dbr_htonf (
const dbr_float_t * pHost, dbr_float_t * pNet )
{
AlignedWireRef < epicsFloat32 > tmp ( *pNet );
tmp = *pHost;
}
inline void dbr_ntohf (
inline void dbr_ntohf (
const dbr_float_t * pNet, dbr_float_t * pHost )
{
*pHost = AlignedWireRef < const epicsFloat32 > ( *pNet );
}
inline epicsUInt16 dbr_ntohs( const epicsUInt16 & net )
inline epicsUInt16 dbr_ntohs( const epicsUInt16 & net )
{
return AlignedWireRef < const epicsUInt16 > ( net );
}
inline epicsUInt16 dbr_htons ( const epicsUInt16 & host )
inline epicsUInt16 dbr_htons ( const epicsUInt16 & host )
{
epicsUInt16 tmp;
AlignedWireRef < epicsUInt16 > awr ( tmp );
@@ -103,7 +101,7 @@ inline epicsUInt32 dbr_htonl ( const epicsUInt32 & host )
* otherwise vise-versa
*
* net format: big endian and IEEE float
*
*
*/
/*
@@ -122,7 +120,7 @@ arrayElementCount num /* number of values */
/* convert "in place" -> nothing to do */
if (s == d)
return;
memcpy ( pDest, pSrc, num*MAX_STRING_SIZE );
memcpy ( pDest, pSrc, num*MAX_STRING_SIZE );
}
/*
@@ -234,7 +232,7 @@ arrayElementCount num /* number of values */
*
*
* NOTES:
* placing encode outside the loop results in more
* placing encode outside the loop results in more
* code but better performance.
*
*/
@@ -291,10 +289,10 @@ arrayElementCount num /* number of values */
** struct dbr_sts_string *d pointer to destination struct
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -307,7 +305,7 @@ arrayElementCount num /* number of values */
{
struct dbr_sts_string *pSrc = (struct dbr_sts_string *) s;
struct dbr_sts_string *pDest = (struct dbr_sts_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@@ -328,8 +326,8 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -361,10 +359,10 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -387,10 +385,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_sts_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -418,9 +416,9 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_sts_enum(
@@ -446,9 +444,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_short()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_short(
@@ -485,9 +483,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_char()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_char(
@@ -526,9 +524,9 @@ arrayElementCount num /* number of values */
** cvrt_gr_long()
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_gr_long(
@@ -564,10 +562,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_gr_enum(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -599,10 +597,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_gr_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -663,10 +661,10 @@ arrayElementCount num /* number of values */
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -730,9 +728,9 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_short(
@@ -772,9 +770,9 @@ arrayElementCount num /* number of values */
** cvrt_ctrl_long(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_long(
@@ -814,9 +812,9 @@ arrayElementCount num /* number of values */
** cvrt_ctrl_short(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_ctrl_char(
@@ -833,7 +831,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
if ( s == d )
if ( s == d )
return;
pDest->upper_disp_limit = pSrc->upper_disp_limit;
@@ -853,10 +851,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -919,10 +917,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_float(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -984,10 +982,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_ctrl_enum(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -1003,7 +1001,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
pDest->no_str = dbr_ntohs(pSrc->no_str);
pDest->no_str = dbr_ntohs(pSrc->no_str);
if ( s != d ) {
memcpy((void *)pDest->strs,(void *)pSrc->strs,sizeof(pSrc->strs));
}
@@ -1024,8 +1022,8 @@ arrayElementCount num /* number of values */
** else ieee to vax
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -1043,7 +1041,7 @@ arrayElementCount num /* number of values */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
if ( s == d )
if ( s == d )
return;
if (num == 1) /* single value */
@@ -1058,8 +1056,8 @@ arrayElementCount num /* number of values */
** cvrt_sts_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -1088,10 +1086,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_string(s,d)
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -1104,7 +1102,7 @@ arrayElementCount num /* number of values */
{
struct dbr_time_string *pSrc = (struct dbr_time_string *) s;
struct dbr_time_string *pDest = (struct dbr_time_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@@ -1120,8 +1118,8 @@ arrayElementCount num /* number of values */
** cvrt_time_short(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -1152,10 +1150,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_float(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -1180,10 +1178,10 @@ arrayElementCount num /* number of values */
/****************************************************************************
** cvrt_time_double(s,d)
**
** if encode
** if encode
** converts struct in HOST format to ieee format
** else
** converts fields of struct in NET format to fields with HOST
** else
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -1211,9 +1209,9 @@ arrayElementCount num /* number of values */
** cvrt_time_enum(s,d)
**
** converts fields of struct in NET format to fields with HOST format
** or
** or
** converts fields of struct in HOST format to fields with NET format
**
**
****************************************************************************/
static void cvrt_time_enum(
@@ -1241,8 +1239,8 @@ arrayElementCount num /* number of values */
** cvrt_sts_char(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -1262,7 +1260,7 @@ arrayElementCount num /* number of values */
pDest->stamp.secPastEpoch = dbr_ntohl(pSrc->stamp.secPastEpoch);
pDest->stamp.nsec = dbr_ntohl(pSrc->stamp.nsec);
if ( s == d )
if ( s == d )
return;
if (num == 1) /* single value */
@@ -1276,8 +1274,8 @@ arrayElementCount num /* number of values */
** cvrt_time_long(s,d)
**
** converts fields ofstruct in HOST format to ieee format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format
****************************************************************************/
@@ -1326,7 +1324,7 @@ arrayElementCount num /* number of values */
for(i=0; i<num; i++){
*pDest = dbr_ntohs( *pSrc );
/*
* dont increment these inside the MACRO
* dont increment these inside the MACRO
*/
pDest++;
pSrc++;
@@ -1339,10 +1337,10 @@ arrayElementCount num /* number of values */
** struct dbr_stsack_string *d pointer to destination struct
** int encode; boolean, if true vax to ieee
** else ieee to vax
**
**
** converts fields of struct in HOST format to NET format
** or
** converts fields of struct in NET format to fields with HOST
** or
** converts fields of struct in NET format to fields with HOST
** format;
****************************************************************************/
@@ -1355,7 +1353,7 @@ arrayElementCount num /* number of values */
{
struct dbr_stsack_string *pSrc = (struct dbr_stsack_string *) s;
struct dbr_stsack_string *pDest = (struct dbr_stsack_string *) d;
/* convert ieee to vax format or vax to ieee */
pDest->status = dbr_ntohs(pSrc->status);
pDest->severity = dbr_ntohs(pSrc->severity);
@@ -1411,7 +1409,7 @@ static CACVRTFUNCPTR cac_dbr_cvrt[] = {
cvrt_ctrl_long,
cvrt_ctrl_double,
cvrt_put_ackt,
cvrt_put_ackt,
cvrt_put_ackt, /* DBR_PUT_ACKS identical to DBR_PUT_ACKT */
cvrt_stsack_string,
cvrt_string
@@ -1419,18 +1417,18 @@ static CACVRTFUNCPTR cac_dbr_cvrt[] = {
#endif /* EPICS_CONVERSION_REQUIRED */
int caNetConvert ( unsigned type, const void *pSrc, void *pDest,
int caNetConvert ( unsigned type, const void *pSrc, void *pDest,
int hton, arrayElementCount count )
{
# ifdef EPICS_CONVERSION_REQUIRED
if ( type >= NELEMENTS ( cac_dbr_cvrt ) ) {
return ECA_BADTYPE;
}
}
( * cac_dbr_cvrt [ type ] ) ( pSrc, pDest, hton, count );
# else
if ( INVALID_DB_REQ ( type ) ) {
return ECA_BADTYPE;
}
}
if ( pSrc != pDest ) {
memcpy ( pDest, pSrc, dbr_size_n ( type, count ) );
}

File diff suppressed because it is too large Load Diff

View File

@@ -3,11 +3,10 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
@@ -20,16 +19,15 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "disconnectGovernorTimer.h"
#include "udpiiu.h"
#include "nciu.h"
static const double disconnectGovernorPeriod = 10.0; // sec
disconnectGovernorTimer::disconnectGovernorTimer (
disconnectGovernorNotify & iiuIn,
epicsTimerQueue & queueIn,
disconnectGovernorTimer::disconnectGovernorTimer (
disconnectGovernorNotify & iiuIn,
epicsTimerQueue & queueIn,
epicsMutex & mutexIn ) :
mutex ( mutexIn ), timer ( queueIn.createTimer () ),
iiu ( iiuIn )
@@ -58,18 +56,18 @@ void disconnectGovernorTimer::shutdown (
}
}
while ( nciu * pChan = this->chanList.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
pChan->serviceShutdownNotify ( cbGuard, guard );
}
}
epicsTimerNotify::expireStatus disconnectGovernorTimer::expire (
epicsTimerNotify::expireStatus disconnectGovernorTimer::expire (
const epicsTime & /* currentTime */ )
{
epicsGuard < epicsMutex > guard ( this->mutex );
while ( nciu * pChan = chanList.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
this->iiu.govExpireNotify ( guard, *pChan );
}
@@ -83,14 +81,14 @@ void disconnectGovernorTimer::show ( unsigned level ) const
this->chanList.count () );
if ( level > 0u ) {
tsDLIterConst < nciu > pChan = this->chanList.firstIter ();
while ( pChan.valid () ) {
while ( pChan.valid () ) {
pChan->show ( level - 1u );
pChan++;
}
}
}
void disconnectGovernorTimer::installChan (
void disconnectGovernorTimer::installChan (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
guard.assertIdenticalMutex ( this->mutex );

View File

@@ -3,65 +3,55 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
// Los Alamos, New Mexico 87545
//
//
// Copyright, 1986, The Regents of the University of California.
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
#ifndef disconnectGovernorTimerh
#define disconnectGovernorTimerh
#ifdef epicsExportSharedSymbols
# define searchTimerh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_disconnectGovernorTimer_H
#define INC_disconnectGovernorTimer_H
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsTimer.h"
#ifdef searchTimerh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caProto.h"
#include "netiiu.h"
class disconnectGovernorNotify {
public:
virtual ~disconnectGovernorNotify () = 0;
virtual void govExpireNotify (
virtual void govExpireNotify (
epicsGuard < epicsMutex > &, nciu & ) = 0;
};
class disconnectGovernorTimer : private epicsTimerNotify {
public:
disconnectGovernorTimer (
disconnectGovernorTimer (
class disconnectGovernorNotify &, epicsTimerQueue &, epicsMutex & );
virtual ~disconnectGovernorTimer ();
void start ();
void shutdown (
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard );
void installChan (
void installChan (
epicsGuard < epicsMutex > &, nciu & );
void uninstallChan (
void uninstallChan (
epicsGuard < epicsMutex > &, nciu & );
void show ( unsigned level ) const;
private:
@@ -70,8 +60,8 @@ private:
epicsTimer & timer;
class disconnectGovernorNotify & iiu;
epicsTimerNotify::expireStatus expire ( const epicsTime & currentTime );
disconnectGovernorTimer ( const disconnectGovernorTimer & );
disconnectGovernorTimer & operator = ( const disconnectGovernorTimer & );
disconnectGovernorTimer ( const disconnectGovernorTimer & );
disconnectGovernorTimer & operator = ( const disconnectGovernorTimer & );
};
#endif // ifdef disconnectGovernorTimerh
#endif // ifdef INC_disconnectGovernorTimer_H

View File

@@ -5,7 +5,7 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <stdio.h>
@@ -17,8 +17,8 @@
void event_handler (struct event_handler_args args);
int evtime (char *pname);
static unsigned iteration_count;
static epicsUInt32 last_time;
static unsigned iteration_count;
static epicsUInt32 last_time;
#ifndef iocCore
int main(int argc, char **argv)
@@ -32,7 +32,7 @@ int main(int argc, char **argv)
else{
printf("usage: %s <channel name>", argv[0]);
}
return(0);
return(0);
}
#endif
@@ -41,28 +41,28 @@ int main(int argc, char **argv)
*/
int evtime(char *pname)
{
chid chan;
int status;
chid chan;
int status;
status = ca_search(pname, &chan);
SEVCHK(status, NULL);
status = ca_search(pname, &chan);
SEVCHK(status, NULL);
status = ca_pend_io(10.0);
if(status != ECA_NORMAL){
printf("%s not found\n", pname);
return 0;
}
status = ca_pend_io(10.0);
if(status != ECA_NORMAL){
printf("%s not found\n", pname);
return 0;
}
status = ca_add_event(
DBR_FLOAT,
chan,
event_handler,
NULL,
NULL);
SEVCHK(status, __FILE__);
status = ca_add_event(
DBR_FLOAT,
chan,
event_handler,
NULL,
NULL);
SEVCHK(status, __FILE__);
status = ca_pend_event(0.0);
SEVCHK(status, NULL);
status = ca_pend_event(0.0);
SEVCHK(status, NULL);
}
@@ -72,24 +72,24 @@ int evtime(char *pname)
*/
void event_handler(struct event_handler_args args)
{
epicsUInt32 current_time;
# define COUNT 0x8000
double interval;
double delay;
epicsTimeStamp ts;
epicsUInt32 current_time;
# define COUNT 0x8000
double interval;
double delay;
epicsTimeStamp ts;
if(iteration_count%COUNT == 0){
epicsTimeGetCurrent(&ts);
current_time = ts.secPastEpoch;
if(last_time != 0){
interval = current_time - last_time;
delay = interval/COUNT;
printf("Delay = %f sec per event\n",
delay);
}
last_time = current_time;
}
if(iteration_count%COUNT == 0){
epicsTimeGetCurrent(&ts);
current_time = ts.secPastEpoch;
if(last_time != 0){
interval = current_time - last_time;
delay = interval/COUNT;
printf("Delay = %f sec per event\n",
delay);
}
last_time = current_time;
}
iteration_count++;
iteration_count++;
}

View File

@@ -3,24 +3,23 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@@ -28,11 +27,10 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
getCallback::getCallback ( oldChannelNotify & chanIn,
getCallback::getCallback ( oldChannelNotify & chanIn,
caEventCallBackFunc *pFuncIn, void *pPrivateIn ) :
chan ( chanIn ), pFunc ( pFuncIn ), pPrivate ( pPrivateIn )
{
@@ -65,7 +63,7 @@ void getCallback::completion (
void getCallback::exception (
epicsGuard < epicsMutex > & guard,
int status, const char * /* pContext */,
int status, const char * /* pContext */,
unsigned type, arrayElementCount count )
{
if ( status != ECA_CHANDESTROY ) {

View File

@@ -3,24 +3,23 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@@ -30,23 +29,22 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
getCopy::getCopy (
epicsGuard < epicsMutex > & guard, ca_client_context & cacCtxIn,
oldChannelNotify & chanIn, unsigned typeIn,
getCopy::getCopy (
epicsGuard < epicsMutex > & guard, ca_client_context & cacCtxIn,
oldChannelNotify & chanIn, unsigned typeIn,
arrayElementCount countIn, void * pValueIn ) :
count ( countIn ), cacCtx ( cacCtxIn ), chan ( chanIn ), pValue ( pValueIn ),
count ( countIn ), cacCtx ( cacCtxIn ), chan ( chanIn ), pValue ( pValueIn ),
ioSeqNo ( 0 ), type ( typeIn )
{
this->ioSeqNo = cacCtxIn.sequenceNumberOfOutstandingIO ( guard );
cacCtxIn.incrementOutstandingIO ( guard, this->ioSeqNo );
}
getCopy::~getCopy ()
getCopy::~getCopy ()
{
}
@@ -56,8 +54,8 @@ void getCopy::cancel ()
this->cacCtx.decrementOutstandingIO ( guard, this->ioSeqNo );
}
void getCopy::completion (
epicsGuard < epicsMutex > & guard, unsigned typeIn,
void getCopy::completion (
epicsGuard < epicsMutex > & guard, unsigned typeIn,
arrayElementCount countIn, const void *pDataIn )
{
if ( this->type == typeIn ) {
@@ -68,7 +66,7 @@ void getCopy::completion (
// this object destroyed by preceding function call
}
else {
this->exception ( guard, ECA_INTERNAL,
this->exception ( guard, ECA_INTERNAL,
"bad data type match in get copy back response",
typeIn, countIn);
// this object destroyed by preceding function call
@@ -77,7 +75,7 @@ void getCopy::completion (
void getCopy::exception (
epicsGuard < epicsMutex > & guard,
int status, const char *pContext,
int status, const char *pContext,
unsigned /* typeIn */, arrayElementCount /* countIn */ )
{
oldChannelNotify & chanTmp ( this->chan );
@@ -88,8 +86,8 @@ void getCopy::exception (
// the lock and calling cb in case they destroy channel there
this->cacCtx.destroyGetCopy ( guard, *this );
if ( status != ECA_CHANDESTROY ) {
caClientCtx.exception ( guard, status, pContext,
__FILE__, __LINE__, chanTmp, typeTmp,
caClientCtx.exception ( guard, status, pContext,
__FILE__, __LINE__, chanTmp, typeTmp,
countTmp, CA_OP_GET );
}
}
@@ -97,7 +95,7 @@ void getCopy::exception (
void getCopy::show ( unsigned level ) const
{
int tmpType = static_cast <int> ( this->type );
::printf ( "read copy IO at %p, type %s, element count %lu\n",
::printf ( "read copy IO at %p, type %s, element count %lu\n",
static_cast <const void *> ( this ), dbf_type_to_text ( tmpType ), this->count );
if ( level > 0u ) {
::printf ( "\tIO sequence number %u, user's storage %p\n",

View File

@@ -3,23 +3,22 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
*/
#include <algorithm>
@@ -29,7 +28,7 @@
#include "hostNameCache.h"
#include "epicsGuard.h"
hostNameCache::hostNameCache (
hostNameCache::hostNameCache (
const osiSockAddr & addr, ipAddrToAsciiEngine & engine ) :
dnsTransaction ( engine.createTransaction() ), nameLength ( 0 )
{
@@ -65,7 +64,7 @@ void hostNameCache::transactionComplete ( const char * pHostNameIn )
this->nameLength = newNameLen;
}
unsigned hostNameCache::getName (
unsigned hostNameCache::getName (
char * pBuf, unsigned bufSize ) const
{
if ( bufSize == 0u ) {

View File

@@ -3,41 +3,31 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef hostNameCacheh
#define hostNameCacheh
#ifdef epicsExportSharedSymbols
# define hostNameCache_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_hostNameCache_H
#define INC_hostNameCache_H
#include "ipAddrToAsciiAsynchronous.h"
#include "epicsMutex.h"
#ifdef hostNameCache_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class hostNameCache : public ipAddrToAsciiCallBack {
public:
hostNameCache ( const osiSockAddr & addr, ipAddrToAsciiEngine & engine );
@@ -58,4 +48,4 @@ inline const char * hostNameCache::pointer () const
return this->hostNameBuf;
}
#endif // #ifndef hostNameCacheh
#endif // #ifndef INC_hostNameCache_H

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -19,8 +18,8 @@
* Author: Jeff Hill
*/
#ifndef inetAddrIDh
#define inetAddrIDh
#ifndef INC_inetAddrID_H
#define INC_inetAddrID_H
#include "osiSock.h"
#include "resourceLib.h"
@@ -58,7 +57,7 @@ inline resTableIndex inetAddrID::hash () const
index = this->addr.sin_addr.s_addr;
index ^= this->addr.sin_port;
index ^= this->addr.sin_port >> 8u;
return integerHash ( inetAddrMinIndexBitWidth,
return integerHash ( inetAddrMinIndexBitWidth,
inetAddrMaxIndexBitWidth, index );
}
@@ -67,6 +66,6 @@ inline void inetAddrID::name ( char *pBuf, unsigned bufSize ) const
ipAddrToDottedIP ( &this->addr, pBuf, bufSize );
}
#endif // ifdef inetAddrID
#endif // ifdef INC_inetAddrID_H

View File

@@ -4,10 +4,10 @@
* 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.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -31,10 +31,7 @@
#include "errlog.h"
#include "osiWireFormat.h"
#define epicsExportSharedSymbols
#include "addrList.h"
#undef epicsExportSharedSymbols
#include "iocinf.h"
/*
@@ -65,16 +62,16 @@ static char *getToken ( const char **ppString, char *pBuf, unsigned bufSIze )
if ( tokenFound ) {
pBuf[bufSIze-1] = '\0';
return pBuf;
}
return pBuf;
}
return NULL;
}
/*
* addAddrToChannelAccessAddressList ()
*/
extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
( ELLLIST *pList, const ENV_PARAM *pEnv,
extern "C" int epicsStdCall addAddrToChannelAccessAddressList
( ELLLIST *pList, const ENV_PARAM *pEnv,
unsigned short port, int ignoreNonDefaultPort )
{
osiSockAddrNode *pNewNode;
@@ -109,9 +106,9 @@ extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
pNewNode->addr.ia = addr;
/*
* LOCK applied externally
*/
/*
* LOCK applied externally
*/
ellAdd (pList, &pNewNode->node);
ret = 0; /* success if anything is added to the list */
}
@@ -122,14 +119,14 @@ extern "C" int epicsShareAPI addAddrToChannelAccessAddressList
/*
* removeDuplicateAddresses ()
*/
extern "C" void epicsShareAPI removeDuplicateAddresses
extern "C" void epicsStdCall removeDuplicateAddresses
( ELLLIST *pDestList, ELLLIST *pSrcList, int silent )
{
ELLNODE *pRawNode;
while ( (pRawNode = ellGet ( pSrcList ) ) ) {
STATIC_ASSERT ( offsetof (osiSockAddrNode, node) == 0 );
osiSockAddrNode *pNode = reinterpret_cast <osiSockAddrNode *> ( pRawNode );
STATIC_ASSERT ( offsetof (osiSockAddrNode, node) == 0 );
osiSockAddrNode *pNode = reinterpret_cast <osiSockAddrNode *> ( pRawNode );
osiSockAddrNode *pTmpNode;
if ( pNode->addr.sa.sa_family == AF_INET ) {
@@ -137,14 +134,14 @@ extern "C" void epicsShareAPI removeDuplicateAddresses
pTmpNode = (osiSockAddrNode *) ellFirst (pDestList);
while ( pTmpNode ) {
if (pTmpNode->addr.sa.sa_family == AF_INET) {
if ( pNode->addr.ia.sin_addr.s_addr == pTmpNode->addr.ia.sin_addr.s_addr &&
if ( pNode->addr.ia.sin_addr.s_addr == pTmpNode->addr.ia.sin_addr.s_addr &&
pNode->addr.ia.sin_port == pTmpNode->addr.ia.sin_port ) {
if ( ! silent ) {
if ( ! silent ) {
char buf[64];
ipAddrToDottedIP ( &pNode->addr.ia, buf, sizeof (buf) );
fprintf ( stderr,
"Warning: Duplicate EPICS CA Address list entry \"%s\" discarded\n", buf );
}
fprintf ( stderr,
"Warning: Duplicate EPICS CA Address list entry \"%s\" discarded\n", buf );
}
free (pNode);
pNode = NULL;
break;
@@ -182,7 +179,7 @@ static void forcePort ( ELLLIST *pList, unsigned short port )
/*
* configureChannelAccessAddressList ()
*/
extern "C" void epicsShareAPI configureChannelAccessAddressList
extern "C" void epicsStdCall configureChannelAccessAddressList
( ELLLIST *pList, SOCKET sock, unsigned short port )
{
ELLLIST tmpList;
@@ -203,7 +200,7 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
* from the interfaces found.
*/
yes = true;
pstr = envGetConfigParam ( &EPICS_CA_AUTO_ADDR_LIST,
pstr = envGetConfigParam ( &EPICS_CA_AUTO_ADDR_LIST,
sizeof (yesno), yesno );
if ( pstr ) {
if ( strstr ( pstr, "no" ) || strstr ( pstr, "NO" ) ) {
@@ -216,19 +213,19 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
* (lock outside because this is used by the server also)
*/
if (yes) {
ELLLIST bcastList;
ELLLIST bcastList;
osiSockAddr addr;
ellInit ( &bcastList );
ellInit ( &bcastList );
addr.ia.sin_family = AF_UNSPEC;
osiSockDiscoverBroadcastAddresses ( &bcastList, sock, &addr );
forcePort ( &bcastList, port );
removeDuplicateAddresses ( &tmpList, &bcastList, 1 );
removeDuplicateAddresses ( &tmpList, &bcastList, 1 );
if ( ellCount ( &tmpList ) == 0 ) {
osiSockAddrNode *pNewNode;
pNewNode = (osiSockAddrNode *) calloc ( 1, sizeof (*pNewNode) );
if ( pNewNode ) {
/*
* if no interfaces found then look for local channels
/*
* if no interfaces found then look for local channels
* with the loop back interface
*/
pNewNode->addr.ia.sin_family = AF_INET;
@@ -250,7 +247,7 @@ extern "C" void epicsShareAPI configureChannelAccessAddressList
/*
* printChannelAccessAddressList ()
*/
extern "C" void epicsShareAPI printChannelAccessAddressList ( const ELLLIST *pList )
extern "C" void epicsStdCall printChannelAccessAddressList ( const ELLLIST *pList )
{
osiSockAddrNode *pNode;

View File

@@ -3,27 +3,26 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef INCiocinfh
#define INCiocinfh
#ifndef INC_iocinf_H
#define INC_iocinf_H
#ifdef DEBUG
# define debugPrintf(argsInParen) ::printf argsInParen
@@ -47,17 +46,17 @@
* CA_CONN_VERIFY_PERIOD is normally obtained from an
* EPICS environment variable.
*/
static const double CA_ECHO_TIMEOUT = 5.0; /* (sec) disconn no echo reply tmo */
static const double CA_ECHO_TIMEOUT = 5.0; /* (sec) disconn no echo reply tmo */
static const double CA_CONN_VERIFY_PERIOD = 30.0; /* (sec) how often to request echo */
/*
* this determines the number of messages received
* without a delay in between before we go into
* without a delay in between before we go into
* monitor flow control
*
* turning this down effects maximum throughput
* because we dont get an optimal number of bytes
* per network frame
* because we dont get an optimal number of bytes
* per network frame
*/
static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u;
@@ -67,4 +66,4 @@ static const unsigned contiguousMsgCountWhichTriggersFlowControl = 10u;
#define genLocalExcep( CBGUARD, GUARD, CAC, STAT, PCTX ) \
(CAC).exception ( CBGUARD, GUARD, STAT, PCTX, __FILE__, __LINE__ )
#endif // ifdef INCiocinfh
#endif // ifdef INC_iocinf_H

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -31,7 +30,7 @@ localHostName::localHostName () :
const char * pErrStr = "<unknown host>";
int status = -1;
if ( this->attachedToSockLib ) {
status = gethostname (
status = gethostname (
this->cache, sizeof ( this->cache ) );
}
if ( status ) {
@@ -48,7 +47,7 @@ localHostName::~localHostName ()
}
}
unsigned localHostName::getName (
unsigned localHostName::getName (
char * pBuf, unsigned bufLength ) const
{
if ( bufLength ) {

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -19,22 +18,13 @@
* Author: Jeff Hill
*/
#ifndef localHostNameh
#define localHostNameh
#ifndef INC_localHostName_H
#define INC_localHostName_H
#include <string.h>
#ifdef epicsExportSharedSymbols
# define localHostNameh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsSingleton.h"
#ifdef localHostNameh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class localHostName {
public:
localHostName ();
@@ -60,6 +50,6 @@ inline const char * localHostName::pointer () const
return this->cache;
}
#endif // ifndef localHostNameh
#endif // ifndef INC_localHostName_H

View File

@@ -3,24 +3,23 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@@ -30,15 +29,14 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "msgForMultiplyDefinedPV.h"
#include "cac.h"
#include "caerr.h" // for ECA_DBLCHNL
msgForMultiplyDefinedPV::msgForMultiplyDefinedPV (
msgForMultiplyDefinedPV::msgForMultiplyDefinedPV (
ipAddrToAsciiEngine & engine,
callbackForMultiplyDefinedPV & cbIn,
callbackForMultiplyDefinedPV & cbIn,
const char * pChannelName, const char * pAcc ) :
dnsTransaction ( engine.createTransaction () ), cb ( cbIn )
{
@@ -61,15 +59,15 @@ void msgForMultiplyDefinedPV::transactionComplete ( const char * pHostNameRej )
// !! dont touch 'this' pointer after this point because object has been deleted !!
}
void * msgForMultiplyDefinedPV::operator new ( size_t size,
void * msgForMultiplyDefinedPV::operator new ( size_t size,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
{
return freeList.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
void msgForMultiplyDefinedPV::operator delete ( void *pCadaver,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
void msgForMultiplyDefinedPV::operator delete ( void *pCadaver,
tsFreeList < class msgForMultiplyDefinedPV, 16 > & freeList )
{
freeList.release ( pCadaver, sizeof ( msgForMultiplyDefinedPV ) );
}

View File

@@ -3,48 +3,38 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef msgForMultiplyDefinedPVh
#define msgForMultiplyDefinedPVh
#ifdef epicsExportSharedSymbols
# define msgForMultiplyDefinedPVh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_msgForMultiplyDefinedPV_H
#define INC_msgForMultiplyDefinedPV_H
#include "ipAddrToAsciiAsynchronous.h"
#include "tsFreeList.h"
#include "tsDLList.h"
#include "compilerDependencies.h"
#ifdef msgForMultiplyDefinedPVh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
#endif
class callbackForMultiplyDefinedPV {
public:
virtual ~callbackForMultiplyDefinedPV () = 0;
virtual void pvMultiplyDefinedNotify (
class msgForMultiplyDefinedPV &, const char * pChannelName,
virtual void pvMultiplyDefinedNotify (
class msgForMultiplyDefinedPV &, const char * pChannelName,
const char * pAcc, const char * pRej ) = 0;
};
@@ -53,7 +43,7 @@ class msgForMultiplyDefinedPV :
public tsDLNode < msgForMultiplyDefinedPV > {
public:
msgForMultiplyDefinedPV ( ipAddrToAsciiEngine & engine,
callbackForMultiplyDefinedPV &, const char * pChannelName,
callbackForMultiplyDefinedPV &, const char * pChannelName,
const char * pAcc );
virtual ~msgForMultiplyDefinedPV ();
void ioInitiate ( const osiSockAddr & rej );
@@ -75,5 +65,5 @@ inline void msgForMultiplyDefinedPV::ioInitiate ( const osiSockAddr & rej )
this->dnsTransaction.ipAddrToAscii ( rej, *this );
}
#endif // ifdef msgForMultiplyDefinedPVh
#endif // ifdef INC_msgForMultiplyDefinedPV_H

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -29,7 +28,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "cac.h"
#include "osiWireFormat.h"
@@ -51,7 +49,7 @@ nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
typeCode ( USHRT_MAX ),
priority ( static_cast <ca_uint8_t> ( pri ) )
{
size_t nameLengthTmp = strlen ( pNameIn ) + 1;
size_t nameLengthTmp = strlen ( pNameIn ) + 1;
// second constraint is imposed by size field in protocol header
if ( nameLengthTmp > MAX_UDP_SEND - sizeof ( caHdr ) || nameLengthTmp > USHRT_MAX ) {
@@ -62,7 +60,7 @@ nciu::nciu ( cac & cacIn, netiiu & iiuIn, cacChannelNotify & chanIn,
throw cacChannel::badPriority ();
}
this->nameLength = static_cast <unsigned short> ( nameLengthTmp );
this->nameLength = static_cast <unsigned short> ( nameLengthTmp );
this->pNameStr = new char [ this->nameLength ];
strcpy ( this->pNameStr, pNameIn );
@@ -114,7 +112,7 @@ void nciu::initiateConnect (
}
void nciu::connect ( unsigned nativeType,
unsigned nativeCount, unsigned sidIn,
unsigned nativeCount, unsigned sidIn,
epicsGuard < epicsMutex > & /* cbGuard */,
epicsGuard < epicsMutex > & guard )
{

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -17,18 +16,13 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef nciuh
#define nciuh
#ifdef epicsExportSharedSymbols
# define nciuh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_nciu_H
#define INC_nciu_H
#include "resourceLib.h"
#include "tsDLList.h"
@@ -36,10 +30,7 @@
#include "epicsMutex.h"
#include "compilerDependencies.h"
#ifdef nciuh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#define CA_MINOR_PROTOCOL_REVISION 13
#include "caProto.h"
@@ -278,8 +269,8 @@ private:
epicsGuard < epicsMutex > &, class baseNMIU & );
const char * pHostName (
epicsGuard < epicsMutex > & guard ) const throw ();
nciu ( const nciu & );
nciu & operator = ( const nciu & );
nciu ( const nciu & );
nciu & operator = ( const nciu & );
void operator delete ( void * );
};
@@ -382,4 +373,4 @@ inline bool channelNode::isInstalledInServer ( epicsGuard < epicsMutex > & ) con
this->listMember == cs_subscripUpdateReqPend;
}
#endif // ifdef nciuh
#endif // ifdef INC_nciu_H

View File

@@ -3,35 +3,34 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef netIOh
#define netIOh
#ifndef INC_netIO_H
#define INC_netIO_H
#include "nciu.h"
#include "compilerDependencies.h"
// SUN PRO generates multiply defined symbols if the baseNMIU
// destructor is virtual (therefore it is protected).
// destructor is virtual (therefore it is protected).
// I assume that SUNPRO will fix this in future versions.
// With other compilers we get warnings (and
// With other compilers we get warnings (and
// potential problems) if we dont make the baseNMIU
// destructor virtual.
#if defined ( __SUNPRO_CC ) && ( __SUNPRO_CC <= 0x540 )
@@ -45,42 +44,42 @@ class privateInterfaceForIO;
class baseNMIU : public tsDLNode < baseNMIU >,
public chronIntIdRes < baseNMIU > {
public:
virtual void destroy (
virtual void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & ) = 0; // only called by cac
virtual void completion (
virtual void completion (
epicsGuard < epicsMutex > &, cacRecycle & ) = 0;
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext ) = 0;
virtual void exception (
virtual void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count ) = 0;
virtual void completion (
virtual void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
unsigned type, arrayElementCount count,
const void * pData ) = 0;
virtual void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan ) = 0;
virtual class netSubscription * isSubscription () = 0;
virtual void show (
virtual void show (
unsigned level ) const = 0;
virtual void show (
epicsGuard < epicsMutex > &,
virtual void show (
epicsGuard < epicsMutex > &,
unsigned level ) const = 0;
protected:
NETIO_VIRTUAL_DESTRUCTOR ~baseNMIU ();
NETIO_VIRTUAL_DESTRUCTOR ~baseNMIU ();
};
class netSubscription : public baseNMIU {
public:
static netSubscription * factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &,
class privateInterfaceForIO &, unsigned type, arrayElementCount count,
static netSubscription * factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &,
class privateInterfaceForIO &, unsigned type, arrayElementCount count,
unsigned mask, cacStateNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
arrayElementCount getCount (
epicsGuard < epicsMutex > &, bool allow_zero ) const;
@@ -90,12 +89,12 @@ public:
epicsGuard < epicsMutex > & ) const;
void subscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan );
void unsubscribeIfRequired (
void unsubscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan );
protected:
netSubscription (
class privateInterfaceForIO &, unsigned type,
arrayElementCount count,
netSubscription (
class privateInterfaceForIO &, unsigned type,
arrayElementCount count,
unsigned mask, cacStateNotify & );
~netSubscription ();
private:
@@ -107,23 +106,23 @@ private:
bool subscribed;
class netSubscription * isSubscription ();
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & ))
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count, const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count );
void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan );
@@ -133,12 +132,12 @@ private:
class netReadNotifyIO : public baseNMIU {
public:
static netReadNotifyIO * factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > &,
static netReadNotifyIO * factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > &,
privateInterfaceForIO &, cacReadNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
protected:
netReadNotifyIO ( privateInterfaceForIO &, cacReadNotify & );
@@ -147,24 +146,24 @@ private:
cacReadNotify & notify;
class privateInterfaceForIO & privateChanForIO;
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & ))
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext,
int status, const char * pContext,
unsigned type, arrayElementCount count );
class netSubscription * isSubscription ();
void forceSubscriptionUpdate (
@@ -175,12 +174,12 @@ private:
class netWriteNotifyIO : public baseNMIU {
public:
static netWriteNotifyIO * factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &,
static netWriteNotifyIO * factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > &,
privateInterfaceForIO &, cacWriteNotify & );
void show (
void show (
unsigned level ) const;
void show (
void show (
epicsGuard < epicsMutex > &, unsigned level ) const;
protected:
netWriteNotifyIO ( privateInterfaceForIO &, cacWriteNotify & );
@@ -189,25 +188,25 @@ private:
cacWriteNotify & notify;
privateInterfaceForIO & privateChanForIO;
void operator delete ( void * );
void * operator new ( size_t,
void * operator new ( size_t,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & );
epicsPlacementDeleteOperator (( void *,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & ))
class netSubscription * isSubscription ();
void destroy (
void destroy (
epicsGuard < epicsMutex > &, class cacRecycle & );
void completion (
epicsGuard < epicsMutex > &, cacRecycle & );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext );
void completion (
void completion (
epicsGuard < epicsMutex > &, cacRecycle &,
unsigned type, arrayElementCount count,
const void * pData );
void exception (
void exception (
epicsGuard < epicsMutex > &, cacRecycle &,
int status, const char * pContext, unsigned type,
int status, const char * pContext, unsigned type,
arrayElementCount count );
void forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan );
@@ -215,23 +214,23 @@ private:
netWriteNotifyIO & operator = ( const netWriteNotifyIO & );
};
inline void * netSubscription::operator new ( size_t size,
inline void * netSubscription::operator new ( size_t size,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netSubscription::operator delete ( void *pCadaver,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
inline void netSubscription::operator delete ( void *pCadaver,
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > &freeList )
{
freeList.release ( pCadaver );
}
#endif
inline netSubscription * netSubscription::factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & freeList,
class privateInterfaceForIO & chan, unsigned type, arrayElementCount count,
inline netSubscription * netSubscription::factory (
tsFreeList < class netSubscription, 1024, epicsMutexNOOP > & freeList,
class privateInterfaceForIO & chan, unsigned type, arrayElementCount count,
unsigned mask, cacStateNotify &notify )
{
return new ( freeList ) netSubscription ( chan, type,
@@ -261,46 +260,46 @@ inline unsigned netSubscription::getMask ( epicsGuard < epicsMutex > & ) const
return this->mask;
}
inline netReadNotifyIO * netReadNotifyIO::factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList,
inline netReadNotifyIO * netReadNotifyIO::factory (
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList,
privateInterfaceForIO & ioComplNotifIntf, cacReadNotify & notify )
{
return new ( freeList ) netReadNotifyIO ( ioComplNotifIntf, notify );
}
inline void * netReadNotifyIO::operator new ( size_t size,
inline void * netReadNotifyIO::operator new ( size_t size,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netReadNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
inline void netReadNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netReadNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
freeList.release ( pCadaver );
}
#endif
inline netWriteNotifyIO * netWriteNotifyIO::factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList,
inline netWriteNotifyIO * netWriteNotifyIO::factory (
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList,
privateInterfaceForIO & ioComplNotifyIntf, cacWriteNotify & notify )
{
return new ( freeList ) netWriteNotifyIO ( ioComplNotifyIntf, notify );
}
inline void * netWriteNotifyIO::operator new ( size_t size,
inline void * netWriteNotifyIO::operator new ( size_t size,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
{
return freeList.allocate ( size );
}
#if defined ( CXX_PLACEMENT_DELETE )
inline void netWriteNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
inline void netWriteNotifyIO::operator delete ( void *pCadaver,
tsFreeList < class netWriteNotifyIO, 1024, epicsMutexNOOP > & freeList )
{
freeList.release ( pCadaver );
}
#endif
#endif // ifdef netIOh
#endif // ifdef INC_netIO_H

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -29,8 +28,8 @@
#include "nciu.h"
#include "cac.h"
netReadNotifyIO::netReadNotifyIO (
privateInterfaceForIO & ioComplIntfIn,
netReadNotifyIO::netReadNotifyIO (
privateInterfaceForIO & ioComplIntfIn,
cacReadNotify & notify ) :
notify ( notify ), privateChanForIO ( ioComplIntfIn )
{
@@ -42,26 +41,26 @@ netReadNotifyIO::~netReadNotifyIO ()
void netReadNotifyIO::show ( unsigned /* level */ ) const
{
::printf ( "netReadNotifyIO at %p\n",
::printf ( "netReadNotifyIO at %p\n",
static_cast < const void * > ( this ) );
}
void netReadNotifyIO::show (
void netReadNotifyIO::show (
epicsGuard < epicsMutex > &, unsigned level ) const
{
this->show ( level );
}
void netReadNotifyIO::destroy (
void netReadNotifyIO::destroy (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle )
{
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, unsigned type,
void netReadNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, unsigned type,
arrayElementCount count, const void * pData )
{
//guard.assertIdenticalMutex ( this->mutex );
@@ -82,28 +81,28 @@ void netReadNotifyIO::completion (
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext )
{
//guard.assertIdenticalMutex ( this->mutex );
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0u );
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );
}
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netReadNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext,
int status, const char *pContext,
unsigned type, arrayElementCount count )
{
//guard.assertIdenticalMutex ( this->mutex )
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, type, count );
this->~netReadNotifyIO ();
recycle.recycleReadNotifyIO ( guard, *this );

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -25,16 +24,15 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "nciu.h"
#include "cac.h"
#include "db_access.h" // for dbf_type_to_text
#include "caerr.h"
netSubscription::netSubscription (
privateInterfaceForIO & chanIn,
unsigned typeIn, arrayElementCount countIn,
netSubscription::netSubscription (
privateInterfaceForIO & chanIn,
unsigned typeIn, arrayElementCount countIn,
unsigned maskIn, cacStateNotify & notifyIn ) :
count ( countIn ), privateChanForIO ( chanIn ),
notify ( notifyIn ), type ( typeIn ), mask ( maskIn ),
@@ -48,11 +46,11 @@ netSubscription::netSubscription (
}
}
netSubscription::~netSubscription ()
netSubscription::~netSubscription ()
{
}
void netSubscription::destroy (
void netSubscription::destroy (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle )
{
this->~netSubscription ();
@@ -66,26 +64,26 @@ class netSubscription * netSubscription::isSubscription ()
void netSubscription::show ( unsigned /* level */ ) const
{
::printf ( "event subscription IO at %p, type %s, element count %lu, mask %u\n",
static_cast < const void * > ( this ),
dbf_type_to_text ( static_cast < int > ( this->type ) ),
::printf ( "event subscription IO at %p, type %s, element count %lu, mask %u\n",
static_cast < const void * > ( this ),
dbf_type_to_text ( static_cast < int > ( this->type ) ),
this->count, this->mask );
}
void netSubscription::show (
void netSubscription::show (
epicsGuard < epicsMutex > &, unsigned level ) const
{
this->show ( level );
}
void netSubscription::completion (
void netSubscription::completion (
epicsGuard < epicsMutex > &, cacRecycle & )
{
errlogPrintf ( "subscription update w/o data ?\n" );
}
void netSubscription::exception (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle,
void netSubscription::exception (
epicsGuard < epicsMutex > & guard, cacRecycle & recycle,
int status, const char * pContext )
{
if ( status == ECA_DISCONN ) {
@@ -93,7 +91,7 @@ void netSubscription::exception (
}
if ( status == ECA_CHANDESTROY ) {
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
this->~netSubscription ();
recycle.recycleSubscription ( guard, *this );
@@ -101,15 +99,15 @@ void netSubscription::exception (
else {
// guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
}
}
}
void netSubscription::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, int status, const char * pContext,
void netSubscription::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle, int status, const char * pContext,
unsigned typeIn, arrayElementCount countIn )
{
if ( status == ECA_DISCONN ) {
@@ -117,7 +115,7 @@ void netSubscription::exception (
}
if ( status == ECA_CHANDESTROY ) {
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0 );
this->~netSubscription ();
recycle.recycleSubscription ( guard, *this );
@@ -125,20 +123,20 @@ void netSubscription::exception (
else {
//guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.exception (
this->notify.exception (
guard, status, pContext, typeIn, countIn );
}
}
}
void netSubscription::completion (
void netSubscription::completion (
epicsGuard < epicsMutex > & guard, cacRecycle &,
unsigned typeIn, arrayElementCount countIn,
unsigned typeIn, arrayElementCount countIn,
const void * pDataIn )
{
// guard.assertIdenticalMutex ( this->mutex );
if ( this->privateChanForIO.connected ( guard ) ) {
this->notify.current (
this->notify.current (
guard, typeIn, countIn, pDataIn );
}
}
@@ -147,17 +145,17 @@ void netSubscription::subscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
if ( ! this->subscribed ) {
chan.getPIIU(guard)->subscriptionRequest (
chan.getPIIU(guard)->subscriptionRequest (
guard, chan, *this );
this->subscribed = true;
}
}
void netSubscription::unsubscribeIfRequired (
void netSubscription::unsubscribeIfRequired (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
if ( this->subscribed ) {
chan.getPIIU(guard)->subscriptionCancelRequest (
chan.getPIIU(guard)->subscriptionCancelRequest (
guard, chan, *this );
this->subscribed = false;
}
@@ -166,7 +164,7 @@ void netSubscription::unsubscribeIfRequired (
void netSubscription::forceSubscriptionUpdate (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
chan.getPIIU(guard)->subscriptionUpdateRequest (
chan.getPIIU(guard)->subscriptionUpdateRequest (
guard, chan, *this );
}

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -29,7 +28,7 @@
#include "nciu.h"
#include "cac.h"
netWriteNotifyIO::netWriteNotifyIO (
netWriteNotifyIO::netWriteNotifyIO (
privateInterfaceForIO & ioComplIntf, cacWriteNotify & notifyIn ) :
notify ( notifyIn ), privateChanForIO ( ioComplIntf )
{
@@ -41,19 +40,19 @@ netWriteNotifyIO::~netWriteNotifyIO ()
void netWriteNotifyIO::show ( unsigned /* level */ ) const
{
::printf ( "read write notify IO at %p\n",
::printf ( "read write notify IO at %p\n",
static_cast < const void * > ( this ) );
}
void netWriteNotifyIO::show (
epicsGuard < epicsMutex > &,
void netWriteNotifyIO::show (
epicsGuard < epicsMutex > &,
unsigned level ) const
{
this->show ( level );
}
void netWriteNotifyIO::destroy (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::destroy (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle )
{
this->~netWriteNotifyIO ();
@@ -70,10 +69,10 @@ void netWriteNotifyIO::completion (
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::completion (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
unsigned /* type */, arrayElementCount /* count */,
unsigned /* type */, arrayElementCount /* count */,
const void * /* pData */ )
{
//this->chan.getClient().printf ( "Write response with data ?\n" );
@@ -82,26 +81,26 @@ void netWriteNotifyIO::completion (
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::exception (
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char * pContext )
{
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, UINT_MAX, 0u );
this->~netWriteNotifyIO ();
recycle.recycleWriteNotifyIO ( guard, *this );
}
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
void netWriteNotifyIO::exception (
epicsGuard < epicsMutex > & guard,
cacRecycle & recycle,
int status, const char *pContext,
int status, const char *pContext,
unsigned type, arrayElementCount count )
{
this->privateChanForIO.ioCompletionNotify ( guard, *this );
this->notify.exception (
this->notify.exception (
guard, status, pContext, type, count );
this->~netWriteNotifyIO ();
recycle.recycleWriteNotifyIO ( guard, *this );

View File

@@ -3,21 +3,20 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
* Author: J. Hill
* Author: J. Hill
*
*/
#ifndef _NET_CONVERT_H
#define _NET_CONVERT_H
#ifndef INC_net_convert_H
#define INC_net_convert_H
#include "db_access.h"
#include "shareLib.h"
#include "libCaAPI.h"
#ifdef __cplusplus
extern "C" {
@@ -25,12 +24,12 @@ extern "C" {
typedef unsigned long arrayElementCount;
epicsShareFunc int caNetConvert (
unsigned type, const void *pSrc, void *pDest,
LIBCA_API int caNetConvert (
unsigned type, const void *pSrc, void *pDest,
int hton, arrayElementCount count );
#ifdef __cplusplus
}
#endif
#endif /* define _NET_CONVERT_H */
#endif /* ifndef INC_net_convert_H */

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -20,7 +19,7 @@
*/
#include <stdexcept>
#include <string> // vxWorks 6.0 requires this include
#include <string> // vxWorks 6.0 requires this include
#include <limits.h>
#include <float.h>
@@ -47,51 +46,51 @@ bool netiiu::ca_v41_ok (
return false;
}
void netiiu::writeRequest (
epicsGuard < epicsMutex > &, nciu &,
void netiiu::writeRequest (
epicsGuard < epicsMutex > &, nciu &,
unsigned, arrayElementCount, const void * )
{
throw cacChannel::notConnected();
}
void netiiu::writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &, unsigned,
void netiiu::writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &, unsigned,
arrayElementCount, const void * )
{
throw cacChannel::notConnected();
}
void netiiu::readNotifyRequest (
epicsGuard < epicsMutex > &,
void netiiu::readNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netReadNotifyIO &, unsigned, arrayElementCount )
{
throw cacChannel::notConnected();
}
void netiiu::clearChannelRequest (
void netiiu::clearChannelRequest (
epicsGuard < epicsMutex > &, ca_uint32_t, ca_uint32_t )
{
}
void netiiu::subscriptionRequest (
void netiiu::subscriptionRequest (
epicsGuard < epicsMutex > &, nciu &, netSubscription & )
{
}
void netiiu::subscriptionCancelRequest (
void netiiu::subscriptionCancelRequest (
epicsGuard < epicsMutex > &, nciu &, netSubscription & )
{
}
void netiiu::subscriptionUpdateRequest (
void netiiu::subscriptionUpdateRequest (
epicsGuard < epicsMutex > &, nciu &, netSubscription & )
{
}
static const char * const pHostNameNetIIU = "<disconnected>";
unsigned netiiu::getHostName (
unsigned netiiu::getHostName (
epicsGuard < epicsMutex > &,
char * pBuf, unsigned bufLen ) const throw ()
{
@@ -124,18 +123,18 @@ osiSockAddr netiiu::getNetworkAddress (
return addr;
}
void netiiu::flushRequest (
void netiiu::flushRequest (
epicsGuard < epicsMutex > & )
{
}
unsigned netiiu::requestMessageBytesPending (
unsigned netiiu::requestMessageBytesPending (
epicsGuard < epicsMutex > & )
{
return 0u;
}
void netiiu::flush (
void netiiu::flush (
epicsGuard < epicsMutex > & )
{
}
@@ -145,7 +144,7 @@ void netiiu::requestRecvProcessPostponedFlush (
{
}
void netiiu::uninstallChan (
void netiiu::uninstallChan (
epicsGuard < epicsMutex > &, nciu & )
{
throw cacChannel::notConnected();
@@ -157,15 +156,15 @@ double netiiu::receiveWatchdogDelay (
return - DBL_MAX;
}
void netiiu::uninstallChanDueToSuccessfulSearchResponse (
void netiiu::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &, const epicsTime & )
{
throw std::runtime_error (
throw std::runtime_error (
"search response occured when not attached to udpiiu?" );
}
bool netiiu::searchMsg (
epicsGuard < epicsMutex > &, ca_uint32_t /* id */,
epicsGuard < epicsMutex > &, ca_uint32_t /* id */,
const char * /* pName */, unsigned /* nameLength */ )
{
return false;

View File

@@ -3,27 +3,26 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef netiiuh
#define netiiuh
#ifndef INC_netiiu_H
#define INC_netiiu_H
#include "cacIO.h"
#include "caProto.h"
@@ -38,8 +37,8 @@ class nciu;
class netiiu {
public:
virtual ~netiiu () = 0;
virtual unsigned getHostName (
epicsGuard < epicsMutex > &, char * pBuf,
virtual unsigned getHostName (
epicsGuard < epicsMutex > &, char * pBuf,
unsigned bufLength ) const throw () = 0;
virtual const char * pHostName (
epicsGuard < epicsMutex > & ) const throw () = 0;
@@ -47,51 +46,51 @@ public:
epicsGuard < epicsMutex > & ) const = 0;
virtual bool ca_v42_ok (
epicsGuard < epicsMutex > & ) const = 0;
virtual unsigned requestMessageBytesPending (
virtual unsigned requestMessageBytesPending (
epicsGuard < epicsMutex > & mutualExclusionGuard ) = 0;
virtual void flush (
virtual void flush (
epicsGuard < epicsMutex > & mutualExclusionGuard ) = 0;
virtual void writeRequest (
epicsGuard < epicsMutex > &, nciu &,
unsigned type, arrayElementCount nElem,
virtual void writeRequest (
epicsGuard < epicsMutex > &, nciu &,
unsigned type, arrayElementCount nElem,
const void *pValue ) = 0;
virtual void writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &,
unsigned type, arrayElementCount nElem,
virtual void writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &,
unsigned type, arrayElementCount nElem,
const void *pValue ) = 0;
virtual void readNotifyRequest (
epicsGuard < epicsMutex > &, nciu &,
netReadNotifyIO &, unsigned type,
virtual void readNotifyRequest (
epicsGuard < epicsMutex > &, nciu &,
netReadNotifyIO &, unsigned type,
arrayElementCount nElem ) = 0;
virtual void clearChannelRequest (
epicsGuard < epicsMutex > &,
virtual void clearChannelRequest (
epicsGuard < epicsMutex > &,
ca_uint32_t sid, ca_uint32_t cid ) = 0;
virtual void subscriptionRequest (
epicsGuard < epicsMutex > &,
virtual void subscriptionRequest (
epicsGuard < epicsMutex > &,
nciu &, netSubscription & ) = 0;
virtual void subscriptionUpdateRequest (
epicsGuard < epicsMutex > &,
virtual void subscriptionUpdateRequest (
epicsGuard < epicsMutex > &,
nciu &, netSubscription & ) = 0;
virtual void subscriptionCancelRequest (
epicsGuard < epicsMutex > &,
virtual void subscriptionCancelRequest (
epicsGuard < epicsMutex > &,
nciu & chan, netSubscription & subscr ) = 0;
virtual void flushRequest (
virtual void flushRequest (
epicsGuard < epicsMutex > & ) = 0;
virtual void requestRecvProcessPostponedFlush (
epicsGuard < epicsMutex > & ) = 0;
virtual osiSockAddr getNetworkAddress (
epicsGuard < epicsMutex > & ) const = 0;
virtual void uninstallChan (
virtual void uninstallChan (
epicsGuard < epicsMutex > &, nciu & ) = 0;
virtual void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
virtual void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
const class epicsTime & currentTime ) = 0;
virtual double receiveWatchdogDelay (
epicsGuard < epicsMutex > & ) const = 0;
virtual bool searchMsg (
epicsGuard < epicsMutex > &, ca_uint32_t id,
epicsGuard < epicsMutex > &, ca_uint32_t id,
const char * pName, unsigned nameLength ) = 0;
};
#endif // netiiuh
#endif // ifndef INC_netiiu_H

View File

@@ -3,37 +3,35 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include "osiSock.h"
#define epicsExportSharedSymbols
#include "noopiiu.h"
noopiiu noopIIU;
noopiiu::~noopiiu ()
noopiiu::~noopiiu ()
{
}
unsigned noopiiu::getHostName (
unsigned noopiiu::getHostName (
epicsGuard < epicsMutex > & cacGuard,
char * pBuf, unsigned bufLength ) const throw ()
{
@@ -58,71 +56,71 @@ bool noopiiu::ca_v41_ok (
return netiiu::ca_v41_ok ( cacGuard );
}
void noopiiu::writeRequest (
epicsGuard < epicsMutex > & guard,
nciu & chan, unsigned type,
void noopiiu::writeRequest (
epicsGuard < epicsMutex > & guard,
nciu & chan, unsigned type,
arrayElementCount nElem, const void * pValue )
{
netiiu::writeRequest ( guard, chan, type, nElem, pValue );
}
void noopiiu::writeNotifyRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
netWriteNotifyIO & io, unsigned type,
void noopiiu::writeNotifyRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
netWriteNotifyIO & io, unsigned type,
arrayElementCount nElem, const void *pValue )
{
netiiu::writeNotifyRequest ( guard, chan, io, type, nElem, pValue );
}
void noopiiu::readNotifyRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
void noopiiu::readNotifyRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
netReadNotifyIO & io, unsigned type, arrayElementCount nElem )
{
netiiu::readNotifyRequest ( guard, chan, io, type, nElem );
}
void noopiiu::clearChannelRequest (
epicsGuard < epicsMutex > & guard,
void noopiiu::clearChannelRequest (
epicsGuard < epicsMutex > & guard,
ca_uint32_t sid, ca_uint32_t cid )
{
netiiu::clearChannelRequest ( guard, sid, cid );
}
void noopiiu::subscriptionRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
void noopiiu::subscriptionRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
netSubscription & subscr )
{
netiiu::subscriptionRequest ( guard, chan, subscr );
}
void noopiiu::subscriptionUpdateRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
void noopiiu::subscriptionUpdateRequest (
epicsGuard < epicsMutex > & guard, nciu & chan,
netSubscription & subscr )
{
netiiu::subscriptionUpdateRequest (
guard, chan, subscr );
}
void noopiiu::subscriptionCancelRequest (
epicsGuard < epicsMutex > & guard,
void noopiiu::subscriptionCancelRequest (
epicsGuard < epicsMutex > & guard,
nciu & chan, netSubscription & subscr )
{
netiiu::subscriptionCancelRequest ( guard, chan, subscr );
}
void noopiiu::flushRequest (
void noopiiu::flushRequest (
epicsGuard < epicsMutex > & guard )
{
netiiu::flushRequest ( guard );
}
unsigned noopiiu::requestMessageBytesPending (
unsigned noopiiu::requestMessageBytesPending (
epicsGuard < epicsMutex > & guard )
{
return netiiu::requestMessageBytesPending ( guard );
}
void noopiiu::flush (
void noopiiu::flush (
epicsGuard < epicsMutex > & guard )
{
netiiu::flush ( guard );
@@ -146,14 +144,14 @@ double noopiiu::receiveWatchdogDelay (
return netiiu::receiveWatchdogDelay ( guard );
}
void noopiiu::uninstallChan (
void noopiiu::uninstallChan (
epicsGuard < epicsMutex > &, nciu & )
{
// intentionally does not call default in netiiu
}
void noopiiu::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > & guard, nciu & chan,
void noopiiu::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > & guard, nciu & chan,
const class epicsTime & currentTime )
{
netiiu::uninstallChanDueToSuccessfulSearchResponse (
@@ -161,7 +159,7 @@ void noopiiu::uninstallChanDueToSuccessfulSearchResponse (
}
bool noopiiu::searchMsg (
epicsGuard < epicsMutex > & guard, ca_uint32_t id,
epicsGuard < epicsMutex > & guard, ca_uint32_t id,
const char * pName, unsigned nameLength )
{
return netiiu::searchMsg (

View File

@@ -3,90 +3,89 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef noopiiuh
#define noopiiuh
#ifndef INC_noopiiu_H
#define INC_noopiiu_H
#include "netiiu.h"
class noopiiu : public netiiu {
public:
~noopiiu ();
unsigned getHostName (
epicsGuard < epicsMutex > &, char * pBuf,
unsigned getHostName (
epicsGuard < epicsMutex > &, char * pBuf,
unsigned bufLength ) const throw ();
const char * pHostName (
epicsGuard < epicsMutex > & ) const throw ();
epicsGuard < epicsMutex > & ) const throw ();
bool ca_v41_ok (
epicsGuard < epicsMutex > & ) const;
bool ca_v42_ok (
epicsGuard < epicsMutex > & ) const;
unsigned requestMessageBytesPending (
unsigned requestMessageBytesPending (
epicsGuard < epicsMutex > & mutualExclusionGuard );
void flush (
void flush (
epicsGuard < epicsMutex > & mutualExclusionGuard );
void writeRequest (
epicsGuard < epicsMutex > &, nciu &,
unsigned type, arrayElementCount nElem,
void writeRequest (
epicsGuard < epicsMutex > &, nciu &,
unsigned type, arrayElementCount nElem,
const void *pValue );
void writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &,
unsigned type, arrayElementCount nElem,
void writeNotifyRequest (
epicsGuard < epicsMutex > &,
nciu &, netWriteNotifyIO &,
unsigned type, arrayElementCount nElem,
const void *pValue );
void readNotifyRequest (
epicsGuard < epicsMutex > &, nciu &,
netReadNotifyIO &, unsigned type,
void readNotifyRequest (
epicsGuard < epicsMutex > &, nciu &,
netReadNotifyIO &, unsigned type,
arrayElementCount nElem );
void clearChannelRequest (
epicsGuard < epicsMutex > &,
void clearChannelRequest (
epicsGuard < epicsMutex > &,
ca_uint32_t sid, ca_uint32_t cid );
void subscriptionRequest (
epicsGuard < epicsMutex > &,
void subscriptionRequest (
epicsGuard < epicsMutex > &,
nciu &, netSubscription & );
void subscriptionUpdateRequest (
epicsGuard < epicsMutex > &,
void subscriptionUpdateRequest (
epicsGuard < epicsMutex > &,
nciu &, netSubscription & );
void subscriptionCancelRequest (
epicsGuard < epicsMutex > &,
void subscriptionCancelRequest (
epicsGuard < epicsMutex > &,
nciu & chan, netSubscription & subscr );
void flushRequest (
void flushRequest (
epicsGuard < epicsMutex > & );
void requestRecvProcessPostponedFlush (
epicsGuard < epicsMutex > & );
osiSockAddr getNetworkAddress (
epicsGuard < epicsMutex > & ) const;
void uninstallChan (
epicsGuard < epicsMutex > & mutex,
void uninstallChan (
epicsGuard < epicsMutex > & mutex,
nciu & );
void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
const class epicsTime & currentTime );
double receiveWatchdogDelay (
epicsGuard < epicsMutex > & ) const;
bool searchMsg (
epicsGuard < epicsMutex > &, ca_uint32_t id,
epicsGuard < epicsMutex > &, ca_uint32_t id,
const char * pName, unsigned nameLength );
};
extern noopiiu noopIIU;
#endif // ifndef noopiiuh
#endif // ifndef INC_noopiiu_H

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
@@ -18,30 +17,21 @@
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef oldAccessh
#define oldAccessh
#ifndef INC_oldAccess_H
#define INC_oldAccess_H
#include <memory>
#ifdef epicsExportSharedSymbols
# define oldAccessh_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "tsFreeList.h"
#include "compilerDependencies.h"
#include "osiSock.h"
#ifdef oldAccessh_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caProto.h"
#include "cacIO.h"
#include "cadef.h"
@@ -58,53 +48,53 @@ public:
epicsGuard < epicsMutex > & mutexGuard );
// legacy C API
friend unsigned epicsShareAPI ca_get_host_name (
friend unsigned epicsStdCall ca_get_host_name (
chid pChan, char * pBuf, unsigned bufLength );
friend const char * epicsShareAPI ca_host_name (
friend const char * epicsStdCall ca_host_name (
chid pChan );
friend const char * epicsShareAPI ca_name (
friend const char * epicsStdCall ca_name (
chid pChan );
friend void epicsShareAPI ca_set_puser (
friend void epicsStdCall ca_set_puser (
chid pChan, void * puser );
friend void * epicsShareAPI ca_puser (
friend void * epicsStdCall ca_puser (
chid pChan );
friend int epicsShareAPI ca_change_connection_event (
friend int epicsStdCall ca_change_connection_event (
chid pChan, caCh * pfunc );
friend int epicsShareAPI ca_replace_access_rights_event (
friend int epicsStdCall ca_replace_access_rights_event (
chid pChan, caArh *pfunc );
friend int epicsShareAPI ca_array_get ( chtype type,
friend int epicsStdCall ca_array_get ( chtype type,
arrayElementCount count, chid pChan, void * pValue );
friend int epicsShareAPI ca_array_get_callback ( chtype type,
friend int epicsStdCall ca_array_get_callback ( chtype type,
arrayElementCount count, chid pChan,
caEventCallBackFunc *pfunc, void *arg );
friend int epicsShareAPI ca_array_put (
friend int epicsStdCall ca_array_put (
chtype type, arrayElementCount count,
chid pChan, const void * pValue );
friend int epicsShareAPI ca_array_put_callback (
friend int epicsStdCall ca_array_put_callback (
chtype type, arrayElementCount count,
chid pChan, const void *pValue,
caEventCallBackFunc *pfunc, void *usrarg );
friend double epicsShareAPI ca_beacon_period (
friend double epicsStdCall ca_beacon_period (
chid pChan );
friend unsigned epicsShareAPI ca_search_attempts (
friend unsigned epicsStdCall ca_search_attempts (
chid pChan );
friend unsigned epicsShareAPI ca_write_access (
friend unsigned epicsStdCall ca_write_access (
chid pChan );
friend unsigned epicsShareAPI ca_read_access (
friend unsigned epicsStdCall ca_read_access (
chid pChan );
friend short epicsShareAPI ca_field_type (
friend short epicsStdCall ca_field_type (
chid pChan );
friend arrayElementCount epicsShareAPI ca_element_count (
friend arrayElementCount epicsStdCall ca_element_count (
chid pChan );
friend int epicsShareAPI ca_v42_ok (
friend int epicsStdCall ca_v42_ok (
chid pChan );
friend int epicsShareAPI ca_create_subscription (
friend int epicsStdCall ca_create_subscription (
chtype type, arrayElementCount count, chid pChan,
long mask, caEventCallBackFunc * pCallBack,
void * pCallBackArg, evid * monixptr );
friend enum channel_state epicsShareAPI ca_state (
friend enum channel_state epicsStdCall ca_state (
chid pChan );
friend double epicsShareAPI ca_receive_watchdog_delay (
friend double epicsStdCall ca_receive_watchdog_delay (
chid pChan );
unsigned getName (
@@ -195,8 +185,8 @@ private:
void exception (
epicsGuard < epicsMutex > &, int status,
const char *pContext, unsigned type, arrayElementCount count );
getCopy ( const getCopy & );
getCopy & operator = ( const getCopy & );
getCopy ( const getCopy & );
getCopy & operator = ( const getCopy & );
void operator delete ( void * );
};
@@ -220,8 +210,8 @@ private:
void exception (
epicsGuard < epicsMutex > &, int status,
const char * pContext, unsigned type, arrayElementCount count );
getCallback ( const getCallback & );
getCallback & operator = ( const getCallback & );
getCallback ( const getCallback & );
getCallback & operator = ( const getCallback & );
void operator delete ( void * );
};
@@ -243,8 +233,8 @@ private:
void exception (
epicsGuard < epicsMutex > &, int status, const char *pContext,
unsigned type, arrayElementCount count );
putCallback ( const putCallback & );
putCallback & operator = ( const putCallback & );
putCallback ( const putCallback & );
putCallback & operator = ( const putCallback & );
void operator delete ( void * );
};
@@ -283,8 +273,8 @@ private:
void exception (
epicsGuard < epicsMutex > &, int status,
const char *pContext, unsigned type, arrayElementCount count );
oldSubscription ( const oldSubscription & );
oldSubscription & operator = ( const oldSubscription & );
oldSubscription ( const oldSubscription & );
oldSubscription & operator = ( const oldSubscription & );
void operator delete ( void * );
};
@@ -350,41 +340,41 @@ public:
void whenThereIsAnExceptionDestroySyncGroupIO ( epicsGuard < epicsMutex > &, T & );
// legacy C API
friend int epicsShareAPI ca_create_channel (
friend int epicsStdCall ca_create_channel (
const char * name_str, caCh * conn_func, void * puser,
capri priority, chid * chanptr );
friend int epicsShareAPI ca_clear_channel ( chid pChan );
friend int epicsShareAPI ca_array_get ( chtype type,
friend int epicsStdCall ca_clear_channel ( chid pChan );
friend int epicsStdCall ca_array_get ( chtype type,
arrayElementCount count, chid pChan, void * pValue );
friend int epicsShareAPI ca_array_get_callback ( chtype type,
friend int epicsStdCall ca_array_get_callback ( chtype type,
arrayElementCount count, chid pChan,
caEventCallBackFunc *pfunc, void *arg );
friend int epicsShareAPI ca_array_put ( chtype type,
friend int epicsStdCall ca_array_put ( chtype type,
arrayElementCount count, chid pChan, const void * pValue );
friend int epicsShareAPI ca_array_put_callback ( chtype type,
friend int epicsStdCall ca_array_put_callback ( chtype type,
arrayElementCount count, chid pChan, const void * pValue,
caEventCallBackFunc *pfunc, void *usrarg );
friend int epicsShareAPI ca_create_subscription (
friend int epicsStdCall ca_create_subscription (
chtype type, arrayElementCount count, chid pChan,
long mask, caEventCallBackFunc * pCallBack, void * pCallBackArg,
evid *monixptr );
friend int epicsShareAPI ca_flush_io ();
friend int epicsShareAPI ca_clear_subscription ( evid pMon );
friend int epicsShareAPI ca_sg_create ( CA_SYNC_GID * pgid );
friend int epicsShareAPI ca_sg_delete ( const CA_SYNC_GID gid );
friend int epicsShareAPI ca_sg_block ( const CA_SYNC_GID gid, ca_real timeout );
friend int epicsShareAPI ca_sg_reset ( const CA_SYNC_GID gid );
friend int epicsShareAPI ca_sg_test ( const CA_SYNC_GID gid );
friend int epicsShareAPI ca_sg_array_get ( const CA_SYNC_GID gid,
friend int epicsStdCall ca_flush_io ();
friend int epicsStdCall ca_clear_subscription ( evid pMon );
friend int epicsStdCall ca_sg_create ( CA_SYNC_GID * pgid );
friend int epicsStdCall ca_sg_delete ( const CA_SYNC_GID gid );
friend int epicsStdCall ca_sg_block ( const CA_SYNC_GID gid, ca_real timeout );
friend int epicsStdCall ca_sg_reset ( const CA_SYNC_GID gid );
friend int epicsStdCall ca_sg_test ( const CA_SYNC_GID gid );
friend int epicsStdCall ca_sg_array_get ( const CA_SYNC_GID gid,
chtype type, arrayElementCount count,
chid pChan, void *pValue );
friend int epicsShareAPI ca_sg_array_put ( const CA_SYNC_GID gid,
friend int epicsStdCall ca_sg_array_put ( const CA_SYNC_GID gid,
chtype type, arrayElementCount count,
chid pChan, const void *pValue );
friend int ca_sync_group_destroy ( CallbackGuard & cbGuard,
epicsGuard < epicsMutex > & guard,
ca_client_context & cac, const CA_SYNC_GID gid );
friend void sync_group_reset ( ca_client_context & client,
friend void sync_group_reset ( ca_client_context & client,
CASG & sg );
// exceptions
@@ -581,7 +571,7 @@ inline unsigned ca_client_context::sequenceNumberOfOutstandingIO (
}
template < class T >
void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO (
void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO (
epicsGuard < epicsMutex > & guard, T & io )
{
if ( this->pCallbackGuard.get() &&
@@ -607,4 +597,4 @@ void ca_client_context :: whenThereIsAnExceptionDestroySyncGroupIO (
}
}
#endif // ifndef oldAccessh
#endif // ifndef INC_oldAccess_H

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -17,9 +16,9 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@@ -33,7 +32,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "cac.h"
@@ -174,7 +172,7 @@ void oldChannelNotify::operator delete ( void * )
/*
* ca_get_host_name ()
*/
unsigned epicsShareAPI ca_get_host_name (
unsigned epicsStdCall ca_get_host_name (
chid pChan, char * pBuf, unsigned bufLength )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef() );
@@ -187,7 +185,7 @@ unsigned epicsShareAPI ca_get_host_name (
* !!!! not thread safe !!!!
*
*/
const char * epicsShareAPI ca_host_name (
const char * epicsStdCall ca_host_name (
chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
@@ -197,7 +195,7 @@ const char * epicsShareAPI ca_host_name (
/*
* ca_set_puser ()
*/
void epicsShareAPI ca_set_puser (
void epicsStdCall ca_set_puser (
chid pChan, void * puser )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
@@ -207,7 +205,7 @@ void epicsShareAPI ca_set_puser (
/*
* ca_get_puser ()
*/
void * epicsShareAPI ca_puser (
void * epicsStdCall ca_puser (
chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
@@ -217,7 +215,7 @@ void * epicsShareAPI ca_puser (
/*
* Specify an event subroutine to be run for connection events
*/
int epicsShareAPI ca_change_connection_event ( chid pChan, caCh * pfunc )
int epicsStdCall ca_change_connection_event ( chid pChan, caCh * pfunc )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
if ( ! pChan->currentlyConnected ) {
@@ -239,7 +237,7 @@ int epicsShareAPI ca_change_connection_event ( chid pChan, caCh * pfunc )
/*
* ca_replace_access_rights_event
*/
int epicsShareAPI ca_replace_access_rights_event (
int epicsStdCall ca_replace_access_rights_event (
chid pChan, caArh *pfunc )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
@@ -266,7 +264,7 @@ int epicsShareAPI ca_replace_access_rights_event (
/*
* ca_array_get ()
*/
int epicsShareAPI ca_array_get ( chtype type,
int epicsStdCall ca_array_get ( chtype type,
arrayElementCount count, chid pChan, void *pValue )
{
int caStatus;
@@ -334,7 +332,7 @@ int epicsShareAPI ca_array_get ( chtype type,
/*
* ca_array_get_callback ()
*/
int epicsShareAPI ca_array_get_callback ( chtype type,
int epicsStdCall ca_array_get_callback ( chtype type,
arrayElementCount count, chid pChan,
caEventCallBackFunc *pfunc, void *arg )
{
@@ -411,7 +409,7 @@ void oldChannelNotify::read (
/*
* ca_array_put_callback ()
*/
int epicsShareAPI ca_array_put_callback ( chtype type, arrayElementCount count,
int epicsStdCall ca_array_put_callback ( chtype type, arrayElementCount count,
chid pChan, const void *pValue, caEventCallBackFunc *pfunc, void *usrarg )
{
int caStatus;
@@ -475,7 +473,7 @@ int epicsShareAPI ca_array_put_callback ( chtype type, arrayElementCount count,
/*
* ca_array_put ()
*/
int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
int epicsStdCall ca_array_put ( chtype type, arrayElementCount count,
chid pChan, const void * pValue )
{
if ( type < 0 ) {
@@ -529,7 +527,7 @@ int epicsShareAPI ca_array_put ( chtype type, arrayElementCount count,
return caStatus;
}
int epicsShareAPI ca_create_subscription (
int epicsStdCall ca_create_subscription (
chtype type, arrayElementCount count, chid pChan,
long mask, caEventCallBackFunc * pCallBack, void * pCallBackArg,
evid * monixptr )
@@ -620,7 +618,7 @@ void oldChannelNotify::write (
/*
* ca_field_type()
*/
short epicsShareAPI ca_field_type ( chid pChan )
short epicsStdCall ca_field_type ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.nativeType ( guard );
@@ -629,7 +627,7 @@ short epicsShareAPI ca_field_type ( chid pChan )
/*
* ca_element_count ()
*/
arrayElementCount epicsShareAPI ca_element_count ( chid pChan )
arrayElementCount epicsStdCall ca_element_count ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.nativeElementCount ( guard );
@@ -638,7 +636,7 @@ arrayElementCount epicsShareAPI ca_element_count ( chid pChan )
/*
* ca_state ()
*/
enum channel_state epicsShareAPI ca_state ( chid pChan )
enum channel_state epicsStdCall ca_state ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
if ( pChan->io.connected ( guard ) ) {
@@ -655,7 +653,7 @@ enum channel_state epicsShareAPI ca_state ( chid pChan )
/*
* ca_read_access ()
*/
unsigned epicsShareAPI ca_read_access ( chid pChan )
unsigned epicsStdCall ca_read_access ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.accessRights(guard).readPermit();
@@ -664,7 +662,7 @@ unsigned epicsShareAPI ca_read_access ( chid pChan )
/*
* ca_write_access ()
*/
unsigned epicsShareAPI ca_write_access ( chid pChan )
unsigned epicsStdCall ca_write_access ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.accessRights(guard).writePermit();
@@ -673,25 +671,25 @@ unsigned epicsShareAPI ca_write_access ( chid pChan )
/*
* ca_name ()
*/
const char * epicsShareAPI ca_name ( chid pChan )
const char * epicsStdCall ca_name ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.pName ( guard );
}
unsigned epicsShareAPI ca_search_attempts ( chid pChan )
unsigned epicsStdCall ca_search_attempts ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.searchAttempts ( guard );
}
double epicsShareAPI ca_beacon_period ( chid pChan )
double epicsStdCall ca_beacon_period ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.beaconPeriod ( guard );
}
double epicsShareAPI ca_receive_watchdog_delay ( chid pChan )
double epicsStdCall ca_receive_watchdog_delay ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.receiveWatchdogDelay ( guard );
@@ -700,7 +698,7 @@ double epicsShareAPI ca_receive_watchdog_delay ( chid pChan )
/*
* ca_v42_ok(chid chan)
*/
int epicsShareAPI ca_v42_ok ( chid pChan )
int epicsStdCall ca_v42_ok ( chid pChan )
{
epicsGuard < epicsMutex > guard ( pChan->cacCtx.mutexRef () );
return pChan->io.ca_v42_ok ( guard );

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -23,17 +22,16 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
oldSubscription::oldSubscription (
epicsGuard < epicsMutex > & guard,
oldChannelNotify & chanIn, cacChannel & io,
epicsGuard < epicsMutex > & guard,
oldChannelNotify & chanIn, cacChannel & io,
unsigned type, arrayElementCount nElem, unsigned mask,
caEventCallBackFunc * pFuncIn, void * pPrivateIn,
evid * pEventId ) :
chan ( chanIn ), id ( UINT_MAX ), pFunc ( pFuncIn ),
chan ( chanIn ), id ( UINT_MAX ), pFunc ( pFuncIn ),
pPrivate ( pPrivateIn )
{
// The users event id *must* be set prior to potentially
@@ -51,7 +49,7 @@ oldSubscription::~oldSubscription ()
{
}
void oldSubscription::current (
void oldSubscription::current (
epicsGuard < epicsMutex > & guard,
unsigned type, arrayElementCount count, const void * pData )
{
@@ -68,10 +66,10 @@ void oldSubscription::current (
( *pFuncTmp ) ( args );
}
}
void oldSubscription::exception (
epicsGuard < epicsMutex > & guard,
int status, const char * /* pContext */,
int status, const char * /* pContext */,
unsigned type, arrayElementCount count )
{
if ( status == ECA_CHANDESTROY ) {

View File

@@ -3,24 +3,23 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#include <string>
@@ -28,12 +27,11 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
putCallback::putCallback (
oldChannelNotify & chanIn, caEventCallBackFunc * pFuncIn,
putCallback::putCallback (
oldChannelNotify & chanIn, caEventCallBackFunc * pFuncIn,
void * pPrivateIn ) :
chan ( chanIn ), pFunc ( pFuncIn ), pPrivate ( pPrivateIn )
{
@@ -63,9 +61,9 @@ void putCallback::completion ( epicsGuard < epicsMutex > & guard )
}
}
void putCallback::exception (
void putCallback::exception (
epicsGuard < epicsMutex > & guard,
int status, const char * /* pContext */,
int status, const char * /* pContext */,
unsigned type, arrayElementCount count )
{
if ( status != ECA_CHANDESTROY ) {

View File

@@ -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.
\*************************************************************************/
/*
*
@@ -33,7 +33,7 @@
* received it goes to all sockets on the same port, but if a unicast is
* received it goes to only one of the sockets on the same port (we can only
* guess at which one it will be).
*
*
* I have observed this behavior under winsock II:
* o only one of the sockets on the same port receives the message if we
* send to the loopback address
@@ -69,14 +69,14 @@
#include "taskwd.h"
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "caProto.h"
#include "udpiiu.h"
#include "repeaterClient.h"
#include "addrList.h"
/*
/*
* these can be external since there is only one instance
* per machine so we dont care about reentrancy
*/
@@ -89,10 +89,10 @@ static const unsigned short PORT_ANY = 0u;
*/
static int makeSocket ( unsigned short port, bool reuseAddr, SOCKET * pSock )
{
SOCKET sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, 0 );
SOCKET sock = epicsSocketCreate ( AF_INET, SOCK_DGRAM, 0 );
if ( sock == INVALID_SOCKET ) {
*pSock = sock;
*pSock = sock;
return SOCKERRNO;
}
@@ -108,8 +108,8 @@ static int makeSocket ( unsigned short port, bool reuseAddr, SOCKET * pSock )
memset ( (char *) &bd, 0, sizeof (bd) );
bd.ia.sin_family = AF_INET;
bd.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
bd.ia.sin_port = htons ( port );
bd.ia.sin_addr.s_addr = htonl ( INADDR_ANY );
bd.ia.sin_port = htons ( port );
status = bind ( sock, &bd.sa, (int) sizeof(bd) );
if ( status < 0 ) {
status = SOCKERRNO;
@@ -139,7 +139,7 @@ bool repeaterClient::connect ()
if ( int sockerrno = makeSocket ( PORT_ANY, false, & this->sock ) ) {
char sockErrBuf[64];
epicsSocketConvertErrorToString (
epicsSocketConvertErrorToString (
sockErrBuf, sizeof ( sockErrBuf ), sockerrno );
fprintf ( stderr, "%s: no client sock because \"%s\"\n",
__FILE__, sockErrBuf );
@@ -149,7 +149,7 @@ bool repeaterClient::connect ()
status = ::connect ( this->sock, &this->from.sa, sizeof ( this->from.sa ) );
if ( status < 0 ) {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "%s: unable to connect client sock because \"%s\"\n",
__FILE__, sockErrBuf );
@@ -178,7 +178,7 @@ bool repeaterClient::sendConfirm ()
}
else {
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
debugPrintf ( ( "CA Repeater: confirm req err was \"%s\"\n", sockErrBuf) );
return false;
@@ -227,7 +227,7 @@ repeaterClient::~repeaterClient ()
}
void repeaterClient::operator delete ( void * )
{
{
// Visual C++ .net appears to require operator delete if
// placement operator delete is defined? I smell a ms rat
// because if I declare placement new and delete, but
@@ -237,16 +237,16 @@ void repeaterClient::operator delete ( void * )
__FILE__, __LINE__ );
}
void * repeaterClient::operator new ( size_t size,
void * repeaterClient::operator new ( size_t size,
tsFreeList < repeaterClient, 0x20 > & freeList )
{
{
return freeList.allocate ( size );
}
#ifdef CXX_PLACEMENT_DELETE
void repeaterClient::operator delete ( void *pCadaver,
tsFreeList < repeaterClient, 0x20 > & freeList )
{
void repeaterClient::operator delete ( void *pCadaver,
tsFreeList < repeaterClient, 0x20 > & freeList )
{
freeList.release ( pCadaver );
}
#endif
@@ -326,7 +326,7 @@ static void verifyClients ( tsFreeList < repeaterClient, 0x20 > & freeList )
/*
* fanOut()
*/
static void fanOut ( const osiSockAddr & from, const void * pMsg,
static void fanOut ( const osiSockAddr & from, const void * pMsg,
unsigned msgSize, tsFreeList < repeaterClient, 0x20 > & freeList )
{
static tsDLList < repeaterClient > theClients;
@@ -354,7 +354,7 @@ static void fanOut ( const osiSockAddr & from, const void * pMsg,
/*
* register_new_client()
*/
static void register_new_client ( osiSockAddr & from,
static void register_new_client ( osiSockAddr & from,
tsFreeList < repeaterClient, 0x20 > & freeList )
{
bool newClient = false;
@@ -375,7 +375,7 @@ static void register_new_client ( osiSockAddr & from,
SOCKET sock;
if ( int sockerrno = makeSocket ( PORT_ANY, true, & sock ) ) {
char sockErrBuf[64];
epicsSocketConvertErrorToString (
epicsSocketConvertErrorToString (
sockErrBuf, sizeof ( sockErrBuf ), sockerrno );
fprintf ( stderr, "%s: Unable to create repeater bind test socket because \"%s\"\n",
__FILE__, sockErrBuf );
@@ -391,7 +391,7 @@ static void register_new_client ( osiSockAddr & from,
* repeater would not always allow the loopback address
* as a local client address so current clients alternate
* between the address of the first non-loopback interface
* found and the loopback addresss when subscribing with
* found and the loopback addresss when subscribing with
* the CA repeater until all CA repeaters have been updated
* to current code.
*/
@@ -418,8 +418,8 @@ static void register_new_client ( osiSockAddr & from,
break;
}
pclient++;
}
}
repeaterClient *pNewClient;
if ( pclient.valid () ) {
pNewClient = pclient.pointer ();
@@ -435,7 +435,7 @@ static void register_new_client ( osiSockAddr & from,
freeList.release ( pNewClient );
return;
}
client_list.add ( *pNewClient );
client_list.add ( *pNewClient );
newClient = true;
}
@@ -451,7 +451,7 @@ static void register_new_client ( osiSockAddr & from,
}
/*
* send a noop message to all other clients so that we dont
* send a noop message to all other clients so that we dont
* accumulate sockets when there are no beacons
*/
caHdr noop;
@@ -479,14 +479,14 @@ static void register_new_client ( osiSockAddr & from,
/*
* ca_repeater ()
*/
void ca_repeater ()
void ca_repeater ()
{
tsFreeList < repeaterClient, 0x20 > freeList;
int size;
SOCKET sock;
osiSockAddr from;
unsigned short port;
char * pBuf;
char * pBuf;
pBuf = new char [MAX_UDP_RECV];
@@ -508,7 +508,7 @@ void ca_repeater ()
return;
}
char sockErrBuf[64];
epicsSocketConvertErrorToString (
epicsSocketConvertErrorToString (
sockErrBuf, sizeof ( sockErrBuf ), sockerrno );
fprintf ( stderr, "%s: Unable to create repeater socket because \"%s\" - fatal\n",
__FILE__, sockErrBuf );
@@ -517,6 +517,56 @@ void ca_repeater ()
return;
}
#ifdef IP_ADD_MEMBERSHIP
/*
* join UDP socket to any multicast groups
*/
{
ELLLIST casBeaconAddrList = ELLLIST_INIT;
ELLLIST casMergeAddrList = ELLLIST_INIT;
/*
* collect user specified beacon address list;
* check BEACON_ADDR_LIST list first; if no result, take CA_ADDR_LIST
*/
if(!addAddrToChannelAccessAddressList(&casMergeAddrList,&EPICS_CAS_BEACON_ADDR_LIST,port,0)) {
addAddrToChannelAccessAddressList(&casMergeAddrList,&EPICS_CA_ADDR_LIST,port,0);
}
/* First clean up */
removeDuplicateAddresses(&casBeaconAddrList, &casMergeAddrList , 0);
osiSockAddrNode *pNode;
for(pNode = (osiSockAddrNode*)ellFirst(&casBeaconAddrList);
pNode;
pNode = (osiSockAddrNode*)ellNext(&pNode->node))
{
if(pNode->addr.ia.sin_family==AF_INET) {
epicsUInt32 top = ntohl(pNode->addr.ia.sin_addr.s_addr)>>24;
if(top>=224 && top<=239) {
/* This is a multi-cast address */
struct ip_mreq mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.imr_multiaddr = pNode->addr.ia.sin_addr;
mreq.imr_interface.s_addr = INADDR_ANY;
if (setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(char *) &mreq, sizeof(mreq)) != 0) {
char name[40];
char sockErrBuf[64];
epicsSocketConvertErrnoToString (sockErrBuf, sizeof ( sockErrBuf ) );
ipAddrToDottedIP (&pNode->addr.ia, name, sizeof(name));
errlogPrintf("caR: Socket mcast join to %s failed: %s\n", name, sockErrBuf );
}
}
}
}
}
#endif
debugPrintf ( ( "CA Repeater: Attached and initialized\n" ) );
while ( true ) {
@@ -534,7 +584,7 @@ void ca_repeater ()
continue;
}
char sockErrBuf[64];
epicsSocketConvertErrnoToString (
epicsSocketConvertErrnoToString (
sockErrBuf, sizeof ( sockErrBuf ) );
fprintf ( stderr, "CA Repeater: unexpected UDP recv err: %s\n",
sockErrBuf );
@@ -571,7 +621,7 @@ void ca_repeater ()
continue;
}
fanOut ( from, pMsg, size, freeList );
fanOut ( from, pMsg, size, freeList );
}
}

View File

@@ -3,42 +3,33 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef repeaterClienth
#define repeaterClienth
#ifdef epicsExportSharedSymbols
# define repeaterClienth_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_repeaterClient_H
#define INC_repeaterClient_H
#include "tsDLList.h"
#include "tsFreeList.h"
#include "compilerDependencies.h"
#ifdef repeaterClienth_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
union osiSockAddr;
@@ -56,9 +47,9 @@ public:
bool verify ();
bool identicalAddress ( const osiSockAddr &from );
bool identicalPort ( const osiSockAddr &from );
void * operator new ( size_t size,
void * operator new ( size_t size,
tsFreeList < repeaterClient, 0x20 > & );
epicsPlacementDeleteOperator (( void *,
epicsPlacementDeleteOperator (( void *,
tsFreeList < repeaterClient, 0x20 > & ))
private:
osiSockAddr from;
@@ -67,6 +58,4 @@ private:
void operator delete ( void * );
};
#endif // repeaterClienth
#endif // ifndef INC_repeaterClient_H

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -25,17 +24,15 @@
#include "iocinf.h"
#include "repeaterSubscribeTimer.h"
#define epicsExportSharedSymbols
#include "udpiiu.h"
#undef epicsExportSharedSymbols
static const double repeaterSubscribeTimerInitialPeriod = 10.0; // sec
static const double repeaterSubscribeTimerPeriod = 1.0; // sec
repeaterSubscribeTimer::repeaterSubscribeTimer (
repeaterSubscribeTimer::repeaterSubscribeTimer (
repeaterTimerNotify & iiuIn, epicsTimerQueue & queueIn,
epicsMutex & cbMutexIn, cacContextNotify & ctxNotifyIn ) :
timer ( queueIn.createTimer () ), iiu ( iiuIn ),
timer ( queueIn.createTimer () ), iiu ( iiuIn ),
cbMutex ( cbMutexIn ),ctxNotify ( ctxNotifyIn ),
stateMutex(__FILE__, __LINE__),
attempts ( 0 ), registered ( false ), once ( false )
@@ -49,7 +46,7 @@ repeaterSubscribeTimer::~repeaterSubscribeTimer ()
void repeaterSubscribeTimer::start ()
{
this->timer.start (
this->timer.start (
*this, repeaterSubscribeTimerInitialPeriod );
}
@@ -68,12 +65,12 @@ epicsTimerNotify::expireStatus repeaterSubscribeTimer::
expire ( const epicsTime & /* currentTime */ )
{
epicsGuard < epicsMutex > guard ( this->stateMutex );
static const unsigned nTriesToMsg = 50;
if ( this->attempts > nTriesToMsg && ! this->once ) {
callbackManager mgr ( this->ctxNotify, this->cbMutex );
this->iiu.printFormated ( mgr.cbGuard,
"CA client library is unable to contact CA repeater after %u tries.\n",
"CA client library is unable to contact CA repeater after %u tries.\n",
nTriesToMsg );
this->iiu.printFormated ( mgr.cbGuard,
"Silence this message by starting a CA repeater daemon\n") ;
@@ -96,7 +93,7 @@ epicsTimerNotify::expireStatus repeaterSubscribeTimer::
void repeaterSubscribeTimer::show ( unsigned /* level */ ) const
{
epicsGuard < epicsMutex > guard ( this->stateMutex );
::printf ( "repeater subscribe timer: attempts=%u registered=%u once=%u\n",
this->attempts, this->registered, this->once );
}

View File

@@ -3,42 +3,31 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef repeaterSubscribeTimerh
#define repeaterSubscribeTimerh
#ifndef INC_repeaterSubscribeTimer_H
#define INC_repeaterSubscribeTimer_H
#include "epicsTimer.h"
#ifdef epicsExportSharedSymbols
# define repeaterSubscribeTimerh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include "epicsTimer.h"
#ifdef repeaterSubscribeTimerh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
class epicsMutex;
class cacContextNotify;
@@ -46,17 +35,17 @@ class cacContextNotify;
class repeaterTimerNotify {
public:
virtual ~repeaterTimerNotify () = 0;
virtual void repeaterRegistrationMessage (
virtual void repeaterRegistrationMessage (
unsigned attemptNumber ) = 0;
virtual int printFormated (
epicsGuard < epicsMutex > & callbackControl,
virtual int printFormated (
epicsGuard < epicsMutex > & callbackControl,
const char * pformat, ... ) = 0;
};
class repeaterSubscribeTimer : private epicsTimerNotify {
public:
repeaterSubscribeTimer (
repeaterTimerNotify &, epicsTimerQueue &,
repeaterSubscribeTimer (
repeaterTimerNotify &, epicsTimerQueue &,
epicsMutex & cbMutex, cacContextNotify & ctxNotify );
virtual ~repeaterSubscribeTimer ();
void start ();
@@ -64,7 +53,7 @@ public:
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard );
void confirmNotify ();
void show ( unsigned level ) const;
void show ( unsigned level ) const;
private:
epicsTimer & timer;
repeaterTimerNotify & iiu;
@@ -74,9 +63,9 @@ private:
unsigned attempts;
bool registered;
bool once;
expireStatus expire ( const epicsTime & currentTime );
repeaterSubscribeTimer ( const repeaterSubscribeTimer & );
repeaterSubscribeTimer & operator = ( const repeaterSubscribeTimer & );
expireStatus expire ( const epicsTime & currentTime );
repeaterSubscribeTimer ( const repeaterSubscribeTimer & );
repeaterSubscribeTimer & operator = ( const repeaterSubscribeTimer & );
};
#endif // ifdef repeaterSubscribeTimerh
#endif // ifdef INC_repeaterSubscribeTimer_H

View File

@@ -3,11 +3,10 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
@@ -19,31 +18,30 @@
//
#include <stdexcept>
#include <string> // vxWorks 6.0 requires this include
#include <string> // vxWorks 6.0 requires this include
#include <limits.h>
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#include "envDefs.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "udpiiu.h"
#include "nciu.h"
static const unsigned initialTriesPerFrame = 1u; // initial UDP frames per search try
static const unsigned maxTriesPerFrame = 64u; // max UDP frames per search try
static const unsigned maxTriesPerFrame = 64u; // max UDP frames per search try
//
// searchTimer::searchTimer ()
//
searchTimer::searchTimer (
searchTimerNotify & iiuIn,
epicsTimerQueue & queueIn,
const unsigned indexIn,
searchTimer::searchTimer (
searchTimerNotify & iiuIn,
epicsTimerQueue & queueIn,
const unsigned indexIn,
epicsMutex & mutexIn,
bool boostPossibleIn ) :
timeAtLastSend ( epicsTime::getMonotonic () ),
timeAtLastSend ( epicsTime::getCurrent () ),
timer ( queueIn.createTimer () ),
iiu ( iiuIn ),
mutex ( mutexIn ),
@@ -73,7 +71,7 @@ searchTimer::~searchTimer ()
this->timer.destroy ();
}
void searchTimer::shutdown (
void searchTimer::shutdown (
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard )
{
@@ -87,25 +85,25 @@ void searchTimer::shutdown (
}
while ( nciu * pChan = this->chanListReqPending.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
pChan->serviceShutdownNotify ( cbGuard, guard );
}
while ( nciu * pChan = this->chanListRespPending.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
pChan->serviceShutdownNotify ( cbGuard, guard );
}
}
void searchTimer::installChannel (
void searchTimer::installChannel (
epicsGuard < epicsMutex > & guard, nciu & chan )
{
this->chanListReqPending.add ( chan );
chan.channelNode::setReqPendingState ( guard, this->index );
}
void searchTimer::moveChannels (
void searchTimer::moveChannels (
epicsGuard < epicsMutex > & guard, searchTimer & dest )
{
while ( nciu * pChan = this->chanListRespPending.get () ) {
@@ -122,25 +120,25 @@ void searchTimer::moveChannels (
//
// searchTimer::expire ()
//
epicsTimerNotify::expireStatus searchTimer::expire (
epicsTimerNotify::expireStatus searchTimer::expire (
const epicsTime & currentTime )
{
epicsGuard < epicsMutex > guard ( this->mutex );
while ( nciu * pChan = this->chanListRespPending.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
this->iiu.noSearchRespNotify (
this->iiu.noSearchRespNotify (
guard, *pChan, this->index );
}
this->timeAtLastSend = currentTime;
// boost search period for channels not recently
// searched for if there was some success
if ( this->searchResponses && this->boostPossible ) {
while ( nciu * pChan = this->chanListReqPending.get () ) {
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
this->iiu.boostChannel ( guard, *pChan );
}
@@ -149,8 +147,8 @@ epicsTimerNotify::expireStatus searchTimer::expire (
if ( this->searchAttempts ) {
#if 0
//
// dynamically adjust the number of UDP frames per
// try depending how many search requests are not
// dynamically adjust the number of UDP frames per
// try depending how many search requests are not
// replied to
//
// The variable this->framesPerTry
@@ -160,13 +158,13 @@ epicsTimerNotify::expireStatus searchTimer::expire (
// network bandwidth. If it is too low we will
// use very little of the incoming UDP message
// buffer associated with the server's port and
// will therefore take longer to connect. We
// initialize this->framesPerTry to a prime number
// will therefore take longer to connect. We
// initialize this->framesPerTry to a prime number
// so that it is less likely that the
// same channel is in the last UDP frame
// sent every time that this is called (and
// potentially discarded by a CA server with
// a small UDP input queue).
// a small UDP input queue).
//
// increase frames per try only if we see better than
// a 93.75% success rate for one pass through the list
@@ -182,19 +180,19 @@ epicsTimerNotify::expireStatus searchTimer::expire (
else {
this->framesPerTry += (this->framesPerTry/8) + 1;
}
debugPrintf ( ("Increasing frame count to %u t=%u r=%u\n",
debugPrintf ( ("Increasing frame count to %u t=%u r=%u\n",
this->framesPerTry, this->searchAttempts, this->searchResponses) );
}
}
// if we detect congestion because we have less than a 87.5% success
// if we detect congestion because we have less than a 87.5% success
// rate then gradually reduce the frames per try
else if ( this->searchResponses <
else if ( this->searchResponses <
( this->searchAttempts - (this->searchAttempts/8u) ) ) {
if ( this->framesPerTry > 1 ) {
this->framesPerTry--;
}
this->framesPerTryCongestThresh = this->framesPerTry/2 + 1;
debugPrintf ( ("Congestion detected - set frames per try to %f t=%u r=%u\n",
debugPrintf ( ("Congestion detected - set frames per try to %f t=%u r=%u\n",
this->framesPerTry, this->searchAttempts, this->searchResponses) );
}
#else
@@ -214,20 +212,20 @@ epicsTimerNotify::expireStatus searchTimer::expire (
else {
this->framesPerTry += 1.0 / this->framesPerTry;
}
debugPrintf ( ("Increasing frame count to %g t=%u r=%u\n",
debugPrintf ( ("Increasing frame count to %g t=%u r=%u\n",
this->framesPerTry, this->searchAttempts, this->searchResponses) );
}
}
else {
this->framesPerTryCongestThresh = this->framesPerTry / 2.0;
this->framesPerTry = 1u;
debugPrintf ( ("Congestion detected - set frames per try to %g t=%u r=%u\n",
debugPrintf ( ("Congestion detected - set frames per try to %g t=%u r=%u\n",
this->framesPerTry, this->searchAttempts, this->searchResponses) );
}
#endif
}
this->dgSeqNoAtTimerExpireBegin =
this->dgSeqNoAtTimerExpireBegin =
this->iiu.datagramSeqNumber ( guard );
this->searchAttempts = 0;
@@ -240,9 +238,9 @@ epicsTimerNotify::expireStatus searchTimer::expire (
break;
}
pChan->channelNode::listMember =
pChan->channelNode::listMember =
channelNode::cs_none;
bool success = pChan->searchMsg ( guard );
if ( ! success ) {
if ( this->iiu.datagramFlush ( guard, currentTime ) ) {
@@ -253,14 +251,14 @@ epicsTimerNotify::expireStatus searchTimer::expire (
}
if ( ! success ) {
this->chanListReqPending.push ( *pChan );
pChan->channelNode::setReqPendingState (
pChan->channelNode::setReqPendingState (
guard, this->index );
break;
}
}
this->chanListRespPending.add ( *pChan );
pChan->channelNode::setRespPendingState (
pChan->channelNode::setRespPendingState (
guard, this->index );
if ( this->searchAttempts < UINT_MAX ) {
@@ -273,14 +271,14 @@ epicsTimerNotify::expireStatus searchTimer::expire (
nFrameSent++;
}
this->dgSeqNoAtTimerExpireEnd =
this->dgSeqNoAtTimerExpireEnd =
this->iiu.datagramSeqNumber ( guard ) - 1u;
# ifdef DEBUG
if ( this->searchAttempts ) {
char buf[64];
currentTime.strftime ( buf, sizeof(buf), "%M:%S.%09f");
debugPrintf ( ("sent %u delay sec=%f Rts=%s\n",
debugPrintf ( ("sent %u delay sec=%f Rts=%s\n",
nFrameSent, this->period(), buf ) );
}
# endif
@@ -293,22 +291,22 @@ void searchTimer :: show ( unsigned level ) const
epicsGuard < epicsMutex > guard ( this->mutex );
::printf ( "searchTimer with period %f\n", this->period ( guard ) );
if ( level > 0 ) {
::printf ( "channels with search request pending = %u\n",
::printf ( "channels with search request pending = %u\n",
this->chanListReqPending.count () );
if ( level > 1u ) {
tsDLIterConst < nciu > pChan =
tsDLIterConst < nciu > pChan =
this->chanListReqPending.firstIter ();
while ( pChan.valid () ) {
while ( pChan.valid () ) {
pChan->show ( level - 2u );
pChan++;
}
}
::printf ( "channels with search response pending = %u\n",
::printf ( "channels with search response pending = %u\n",
this->chanListRespPending.count () );
if ( level > 1u ) {
tsDLIterConst < nciu > pChan =
tsDLIterConst < nciu > pChan =
this->chanListRespPending.firstIter ();
while ( pChan.valid () ) {
while ( pChan.valid () ) {
pChan->show ( level - 2u );
pChan++;
}
@@ -321,9 +319,9 @@ void searchTimer :: show ( unsigned level ) const
// at least one response. However, dont reset this delay if we
// get a delayed response to an old search request.
//
void searchTimer::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > & guard, nciu & chan,
ca_uint32_t respDatagramSeqNo, bool seqNumberIsValid,
void searchTimer::uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > & guard, nciu & chan,
ca_uint32_t respDatagramSeqNo, bool seqNumberIsValid,
const epicsTime & currentTime )
{
guard.assertIdenticalMutex ( this->mutex );
@@ -335,8 +333,8 @@ void searchTimer::uninstallChanDueToSuccessfulSearchResponse (
bool validResponse = true;
if ( seqNumberIsValid ) {
validResponse =
this->dgSeqNoAtTimerExpireBegin <= respDatagramSeqNo &&
validResponse =
this->dgSeqNoAtTimerExpireBegin <= respDatagramSeqNo &&
this->dgSeqNoAtTimerExpireEnd >= respDatagramSeqNo;
}
@@ -351,7 +349,7 @@ void searchTimer::uninstallChanDueToSuccessfulSearchResponse (
if ( this->searchResponses == this->searchAttempts ) {
if ( this->chanListReqPending.count () ) {
//
// when we get 100% success immediately
// when we get 100% success immediately
// send another search request
//
debugPrintf ( ( "All requests succesful, set timer delay to zero\n" ) );
@@ -366,25 +364,25 @@ void searchTimer::uninstallChan (
epicsGuard < epicsMutex > & cacGuard, nciu & chan )
{
cacGuard.assertIdenticalMutex ( this->mutex );
unsigned ulistmem =
static_cast <unsigned> ( chan.channelNode::listMember );
unsigned uReqBase =
static_cast <unsigned> ( channelNode::cs_searchReqPending0 );
unsigned ulistmem =
static_cast <unsigned> ( chan.channelNode::listMember );
unsigned uReqBase =
static_cast <unsigned> ( channelNode::cs_searchReqPending0 );
if ( ulistmem == this->index + uReqBase ) {
this->chanListReqPending.remove ( chan );
}
else {
unsigned uRespBase =
static_cast <unsigned > (
channelNode::cs_searchRespPending0 );
if ( ulistmem == this->index + uRespBase ) {
this->chanListRespPending.remove ( chan );
}
else {
throw std::runtime_error (
"uninstalling channel search timer, but channel "
"state is wrong" );
}
else {
unsigned uRespBase =
static_cast <unsigned > (
channelNode::cs_searchRespPending0 );
if ( ulistmem == this->index + uRespBase ) {
this->chanListRespPending.remove ( chan );
}
else {
throw std::runtime_error (
"uninstalling channel search timer, but channel "
"state is wrong" );
}
}
chan.channelNode::listMember = channelNode::cs_none;
}

View File

@@ -3,57 +3,47 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
//
//
//
//
//
// L O S A L A M O S
// Los Alamos National Laboratory
// Los Alamos, New Mexico 87545
//
//
// Copyright, 1986, The Regents of the University of California.
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
//
// Author Jeffrey O. Hill
// johill@lanl.gov
// 505 665 1831
//
#ifndef searchTimerh
#define searchTimerh
#ifdef epicsExportSharedSymbols
# define searchTimerh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_searchTimer_H
#define INC_searchTimer_H
#include "epicsMutex.h"
#include "epicsGuard.h"
#include "epicsTimer.h"
#ifdef searchTimerh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "caProto.h"
#include "netiiu.h"
class searchTimerNotify {
public:
virtual ~searchTimerNotify () = 0;
virtual void boostChannel (
virtual void boostChannel (
epicsGuard < epicsMutex > &, nciu & ) = 0;
virtual void noSearchRespNotify (
virtual void noSearchRespNotify (
epicsGuard < epicsMutex > &, nciu &, unsigned ) = 0;
virtual double getRTTE ( epicsGuard < epicsMutex > & ) const = 0;
virtual void updateRTTE ( epicsGuard < epicsMutex > &, double rtte ) = 0;
virtual bool datagramFlush (
epicsGuard < epicsMutex > &,
virtual bool datagramFlush (
epicsGuard < epicsMutex > &,
const epicsTime & currentTime ) = 0;
virtual ca_uint32_t datagramSeqNumber (
epicsGuard < epicsMutex > & ) const = 0;
@@ -61,24 +51,24 @@ public:
class searchTimer : private epicsTimerNotify {
public:
searchTimer (
class searchTimerNotify &, epicsTimerQueue &,
searchTimer (
class searchTimerNotify &, epicsTimerQueue &,
const unsigned index, epicsMutex &,
bool boostPossible );
virtual ~searchTimer ();
void start ( epicsGuard < epicsMutex > & );
void shutdown (
void shutdown (
epicsGuard < epicsMutex > & cbGuard,
epicsGuard < epicsMutex > & guard );
void moveChannels (
void moveChannels (
epicsGuard < epicsMutex > &, searchTimer & dest );
void installChannel (
void installChannel (
epicsGuard < epicsMutex > &, nciu & );
void uninstallChan (
void uninstallChan (
epicsGuard < epicsMutex > &, nciu & );
void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
ca_uint32_t respDatagramSeqNo, bool seqNumberIsValid,
void uninstallChanDueToSuccessfulSearchResponse (
epicsGuard < epicsMutex > &, nciu &,
ca_uint32_t respDatagramSeqNo, bool seqNumberIsValid,
const epicsTime & currentTime );
void show ( unsigned level ) const;
private:
@@ -94,15 +84,15 @@ private:
unsigned searchAttempts; /* num search tries after last timer experation */
unsigned searchResponses; /* num search resp after last timer experation */
const unsigned index;
ca_uint32_t dgSeqNoAtTimerExpireBegin;
ca_uint32_t dgSeqNoAtTimerExpireBegin;
ca_uint32_t dgSeqNoAtTimerExpireEnd;
const bool boostPossible;
bool stopped;
expireStatus expire ( const epicsTime & currentTime );
double period ( epicsGuard < epicsMutex > & ) const;
searchTimer ( const searchTimer & ); // not implemented
searchTimer & operator = ( const searchTimer & ); // not implemented
searchTimer ( const searchTimer & ); // not implemented
searchTimer & operator = ( const searchTimer & ); // not implemented
};
#endif // ifdef searchTimerh
#endif // ifdef INC_searchTimer_H

View File

@@ -3,28 +3,27 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef sgAutoPtrh
#define sgAutoPtrh
#ifndef INC_sgAutoPtr_H
#define INC_sgAutoPtr_H
template < class T >
class sgAutoPtr {
@@ -40,18 +39,18 @@ private:
T * pNotify;
struct CASG & sg;
epicsGuard < epicsMutex > & guard;
sgAutoPtr & operator = ( const sgAutoPtr & );
sgAutoPtr & operator = ( const sgAutoPtr & );
};
template < class T >
inline sgAutoPtr < T > :: sgAutoPtr (
epicsGuard < epicsMutex > & guardIn, struct CASG & sgIn ) :
inline sgAutoPtr < T > :: sgAutoPtr (
epicsGuard < epicsMutex > & guardIn, struct CASG & sgIn ) :
pNotify ( 0 ), sg ( sgIn ), guard ( guardIn )
{
}
template < class T >
inline sgAutoPtr < T > :: ~sgAutoPtr ()
inline sgAutoPtr < T > :: ~sgAutoPtr ()
{
if ( this->pNotify ) {
this->sg.ioPendingList.remove ( *this->pNotify );
@@ -100,4 +99,4 @@ inline T * sgAutoPtr < T > :: get ()
return this->pNotify;
}
#endif // sgAutoPtrh
#endif // ifndef INC_sgAutoPtr_H

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -17,18 +16,13 @@
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef syncGrouph
#define syncGrouph
#ifdef epicsExportSharedSymbols
# define syncGrouph_restore_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_syncGroup_H
#define INC_syncGroup_H
#include "tsDLList.h"
#include "tsFreeList.h"
@@ -36,11 +30,7 @@
#include "epicsEvent.h"
#include "compilerDependencies.h"
#ifdef syncGrouph_restore_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
#include "cadef.h"
#include "cacIO.h"
@@ -70,7 +60,7 @@ struct CASG;
class syncGroupReadNotify : public syncGroupNotify, public cacReadNotify {
public:
typedef void ( CASG :: * PRecycleFunc )
typedef void ( CASG :: * PRecycleFunc )
( epicsGuard < epicsMutex > &, syncGroupReadNotify & );
static syncGroupReadNotify * factory (
tsFreeList < class syncGroupReadNotify, 128, epicsMutexNOOP > &,
@@ -115,7 +105,7 @@ private:
class syncGroupWriteNotify : public syncGroupNotify, public cacWriteNotify {
public:
typedef void ( CASG :: * PRecycleFunc )
typedef void ( CASG :: * PRecycleFunc )
( epicsGuard < epicsMutex > &, syncGroupWriteNotify & );
static syncGroupWriteNotify * factory (
tsFreeList < class syncGroupWriteNotify, 128, epicsMutexNOOP > &,
@@ -150,7 +140,7 @@ private:
void completion ( epicsGuard < epicsMutex > & );
void exception (
epicsGuard < epicsMutex > &, int status, const char *pContext,
unsigned type, arrayElementCount count );
unsigned type, arrayElementCount count );
syncGroupWriteNotify ( const syncGroupWriteNotify & );
syncGroupWriteNotify & operator = ( const syncGroupWriteNotify & );
};
@@ -174,9 +164,9 @@ public:
void reset ( CallbackGuard &, epicsGuard < epicsMutex > & );
void show ( epicsGuard < epicsMutex > &, unsigned level ) const;
void show ( unsigned level ) const;
void get ( epicsGuard < epicsMutex > &, chid pChan,
void get ( epicsGuard < epicsMutex > &, chid pChan,
unsigned type, arrayElementCount count, void * pValue );
void put ( epicsGuard < epicsMutex > &, chid pChan,
void put ( epicsGuard < epicsMutex > &, chid pChan,
unsigned type, arrayElementCount count, const void * pValue );
void completionNotify (
epicsGuard < epicsMutex > &, syncGroupNotify & );
@@ -208,9 +198,9 @@ private:
void destroyCompletedIO (
CallbackGuard & cbGuard,
epicsGuard < epicsMutex > & guard );
void recycleReadNotifyIO ( epicsGuard < epicsMutex > &,
void recycleReadNotifyIO ( epicsGuard < epicsMutex > &,
syncGroupReadNotify & );
void recycleWriteNotifyIO ( epicsGuard < epicsMutex > &,
void recycleWriteNotifyIO ( epicsGuard < epicsMutex > &,
syncGroupWriteNotify & );
CASG ( const CASG & );
@@ -277,4 +267,4 @@ inline bool syncGroupReadNotify::ioPending (
return ! this->ioComplete;
}
#endif // ifdef syncGrouph
#endif // ifdef INC_syncGroup_H

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -16,12 +15,11 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "syncGroup.h"
#include "oldAccess.h"
syncGroupNotify::syncGroupNotify ()
syncGroupNotify::syncGroupNotify ()
{
}

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
@@ -21,7 +20,6 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "syncGroup.h"
#include "oldAccess.h"
@@ -29,7 +27,7 @@
syncGroupReadNotify::syncGroupReadNotify (
CASG & sgIn, PRecycleFunc pRecycleFuncIn,
chid pChan, void * pValueIn ) :
chan ( pChan ), pRecycleFunc ( pRecycleFuncIn ),
chan ( pChan ), pRecycleFunc ( pRecycleFuncIn ),
sg ( sgIn ), pValue ( pValueIn ),
magic ( CASG_MAGIC ), id ( 0u ),
idIsValid ( false ), ioComplete ( false )

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
@@ -21,12 +20,11 @@
#include "errlog.h"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "syncGroup.h"
#include "oldAccess.h"
syncGroupWriteNotify::syncGroupWriteNotify ( CASG & sgIn,
syncGroupWriteNotify::syncGroupWriteNotify ( CASG & sgIn,
PRecycleFunc pRecycleFuncIn, chid pChan ) :
chan ( pChan ), pRecycleFunc ( pRecycleFuncIn ),
sg ( sgIn ), magic ( CASG_MAGIC ),

View File

@@ -3,8 +3,7 @@
* 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
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
@@ -15,7 +14,6 @@
#define epicsAssertAuthor "Jeff Hill johill@lanl.gov"
#define epicsExportSharedSymbols
#include "iocinf.h"
#include "oldAccess.h"
#include "syncGroup.h"
@@ -23,7 +21,7 @@
/*
* ca_sg_create()
*/
extern "C" int epicsShareAPI ca_sg_create ( CA_SYNC_GID * pgid )
extern "C" int epicsStdCall ca_sg_create ( CA_SYNC_GID * pgid )
{
ca_client_context * pcac;
int caStatus;
@@ -67,7 +65,7 @@ int ca_sync_group_destroy ( CallbackGuard & cbGuard, epicsGuard < epicsMutex > &
/*
* ca_sg_delete()
*/
extern "C" int epicsShareAPI ca_sg_delete ( const CA_SYNC_GID gid )
extern "C" int epicsStdCall ca_sg_delete ( const CA_SYNC_GID gid )
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( & pcac );
@@ -102,7 +100,7 @@ void sync_group_reset ( ca_client_context & client, CASG & sg )
epicsGuard < epicsMutex > guard ( client.mutex );
sg.reset ( *client.pCallbackGuard.get(), guard );
}
else {
else {
//
// we will definately stall out here if all of the
// following are true
@@ -126,7 +124,7 @@ void sync_group_reset ( ca_client_context & client, CASG & sg )
// !!!! is disabled. This prevents the preemptive callback lock from being released
// !!!! by other threads than the one that locked it.
//
extern "C" int epicsShareAPI ca_sg_block (
extern "C" int epicsStdCall ca_sg_block (
const CA_SYNC_GID gid, ca_real timeout )
{
ca_client_context *pcac;
@@ -154,7 +152,7 @@ extern "C" int epicsShareAPI ca_sg_block (
/*
* ca_sg_reset
*/
extern "C" int epicsShareAPI ca_sg_reset ( const CA_SYNC_GID gid )
extern "C" int epicsStdCall ca_sg_reset ( const CA_SYNC_GID gid )
{
ca_client_context *pcac;
int caStatus = fetchClientContext (&pcac);
@@ -178,7 +176,7 @@ extern "C" int epicsShareAPI ca_sg_reset ( const CA_SYNC_GID gid )
/*
* ca_sg_stat
*/
extern "C" int epicsShareAPI ca_sg_stat ( const CA_SYNC_GID gid )
extern "C" int epicsStdCall ca_sg_stat ( const CA_SYNC_GID gid )
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -201,7 +199,7 @@ extern "C" int epicsShareAPI ca_sg_stat ( const CA_SYNC_GID gid )
/*
* ca_sg_test
*/
extern "C" int epicsShareAPI ca_sg_test ( const CA_SYNC_GID gid )
extern "C" int epicsStdCall ca_sg_test ( const CA_SYNC_GID gid )
{
ca_client_context * pcac;
int caStatus = fetchClientContext ( &pcac );
@@ -245,7 +243,7 @@ extern "C" int epicsShareAPI ca_sg_test ( const CA_SYNC_GID gid )
/*
* ca_sg_array_put()
*/
extern "C" int epicsShareAPI ca_sg_array_put ( const CA_SYNC_GID gid, chtype type,
extern "C" int epicsStdCall ca_sg_array_put ( const CA_SYNC_GID gid, chtype type,
arrayElementCount count, chid pChan, const void *pValue )
{
ca_client_context *pcac;
@@ -262,7 +260,7 @@ extern "C" int epicsShareAPI ca_sg_array_put ( const CA_SYNC_GID gid, chtype typ
}
try {
pcasg->put ( guard, pChan, type,
pcasg->put ( guard, pChan, type,
static_cast < unsigned > ( count ), pValue );
return ECA_NORMAL;
}
@@ -307,7 +305,7 @@ extern "C" int epicsShareAPI ca_sg_array_put ( const CA_SYNC_GID gid, chtype typ
/*
* ca_sg_array_get()
*/
extern "C" int epicsShareAPI ca_sg_array_get ( const CA_SYNC_GID gid, chtype type,
extern "C" int epicsStdCall ca_sg_array_get ( const CA_SYNC_GID gid, chtype type,
arrayElementCount count, chid pChan, void *pValue )
{
ca_client_context *pcac;
@@ -324,7 +322,7 @@ extern "C" int epicsShareAPI ca_sg_array_get ( const CA_SYNC_GID gid, chtype typ
}
try {
pcasg->get ( guard, pChan, type,
pcasg->get ( guard, pChan, type,
static_cast < unsigned > ( count ), pValue );
return ECA_NORMAL;
}

View File

@@ -1,11 +0,0 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -27,14 +26,14 @@
//
// the recv watchdog timer is active when this object is created
//
tcpRecvWatchdog::tcpRecvWatchdog
tcpRecvWatchdog::tcpRecvWatchdog
( epicsMutex & cbMutexIn, cacContextNotify & ctxNotifyIn,
epicsMutex & mutexIn, tcpiiu & iiuIn,
epicsMutex & mutexIn, tcpiiu & iiuIn,
double periodIn, epicsTimerQueue & queueIn ) :
period ( periodIn ), timer ( queueIn.createTimer () ),
cbMutex ( cbMutexIn ), ctxNotify ( ctxNotifyIn ),
mutex ( mutexIn ), iiu ( iiuIn ),
probeResponsePending ( false ), beaconAnomaly ( true ),
cbMutex ( cbMutexIn ), ctxNotify ( ctxNotifyIn ),
mutex ( mutexIn ), iiu ( iiuIn ),
probeResponsePending ( false ), beaconAnomaly ( true ),
probeTimeoutDetected ( false ), shuttingDown ( false )
{
}
@@ -61,15 +60,15 @@ tcpRecvWatchdog::expire ( const epicsTime & /* currentTime */ )
char hostName[128];
this->iiu.getHostName ( guard, hostName, sizeof (hostName) );
debugPrintf ( ( "CA server \"%s\" unresponsive after %g inactive sec"
"- disconnecting.\n",
"- disconnecting.\n",
hostName, this->period ) );
# endif
// to get the callback lock safely we must reorder
// to get the callback lock safely we must reorder
// the lock hierarchy
epicsGuardRelease < epicsMutex > unguard ( guard );
{
// callback lock is required because channel disconnect
// state change is initiated from this thread, and
// state change is initiated from this thread, and
// this can cause their disconnect notify callback
// to be invoked.
callbackManager mgr ( this->ctxNotify, this->cbMutex );
@@ -91,7 +90,7 @@ tcpRecvWatchdog::expire ( const epicsTime & /* currentTime */ )
}
}
void tcpRecvWatchdog::beaconArrivalNotify (
void tcpRecvWatchdog::beaconArrivalNotify (
epicsGuard < epicsMutex > & guard )
{
guard.assertIdenticalMutex ( this->mutex );
@@ -103,12 +102,12 @@ void tcpRecvWatchdog::beaconArrivalNotify (
//
// be careful about using beacons to reset the connection
// time out watchdog until we have received a ping response
// time out watchdog until we have received a ping response
// from the IOC (this makes the software detect reconnects
// faster when the server is rebooted twice in rapid
// faster when the server is rebooted twice in rapid
// succession before a 1st or 2nd beacon has been received)
//
void tcpRecvWatchdog::beaconAnomalyNotify (
void tcpRecvWatchdog::beaconAnomalyNotify (
epicsGuard < epicsMutex > & guard )
{
guard.assertIdenticalMutex ( this->mutex );
@@ -116,7 +115,7 @@ void tcpRecvWatchdog::beaconAnomalyNotify (
debugPrintf ( ("Saw an abnormal beacon\n") );
}
void tcpRecvWatchdog::messageArrivalNotify (
void tcpRecvWatchdog::messageArrivalNotify (
epicsGuard < epicsMutex > & guard )
{
guard.assertIdenticalMutex ( this->mutex );
@@ -128,7 +127,7 @@ void tcpRecvWatchdog::messageArrivalNotify (
}
}
void tcpRecvWatchdog::probeResponseNotify (
void tcpRecvWatchdog::probeResponseNotify (
epicsGuard < epicsMutex > & cbGuard )
{
bool restartNeeded = false;
@@ -158,27 +157,27 @@ void tcpRecvWatchdog::probeResponseNotify (
}
//
// The thread for outgoing requests in the client runs
// The thread for outgoing requests in the client runs
// at a higher priority than the thread in the client
// that receives responses. Therefore, there could
// be considerable large array write send backlog that
// is delaying departure of an echo request and also
// interrupting delivery of an echo response.
// We must be careful not to timeout the echo response as
// long as we see indication of regular departures of
// message buffers from the client in a situation where
// we know that the TCP send queueing has been exceeded.
// The send watchdog will be responsible for detecting
// that receives responses. Therefore, there could
// be considerable large array write send backlog that
// is delaying departure of an echo request and also
// interrupting delivery of an echo response.
// We must be careful not to timeout the echo response as
// long as we see indication of regular departures of
// message buffers from the client in a situation where
// we know that the TCP send queueing has been exceeded.
// The send watchdog will be responsible for detecting
// dead connections in this case.
//
void tcpRecvWatchdog::sendBacklogProgressNotify (
void tcpRecvWatchdog::sendBacklogProgressNotify (
epicsGuard < epicsMutex > & guard )
{
guard.assertIdenticalMutex ( this->mutex );
// We dont set "beaconAnomaly" to be false here because, after we see a
// beacon anomaly (which could be transiently detecting a reboot) we will
// not trust the beacon as an indicator of a healthy server until we
// beacon anomaly (which could be transiently detecting a reboot) we will
// not trust the beacon as an indicator of a healthy server until we
// receive at least one message from the server.
if ( this->probeResponsePending && ! this->shuttingDown ) {
this->timer.start ( *this, CA_ECHO_TIMEOUT );
@@ -197,7 +196,7 @@ void tcpRecvWatchdog::connectNotify (
debugPrintf ( ("connected to the server - initiating circuit recv watchdog\n") );
}
void tcpRecvWatchdog::sendTimeoutNotify (
void tcpRecvWatchdog::sendTimeoutNotify (
epicsGuard < epicsMutex > & /* cbGuard */,
epicsGuard < epicsMutex > & guard )
{
@@ -243,7 +242,7 @@ void tcpRecvWatchdog::show ( unsigned level ) const
static_cast <const void *> ( this ), this->period );
if ( level > 0u ) {
::printf ( "\t%s %s %s\n",
this->probeResponsePending ? "probe-response-pending" : "",
this->probeResponsePending ? "probe-response-pending" : "",
this->beaconAnomaly ? "beacon-anomaly-detected" : "",
this->probeTimeoutDetected ? "probe-response-timeout" : "" );
}

View File

@@ -3,57 +3,48 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef tcpRecvWatchdogh
#define tcpRecvWatchdogh
#ifdef epicsExportSharedSymbols
# define tcpRecvWatchdogh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_tcpRecvWatchdog_H
#define INC_tcpRecvWatchdog_H
#include "epicsTimer.h"
#ifdef tcpRecvWatchdogh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
class tcpiiu;
class tcpRecvWatchdog : private epicsTimerNotify {
public:
tcpRecvWatchdog ( epicsMutex & cbMutex,
tcpRecvWatchdog ( epicsMutex & cbMutex,
cacContextNotify & ctxNotify,
epicsMutex & mutex, tcpiiu &,
epicsMutex & mutex, tcpiiu &,
double periodIn, epicsTimerQueue & );
virtual ~tcpRecvWatchdog ();
void sendBacklogProgressNotify (
epicsGuard < epicsMutex > & );
void messageArrivalNotify (
epicsGuard < epicsMutex > & guard );
void probeResponseNotify (
void probeResponseNotify (
epicsGuard < epicsMutex > & );
void beaconArrivalNotify (
void beaconArrivalNotify (
epicsGuard < epicsMutex > & );
void beaconAnomalyNotify ( epicsGuard < epicsMutex > & );
void connectNotify (
@@ -77,9 +68,9 @@ private:
bool probeTimeoutDetected;
bool shuttingDown;
expireStatus expire ( const epicsTime & currentTime );
tcpRecvWatchdog ( const tcpRecvWatchdog & );
tcpRecvWatchdog & operator = ( const tcpRecvWatchdog & );
tcpRecvWatchdog ( const tcpRecvWatchdog & );
tcpRecvWatchdog & operator = ( const tcpRecvWatchdog & );
};
#endif // #ifndef tcpRecvWatchdogh
#endif // #ifndef INC_tcpRecvWatchdog_H

View File

@@ -3,12 +3,11 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
* L O S A L A M O S
* Los Alamos National Laboratory
@@ -25,8 +24,8 @@
#include "cac.h"
#include "virtualCircuit.h"
tcpSendWatchdog::tcpSendWatchdog (
epicsMutex & cbMutexIn, cacContextNotify & ctxNotifyIn,
tcpSendWatchdog::tcpSendWatchdog (
epicsMutex & cbMutexIn, cacContextNotify & ctxNotifyIn,
epicsMutex & mutexIn, tcpiiu & iiuIn,
double periodIn, epicsTimerQueue & queueIn ) :
period ( periodIn ), timer ( queueIn.createTimer () ),
@@ -40,7 +39,7 @@ tcpSendWatchdog::~tcpSendWatchdog ()
this->timer.destroy ();
}
epicsTimerNotify::expireStatus tcpSendWatchdog::expire (
epicsTimerNotify::expireStatus tcpSendWatchdog::expire (
const epicsTime & /* currentTime */ )
{
{
@@ -55,7 +54,7 @@ epicsTimerNotify::expireStatus tcpSendWatchdog::expire (
# ifdef DEBUG
char hostName[128];
this->iiu.getHostName ( guard, hostName, sizeof ( hostName ) );
debugPrintf ( ( "Request not accepted by CA server %s for %g sec. Disconnecting.\n",
debugPrintf ( ( "Request not accepted by CA server %s for %g sec. Disconnecting.\n",
hostName, this->period ) );
# endif
this->iiu.sendTimeoutNotify ( mgr, guard );

View File

@@ -3,41 +3,31 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
/*
*
*
*
* L O S A L A M O S
* Los Alamos National Laboratory
* Los Alamos, New Mexico 87545
*
*
* Copyright, 1986, The Regents of the University of California.
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*
*
* Author Jeffrey O. Hill
* johill@lanl.gov
* 505 665 1831
*/
#ifndef tcpSendWatchdogh
#define tcpSendWatchdogh
#ifdef epicsExportSharedSymbols
# define tcpSendWatchdogh_epicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifndef INC_tcpSendWatchdog_H
#define INC_tcpSendWatchdog_H
#include "epicsTimer.h"
#ifdef tcpSendWatchdogh_epicsExportSharedSymbols
# define epicsExportSharedSymbols
# include "shareLib.h"
#endif
#include "libCaAPI.h"
class tcpSendWatchdog : private epicsTimerNotify {
public:
@@ -56,8 +46,8 @@ private:
epicsMutex & mutex;
tcpiiu & iiu;
expireStatus expire ( const epicsTime & currentTime );
tcpSendWatchdog ( const tcpSendWatchdog & );
tcpSendWatchdog & operator = ( const tcpSendWatchdog & );
tcpSendWatchdog ( const tcpSendWatchdog & );
tcpSendWatchdog & operator = ( const tcpSendWatchdog & );
};
#endif // #ifndef tcpSendWatchdog
#endif // #ifndef INC_tcpSendWatchdog_H

File diff suppressed because it is too large Load Diff

View File

@@ -5,11 +5,11 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author: Jeff Hill
* Date: 07-01-91
* Author: Jeff Hill
* Date: 07-01-91
*/
/*
@@ -32,24 +32,24 @@ static unsigned long outstanding;
/*
* ca_test
* ca_test
*
* find channel, write a value if supplied, and
* read back the current value
* find channel, write a value if supplied, and
* read back the current value
*
*/
int ca_test(
char *pname,
char *pvalue
char *pname,
char *pvalue
)
{
int status;
if(pvalue){
status = capft(pname,pvalue);
}
else{
status = cagft(pname);
}
if(pvalue){
status = capft(pname,pvalue);
}
else{
status = cagft(pname);
}
ca_task_exit();
return status;
}
@@ -57,244 +57,244 @@ char *pvalue
/*
* cagft()
* cagft()
*
* ca get field test
* ca get field test
*
* test ca get over the range of CA data types
* test ca get over the range of CA data types
*/
static int cagft(char *pname)
{
const unsigned maxTries = 1000ul;
unsigned ntries = 0u;
chid chan_id;
int status;
int i;
{
const unsigned maxTries = 1000ul;
unsigned ntries = 0u;
chid chan_id;
int status;
int i;
/*
* convert name to chan id
*/
status = ca_search(pname, &chan_id);
SEVCHK(status,NULL);
status = ca_pend_io(5.0);
if(status != ECA_NORMAL){
/*
* convert name to chan id
*/
status = ca_search(pname, &chan_id);
SEVCHK(status,NULL);
status = ca_pend_io(5.0);
if(status != ECA_NORMAL){
SEVCHK(ca_clear_channel(chan_id),NULL);
printf("Not Found %s\n", pname);
return -1;
}
printf("Not Found %s\n", pname);
return -1;
}
printf("name:\t%s\n",
printf("name:\t%s\n",
ca_name(chan_id));
printf("native type:\t%s\n",
printf("native type:\t%s\n",
dbr_type_to_text(ca_field_type(chan_id)));
printf("native count:\t%lu\n",
printf("native count:\t%lu\n",
ca_element_count(chan_id));
/*
* fetch as each type
*/
for(i=0; i<=LAST_BUFFER_TYPE; i++){
if(ca_field_type(chan_id)==DBR_STRING) {
if( (i!=DBR_STRING)
&& (i!=DBR_STS_STRING)
&& (i!=DBR_TIME_STRING)
&& (i!=DBR_GR_STRING)
/*
* fetch as each type
*/
for(i=0; i<=LAST_BUFFER_TYPE; i++){
if(ca_field_type(chan_id)==DBR_STRING) {
if( (i!=DBR_STRING)
&& (i!=DBR_STS_STRING)
&& (i!=DBR_TIME_STRING)
&& (i!=DBR_GR_STRING)
&& (i!=DBR_CTRL_STRING)) {
continue;
}
}
/* ignore write only types */
if (
i == DBR_PUT_ACKT ||
if (
i == DBR_PUT_ACKT ||
i == DBR_PUT_ACKS ) {
continue;
}
status = ca_array_get_callback(
i,
ca_element_count(chan_id),
chan_id,
printit,
NULL);
SEVCHK(status, NULL);
status = ca_array_get_callback(
i,
ca_element_count(chan_id),
chan_id,
printit,
NULL);
SEVCHK(status, NULL);
outstanding++;
}
outstanding++;
}
/*
* wait for the operation to complete
* before returning
*/
while ( ntries < maxTries ) {
unsigned long oldOut;
/*
* wait for the operation to complete
* before returning
*/
while ( ntries < maxTries ) {
unsigned long oldOut;
oldOut = outstanding;
ca_pend_event ( 0.05 );
oldOut = outstanding;
ca_pend_event ( 0.05 );
if ( ! outstanding ) {
if ( ! outstanding ) {
SEVCHK ( ca_clear_channel ( chan_id ), NULL );
printf ( "\n\n" );
return 0;
}
printf ( "\n\n" );
return 0;
}
if ( outstanding == oldOut ) {
ntries++;
}
}
if ( outstanding == oldOut ) {
ntries++;
}
}
SEVCHK ( ca_clear_channel ( chan_id ), NULL );
return -1;
return -1;
}
/*
* PRINTIT()
* PRINTIT()
*/
static void printit ( struct event_handler_args args )
{
if ( args.status == ECA_NORMAL ) {
ca_dump_dbr ( args.type, args.count, args.dbr );
}
else {
if ( args.status == ECA_NORMAL ) {
ca_dump_dbr ( args.type, args.count, args.dbr );
}
else {
printf ( "%s\t%s\n", dbr_text[args.type], ca_message(args.status) );
}
}
outstanding--;
outstanding--;
}
/*
* capft
* capft
*
* test ca_put() over a range of data types
*
* test ca_put() over a range of data types
*
*/
static int capft(
char *pname,
char *pvalue
char *pname,
char *pvalue
)
{
dbr_short_t shortvalue;
dbr_long_t longvalue;
dbr_float_t floatvalue;
dbr_char_t charvalue;
dbr_double_t doublevalue;
unsigned long ntries = 10ul;
int status;
chid chan_id;
dbr_short_t shortvalue;
dbr_long_t longvalue;
dbr_float_t floatvalue;
dbr_char_t charvalue;
dbr_double_t doublevalue;
unsigned long ntries = 10ul;
int status;
chid chan_id;
if (((*pname < ' ') || (*pname > 'z'))
|| ((*pvalue < ' ') || (*pvalue > 'z'))){
printf("\nusage \"pv name\",\"value\"\n");
return -1;
}
if (((*pname < ' ') || (*pname > 'z'))
|| ((*pvalue < ' ') || (*pvalue > 'z'))){
printf("\nusage \"pv name\",\"value\"\n");
return -1;
}
/*
* convert name to chan id
*/
status = ca_search(pname, &chan_id);
SEVCHK(status,NULL);
status = ca_pend_io(5.0);
if(status != ECA_NORMAL){
/*
* convert name to chan id
*/
status = ca_search(pname, &chan_id);
SEVCHK(status,NULL);
status = ca_pend_io(5.0);
if(status != ECA_NORMAL){
SEVCHK(ca_clear_channel(chan_id),NULL);
printf("Not Found %s\n", pname);
return -1;
}
printf("Not Found %s\n", pname);
return -1;
}
printf("name:\t%s\n", ca_name(chan_id));
printf("native type:\t%d\n", ca_field_type(chan_id));
printf("native count:\t%lu\n", ca_element_count(chan_id));
printf("name:\t%s\n", ca_name(chan_id));
printf("native type:\t%d\n", ca_field_type(chan_id));
printf("native count:\t%lu\n", ca_element_count(chan_id));
/*
* string value ca_put
*/
status = ca_put(
DBR_STRING,
chan_id,
pvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_STRING);
/*
* string value ca_put
*/
status = ca_put(
DBR_STRING,
chan_id,
pvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_STRING);
if(ca_field_type(chan_id)==0)goto skip_rest;
if(ca_field_type(chan_id)==0)goto skip_rest;
if(sscanf(pvalue,"%hd",&shortvalue)==1) {
/*
* short integer ca_put
*/
status = ca_put(
DBR_SHORT,
chan_id,
&shortvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_SHORT);
status = ca_put(
DBR_ENUM,
chan_id,
&shortvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_ENUM);
charvalue=(dbr_char_t)shortvalue;
status = ca_put(
DBR_CHAR,
chan_id,
&charvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_CHAR);
}
if(sscanf(pvalue,"%d",&longvalue)==1) {
/*
* long integer ca_put
*/
status = ca_put(
DBR_LONG,
chan_id,
&longvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_LONG);
}
if(epicsScanFloat(pvalue, &floatvalue)==1) {
/*
* single precision float ca_put
*/
status = ca_put(
DBR_FLOAT,
chan_id,
&floatvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_FLOAT);
}
if(epicsScanDouble(pvalue, &doublevalue)==1) {
/*
* double precision float ca_put
*/
status = ca_put(
DBR_DOUBLE,
chan_id,
&doublevalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_DOUBLE);
}
if(sscanf(pvalue,"%hd",&shortvalue)==1) {
/*
* short integer ca_put
*/
status = ca_put(
DBR_SHORT,
chan_id,
&shortvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_SHORT);
status = ca_put(
DBR_ENUM,
chan_id,
&shortvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_ENUM);
charvalue=(dbr_char_t)shortvalue;
status = ca_put(
DBR_CHAR,
chan_id,
&charvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_CHAR);
}
if(sscanf(pvalue,"%d",&longvalue)==1) {
/*
* long integer ca_put
*/
status = ca_put(
DBR_LONG,
chan_id,
&longvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_LONG);
}
if(epicsScanFloat(pvalue, &floatvalue)==1) {
/*
* single precision float ca_put
*/
status = ca_put(
DBR_FLOAT,
chan_id,
&floatvalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_FLOAT);
}
if(epicsScanDouble(pvalue, &doublevalue)==1) {
/*
* double precision float ca_put
*/
status = ca_put(
DBR_DOUBLE,
chan_id,
&doublevalue);
SEVCHK(status, NULL);
verify_value(chan_id, DBR_DOUBLE);
}
skip_rest:
/*
* wait for the operation to complete
* (outstabnding decrements to zero)
*/
while(ntries){
ca_pend_event(1.0);
/*
* wait for the operation to complete
* (outstabnding decrements to zero)
*/
while(ntries){
ca_pend_event(1.0);
if(!outstanding){
if(!outstanding){
SEVCHK(ca_clear_channel(chan_id),NULL);
printf("\n\n");
return 0;
}
printf("\n\n");
return 0;
}
ntries--;
}
ntries--;
}
SEVCHK(ca_clear_channel(chan_id),NULL);
return -1;
return -1;
}
@@ -305,19 +305,19 @@ skip_rest:
*/
static void verify_value(chid chan_id, chtype type)
{
int status;
int status;
/*
* issue a get which calls back `printit'
* upon completion
*/
status = ca_array_get_callback(
type,
ca_element_count(chan_id),
chan_id,
printit,
NULL);
SEVCHK(status, NULL);
/*
* issue a get which calls back `printit'
* upon completion
*/
status = ca_array_get_callback(
type,
ca_element_count(chan_id),
chan_id,
printit,
NULL);
SEVCHK(status, NULL);
outstanding++;
outstanding++;
}

View File

@@ -5,11 +5,11 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author: Jeff Hill
* Date: 21JAN2000
* Author: Jeff Hill
* Date: 21JAN2000
*/
#ifdef __cplusplus

View File

@@ -5,11 +5,11 @@
* 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.
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
* Author: Jeff Hill
* Date: 21JAN2000
* Author: Jeff Hill
* Date: 21JAN2000
*/
#include <string.h>
#include <stdio.h>
@@ -20,36 +20,36 @@
int main(int argc, char **argv)
{
/*
* print error and return if arguments are invalid
*/
if(argc < 2 || argc > 3){
printf("usage: %s <PV name> [optional value to be written]\n", argv[0]);
printf("the following arguments were received\n");
while(argc>0) {
printf("%s\n",argv[0]);
argv++; argc--;
}
return -1;
}
/*
* print error and return if arguments are invalid
*/
if(argc < 2 || argc > 3){
printf("usage: %s <PV name> [optional value to be written]\n", argv[0]);
printf("the following arguments were received\n");
while(argc>0) {
printf("%s\n",argv[0]);
argv++; argc--;
}
return -1;
}
/*
* check for supplied value
*/
if(argc == 2){
return ca_test(argv[1], NULL);
}
else if(argc == 3){
char *pt;
/*
* check for supplied value
*/
if(argc == 2){
return ca_test(argv[1], NULL);
}
else if(argc == 3){
char *pt;
/* strip leading and trailing quotes*/
if(argv[2][1]=='"') argv[2]++;
if( (pt=strchr(argv[2],'"')) ) *pt = 0;
return ca_test(argv[1], argv[2]);
}
else{
return -1;
}
/* strip leading and trailing quotes*/
if(argv[2][1]=='"') argv[2]++;
if( (pt=strchr(argv[2],'"')) ) *pt = 0;
return ca_test(argv[1], argv[2]);
}
else{
return -1;
}
}

View File

@@ -3,9 +3,8 @@
* 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.
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
@@ -16,10 +15,9 @@
#include "epicsStdioRedirect.h"
#define epicsExportSharedSymbols
#include "cadef.h"
extern "C" void epicsShareAPI ca_test_event ( struct event_handler_args args )
extern "C" void epicsStdCall ca_test_event ( struct event_handler_args args )
{
chtype nativeType = ca_field_type ( args.chid );
const char * pNativeTypeName = "<invalid>";
@@ -32,7 +30,7 @@ extern "C" void epicsShareAPI ca_test_event ( struct event_handler_args args )
}
}
printf ( "ca_test_event() for channel \"%s\" with native type %s\n",
printf ( "ca_test_event() for channel \"%s\" with native type %s\n",
ca_name(args.chid), pNativeTypeName );
if ( ! ( CA_M_SUCCESS & args.status ) ) {
@@ -49,7 +47,7 @@ extern "C" void epicsShareAPI ca_test_event ( struct event_handler_args args )
* ca_dump_dbr()
* dump the specified dbr type to stdout
*/
extern "C" void epicsShareAPI ca_dump_dbr (
extern "C" void epicsStdCall ca_dump_dbr (
chtype type, unsigned count, const void * pbuffer )
{
unsigned i;
@@ -132,7 +130,7 @@ extern "C" void epicsShareAPI ca_dump_dbr (
case DBR_GR_STRING:
case DBR_CTRL_STRING:
{
struct dbr_sts_string *pvalue
struct dbr_sts_string *pvalue
= (struct dbr_sts_string *) pbuffer;
printf("%2d %2d",pvalue->status,pvalue->severity);
printf("\tValue: %s",pvalue->value);
@@ -219,7 +217,7 @@ extern "C" void epicsShareAPI ca_dump_dbr (
}
case DBR_TIME_STRING:
{
struct dbr_time_string *pvalue
struct dbr_time_string *pvalue
= (struct dbr_time_string *) pbuffer;
epicsTimeToStrftime(tsString,sizeof(tsString),
@@ -564,12 +562,12 @@ extern "C" void epicsShareAPI ca_dump_dbr (
}
case DBR_STSACK_STRING:
{
struct dbr_stsack_string *pvalue
= (struct dbr_stsack_string *)pbuffer;
printf("%2d %2d",pvalue->status,pvalue->severity);
printf(" %2d %2d",pvalue->ackt,pvalue->acks);
printf(" %s",pvalue->value);
break;
struct dbr_stsack_string *pvalue
= (struct dbr_stsack_string *)pbuffer;
printf("%2d %2d",pvalue->status,pvalue->severity);
printf(" %2d %2d",pvalue->ackt,pvalue->acks);
printf(" %s",pvalue->value);
break;
}
case DBR_CLASS_NAME:
{
@@ -579,7 +577,7 @@ extern "C" void epicsShareAPI ca_dump_dbr (
break;
}
default:
printf (
printf (
"unsupported by ca_dbrDump()" );
break;
}

View File

@@ -1,102 +0,0 @@
/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* EPICS BASE Versions 3.13.7
* and higher are distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/*
*
* U C X . H
* UNIX ioctl structures and defines used for VAX/UCX
*
*/
#ifndef _UCX_H_
# define _UCX_H_
#ifdef UCX
#define IFF_UP 0x1 /* interface is up */
#define IFF_BROADCAST 0x2 /* broadcast address valid */
#define IFF_LOOPBACK 0x8 /* is a loopback net */
#define IFF_POINTOPOINT 0x10 /* interface is point to point */
/*
* Interface request structure used for socket
* ioctl's. All interface ioctl's must have parameter
* definitions which begin with ifr_name. The
* remainder may be interface specific.
*/
struct ifreq {
#define IFNAMSIZ 16
char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
short ifru_flags;
int ifru_metric;
caddr_t ifru_data;
} ifr_ifru;
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_flags ifr_ifru.ifru_flags /* flags */
#define ifr_metric ifr_ifru.ifru_metric /* metric */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
};
/* Structure used in SIOCGIFCONF request.
* Used to retrieve interface configuration
* for machine (useful for programs which
* must know all networks accessible).
*/
struct ifconf {
int ifc_len; /* size of associated buffer */
union {
caddr_t ifcu_buf;
struct ifreq *ifcu_req;
} ifc_ifcu;
#define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */
#define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */
};
#ifndef NBBY
# define NBBY 8
#endif
#ifndef FD_SETSIZE
# define FD_SETSIZE 256
#endif
typedef long fd_mask ;
#define NFDBITS (sizeof (fd_mask) * NBBY ) /* bits per mask */
#ifndef howmany
# define howmany(x, y) (((x)+((y)-1))/(y))
#endif
/*
* Both DEC C and VAX C only allow 32 fd's at once
*/
typedef int fd_set ;
#define FD_SET(n, p) (*(p) |= (1 << ((n) % NFDBITS)))
#define FD_CLR(n, p) (*(p) &= ~(1 << ((n) % NFDBITS)))
#define FD_ISSET(n, p) (*(p) & (1 << ((n) % NFDBITS)))
#define FD_ZERO(p) memset((char *)(p), 0, sizeof (*(p)))
#include <iodef.h>
#define IO$_RECEIVE (IO$_WRITEVBLK)
struct timezone {
int tz_minuteswest ; /* minutes west of Greenwich */
int tz_dsttime ; /* type of dst correction */
};
#define TWOPOWER32 4294967296.0
#define TWOPOWER31 2147483648.0
#define UNIX_EPOCH_AS_MJD 40587.0
#endif
#endif

Some files were not shown because too many files have changed in this diff Show More