fixed problem where 3.13.beta11 unable to connect to 3.11 with correct native type

This commit is contained in:
Jeff Hill
1998-03-12 20:39:11 +00:00
parent 7fb514e73e
commit 5276e19d59
9 changed files with 123 additions and 64 deletions

View File

@@ -99,6 +99,9 @@
/************************************************************************/
/*
* $Log$
* Revision 1.100 1998/02/05 21:55:49 jhill
* detect attempts by user to clear bogus channel
*
* Revision 1.98 1997/08/04 22:54:28 jhill
* mutex clean up
*
@@ -253,7 +256,7 @@ static char *sccsId = "@(#) $Id$";
#define CHIXCHK(CHIX) \
{ \
if( (CHIX)->state != cs_conn || INVALID_DB_REQ((CHIX)->type) ){ \
if( (CHIX)->state != cs_conn || INVALID_DB_REQ((CHIX)->privType) ){ \
return ECA_BADCHID; \
} \
}
@@ -264,7 +267,7 @@ static char *sccsId = "@(#) $Id$";
/* allow them to add monitors to a disconnected channel */
#define LOOSECHIXCHK(CHIX) \
{ \
if( (CHIX)->type==TYPENOTINUSE ){ \
if( (CHIX)->privType==TYPENOTINUSE ){ \
return ECA_BADCHID; \
} \
}
@@ -1090,8 +1093,8 @@ int epicsShareAPI ca_search_and_connect
*chix->id.paddr = tmp_paddr;
chix->puser = puser;
chix->pConnFunc = conn_func;
chix->type = chix->id.paddr->dbr_field_type;
chix->count = chix->id.paddr->no_elements;
chix->privType = chix->id.paddr->dbr_field_type;
chix->privCount = chix->id.paddr->no_elements;
chix->piiu = NULL; /* none */
chix->state = cs_conn;
chix->ar.read_access = TRUE;
@@ -1156,8 +1159,8 @@ int epicsShareAPI ca_search_and_connect
chix->puser = (void *) puser;
chix->pConnFunc = conn_func;
chix->type = TYPENOTCONN; /* invalid initial type */
chix->count = 0; /* invalid initial count */
chix->privType = TYPENOTCONN; /* invalid initial type */
chix->privCount = 0; /* invalid initial count */
chix->id.sid = ~0U; /* invalid initial server id */
chix->ar.read_access = FALSE;
chix->ar.write_access = FALSE;
@@ -1282,7 +1285,7 @@ void *pvalue
return ECA_NORDACCESS;
}
if (count > chix->count) {
if (count > chix->privCount) {
return ECA_BADCOUNT;
}
@@ -1363,7 +1366,7 @@ const void *arg
if (INVALID_DB_REQ(type))
return ECA_BADTYPE;
if (count > chix->count)
if (count > chix->privCount)
return ECA_BADCOUNT;
if(!chix->ar.read_access){
@@ -1537,8 +1540,8 @@ LOCAL int issue_get_callback(evid monix, unsigned cmmd)
/*
* set to the native count if they specify zero
*/
if (monix->count == 0 || monix->count > chix->count){
count = chix->count;
if (monix->count == 0 || monix->count > chix->privCount){
count = chix->privCount;
}
else{
count = monix->count;
@@ -1595,7 +1598,7 @@ const void *usrarg
/*
* check for valid count
*/
if(count > chix->count || count == 0)
if(count > chix->privCount || count == 0)
return ECA_BADCOUNT;
piiu = chix->piiu;
@@ -1811,7 +1814,7 @@ int epicsShareAPI ca_array_put (
/*
* check for valid count
*/
if(count > chix->count || count == 0)
if(count > chix->privCount || count == 0)
return ECA_BADCOUNT;
if (type==DBR_STRING) {
@@ -2296,8 +2299,8 @@ int ca_request_event(evid monix)
* clip to the native count and set to the native count if they
* specify zero
*/
if (monix->count > chix->count || monix->count == 0){
count = chix->count;
if (monix->count > chix->privCount || monix->count == 0){
count = chix->privCount;
}
else{
count = monix->count;
@@ -2357,8 +2360,8 @@ db_field_log *pfl
* clip to the native count
* and set to the native count if they specify zero
*/
if(monix->count > monix->chan->count || monix->count == 0){
count = monix->chan->count;
if(monix->count > monix->chan->privCount || monix->count == 0){
count = monix->chan->privCount;
}
else{
count = monix->count;
@@ -2547,8 +2550,8 @@ int epicsShareAPI ca_clear_event (evid monix)
/* msg header */
hdr.m_cmmd = htons(CA_PROTO_EVENT_CANCEL);
hdr.m_available = pMon->id;
hdr.m_type = htons(chix->type);
hdr.m_count = htons(chix->count);
hdr.m_type = htons(chix->privType);
hdr.m_count = htons(chix->privCount);
hdr.m_cid = chix->id.sid;
hdr.m_postsize = 0;
@@ -2604,7 +2607,7 @@ int epicsShareAPI ca_clear_channel (chid pChan)
LOOSECHIXCHK(pChan);
/* disable their further use of deallocated channel */
pChan->type = TYPENOTINUSE;
pChan->privType = TYPENOTINUSE;
old_chan_state = pChan->state;
pChan->state = cs_closed;
pChan->pAccessRightsFunc = NULL;
@@ -3472,7 +3475,7 @@ int issue_claim_channel (chid pchan)
ellAdd (&piiu->chidlist, &pchan->node);
if (!CA_V42(CA_PROTOCOL_VERSION, piiu->minor_version_number)) {
cac_reconnect_channel(pchan->cid);
cac_reconnect_channel(pchan->cid, TYPENOTCONN, 0);
}
}
else {
@@ -3706,3 +3709,28 @@ int epicsShareAPI ca_printf(char *pformat, ...)
return status;
}
/*
* ca_get_field_type()
*/
short epicsShareAPI ca_get_field_type (chid chan)
{
if (chan->state==cs_conn) {
return chan->privType;
}
else {
return TYPENOTCONN;
}
}
/*
* ca_get_element_count()
*/
unsigned short epicsShareAPI ca_get_element_count (chid chan)
{
if (chan->state==cs_conn) {
return chan->privCount;
}
else {
return 0;
}
}

View File

@@ -7,6 +7,9 @@ static char *sccsId = "@(#) $Id$";
/*
* $Log$
* Revision 1.49 1998/02/05 21:56:46 jhill
* added no pend event in event call back test
*
* Revision 1.48 1997/07/10 19:33:11 jhill
* improved CPU consumption by select() under vxWorks
*
@@ -243,10 +246,10 @@ int doacctst(char *pname)
SEVCHK(status, NULL);
if (ca_test_io() == ECA_IOINPROGRESS) {
assert(INVALID_DB_REQ(chix1->type) == TRUE);
assert(INVALID_DB_REQ(chix2->type) == TRUE);
assert(INVALID_DB_REQ(chix3->type) == TRUE);
assert(INVALID_DB_REQ(chix4->type) == TRUE);
assert(INVALID_DB_REQ(ca_field_type(chix1)) == TRUE);
assert(INVALID_DB_REQ(ca_field_type(chix2)) == TRUE);
assert(INVALID_DB_REQ(ca_field_type(chix3)) == TRUE);
assert(INVALID_DB_REQ(ca_field_type(chix4)) == TRUE);
assert(ca_state(chix1) == cs_never_conn);
assert(ca_state(chix2) == cs_never_conn);
@@ -331,10 +334,10 @@ int doacctst(char *pname)
assert (ca_state(chix3) == cs_conn);
assert (ca_state(chix4) == cs_conn);
assert (INVALID_DB_REQ(chix1->type) == FALSE);
assert (INVALID_DB_REQ(chix2->type) == FALSE);
assert (INVALID_DB_REQ(chix3->type) == FALSE);
assert (INVALID_DB_REQ(chix4->type) == FALSE);
assert (INVALID_DB_REQ(ca_field_type(chix1)) == FALSE);
assert (INVALID_DB_REQ(ca_field_type(chix2)) == FALSE);
assert (INVALID_DB_REQ(ca_field_type(chix3)) == FALSE);
assert (INVALID_DB_REQ(ca_field_type(chix4)) == FALSE);
/*
* clear chans before starting another test
@@ -765,7 +768,7 @@ int doacctst(char *pname)
}
printf("done.\n");
if (VALID_DB_REQ(chix4->type)) {
if (VALID_DB_REQ(ca_field_type(chix4))) {
status = ca_add_event(
DBR_FLOAT,
chix4,
@@ -782,7 +785,7 @@ int doacctst(char *pname)
&monix);
SEVCHK(status, NULL);
}
if (VALID_DB_REQ(chix4->type)) {
if (VALID_DB_REQ(ca_field_type(chix4))) {
status = ca_add_event(
DBR_FLOAT,
chix4,
@@ -792,7 +795,7 @@ int doacctst(char *pname)
SEVCHK(status, NULL);
SEVCHK(ca_clear_event(monix), NULL);
}
if (VALID_DB_REQ(chix3->type)) {
if (VALID_DB_REQ(ca_field_type(chix3))) {
status = ca_add_event(
DBR_FLOAT,
chix3,
@@ -813,7 +816,7 @@ int doacctst(char *pname)
pdouble = (dbr_double_t *) calloc(sizeof(*pdouble),NUM);
pgrfloat = (struct dbr_gr_float *) calloc(sizeof(*pgrfloat),NUM);
if (VALID_DB_REQ(chix1->type))
if (VALID_DB_REQ(ca_field_type(chix1)))
if (pfloat)
for (i = 0; i < NUM; i++) {
for (j = 0; j < NUM; j++)
@@ -853,7 +856,7 @@ int doacctst(char *pname)
* o verifies that we can at least write and read back the same array
* if multiple elements are present
*/
if (VALID_DB_REQ(chix1->type)) {
if (VALID_DB_REQ(ca_field_type(chix1))) {
if (ca_element_count(chix1)>1u && ca_read_access(chix1)) {
dbr_float_t *pRF, *pWF, *pEF, *pT1, *pT2;

View File

@@ -131,8 +131,8 @@ HDRVERSIONID(cadefh, "@(#) $Id$")
* recommended that the following MACROS be used to access them.
*
*/
#define ca_field_type(CHID) ((CHID)->type)
#define ca_element_count(CHID) ((CHID)->count)
#define ca_field_type(CHID) (ca_get_field_type(CHID))
#define ca_element_count(CHID) (ca_get_element_count(CHID))
#define ca_name(CHID) ((READONLY char *)((CHID)+1))
/*
* the odd cast here removes const (and allows past practice
@@ -196,9 +196,9 @@ typedef void caArh();
*/
struct channel_in_use{
ELLNODE node; /* list ptrs */
short type; /* database field type */
short privType; /* database field type */
#define TYPENOTCONN (-1) /* the type when disconnected */
unsigned short count; /* array element count */
unsigned short privCount; /* array element count */
union{
unsigned sid; /* server id */
struct dbAddr *paddr; /* database address */
@@ -308,6 +308,9 @@ struct exception_handler_args{
#ifdef CAC_ANSI_FUNC_PROTO
epicsShareFunc short epicsShareAPI ca_get_field_type (chid chan);
epicsShareFunc unsigned short epicsShareAPI ca_get_element_count (chid chan);
/************************************************************************/
/* Perform Library Initialization */
/* */
@@ -1064,7 +1067,8 @@ epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
#endif /*CA_DONT_INCLUDE_STDARGH*/
#else /* CAC_ANSI_FUNC_PROTO */
epicsShareFunc short epicsShareAPI ca_get_field_type ();
epicsShareFunc unsigned short epicsShareAPI ca_get_element_count ();
epicsShareFunc int epicsShareAPI ca_task_initialize ();
epicsShareFunc int epicsShareAPI ca_task_exit ();
epicsShareFunc int epicsShareAPI ca_search_and_connect ();

View File

@@ -47,6 +47,9 @@
/* address in use so that test works on UNIX */
/* kernels that support multicast */
/* $Log$
* Revision 1.74 1998/02/05 22:29:42 jhill
* use osiSock macros
*
* Revision 1.73 1997/08/04 23:37:09 jhill
* added beacon anomaly flag init/allow ip 255.255.255.255
*
@@ -1440,8 +1443,8 @@ void cacDisconnectChannel(ciu chix, enum channel_state state)
{
LOCK;
chix->type = TYPENOTCONN;
chix->count = 0u;
chix->privType = TYPENOTCONN;
chix->privCount = 0u;
chix->id.sid = ~0u;
chix->ar.read_access = FALSE;
chix->ar.write_access = FALSE;

View File

@@ -32,6 +32,11 @@
/************************************************************************/
/* $Log$
* Revision 1.68 1998/02/20 21:52:21 evans
* Added an explicit include of tsDefs.h before cadef.h to avoid the
* functions in it being declared as export and also to avoid its
* allocating space when it should be declaring a reference.
*
* Revision 1.67 1998/02/05 22:30:34 jhill
* fixed dll export problems
*
@@ -736,7 +741,7 @@ void genLocalExcepWFL(long stat, char *ctx,
char *pFile, unsigned line);
#define genLocalExcep(STAT, PCTX) \
genLocalExcepWFL (STAT, PCTX, __FILE__, __LINE__)
void cac_reconnect_channel(caResId id);
void cac_reconnect_channel(caResId id, short type, unsigned short count);
void retryPendingClaims(IIU *piiu);
void cacSetRetryInterval(unsigned retryNo);
void addToChanList(ciu chan, IIU *piiu);

View File

@@ -717,7 +717,7 @@ const struct in_addr *pnet_addr
break;
}
case CA_PROTO_CLAIM_CIU:
cac_reconnect_channel(piiu->curMsg.m_cid);
cac_reconnect_channel(piiu->curMsg.m_cid, piiu->curMsg.m_type, piiu->curMsg.m_count);
break;
case CA_PROTO_CLAIM_CIU_FAILED:
@@ -972,6 +972,11 @@ const struct in_addr *pnet_addr
*/
chan->id.sid = piiu->curMsg.m_cid;
if (!CA_V42(CA_PROTOCOL_VERSION, minorVersion)) {
chan->privType = piiu->curMsg.m_type;
chan->privCount = piiu->curMsg.m_count;
}
issue_claim_channel(chan);
UNLOCK
}
@@ -980,7 +985,7 @@ const struct in_addr *pnet_addr
/*
* cac_reconnect_channel()
*/
void cac_reconnect_channel(caResId cid)
void cac_reconnect_channel(caResId cid, short type, unsigned short count)
{
IIU *piiu;
evid pevent;
@@ -1015,9 +1020,14 @@ void cac_reconnect_channel(caResId cid)
chan->id.sid = piiu->curMsg.m_available;
}
/* Update rmt chid fields from caHdr fields */
chan->type = piiu->curMsg.m_type;
chan->count = piiu->curMsg.m_count;
/*
* Update rmt chid fields from caHdr fields
* if they are valid
*/
if (type != TYPENOTCONN) {
chan->privType = type;
chan->privCount = count;
}
/*
* set state to cs_conn before caling

View File

@@ -23,7 +23,7 @@ void epicsShareAPI 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);
ca_printf("CAC: Native channel data type\t%d\n", args.chid->type);
ca_printf("CAC: Native channel data type\t%d\n", ca_field_type(args.chid));
ca_printf("CAC: Monitor data type\t%d\n", args.type);
ca_printf("CAC: CA Status \"%s\"\n", ca_message(args.status));

View File

@@ -32,6 +32,9 @@
* Modification Log:
* -----------------
* $Log$
* Revision 1.32 1998/02/27 01:05:04 jhill
* integrated Timossi's win sock II changes
*
* Revision 1.1.1.3 1996/11/15 17:45:01 timossi
* Interim release from jeff hill
*
@@ -49,6 +52,9 @@
*
* Revision 1.19 1995/11/29 19:15:42 jhill
* added $Log$
* added Revision 1.32 1998/02/27 01:05:04 jhill
* added integrated Timossi's win sock II changes
* added
* Revision 1.1.1.3 1996/11/15 17:45:01 timossi
* Interim release from jeff hill
*
@@ -459,18 +465,14 @@ BOOL epicsShareAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
fprintf(stderr, "Process attached to ca.dll version %s\n", EPICS_VERSION_STRING);
#endif /* init. winsock */
if ((status = WSAStartup(MAKEWORD(/*major*/2,/*minor*/2), &WsaData)) != 0) {
/*
* The winsock I & II doc indicate that these steps are not required,
* but experience at some sites proves otherwise. Perhaps some vendors
* do not follow the protocol described in the doc.
*/
if ((status = WSAStartup(MAKEWORD(/*major*/1,/*minor*/1), &WsaData)) != 0) {
if ((status = WSAStartup(MAKEWORD(/*major*/1,/*minor*/0), &WsaData)) != 0) {
WSACleanup();
fprintf(stderr,"Unable to attach to winsock version 2.2 or lower\n");
return FALSE;
}
}
WSACleanup();
fprintf(stderr,
"Unable to attach to windows sockets version 2. error=%d\n", status);
fprintf(stderr,
"A Windows Sockets II update for windows 95 is available at\n");
fprintf(stderr,
"http://www.microsoft.com/win32dev/netwrk/winsock2/ws295sdk.html");
return FALSE;
}
#if _DEBUG

View File

@@ -131,8 +131,8 @@ HDRVERSIONID(cadefh, "@(#) $Id$")
* recommended that the following MACROS be used to access them.
*
*/
#define ca_field_type(CHID) ((CHID)->type)
#define ca_element_count(CHID) ((CHID)->count)
#define ca_field_type(CHID) (ca_get_field_type(CHID))
#define ca_element_count(CHID) (ca_get_element_count(CHID))
#define ca_name(CHID) ((READONLY char *)((CHID)+1))
/*
* the odd cast here removes const (and allows past practice
@@ -196,9 +196,9 @@ typedef void caArh();
*/
struct channel_in_use{
ELLNODE node; /* list ptrs */
short type; /* database field type */
short privType; /* database field type */
#define TYPENOTCONN (-1) /* the type when disconnected */
unsigned short count; /* array element count */
unsigned short privCount; /* array element count */
union{
unsigned sid; /* server id */
struct dbAddr *paddr; /* database address */
@@ -308,6 +308,9 @@ struct exception_handler_args{
#ifdef CAC_ANSI_FUNC_PROTO
epicsShareFunc short epicsShareAPI ca_get_field_type (chid chan);
epicsShareFunc unsigned short epicsShareAPI ca_get_element_count (chid chan);
/************************************************************************/
/* Perform Library Initialization */
/* */
@@ -1064,7 +1067,8 @@ epicsShareFunc int epicsShareAPI ca_replace_printf_handler (
#endif /*CA_DONT_INCLUDE_STDARGH*/
#else /* CAC_ANSI_FUNC_PROTO */
epicsShareFunc short epicsShareAPI ca_get_field_type ();
epicsShareFunc unsigned short epicsShareAPI ca_get_element_count ();
epicsShareFunc int epicsShareAPI ca_task_initialize ();
epicsShareFunc int epicsShareAPI ca_task_exit ();
epicsShareFunc int epicsShareAPI ca_search_and_connect ();