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_));
}