www.pudn.com > ACEProactor.rar > acceptor.cpp, change:2006-01-23,size:2709b


// Acceptor.cpp: implementation of the Acceptor class. 
// 
////////////////////////////////////////////////////////////////////// 
#include "ace\Global_Macros.h" 
#include "Acceptor.h" 
#include "Receiver.h" 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
 
// ************************************************************* 
Acceptor::Acceptor (void) 
: sessions_ (0), 
total_snd_(0), 
total_rcv_(0), 
total_w_  (0), 
total_r_  (0) 
{ 
	ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_); 
	 
	for (int i = 0; i  MAX_RECEIVERS; ++i) 
		this->list_receivers_[i] = 0; 
} 
 
Acceptor::~Acceptor (void) 
{ 
	this->stop (); 
} 
 
 
void 
Acceptor::cancel_all (void) 
{ 
	ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_); 
	 
	this->cancel (); 
	 
	for (int i = 0; i  MAX_RECEIVERS; ++i) 
    { 
		if (this->list_receivers_[i] != 0) 
			this->list_receivers_[i]->cancel (); 
    } 
	return; 
} 
 
 
void 
Acceptor::stop (void) 
{ 
	// This method can be called only after proactor event loop is done 
	// in all threads. 
	 
	ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_); 
	 
	for (int i = 0; i  MAX_RECEIVERS; ++i) 
    { 
		delete this->list_receivers_[i]; 
		this->list_receivers_[i] = 0; 
    } 
} 
 
void 
Acceptor::on_new_receiver (Receiver & rcvr) 
{ 
	ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_); 
	this->sessions_++; 
	this->list_receivers_[rcvr.index_] = &rcvr; 
	ACE_DEBUG ((LM_DEBUG, 
		ACE_TEXT ("(%t) Acceptor: receiver %d up; now have %d.\n"), 
		rcvr.index_, 
		this->sessions_)); 
} 
Receiver * 
Acceptor::make_handler (void) 
{ 
	ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_, 0); 
	 
	if (this->sessions_ >= MAX_RECEIVERS) 
		return 0; 
	 
	for (int i = 0; i  MAX_RECEIVERS; ++i) 
    { 
		if (this->list_receivers_[i] == 0) 
        { 
			ACE_NEW_RETURN (this->list_receivers_[i], 
				Receiver (this, i), 
				0); 
			return this->list_receivers_[i]; 
        } 
    } 
	 
	return 0; 
} 
void 
Acceptor::on_delete_receiver (Receiver & rcvr) 
{ 
	ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, monitor, this->lock_); 
	 
	this->sessions_--; 
	 
	this->total_snd_ += rcvr.get_total_snd(); 
	this->total_rcv_ += rcvr.get_total_rcv(); 
	this->total_w_   += rcvr.get_total_w(); 
	this->total_r_   += rcvr.get_total_r(); 
	 
	if (rcvr.index_ >= 0 
		&& rcvr.index_  MAX_RECEIVERS 
		&& this->list_receivers_[rcvr.index_] == &rcvr) 
		this->list_receivers_[rcvr.index_] = 0; 
	 
	ACE_DEBUG ((LM_DEBUG, 
		ACE_TEXT ("(%t) Acceptor: receiver %d gone; %d remain\n"), 
		rcvr.index_, 
		this->sessions_)); 
}