|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 5047 (0x13b7) Types: TextFile Names: »conn_retry.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z« └─⟦de7628f85⟧ └─⟦this⟧ »isode-6.0/quipu/conn_retry.c«
/* conn_retry.c - deal with asynchronous A-Associate events */ #ifndef lint static char *rcsid = "$Header: /f/osi/quipu/RCS/conn_retry.c,v 7.0 89/11/23 22:16:56 mrose Rel $"; #endif /* * $Header: /f/osi/quipu/RCS/conn_retry.c,v 7.0 89/11/23 22:16:56 mrose Rel $ * * * $Log: conn_retry.c,v $ * Revision 7.0 89/11/23 22:16:56 mrose * Release 6.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ #include "acsap.h" #include "rosap.h" #include "quipu/util.h" #include "quipu/connection.h" extern LLog * log_dsap; extern time_t time(); extern time_t nsap_timeout; #ifndef NO_STATS extern LLog * log_stat; extern int dn_print(); #endif Conn conn_alloc(); /* * Deal with an incoming acceptance of association establishment. * Return value says whether anything has happened or not. */ conn_retry(conn) struct connection * conn; { struct AcSAPconnect acc_s; struct AcSAPconnect *acc = &acc_s; struct AcSAPindication aci_s; struct AcSAPindication *aci = &aci_s; struct oper_act * on; struct oper_act * onext; struct oper_act * ont = NULLOPER; int result; int pstate; time_t timenow; DLOG (log_dsap,LLOG_TRACE,( "conn_retry()")); timenow = time((time_t *) 0); pstate = conn->cn_state; if (timenow - conn->cn_last_used >= nsap_timeout) { /* this NSAP has had long enough - try the next one... */ LLOG (log_dsap,LLOG_NOTICE,("NSAP hanging (%d)...",conn->cn_ad)); watch_dog ("AcAsynNextRequest"); result = AcAsynNextRequest(conn->cn_ad, acc, aci); watch_dog_reset (); conn->cn_last_used = timenow; /* restart timer */ } else { watch_dog ("AcAsynRetryRequest"); result = AcAsynRetryRequest(conn->cn_ad, acc, aci); watch_dog_reset (); } switch(result) { case CONNECTING_1: DLOG (log_dsap,LLOG_NOTICE,("A-ASSOCIATE.RETRY CONNECTING_1 (%d)",conn->cn_ad)); conn->cn_state = CN_CONNECTING1; ACCFREE(acc); break; case CONNECTING_2: DLOG (log_dsap,LLOG_NOTICE,("A-ASSOCIATE.RETRY CONNECTING_2 (%d)",conn->cn_ad)); conn->cn_state = CN_CONNECTING2; ACCFREE(acc); break; case NOTOK : DLOG (log_dsap,LLOG_NOTICE,( "A-ASSOCIATE.RETRY NOTOK")); conn->cn_state = CN_FAILED; #ifndef NO_STATS (void) dn_decode(conn->cn_what); pslog(log_stat, LLOG_NOTICE, "Failed (RETRY NOTOK)", dn_print, (caddr_t) conn->cn_what); #endif dsa_reliable (conn,FALSE,time((time_t *) 0)); for(on=conn->cn_operlist; on!=NULLOPER; on=onext) { onext = on->on_next_conn; /* See if there is another DSA to try... */ if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) { LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (NOTOK)...")); if (oper_chain (on) == OK) { if (ont == NULLOPER) conn->cn_operlist = onext; else ont->on_next_conn = onext; continue; } } /* No - we can't do it !!! */ oper_fail_wakeup(on); ont = on; } conn_extract(conn); if (aci->aci_type == ACI_ABORT) ACAFREE (&aci->aci_abort); break; case DONE : DLOG (log_dsap,LLOG_NOTICE,( "A-ASSOCIATE.RETRY DONE (%d)",conn->cn_ad)); conn->cn_ad = acc->acc_sd; if( (conn->cn_ad == NOTOK) || (conn_req_aux(conn, acc) != OK)) { #ifndef NO_STATS (void) dn_decode(conn->cn_what); pslog(log_stat, LLOG_NOTICE, "Failed (RETRY DONE)", dn_print, (caddr_t) conn->cn_what); #endif dsa_reliable (conn,FALSE,time((time_t *) 0)); conn->cn_state = CN_FAILED; for(on=conn->cn_operlist; on!=NULLOPER; on=onext) { onext = on->on_next_conn; /* See if there is another DSA to try... */ if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) { LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (DONE)...")); if (oper_chain (on) == OK) { if (ont == NULLOPER) conn->cn_operlist = onext; else ont->on_next_conn = onext; continue; } } oper_fail_wakeup(on); ont = on; } DLOG(log_dsap, LLOG_DEBUG, ("conn_retry calling conn_extract 1")); conn_extract(conn); ACCFREE(acc); return; } ACCFREE(acc); for(on=conn->cn_operlist; on!=NULLOPER; on=on->on_next_conn) { if (on->on_state == ON_ABANDONED) oper_fail_wakeup(on); else if (oper_send_invoke(on) != OK) { LLOG (log_dsap,LLOG_EXCEPTIONS,("oper_send_invoke failed in conn_retry")); oper_log(on); oper_fail_wakeup(on); } } break; default : DLOG(log_dsap, LLOG_DEBUG, ("conn_retry calling conn_extract 2")); for(on=conn->cn_operlist; on!=NULLOPER; on=on->on_next_conn) { oper_fail_wakeup(on); } conn_extract(conn); ACCFREE(acc); break; } /* switch retry */ if (pstate != conn->cn_state) conn->cn_last_used = time((time_t *) 0); }