From 9bd5cdd198f7fed67af4db15385c512b0d11966b Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Wed, 31 May 2000 22:00:49 +0000 Subject: [PATCH] added local channel rundown and split mutex --- src/ca/cac.cpp | 103 +++++++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/src/ca/cac.cpp b/src/ca/cac.cpp index 89ba488ca..a4a157f02 100644 --- a/src/ca/cac.cpp +++ b/src/ca/cac.cpp @@ -51,9 +51,7 @@ cac::cac () : this->ca_exception_arg = NULL; this->ca_fd_register_func = NULL; this->ca_fd_register_arg = NULL; - this->ca_flush_pending = FALSE; this->ca_number_iiu_in_fc = 0u; - this->ca_manage_conn_active = FALSE; this->readSeq = 0u; this->ca_client_lock = semMutexCreate(); @@ -144,6 +142,18 @@ cac::~cac () { threadPrivateSet (caClientContextId, NULL); + // + // destroy local IO channels + // + this->defaultMutex.lock (); + tsDLIterBD iter ( this->localChanList.first () ); + while ( iter != tsDLIterBD ::eol () ) { + tsDLIterBD pnext = iter.itemAfter (); + iter->destroy (); + iter = pnext; + } + this->defaultMutex.unlock (); + // // make certain that process thread isnt deleting // tcpiiu objects at the same that this thread is @@ -153,7 +163,7 @@ cac::~cac () // // shutdown all tcp connections and wait for threads to exit // - this->iiuListLock.lock (); + this->iiuListMutex.lock (); tsDLIterBD piiu ( this->iiuListIdle.first () ); while ( piiu != piiu.eol () ) { tsDLIterBD pnext = piiu.itemAfter (); @@ -166,7 +176,7 @@ cac::~cac () piiu->suicide (); piiu = pnext; } - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); // // shutdown udp and wait for threads to exit @@ -231,16 +241,16 @@ void cac::processRecvBacklog () int status; unsigned bytesToProcess; - this->iiuListLock.lock (); + this->iiuListMutex.lock (); piiu = this->iiuListRecvPending.get (); if (!piiu) { - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); break; } piiu->recvPending = false; this->iiuListIdle.add (*piiu); - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); if (piiu->state == iiu_disconnected) { delete piiu; @@ -272,7 +282,7 @@ void cac::flush () /* * set the push pending flag on all virtual circuits */ - this->iiuListLock.lock (); + this->iiuListMutex.lock (); tsDLIterBD piiu ( this->iiuListIdle.first () ); while ( piiu != tsDLIterBD::eol () ) { piiu->flush (); @@ -283,7 +293,7 @@ void cac::flush () piiu->flush (); piiu++; } - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); } @@ -316,9 +326,9 @@ unsigned cac::connectionCount () const { unsigned count; - this->iiuListLock.lock (); + this->iiuListMutex.lock (); count = this->iiuListIdle.count () + this->iiuListRecvPending.count (); - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); return count; } @@ -329,7 +339,7 @@ void cac::show (unsigned level) const this->pudpiiu->show (level); } - this->iiuListLock.lock (); + this->iiuListMutex.lock (); tsDLIterConstBD piiu ( this->iiuListIdle.first () ); while ( piiu != piiu.eol () ) { @@ -343,17 +353,17 @@ void cac::show (unsigned level) const piiu++; } - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); UNLOCK (this); } void cac::installIIU (tcpiiu &iiu) { - this->iiuListLock.lock (); + this->iiuListMutex.lock (); iiu.recvPending = false; this->iiuListIdle.add (iiu); - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); if (this->ca_fd_register_func) { ( * this->ca_fd_register_func ) ( (void *) this->ca_fd_register_arg, iiu.sock, TRUE); @@ -364,7 +374,7 @@ void cac::signalRecvActivityIIU (tcpiiu &iiu) { bool change; - this->iiuListLock.lock (); + this->iiuListMutex.lock (); if ( iiu.recvPending ) { change = false; @@ -376,7 +386,7 @@ void cac::signalRecvActivityIIU (tcpiiu &iiu) change = true; } - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); // // wakeup after unlock improves performance @@ -388,7 +398,7 @@ void cac::signalRecvActivityIIU (tcpiiu &iiu) void cac::removeIIU (tcpiiu &iiu) { - this->iiuListLock.lock (); + this->iiuListMutex.lock (); if (iiu.recvPending) { this->iiuListRecvPending.remove (iiu); @@ -397,7 +407,7 @@ void cac::removeIIU (tcpiiu &iiu) this->iiuListIdle.remove (iiu); } - this->iiuListLock.unlock (); + this->iiuListMutex.unlock (); } /* @@ -787,37 +797,36 @@ void cac::registerService ( cacServiceIO &service ) bool cac::createChannelIO (const char *pName, cacChannel &chan) { - cacChannelIO *pIO; + cacLocalChannelIO *pIO; pIO = this->services.createChannelIO ( pName, chan ); - if ( pIO ) { - chan.attachIO ( *pIO ); - return true; - } - pIO = cacGlobalServiceList.createChannelIO ( pName, chan ); - if ( pIO ) { - chan.attachIO ( *pIO ); - return true; - } - if ( ! this->pudpiiu ) { - this->pudpiiu = new udpiiu ( this ); - if ( ! this->pudpiiu ) { - return false; + if ( ! pIO ) { + pIO = cacGlobalServiceList.createChannelIO ( pName, chan ); + if ( ! pIO ) { + if ( ! this->pudpiiu ) { + this->pudpiiu = new udpiiu ( this ); + if ( ! this->pudpiiu ) { + return false; + } + } + nciu *pNetChan = new nciu ( this, chan, pName ); + if ( pNetChan ) { + if ( ! pNetChan->fullyConstructed () ) { + pNetChan->destroy (); + return false; + } + else { + return true; + } + } + else { + return false; + } } } - nciu *pNetChan = new nciu ( this, chan, pName ); - if ( pNetChan ) { - if ( ! pNetChan->fullyConstructed () ) { - pNetChan->destroy (); - return false; - } - else { - chan.attachIO ( *pNetChan ); - return true; - } - } - else { - return false; - } + this->defaultMutex.lock (); + this->localChanList.add ( *pIO ); + this->defaultMutex.unlock (); + return true; }