From 1ecdaff1b59fd5acc03cdaafe1ebf93b9195929b Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Mon, 13 Feb 1995 03:32:27 +0000 Subject: [PATCH] NT/ALPHA(VMS/printf handler) changes --- src/ca/BUILD_VMS.COM | 44 ++++- src/ca/Makefile.Unix | 11 +- src/ca/access.c | 247 +++++++++++++++++-------- src/ca/acctst.c | 1 + src/ca/addrList.h | 4 +- src/ca/bsd_depen.c | 3 +- src/ca/ca_printf.c | 29 +-- src/ca/catime.c | 402 ++++++++++++++++++++++++++--------------- src/ca/conn.c | 21 +-- src/ca/convert.c | 30 ++- src/ca/flow_control.c | 4 +- src/ca/if_depen.c | 6 +- src/ca/iocinf.c | 72 +++++--- src/ca/iocinf.h | 8 +- src/ca/iocmsg.h | 4 +- src/ca/net_convert.h | 30 ++- src/ca/netdb_depen.c | 5 +- src/ca/os_depen.h | 34 ++-- src/ca/posix_depen.c | 31 +--- src/ca/repeater.c | 11 +- src/ca/service.c | 2 +- src/ca/syncgrp.c | 18 +- src/ca/test_event.c | 2 +- src/ca/ucx.h | 15 +- src/ca/vms_depen.c | 28 +-- src/ca/vxWorks_depen.c | 43 +---- src/ca/windows_depen.c | 67 ++++--- 27 files changed, 697 insertions(+), 475 deletions(-) diff --git a/src/ca/BUILD_VMS.COM b/src/ca/BUILD_VMS.COM index ef2316147..f4ef27ca0 100644 --- a/src/ca/BUILD_VMS.COM +++ b/src/ca/BUILD_VMS.COM @@ -15,7 +15,7 @@ $! - You are using Multinet for TCP/IP access. If not, the logical $! name definitions below will need to be changed $! $! -$! Arguments : None +$! Arguments : optional source file name $! $! Created 16-NOV-1993 Mark L. Rivers $! 05-MAY-1994 Jeff O. Hill Updated for EPICS 3.12 @@ -30,11 +30,13 @@ $ define /nolog arpa multinet_root:[multinet.include.arpa] $ define /nolog tcp multinet_root:[multinet.include] $! $! Compile the functions and test programs +$! Define symbol for the CC command +$ call set_cc_command $ if (p1 .nes. "") $ then -$ cc /defines=(__STDC__)/include=([]) 'p1' +$ cc_command 'p1' $ else -$ cc /defines=(__STDC__)/include=([]) - +$ cc_command - ACCESS, - CONN, - CONVERT, - @@ -50,7 +52,10 @@ IF_DEPEN, - VMS_DEPEN, - ELLLIB, - BUCKETLIB, - +NEXTFIELDSUBR, - ENVSUBR, - +TSSUBR, - +GENSUBR, - CATIME, - ACCTST $ endif @@ -71,7 +76,10 @@ IF_DEPEN, - VMS_DEPEN, - BSD_DEPEN, - BUCKETLIB, - +NEXTFIELDSUBR, - +TSSUBR, - ENVSUBR, - +GENSUBR, - ELLLIB $! Link the test programs $ call link acctst @@ -84,10 +92,32 @@ $ catime == "$ EPICS_EXE:catime.exe" $ $! $ link: subroutine -$ link 'p1', sys$input/options -channel_access/lib -multinet_socket_library/share -sys$share:vaxcrtl/share +$! Link differently for VAX and AXP +$ if f$getsyi("HW_MODEL") .ge. 1024 +$ then +$ link 'p1', sys$input/options + channel_access/lib + multinet_socket_library/share +$ else +$ link 'p1', sys$input/options + channel_access/lib + multinet_socket_library/share + sys$share:vaxcrtl/share +$ endif +$ endsubroutine +$ +$ +$! This subroutine sets up "cc_command" to use different switches for +$! VAX (assumes VAX C compiler) and AXP (DEC C compiler). +$ set_cc_command : subroutine +$ if f$getsyi("HW_MODEL") .ge. 1024 +$ then +$! turn of no prototype messages because MULTINET does not +$! supply prototypes. +$ cc_command:== cc /warn=(disable=IMPLICITFUNC)/float=d_float /include=([], [-.include], [-.libcom]) +$ else +$ cc_command:== cc /include=([], [-.include], [-.libcom]) +$ endif $ endsubroutine $! ************************************************************ diff --git a/src/ca/Makefile.Unix b/src/ca/Makefile.Unix index 563f16654..e1d5d6a0f 100644 --- a/src/ca/Makefile.Unix +++ b/src/ca/Makefile.Unix @@ -10,11 +10,12 @@ DEPLIBS_BASE = $(EPICS_BASE_LIB) DEPLIBS = ./libca.a\ $(DEPLIBS_BASE)/libCom.a + SRCS.c = \ ../iocinf.c ../access.c ../test_event.c ../service.c \ - ../flow_control.c ../repeater.c ../conn.c ../acctst.c \ + ../flow_control.c ../repeater.c ../conn.c \ ../syncgrp.c ../if_depen.c ../netdb_depen.c ../bsd_depen.c \ - ../posix_depen.c ../caRepeater.c ../acctst.c + ../posix_depen.c ../caRepeater.c ../acctst.c ../catime.c OBJS = caRepeater.o @@ -35,3 +36,9 @@ acctst: acctst.o $(DEPLIBS_BASE)/libCom.a libca.a acctst.o: ../acctst.c $(COMPILE.c) $< +catime: catime.o $(DEPLIBS_BASE)/libCom.a libca.a + +catime.o: ../catime.c + $(COMPILE.c) $< + + diff --git a/src/ca/access.c b/src/ca/access.c index 10cd27819..7233957fc 100644 --- a/src/ca/access.c +++ b/src/ca/access.c @@ -134,6 +134,7 @@ static char *sccsId = "@(#) $Id$"; #include "iocinf.h" #include "net_convert.h" +#include /* for VMS old CC include order madness */ /****************************************************************/ @@ -142,19 +143,6 @@ static char *sccsId = "@(#) $Id$"; #define EXTMSGPTR(PIIU)\ ((struct extmsg *) &(PIIU)->send.buf[(PIIU)->send.wtix]) -/* - * Performs worst case message alignment - */ -#define CAC_ADD_MSG(PIIU) \ -{ \ - unsigned long size; \ - struct extmsg *mp = EXTMSGPTR(PIIU); \ - size = mp->m_postsize = CA_MESSAGE_ALIGN(mp->m_postsize); \ - mp->m_postsize = htons(mp->m_postsize); \ - CAC_RING_BUFFER_WRITE_ADVANCE( \ - &(PIIU)->send, sizeof(struct extmsg) + size); \ -} - @@ -189,12 +177,14 @@ static struct extmsg nullmsg; /* * local functions */ - +#if 0 LOCAL int cac_alloc_msg( struct ioc_in_use *piiu, unsigned extsize, struct extmsg **ppMsg ); +#endif + LOCAL int cac_alloc_msg_no_flush( struct ioc_in_use *piiu, unsigned extsize, @@ -230,6 +220,8 @@ struct extmsg *pmsg, void *pext ); +LOCAL void cac_add_msg (IIU *piiu); + #ifdef CONVERSION_REQUIRED LOCAL void *malloc_put_convert(unsigned long size); LOCAL void free_put_convert(void *pBuf); @@ -253,15 +245,15 @@ void *pext ) { struct extmsg msg; - unsigned long bytesAvailable; - unsigned long actualextsize; - unsigned long extsize; - unsigned long bytesSent; + unsigned bytesAvailable; + unsigned actualextsize; + unsigned extsize; + unsigned bytesSent; msg = *pmsg; actualextsize = pmsg->m_postsize; extsize = CA_MESSAGE_ALIGN(pmsg->m_postsize); - msg.m_postsize = htons(extsize); + msg.m_postsize = htons((ca_uint16_t)extsize); LOCK; @@ -347,8 +339,8 @@ void *pext * if present */ { - static nullBuff[32]; - int n; + static nullBuff[32]; + unsigned n; n = extsize-actualextsize; if(n){ @@ -421,6 +413,7 @@ struct extmsg **ppMsg * LOCK should be on * */ +#if 0 LOCAL int cac_alloc_msg( struct ioc_in_use *piiu, unsigned extsize, @@ -480,13 +473,33 @@ struct extmsg **ppMsg return ECA_NORMAL; } +#endif + + +/* + * cac_add_msg () + */ +LOCAL void cac_add_msg (IIU *piiu) +{ + unsigned long size; + struct extmsg *mp = EXTMSGPTR(piiu); + + /* + * Performs worst case message alignment + */ + mp->m_postsize = (unsigned short) + CA_MESSAGE_ALIGN(mp->m_postsize); + size = mp->m_postsize; + mp->m_postsize = htons(mp->m_postsize); + CAC_RING_BUFFER_WRITE_ADVANCE( + &piiu->send, + sizeof(struct extmsg) + size); +} + /* - * * CA_TASK_INITIALIZE - * - * */ int APIENTRY ca_task_initialize(void) { @@ -518,6 +531,8 @@ int ca_os_independent_init (void) ca_static->ca_exception_func = ca_default_exception_handler; ca_static->ca_exception_arg = NULL; + caSetDefaultPrintfHandler(); + /* record a default user name */ ca_static->ca_pUserName = localUserName(); if(!ca_static->ca_pUserName){ @@ -541,10 +556,10 @@ int ca_os_independent_init (void) */ ca_static->ca_search_retry = 0; ca_static->ca_conn_next_retry = CA_CURRENT_TIME; - sec = CA_RECAST_DELAY; + sec = (unsigned) CA_RECAST_DELAY; ca_static->ca_conn_retry_delay.tv_sec = sec; ca_static->ca_conn_retry_delay.tv_usec = - (CA_RECAST_DELAY-sec)*USEC_PER_SEC; + (long) (CA_RECAST_DELAY-sec)*USEC_PER_SEC; ellInit(&ca_static->ca_iiuList); ellInit(&ca_static->ca_ioeventlist); @@ -597,8 +612,6 @@ int ca_os_independent_init (void) */ LOCAL void create_udp_fd() { - int pri; - char name[64]; int status; if(ca_static->ca_piiuCast){ @@ -615,38 +628,43 @@ LOCAL void create_udp_fd() } #ifdef vxWorks - status = taskPriorityGet(VXTASKIDSELF, &pri); - if(status<0) - ca_signal(ECA_INTERNAL,NULL); + { + int pri; + char name[64]; - strcpy(name,"RD "); - strncat( - name, - taskName(VXTHISTASKID), - sizeof(name)-strlen(name)-1); + status = taskPriorityGet(VXTASKIDSELF, &pri); + if(status<0) + ca_signal(ECA_INTERNAL,NULL); + + strcpy(name,"RD "); + strncat( + name, + taskName(VXTHISTASKID), + sizeof(name)-strlen(name)-1); + + status = taskSpawn( + name, + pri-1, + VX_FP_TASK, + 4096, + (FUNCPTR)cac_recv_task, + (int)taskIdCurrent, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0); + if (status<0) { + ca_signal(ECA_INTERNAL,NULL); + } + + ca_static->recv_tid = status; - status = taskSpawn( - name, - pri-1, - VX_FP_TASK, - 4096, - (FUNCPTR)cac_recv_task, - (int)taskIdCurrent, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0); - if (status<0) { - ca_signal(ECA_INTERNAL,NULL); } - - ca_static->recv_tid = status; - #endif } @@ -1072,7 +1090,7 @@ int APIENTRY ca_search_and_connect chix->pConnFunc = conn_func; chix->type = TYPENOTCONN; /* invalid initial type */ chix->count = 0; /* invalid initial count */ - chix->id.sid = ~0L; /* invalid initial server id */ + chix->id.sid = ~0U; /* invalid initial server id */ chix->state = cs_never_conn; ellInit(&chix->eventq); @@ -1088,10 +1106,10 @@ int APIENTRY ca_search_and_connect */ ca_static->ca_search_retry = 0; ca_static->ca_conn_next_retry = CA_CURRENT_TIME; - sec = CA_RECAST_DELAY; + sec = (int) CA_RECAST_DELAY; ca_static->ca_conn_retry_delay.tv_sec = sec; ca_static->ca_conn_retry_delay.tv_usec = - (CA_RECAST_DELAY-sec)*USEC_PER_SEC; + (long) (CA_RECAST_DELAY-sec)*USEC_PER_SEC; UNLOCK; @@ -1152,7 +1170,7 @@ int reply_type mptr++; strncpy((char *)mptr, (char *)(chix + 1), size); - CAC_ADD_MSG(piiu); + cac_add_msg(piiu); /* * increment the number of times we have tried this @@ -1721,7 +1739,7 @@ void *pvalue struct extmsg hdr; int postcnt; unsigned size_of_one; - int i; + unsigned i; # ifdef CONVERSION_REQUIRED void *pCvrtBuf; void *pdest; @@ -1777,6 +1795,8 @@ void *pvalue case DBR_ENUM: case DBR_SHORT: + case DBR_PUT_ACKT: + case DBR_PUT_ACKS: # if DBR_INT != DBR_SHORT case DBR_INT: # endif /*DBR_INT != DBR_SHORT*/ @@ -1812,10 +1832,10 @@ void *pvalue hdr.m_cmmd = htons(cmd); hdr.m_type = htons(type); - hdr.m_count = htons(count); + hdr.m_count = htons((ca_uint16_t)count); hdr.m_cid = chix->id.sid; hdr.m_available = id; - hdr.m_postsize = postcnt; + hdr.m_postsize = (ca_uint16_t) postcnt; status = cac_push_msg(piiu, &hdr, pvalue); @@ -2033,7 +2053,6 @@ long mask { evid monix; int status; - int size; INITCHK; LOOSECHIXCHK(chix); @@ -2063,7 +2082,8 @@ long mask if (!chix->piiu) { # ifdef vxWorks - static int dbevsize; + int size; + static int dbevsize; if(!dbevsize){ dbevsize = db_sizeof_event_block(); @@ -2098,7 +2118,7 @@ long mask monix->p_delta = p_delta; monix->n_delta = n_delta; monix->timeout = timeout; - monix->mask = mask; + monix->mask = (unsigned short) mask; # ifdef vxWorks if(!chix->piiu){ @@ -2169,8 +2189,10 @@ int ca_request_event(evid monix) unsigned count; struct monops msg; struct ioc_in_use *piiu; + ca_float32_t p_delta; + ca_float32_t n_delta; + ca_float32_t tmo; - piiu = chix->piiu; /* @@ -2201,9 +2223,12 @@ int ca_request_event(evid monix) msg.m_header.m_postsize = sizeof(msg.m_info); /* msg body */ - htonf(&monix->p_delta, &msg.m_info.m_hval); - htonf(&monix->n_delta, &msg.m_info.m_lval); - htonf(&monix->timeout, &msg.m_info.m_toval); + p_delta = (ca_float32_t) monix->p_delta; + n_delta = (ca_float32_t) monix->n_delta; + tmo = (ca_float32_t) monix->timeout; + htonf(&p_delta, &msg.m_info.m_hval); + htonf(&n_delta, &msg.m_info.m_lval); + htonf(&tmo, &msg.m_info.m_toval); msg.m_info.m_mask = htons(monix->mask); status = cac_push_msg(piiu, &msg.m_header, &msg.m_info); @@ -2563,9 +2588,9 @@ int APIENTRY ca_clear_channel (chid chix) /* msg header */ hdr.m_cmmd = htons(IOC_CLEAR_CHANNEL); hdr.m_available = chix->cid; + hdr.m_cid = chix->id.sid; hdr.m_type = htons(0); hdr.m_count = htons(0); - hdr.m_cid = chix->id.sid; hdr.m_postsize = 0; status = cac_push_msg(piiu, &hdr, NULL); @@ -2697,11 +2722,11 @@ int APIENTRY ca_pend(ca_real timeout, int early) /* * Allow for CA background labor */ - remaining = min(SELECT_POLL, remaining); + remaining = (long) min(SELECT_POLL, remaining); } - tmo.tv_sec = remaining; - tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC; + tmo.tv_sec = (long) remaining; + tmo.tv_usec = (long) (remaining-tmo.tv_sec)*USEC_PER_SEC; cac_block_for_io_completion(&tmo); } } @@ -3015,7 +3040,7 @@ int echo_request(struct ioc_in_use *piiu, ca_time *pCurrentTime) phdr->m_available = htons(0); phdr->m_postsize = 0; - CAC_ADD_MSG(piiu); + cac_add_msg(piiu); piiu->echoPending = TRUE; piiu->send_needed = TRUE; @@ -3214,7 +3239,7 @@ LOCAL void ca_default_exception_handler(struct exception_handler_args args) */ LOCK; sprintf(sprintf_buf, - "%s - with request chan=%s op=%d data type=%s count=%d\n", + "%s - with request chan=%s op=%d data type=%s count=%d", args.ctx, pName, args.op, @@ -3265,7 +3290,7 @@ int ca_defunct() * currently implemented as a function * (may be implemented as a MACRO in the future) */ -char APIENTRY *ca_host_name_function(chid chix) +char * APIENTRY ca_host_name_function(chid chix) { IIU *piiu; @@ -3353,3 +3378,69 @@ int ca_channel_status(int tid) return ECA_NORMAL; } #endif /*vxWorks*/ + + +/* + * ca_replace_printf_handler () + */ +int APIENTRY ca_replace_printf_handler ( +int (*ca_printf_func)(char *pformat, va_list args) +) +{ + if (ca_printf_func) { + ca_static->ca_printf_func = ca_printf_func; + } + else { + /* + * os dependent + */ + caSetDefaultPrintfHandler(); + } + + return ECA_NORMAL; +} + + +/* + * ca_printf() + */ +int ca_printf(char *pformat, ...) +{ + int (*ca_printf_func)(char *pformat, va_list args); + va_list theArgs; + int status; + + va_start(theArgs, pformat); + + ca_printf_func = ca_default_printf; + if (ca_static) { + if (ca_static->ca_printf_func) { + ca_printf_func = ca_static->ca_printf_func; + } + } + + status = (*ca_printf_func) (pformat, theArgs); + + va_end(theArgs); + + return status; +} + + +/* + * ca_default_printf() + * (this default is replaced under vxWorks + * - see vxWorks_depen.c) + */ +int ca_default_printf(char *pformat, va_list args) +{ + int status; + + status = vfprintf( + stderr, + pformat, + args); + return status; +} + + diff --git a/src/ca/acctst.c b/src/ca/acctst.c index 2198df6c0..2a60b48d2 100644 --- a/src/ca/acctst.c +++ b/src/ca/acctst.c @@ -10,6 +10,7 @@ static char *sccsId = "@(#) $Id$"; #endif #include +#include #include #include "os_depen.h" diff --git a/src/ca/addrList.h b/src/ca/addrList.h index 38afa328a..763d1d5fa 100644 --- a/src/ca/addrList.h +++ b/src/ca/addrList.h @@ -18,8 +18,8 @@ void caAddConfiguredAddr( SOCKET socket, int port); -int local_addr(SOCKET socket, struct sockaddr_in *plcladdr); - +int local_addr(SOCKET socket, struct sockaddr_in *plcladdr); +int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort); union caAddr{ struct sockaddr_in inetAddr; diff --git a/src/ca/bsd_depen.c b/src/ca/bsd_depen.c index 27b43816b..128bad7eb 100644 --- a/src/ca/bsd_depen.c +++ b/src/ca/bsd_depen.c @@ -45,10 +45,9 @@ int cac_select_io(struct timeval *ptimeout, int flags) long status; IIU *piiu; unsigned long freespace; - int maxfd; + SOCKET maxfd; caFDInfo *pfdi; - LOCK; pfdi = (caFDInfo *) ellGet(&ca_static->fdInfoFreeList); diff --git a/src/ca/ca_printf.c b/src/ca/ca_printf.c index ddfb98d0b..ffbc6ccf9 100644 --- a/src/ca/ca_printf.c +++ b/src/ca/ca_printf.c @@ -52,12 +52,7 @@ static char *sccsId = "@(#) $Id$"; * Dump error messages to the appropriate place * */ -#ifdef __STDC__ int ca_printf(char *pformat, ...) -#else -int ca_printf(va_alist) -va_dcl -#endif { va_list args; int status; @@ -65,29 +60,9 @@ va_dcl va_start(args, pformat); #if defined(vxWorks) - { - int logMsgArgs[6]; - int i; - - for(i=0; i< NELEMENTS(logMsgArgs); i++){ - logMsgArgs[i] = va_arg(args, int); - } - - status = logMsg( - pformat, - logMsgArgs[0], - logMsgArgs[1], - logMsgArgs[2], - logMsgArgs[3], - logMsgArgs[4], - logMsgArgs[5]); - - } + status = mprintf(pformat, args); #else - status = vfprintf( - stderr, - pformat, - args); + status = vfprintf(stderr, pformat, args); #endif va_end(args); diff --git a/src/ca/catime.c b/src/ca/catime.c index bd420a3a3..4d01fb780 100644 --- a/src/ca/catime.c +++ b/src/ca/catime.c @@ -1,29 +1,24 @@ /* + * + * CA performance test + * + * History + * joh 09-12-89 Initial release + * joh 12-20-94 portability + * + * + */ - - CA performance test - - History - joh 09-12-89 Initial release - - - -*/ - -#ifdef VMS -#include -#endif - - -/* System includes */ -#ifdef vxWorks -#include -#include -#endif +#include +#include +#include +#include #include -#include -#include + +#ifndef LOCAL +#define LOCAL static +#endif #ifndef OK #define OK 0 @@ -41,17 +36,44 @@ #define NELEMENTS(A) (sizeof (A) / sizeof ((A) [0])) #endif -#define NUM 1 #define ITERATION_COUNT 10000 #define WAIT_FOR_ACK -chid chan_list[min(10000,ITERATION_COUNT)]; +typedef struct testItem { + chid chix; + char name[40]; + int type; + int count; + union db_access_val val; +}ti; + +ti itemList[ITERATION_COUNT]; + +int catime(char *channelName); + +typedef void tf (ti *pItems, unsigned iterations); + +LOCAL void test ( + ti *pItems, + unsigned iterations +); + +LOCAL tf test_search; +LOCAL tf test_free; +LOCAL tf test_wait; +LOCAL tf test_put; +LOCAL tf test_wait; +LOCAL tf test_get; + +void timeIt( + tf *pfunc, + ti *pItem, + unsigned iterations +); #ifndef vxWorks -main(argc, argv) -int argc; -char **argv; +int main(int argc, char **argv) { char *pname; @@ -61,167 +83,251 @@ char **argv; } else{ printf("usage: %s ", argv[0]); + return -1; } + return 0; } #endif -catime(channelName) -char *channelName; + +/* + * catime () + */ +int catime (char *channelName) { - chid ai_1; + long status; + long i,j; + unsigned strsize; - long status; - long i,j; - void *ptr; - int test_search(), test_free(); + SEVCHK (ca_task_initialize(),"Unable to initialize"); - SEVCHK(ca_task_initialize(),"Unable to initialize"); + strsize = sizeof(itemList[i].name)-1; + for (i=0; itype,ai_1->count); - printf("search test\n"); - timex(test_search,channelName); - printf("free test\n"); - timex(test_free,ai_1); + for (i=0; ica_search_retry; delay = idelay * CA_RECAST_DELAY; /* sec */ delay = min (CA_RECAST_PERIOD, delay); - idelay = delay; + idelay = (long) delay; ca_static->ca_conn_retry_delay.tv_sec = idelay; ca_static->ca_conn_retry_delay.tv_usec = - (delay-idelay)*USEC_PER_SEC; + (long) ((delay-idelay)*USEC_PER_SEC); ca_static->ca_conn_next_retry = cac_time_sum ( ¤t, @@ -347,12 +347,7 @@ LOCAL void logRetryInterval(char *pFN, unsigned lineno) /* - * - * * MARK_SERVER_AVAILABLE - * - * - * */ void mark_server_available(struct in_addr *pnet_addr) { @@ -465,16 +460,16 @@ void mark_server_available(struct in_addr *pnet_addr) { ca_real diff; ca_real delay; - unsigned idelay; + long idelay; ca_time ca_delay; ca_time next; delay = (port&CA_RECAST_PORT_MASK); delay /= MSEC_PER_SEC; delay += CA_RECAST_DELAY; - idelay = delay; + idelay = (long) delay; ca_delay.tv_sec = idelay; - ca_delay.tv_usec = (delay-idelay) * USEC_PER_SEC; + ca_delay.tv_usec = (long) (delay-idelay) * USEC_PER_SEC; next = cac_time_sum(¤tTime, &ca_delay); diff = cac_time_diff( @@ -484,10 +479,10 @@ void mark_server_available(struct in_addr *pnet_addr) ca_static->ca_conn_next_retry = next; LOGRETRYINTERVAL } - idelay = CA_RECAST_DELAY; + idelay = (long) CA_RECAST_DELAY; ca_static->ca_conn_retry_delay.tv_sec = idelay; ca_static->ca_conn_retry_delay.tv_usec = - (CA_RECAST_DELAY-idelay) * USEC_PER_SEC; + (long) ((CA_RECAST_DELAY-idelay) * USEC_PER_SEC); ca_static->ca_search_retry = 0; } diff --git a/src/ca/convert.c b/src/ca/convert.c index cf7eef812..5a5789264 100644 --- a/src/ca/convert.c +++ b/src/ca/convert.c @@ -35,11 +35,6 @@ static char *sccsId = "@(#) $Id$"; #include "iocinf.h" #include "net_convert.h" -void htond(double *pHost, double *pNet); -void ntohd(double *pNet, double *pHost); -void htonf(float *pHost, float *pNet); -void ntohf(float *pNet, float *pHost); - /* * if hton is true then it is a host to network conversion * otherwise vise-versa @@ -1374,7 +1369,7 @@ unsigned long num /* number of values */ } -#ifdef CA_FLOAT_MIT +#if defined(CA_FLOAT_MIT) /************************************************************************/ /* double convert */ /* (THIS ASSUMES IEEE IS THE NETWORK FLOATING POINT FORMAT) */ @@ -1383,7 +1378,7 @@ unsigned long num /* number of values */ /* (this includes mapping of fringe reals to zero or infinity) */ /* (byte swaps included in conversion */ -struct ieeedbl{ +struct ieeedbl { unsigned int mant2 : 32; unsigned int mant1 : 20; unsigned int exp : 11; @@ -1396,7 +1391,7 @@ struct ieeedbl{ /* -1022sign; + sign = pMIT->sign; - if( (short)(pMIT->exp < EXPMINIEEE + MIT_SB){ + if( ((int)pMIT->exp) < EXPMINIEEE + MIT_SB){ exp = 0; mant = 0; sign = 0; } else{ - exp = (short)pMIT->exp-MIT_SB+IEEE_SB; + exp = ((int)pMIT->exp)-MIT_SB+IEEE_SB; mant = (pMIT->mant1<<16) | pMIT->mant2; } pIEEE->mant = mant; @@ -1566,12 +1560,12 @@ void htonf(float *pHost, float *pNet) */ void ntohf(float *pNet, float *pHost) { - struct mitflt *pMIT = pHost; - struct ieeeflt *pIEEE = pNet; + struct mitflt *pMIT = (struct mitflt *) pHost; + struct ieeeflt *pIEEE = (struct ieeeflt *) pNet; long exp,mant2,mant1,sign; *(ca_uint32_t *)pIEEE = ntohl(*(ca_uint32_t *)pIEEE); - if( (short) pIEEE->exp > EXPMAXMIT + IEEE_SB){ + if( ((int)pIEEE->exp) > EXPMAXMIT + IEEE_SB){ sign = pIEEE->sign; exp = EXPMAXMIT + MIT_SB; mant2 = ~0; @@ -1598,7 +1592,7 @@ void ntohf(float *pNet, float *pHost) #endif /*CA_FLOAT_MIT*/ -#ifndef CA_FLOAT_MIT +#if !defined(CA_FLOAT_MIT) /* * htond () diff --git a/src/ca/flow_control.c b/src/ca/flow_control.c index 34270aa5c..cc9c46a2e 100644 --- a/src/ca/flow_control.c +++ b/src/ca/flow_control.c @@ -50,8 +50,8 @@ static char *sccsId = "@(#) $Id$"; void flow_control(struct ioc_in_use *piiu) { unsigned nbytes; - register int status; - register int busy = piiu->client_busy; + int status; + int busy = piiu->client_busy; LOCK; diff --git a/src/ca/if_depen.c b/src/ca/if_depen.c index 2c18f35e0..9101abba3 100644 --- a/src/ca/if_depen.c +++ b/src/ca/if_depen.c @@ -79,7 +79,9 @@ int local_addr(int s, struct sockaddr_in *plcladdr) ifconf.ifc_req = ifreq; status = socket_ioctl(s, SIOCGIFCONF, &ifconf); if (status < 0 || ifconf.ifc_len == 0) { - ca_printf("CAC: ioctl failed %s\n", strerror(MYERRNO)); + ca_printf( + "CAC: ioctl failed because \"%s\"\n", + strerror(MYERRNO)); ifconf.ifc_len = 0; } @@ -145,7 +147,7 @@ int local_addr(int s, struct sockaddr_in *plcladdr) #if 0 /* - * An alternate sloution + * An alternate solution * for os without the if routines */ /* diff --git a/src/ca/iocinf.c b/src/ca/iocinf.c index fca280e73..febf812b0 100644 --- a/src/ca/iocinf.c +++ b/src/ca/iocinf.c @@ -73,7 +73,6 @@ static char *sccsId = "@(#) $Id$"; #define CA_GLBLSOURCE #include "iocinf.h" #include "net_convert.h" -#include LOCAL void tcp_recv_msg(struct ioc_in_use *piiu); LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu); @@ -188,6 +187,7 @@ int net_proto UNLOCK; return ECA_ALLOCMEM; } + memset((char *)&pNode->destAddr,0,sizeof(pNode->destAddr)); pNode->destAddr.inetAddr.sin_family = AF_INET; pNode->destAddr.inetAddr.sin_addr = *pnet_addr; pNode->destAddr.inetAddr.sin_port = @@ -641,6 +641,8 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu) pNode = (caAddrNode *) piiu->destAddr.node.next; while(pNode){ + unsigned long actualSendCnt; + status = sendto( piiu->sock_chan, &piiu->send.buf[piiu->send.rdix], @@ -649,18 +651,23 @@ LOCAL void cac_udp_send_msg_piiu(struct ioc_in_use *piiu) &pNode->destAddr.sockAddr, sizeof(pNode->destAddr.sockAddr)); if(status<0){ - if( MYERRNO != EWOULDBLOCK && - MYERRNO != ENOBUFS && - MYERRNO != EINTR){ + int localErrno; + + localErrno = MYERRNO; + + if( localErrno != EWOULDBLOCK && + localErrno != ENOBUFS && + localErrno != EINTR){ ca_printf( "CAC: error on socket send() %s\n", - strerror(MYERRNO)); + strerror(localErrno)); } TAG_CONN_DOWN(piiu); break; } - assert(status == sendCnt); + actualSendCnt = (unsigned long) status; + assert (actualSendCnt == sendCnt); pNode = (caAddrNode *) pNode->node.next; } @@ -687,6 +694,7 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu) { unsigned long sendCnt; int status; + int localError; /* * check for shutdown in progress @@ -715,8 +723,6 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu) sendCnt, 0); if(status>=0){ - assert(status<=sendCnt); - piiu->sendPending = FALSE; CAC_RING_BUFFER_READ_ADVANCE(&piiu->send, status); @@ -729,9 +735,11 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu) return; } - if( MYERRNO == EWOULDBLOCK || - MYERRNO == ENOBUFS || - MYERRNO == EINTR){ + localError = MYERRNO; + + if( localError == EWOULDBLOCK || + localError == ENOBUFS || + localError == EINTR){ UNLOCK; if(!piiu->sendPending){ cac_gettimeval(&piiu->timeAtSendBlock); @@ -740,12 +748,12 @@ LOCAL void cac_tcp_send_msg_piiu(struct ioc_in_use *piiu) return; } - if( MYERRNO != EPIPE && - MYERRNO != ECONNRESET && - MYERRNO != ETIMEDOUT){ + if( localError != EPIPE && + localError != ECONNRESET && + localError != ETIMEDOUT){ ca_printf( "CAC: error on socket send() %s\n", - strerror(MYERRNO)); + strerror(localError)); } TAG_CONN_DOWN(piiu); @@ -890,7 +898,6 @@ LOCAL void tcp_recv_msg(struct ioc_in_use *piiu) return; } - if(status>MAX_MSG_SIZE){ ca_printf( "CAC: recv_msg(): message overflow %l\n", status-MAX_MSG_SIZE); @@ -1174,15 +1181,15 @@ void close_ioc (struct ioc_in_use *piiu) chix = (chid) &piiu->chidlist.node.next; while (chix = (chid) chix->node.next) { chix->type = TYPENOTCONN; - chix->count = 0; + chix->count = 0U; chix->state = cs_prev_conn; - chix->id.sid = ~0L; + chix->id.sid = ~0U; chix->ar.read_access = FALSE; chix->ar.write_access = FALSE; /* * try to reconnect */ - chix->retry = 0; + chix->retry = 0U; } if (piiu->chidlist.count) { @@ -1564,6 +1571,7 @@ void caAddConfiguredAddr(ELLLIST *pList, ENV_PARAM *pEnv, } while(pToken = getToken(&pStr)){ + memset((char *)&addr,0,sizeof(addr)); addr.inetAddr.sin_family = AF_INET; addr.inetAddr.sin_port = htons(port); addr.inetAddr.sin_addr.s_addr = inet_addr(pToken); @@ -1654,32 +1662,38 @@ void caPrintAddrList(ELLLIST *pList) /* * caFetchPortConfig() */ -unsigned caFetchPortConfig(ENV_PARAM *pEnv, unsigned defaultPort) +int caFetchPortConfig(ENV_PARAM *pEnv, int defaultPort) { long longStatus; - long port; + long epicsParam; + int port; - longStatus = envGetLongConfigParam(pEnv, &port); + longStatus = envGetLongConfigParam(pEnv, &epicsParam); if (longStatus!=0) { - port = defaultPort; + epicsParam = defaultPort; ca_printf ("EPICS \"%s\" integer fetch failed\n", pEnv->name); - ca_printf ("setting \"%s\" = %ld\n", pEnv->name, port); + ca_printf ("setting \"%s\" = %ld\n", pEnv->name, epicsParam); } /* - * Thus must be a server port that will fit in a signed + * This must be a server port that will fit in a signed * short */ - if (port <= IPPORT_USERRESERVED || port>SHRT_MAX) { + if (epicsParam<=IPPORT_USERRESERVED || epicsParam>SHRT_MAX) { ca_printf ("EPICS \"%s\" out of range\n", pEnv->name); /* * Quit if the port is wrong due CA coding error */ - assert (port != defaultPort); - port = defaultPort; - ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, port); + assert (epicsParam != defaultPort); + epicsParam = defaultPort; + ca_printf ("Setting \"%s\" = %ld\n", pEnv->name, epicsParam); } + /* + * ok to clip to int here because we checked the range + */ + port = (int) epicsParam; + return port; } diff --git a/src/ca/iocinf.h b/src/ca/iocinf.h index 997674841..d69b20cd7 100644 --- a/src/ca/iocinf.h +++ b/src/ca/iocinf.h @@ -85,6 +85,7 @@ HDRVERSIONID(iocinfh, "$Id$") #include #include #include +#include /* @@ -168,8 +169,8 @@ struct pending_io_event{ typedef struct timeval ca_time; #define LD_CA_TIME(FLOAT_TIME,PCATIME) \ -((PCATIME)->tv_sec = (FLOAT_TIME), \ -(PCATIME)->tv_usec = ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC) +((PCATIME)->tv_sec = (long) (FLOAT_TIME), \ +(PCATIME)->tv_usec = (long) ((FLOAT_TIME)-(PCATIME)->tv_sec)*USEC_PER_SEC) /* * dont adjust @@ -409,6 +410,7 @@ struct ca_static{ void (*ca_connection_func) (struct connection_handler_args); void *ca_connection_arg; + int (*ca_printf_func)(char *pformat, va_list args); void (*ca_fd_register_func) (void *, SOCKET, int); void *ca_fd_register_arg; @@ -591,6 +593,8 @@ ca_real cac_time_diff(ca_time *pTVA, ca_time *pTVB); ca_time cac_time_sum(ca_time *pTVA, ca_time *pTVB); void caIOBlockFree(evid pIOBlock); void clearChannelResources(unsigned id); +void caSetDefaultPrintfHandler (); +int ca_default_printf(char *pformat, va_list args); /* * !!KLUDGE!! diff --git a/src/ca/iocmsg.h b/src/ca/iocmsg.h index 37802930c..2171403d2 100644 --- a/src/ca/iocmsg.h +++ b/src/ca/iocmsg.h @@ -82,7 +82,7 @@ typedef float ca_float32_t; #define IOC_WRITE 4 /* write a channel value */ #define IOC_SNAPSHOT 5 /* snapshot of the system */ #define IOC_SEARCH 6 /* IOC channel search */ -/* 7 */ +#define IOC_BUILD 7 /* build - obsolete */ #define IOC_EVENTS_OFF 8 /* flow control */ #define IOC_EVENTS_ON 9 /* flow control */ #define IOC_READ_SYNC 10 /* purge old reads */ @@ -91,7 +91,7 @@ typedef float ca_float32_t; #define IOC_RSRV_IS_UP 13 /* CA server has joined the net */ #define IOC_NOT_FOUND 14 /* channel not found */ #define IOC_READ_NOTIFY 15 /* add a one shot event */ -/* 16 */ +#define IOC_READ_BUILD 16 /* read and build - obsolete */ #define REPEATER_CONFIRM 17 /* registration confirmation */ #define IOC_CLAIM_CIU 18 /* client claims resource in server */ #define IOC_WRITE_NOTIFY 19 /* notify after write chan value */ diff --git a/src/ca/net_convert.h b/src/ca/net_convert.h index a5189fabe..160ddf463 100644 --- a/src/ca/net_convert.h +++ b/src/ca/net_convert.h @@ -63,10 +63,30 @@ # endif #endif -#if !defined(MIT_FLOAT) && !defined(CA_LITTLE_ENDIAN) -#define htond(IEEEhost, IEEEnet) (*(double *)(IEEEnet) = *(double *)(IEEEhost)) -#define ntohd(IEEEnet, IEEEhost) (*(double *)(IEEEhost) = *(double *)(IEEEnet)) -#define htonf(IEEEhost, IEEEnet) (*(float *)(IEEEnet) = *(float *)(IEEEhost)) -#define ntohf(IEEEnet, IEEEhost) (*(float *)(IEEEhost) = *(float *)(IEEEnet)) +#if defined(CA_FLOAT_IEEE) && !defined(CA_LITTLE_ENDIAN) +# define htond(IEEEhost, IEEEnet) \ + (*(double *)(IEEEnet) = *(double *)(IEEEhost)) +# define ntohd(IEEEnet, IEEEhost) \ + (*(double *)(IEEEhost) = *(double *)(IEEEnet)) +# define htonf(IEEEhost, IEEEnet) \ + (*(float *)(IEEEnet) = *(float *)(IEEEhost)) +# define ntohf(IEEEnet, IEEEhost) \ + (*(float *)(IEEEhost) = *(float *)(IEEEnet)) +#elif defined(CA_FLOAT_IEEE) && defined(CA_LITTLE_ENDIAN) +# define ntohf(NET,HOST) \ + {*((u_long *)(HOST)) = ntohl(*((u_long *)(NET )));} +# define htonf(HOST,NET) \ + {*((u_long *)(NET) ) = htonl(*((u_long *)(HOST)));} +# define ntohd(NET,HOST) \ + { ((u_long *)(HOST))[1] = ntohl(((u_long *)(NET))[0]) ; \ + ((u_long *)(HOST))[0] = ntohl(((u_long *)(NET))[1]) ;} +# define htond(HOST,NET) \ + { ((u_long *)(NET))[1] = htonl(((u_long *)(HOST))[0]) ; \ + ((u_long *)(NET))[0] = htonl(((u_long *)(HOST))[1]) ;} +#else + void htond(double *pHost, double *pNet); + void ntohd(double *pNet, double *pHost); + void htonf(float *pHost, float *pNet); + void ntohf(float *pNet, float *pHost); #endif diff --git a/src/ca/netdb_depen.c b/src/ca/netdb_depen.c index 9195f4711..46fd3ee7e 100644 --- a/src/ca/netdb_depen.c +++ b/src/ca/netdb_depen.c @@ -39,6 +39,9 @@ static char *sccsId = "@(#) $Id$"; #include #include +#ifdef _WINDOWS +#include +#endif #include #include #include @@ -55,7 +58,7 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size) struct hostent *ent; ent = gethostbyaddr( - pnet_addr, + (char *) pnet_addr, sizeof(*pnet_addr), AF_INET); if(ent){ diff --git a/src/ca/os_depen.h b/src/ca/os_depen.h index 46b876869..800a9d667 100644 --- a/src/ca/os_depen.h +++ b/src/ca/os_depen.h @@ -24,6 +24,7 @@ * pairs reside at the same C bracket level * .11 GeG 120992 support VMS/UCX * .12 CJM 130794 define MYERRNO properly for UCX + * .13 CJM 311094 mods to support DEC C compiler * */ @@ -46,6 +47,7 @@ static char *os_depenhSccsId = "$Id$"; # include # include # include +# include # include # define CA_OS_CONFIGURED #endif @@ -57,6 +59,7 @@ static char *os_depenhSccsId = "$Id$"; # include # include # include +# include # include # include @@ -93,9 +96,13 @@ static char *os_depenhSccsId = "$Id$"; # include # include # include -# define __TIME_LOADED /* dont include VMS CC time.h under MULTINET */ +# include +#if !defined(UCX) # include -# include +# include +#else +# include +#endif # include # include # include @@ -104,12 +111,12 @@ static char *os_depenhSccsId = "$Id$"; # include # define MAXHOSTNAMELEN 75 #ifdef UCX /* GeG 09-DEC-1992 */ -# include -# include +# include +# include #else -# include -# include -# include +# include +# include +# include #endif # define CA_OS_CONFIGURED #endif /*VMS*/ @@ -123,7 +130,7 @@ static char *os_depenhSccsId = "$Id$"; #endif /*_WINDOWS*/ #ifndef CA_OS_CONFIGURED -#error Please define one of vxWorks, UNIX or VMS +#error Please define one of vxWorks, UNIX VMS, or _WINDOWS #endif /* @@ -139,10 +146,10 @@ static char *os_depenhSccsId = "$Id$"; #elif defined(_X86_) # define CA_FLOAT_IEEE # define CA_LITTLE_ENDIAN -#elif (defined(__ALPHA) || defined(__alpha)) && defined(VMS) +#elif (defined(__ALPHA) && defined(VMS) || defined(__alpha)) && defined(VMS) # define CA_FLOAT_MIT # define CA_LITTLE_ENDIAN -#elif (defined(__ALPHA) || defined(__alpha)) && defined(UNIX) +#elif (defined(__ALPHA) && defined(UNIX) || defined(__alpha)) && defined(UNIX) # define CA_FLOAT_IEEE # define CA_LITTLE_ENDIAN #else @@ -269,7 +276,6 @@ static char *os_depenhSccsId = "$Id$"; # else # ifdef UCX # define MYERRNO errno - extern volatile int noshare errno ; # else # define MYERRNO socket_errno # endif @@ -286,6 +292,12 @@ static char *os_depenhSccsId = "$Id$"; #endif #ifdef _WINDOWS +# define LOCK +# define UNLOCK +# define LOCKEVENTS +# define UNLOCKEVENTS +# define EVENTLOCKTEST (post_msg_active) +# define MAXHOSTNAMELEN 75 # define IPPORT_USERRESERVED 5000 # define EWOULDBLOCK WSAEWOULDBLOCK # define ENOBUFS WSAENOBUFS diff --git a/src/ca/posix_depen.c b/src/ca/posix_depen.c index 4e5180531..a72702b42 100644 --- a/src/ca/posix_depen.c +++ b/src/ca/posix_depen.c @@ -31,14 +31,6 @@ * */ -/* - * ANSI includes - */ -#include -#include -#include -#include - #include #include #include @@ -98,12 +90,10 @@ void cac_mux_io(struct timeval *ptimeout) timeout.tv_sec = 0; } while(count>0); - ca_process_input_queue(); } while(newInput); - } log_time(char *pStr) @@ -281,25 +271,14 @@ void ca_spawn_repeater() exit(0); } - /* - * ca_printf() + * caSetDefaultPrintfHandler () + * use the normal default here + * ( see access.c ) */ -int ca_printf(char *pformat, ...) +void caSetDefaultPrintfHandler () { - va_list args; - int status; - - va_start(args, pformat); - - status = vfprintf( - stderr, - pformat, - args); - - va_end(args); - - return status; + ca_static->ca_printf_func = ca_default_printf; } diff --git a/src/ca/repeater.c b/src/ca/repeater.c index 75aa2b9fc..51e44eede 100644 --- a/src/ca/repeater.c +++ b/src/ca/repeater.c @@ -20,11 +20,11 @@ * Los Alamos National Laboratory * * Direct inqueries to: - * Andy Kozubal, AT-8, Mail Stop H820 + * Jeff HIll, AT-8, Mail Stop H820 * Los Alamos National Laboratory * Los Alamos, New Mexico 87545 - * Phone: (505) 667-6508 - * E-mail: kozubal@k2.lanl.gov + * Phone: (505) 665-1831 + * E-mail: johill@lanl.gov * * PURPOSE: * Broadcasts fan out over the LAN, but UDP does not allow @@ -141,8 +141,9 @@ void ca_repeater() status = local_addr(sock, &local); if(status != OK){ - ca_printf("CA Repeater: no inet interfaces online?\n"); - assert(0); + ca_printf( + "CA Repeater: failed during initialization - no local IP address\n"); + exit (0); } #ifdef DEBUG diff --git a/src/ca/service.c b/src/ca/service.c index 53391d512..88c6d1a84 100644 --- a/src/ca/service.c +++ b/src/ca/service.c @@ -688,7 +688,7 @@ struct in_addr *pnet_addr } if (CA_V44(CA_PROTOCOL_VERSION,piiu->minor_version_number)) { - chan->id.sid = ntohl (piiu->curMsg.m_available); + chan->id.sid = piiu->curMsg.m_available; } reconnect_channel(piiu, chan); break; diff --git a/src/ca/syncgrp.c b/src/ca/syncgrp.c index 573d7d3b2..a076903a9 100644 --- a/src/ca/syncgrp.c +++ b/src/ca/syncgrp.c @@ -97,7 +97,7 @@ void ca_sg_shutdown(struct ca_static *ca_temp) /* * ca_sg_create() */ -int ca_sg_create(CA_SYNC_GID *pgid) +int APIENTRY ca_sg_create(CA_SYNC_GID *pgid) { int status; CASG *pcasg; @@ -162,7 +162,7 @@ int ca_sg_create(CA_SYNC_GID *pgid) /* * ca_sg_delete() */ -int ca_sg_delete(CA_SYNC_GID gid) +int APIENTRY ca_sg_delete(CA_SYNC_GID gid) { int status; CASG *pcasg; @@ -200,7 +200,7 @@ int ca_sg_delete(CA_SYNC_GID gid) /* * ca_sg_block() */ -int ca_sg_block(CA_SYNC_GID gid, ca_real timeout) +int APIENTRY ca_sg_block(CA_SYNC_GID gid, ca_real timeout) { struct timeval beg_time; struct timeval cur_time; @@ -270,8 +270,8 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout) /* * wait for asynch notification */ - tmo.tv_sec = remaining; - tmo.tv_usec = (remaining-tmo.tv_sec)*USEC_PER_SEC; + tmo.tv_sec = (long) remaining; + tmo.tv_usec = (long) ((remaining-tmo.tv_sec)*USEC_PER_SEC); cac_block_for_sg_completion (pcasg, &tmo); } pcasg->opPendCount = 0; @@ -283,7 +283,7 @@ int ca_sg_block(CA_SYNC_GID gid, ca_real timeout) /* * ca_sg_reset */ -int ca_sg_reset(CA_SYNC_GID gid) +int APIENTRY ca_sg_reset(CA_SYNC_GID gid) { CASG *pcasg; @@ -305,7 +305,7 @@ int ca_sg_reset(CA_SYNC_GID gid) /* * ca_sg_test */ -int ca_sg_test(CA_SYNC_GID gid) +int APIENTRY ca_sg_test(CA_SYNC_GID gid) { CASG *pcasg; @@ -331,7 +331,7 @@ int ca_sg_test(CA_SYNC_GID gid) /* * ca_sg_array_put() */ -int ca_sg_array_put( +int APIENTRY ca_sg_array_put( CA_SYNC_GID gid, chtype type, unsigned long count, @@ -396,7 +396,7 @@ void *pvalue) /* * ca_sg_array_get() */ -int ca_sg_array_get( +int APIENTRY ca_sg_array_get( CA_SYNC_GID gid, chtype type, unsigned long count, diff --git a/src/ca/test_event.c b/src/ca/test_event.c index 5b796e813..999ce946e 100644 --- a/src/ca/test_event.c +++ b/src/ca/test_event.c @@ -19,7 +19,7 @@ static char *sccsId = "$Id$"; #include "iocinf.h" -void ca_test_event(struct event_handler_args args) +void APIENTRY ca_test_event(struct event_handler_args args) { ca_printf("CAC: ~~~### in test event for [%s] ###~~~\n",args.chid+1); ca_printf("CAC: User argument\t%x\n", args.usr); diff --git a/src/ca/ucx.h b/src/ca/ucx.h index a6be60678..01b2a624e 100644 --- a/src/ca/ucx.h +++ b/src/ca/ucx.h @@ -6,6 +6,8 @@ * * GeG 09-DEC-1992 initial edit * CJM 13-Jul-1994 add fd_set etc for R3.12 + * CJM 09-Dec-1994 define fd_set etc. so it will compile for + * both DEC C and Vax C * */ #ifndef _UCX_H_ @@ -70,13 +72,14 @@ typedef long fd_mask ; #define howmany(x, y) (((x)+((y)-1))/(y)) #endif -typedef struct fd_set { - fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)] ; -} fd_set ; +/* + * Both DEC C and VAX C only allow 32 fd's at once + */ +typedef int fd_set ; -#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) -#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) -#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) +#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) bzero((char *)(p), sizeof (*(p))) #include diff --git a/src/ca/vms_depen.c b/src/ca/vms_depen.c index 7a1113349..e29f64ea5 100644 --- a/src/ca/vms_depen.c +++ b/src/ca/vms_depen.c @@ -31,15 +31,6 @@ * */ -/* - * ANSI includes - */ -#include -#include -#include -#include -#include - /* * VMS includes */ @@ -147,7 +138,7 @@ void os_specific_sg_io_complete(CASG *pcasg) /* * cac_block_for_sg_completion() */ -void cac_block_for_sg_completion(pTV) +void cac_block_for_sg_completion(CASG *pcasg, struct timeval *pTV) { cac_mux_io(pTV); } @@ -335,19 +326,12 @@ void caHostFromInetAddr(struct in_addr *pnet_addr, char *pBuf, unsigned size) /* - * ca_printf() + * caSetDefaultPrintfHandler () + * use the normal default here + * ( see access.c ) */ -int ca_printf(char *pformat, ...) +void caSetDefaultPrintfHandler () { - va_list args; - int status; - - va_start(args, pformat); - - status = vfprintf(stderr, pformat, args); - - va_end(args); - - return status; + ca_static->ca_printf_func = ca_default_printf; } diff --git a/src/ca/vxWorks_depen.c b/src/ca/vxWorks_depen.c index 5a1715d63..886417684 100644 --- a/src/ca/vxWorks_depen.c +++ b/src/ca/vxWorks_depen.c @@ -31,11 +31,10 @@ * */ -#include - #include #include "iocinf.h" #include "remLib.h" +#include LOCAL void ca_repeater_task(); LOCAL void ca_task_exit_tcb(WIND_TCB *ptcb); @@ -379,6 +378,7 @@ int cac_os_depen_init(struct ca_static *pcas) return status; } + evuser = (void *) db_init_events(); assert(evuser); @@ -881,40 +881,17 @@ void cac_recv_task(int tid) /* + * caSetDefaultPrintfHandler() * + * replace the default printf handler with a + * vxWorks specific one that calls logMsg () + * so that: * - * ca_printf() - * - * + * o messages go to the log file + * o messages dont get intermixed */ -int ca_printf(char *pformat, ...) +void caSetDefaultPrintfHandler () { - va_list args; - int status; - - va_start(args, pformat); - - { - int logMsgArgs[6]; - int i; - - for(i=0; i< NELEMENTS(logMsgArgs); i++){ - logMsgArgs[i] = va_arg(args, int); - } - - status = logMsg( - pformat, - logMsgArgs[0], - logMsgArgs[1], - logMsgArgs[2], - logMsgArgs[3], - logMsgArgs[4], - logMsgArgs[5]); - - } - - va_end(args); - - return status; + ca_static->ca_printf_func = vmprintf; } diff --git a/src/ca/windows_depen.c b/src/ca/windows_depen.c index 0a19cd45e..9d07ff333 100644 --- a/src/ca/windows_depen.c +++ b/src/ca/windows_depen.c @@ -1,6 +1,6 @@ /* * $Id$ - * Author: Jeffrey O. Hill + * Author: Jeffrey O. Hill, Chris Timossi * hill@luke.lanl.gov * (505) 665 1831 * Date: 9-93 @@ -31,14 +31,6 @@ * */ -/* - * ANSI includes - */ -#include -#include -#include -#include - #include "iocinf.h" #ifndef _WINDOWS @@ -145,7 +137,7 @@ int cac_os_depen_init(struct ca_static *pcas) { int status; - ca_static = ca_temp; + ca_static = pcas; /* * dont allow disconnect to terminate process @@ -229,26 +221,59 @@ void ca_spawn_repeater() } } + +/* + * caSetDefaultPrintfHandler () + * use the normal default here + * ( see access.c ) + */ +void caSetDefaultPrintfHandler () +{ + ca_static->ca_printf_func = ca_default_printf; +} /* - * ca_printf() + * DllMain () */ -int ca_printf(char *pformat, ...) +BOOL APIENTRY DllMain (HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { - va_list args; - int status; + int status; + WSADATA WsaData; - va_start(args, pformat); + switch (dwReason) { - status = vfprintf( - stderr, - pformat, - args); + case DLL_PROCESS_ATTACH: - va_end(args); + if ((status = WSAStartup(MAKEWORD(1,1), &WsaData)) != 0) + return FALSE; + if (AllocConsole()) { + SetConsoleTitle("Channel Access Status"); + freopen( "CONOUT$", "a", stderr ); + fprintf(stderr, "Process attached to ca.dll R12\n"); + } + break; + + case DLL_PROCESS_DETACH: + + if ((status = WSACleanup()) !=0) + return FALSE; + break; + + case DLL_THREAD_ATTACH: + fprintf(stderr, "Thread attached to ca.dll R12\n"); + break; + + case DLL_THREAD_DETACH: + fprintf(stderr, "Thread detached from ca.dll R12\n"); + break; + + default: + break; + } + +return TRUE; - return status; }