From 6747d4e0e97d17caf08388a09031305401dae119 Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Thu, 6 Apr 1995 16:00:31 +0000 Subject: [PATCH] restored call to ca_flush_io() in ca_pend_event() also now uses caIOBlockListFree() --- src/ca/access.c | 116 +++++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 50 deletions(-) diff --git a/src/ca/access.c b/src/ca/access.c index 046c2509e..0b69e8f60 100644 --- a/src/ca/access.c +++ b/src/ca/access.c @@ -316,20 +316,13 @@ void *pext * we can time out */ if (bytesAvailable>=extsize+sizeof(msg)) { -# if DEBUG - If (piiu->sendPending) { - printf ("-Unblocked-\n"); - } -# endif /* DEBUG */ piiu->sendPending = FALSE; break; } else { if (!piiu->sendPending) { -# if DEBUG - printf ("-Blocked-\n"); -# endif /* DEBUG */ - piiu->timeAtSendBlock = ca_static->currentTime; + piiu->timeAtSendBlock = + ca_static->currentTime; piiu->sendPending = TRUE; } } @@ -506,6 +499,7 @@ int ca_os_independent_init (void) * init broadcasted search counters */ ca_static->ca_search_retry = 0; + ca_static->ca_search_responses = 0; ca_static->ca_conn_next_retry = CA_CURRENT_TIME; sec = (unsigned) CA_RECAST_DELAY; ca_static->ca_conn_retry_delay.tv_sec = sec; @@ -823,20 +817,10 @@ void ca_process_exit() } /* remove any pending read blocks */ - monix = (evid) ellFirst(&ca_static->ca_pend_read_list); - while (monix) { - monixNext = (evid) ellNext (&monix->node); - caIOBlockFree (monix); - monix = monixNext; - } + caIOBlockListFree (&ca_static->ca_pend_read_list, NULL, FALSE, ECA_INTERNAL); /* remove any pending write blocks */ - monix = (evid) ellFirst(&ca_static->ca_pend_write_list); - while (monix) { - monixNext = (evid) ellNext (&monix->node); - caIOBlockFree (monix); - monix = monixNext; - } + caIOBlockListFree (&ca_static->ca_pend_write_list, NULL, FALSE, ECA_INTERNAL); /* remove any pending io event blocks */ ellFree(&ca_static->ca_ioeventlist); @@ -1357,6 +1341,46 @@ void caIOBlockFree(evid pIOBlock) UNLOCK; } + +/* + * Free all io blocks on the list attached to the specified channel + */ +void caIOBlockListFree( +ELLLIST *pList, +chid chan, +int cbRequired, +int status) +{ + evid monix; + evid next; + struct event_handler_args args; + + for (monix = (evid) ellFirst (pList); + monix; + monix = next) { + + next = (evid) ellNext (&monix->node); + + if (chan == NULL || monix->chan == chan) { + + ellDelete (pList, &monix->node); + + args.usr = monix->usr_arg; + args.chid = monix->chan; + args.type = monix->type; + args.count = monix->count; + args.status = status; + args.dbr = NULL; + + caIOBlockFree (monix); + + if (cbRequired) { + (*monix->usr_func) (args); + } + } + } +} + /* * @@ -1755,11 +1779,11 @@ void *pvalue break; case DBR_FLOAT: - htonf(pvalue, pdest); + dbr_htonf(pvalue, pdest); break; case DBR_DOUBLE: - htond(pvalue, pdest); + dbr_htond(pvalue, pdest); break; case DBR_STRING: @@ -2177,9 +2201,9 @@ int ca_request_event(evid monix) 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); + dbr_htonf(&p_delta, &msg.m_info.m_hval); + dbr_htonf(&n_delta, &msg.m_info.m_lval); + dbr_htonf(&tmo, &msg.m_info.m_toval); msg.m_info.m_mask = htons(monix->mask); msg.m_info.m_pad = 0; /* allow future use */ @@ -2565,8 +2589,6 @@ void clearChannelResources(unsigned id) { struct ioc_in_use *piiu; chid chix; - evid monix; - evid next; int status; LOCK; @@ -2577,27 +2599,20 @@ void clearChannelResources(unsigned id) piiu = chix->piiu; /* - * remove any orphaned get callbacks for this - * channel + * remove any orphaned get callbacks for this channel */ - for (monix = (evid) ellFirst (&ca_static->ca_pend_read_list); - monix; - monix = next) { - next = (evid) ellNext (&monix->node); - if (monix->chan == chix) { - ellDelete ( - &ca_static->ca_pend_read_list, - &monix->node); - caIOBlockFree (monix); - } - } - for (monix = (evid) ellFirst (&chix->eventq); - monix; - monix = next){ - assert (monix->chan == chix); - next = (evid) ellNext (&monix->node); - caIOBlockFree(monix); - } + caIOBlockListFree (&ca_static->ca_pend_read_list, chix, FALSE, ECA_INTERNAL); + + /* + * remove any orphaned put callbacks for this channel + */ + caIOBlockListFree (&ca_static->ca_pend_write_list, chix, FALSE, ECA_INTERNAL); + + /* + * remove any monitors still attached to this channel + */ + caIOBlockListFree (&chix->eventq, NULL, FALSE, ECA_INTERNAL); + ellDelete (&piiu->chidlist, &chix->node); status = bucketRemoveItemUnsignedId ( ca_static->ca_pSlowBucket, &chix->cid); @@ -2610,6 +2625,7 @@ void clearChannelResources(unsigned id) UNLOCK; } + /************************************************************************/ /* This routine pends waiting for channel events and calls the */ @@ -2636,13 +2652,13 @@ int APIENTRY ca_pend(ca_real timeout, int early) /* * Flush the send buffers + * (guarantees that we wait for all send buffer to be + * flushed even if this requires blocking) * * Also takes care of outstanding recvs * for single threaded clients */ -#if 0 ca_flush_io(); -#endif if(pndrecvcnt<1 && early){ return ECA_NORMAL;