libassa  3.5.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Public Member Functions | Protected Member Functions | Protected Attributes | Private Attributes | List of all members
ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR > Class Template Reference

#include <Acceptor.h>

Inheritance diagram for ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >:
ASSA::EventHandler

Public Member Functions

 Acceptor (Reactor *r_)
 Default constructor.
virtual ~Acceptor ()
 Do-nothing destructor.
virtual int open (const Address &local_addr_)
 Initialize listener endpoint and Acceptor with Reactor.
virtual int close (void)
 Close PEER_ACCEPTOR stream.
int handle_read (int fd)
 Callback invoked by Reactor when new connection requests is detected.
virtual int handle_close (int fd)
 Callback invoked by Reactor if PEER_ACCEPTOR stream went bad, or Reactor has been commanded to stop event processing.
- Public Member Functions inherited from ASSA::EventHandler
 EventHandler ()
 Constructor.
virtual ~EventHandler ()
 Virtual destructor.
virtual int handle_write (int fd)
 Write handler callback.
virtual int handle_except (int fd)
 Exception handler callback.
virtual int handle_timeout (TimerId tid)
 Timeout handler callback.
virtual int handle_signal (int signum_)
 Signal handler callback.
virtual void resetState (void)
 A hook for derived class to reset internal state as needed.
void set_id (const std::string &id_)
 Set EventHandler ID.
std::string get_id () const
 Retrieve EventHandler ID.

Protected Member Functions

virtual SERVICE_HANDLER * makeServiceHandler (PEER_ACCEPTOR *sock_)
 Defines creation strategy for ServiceHandler.
virtual int acceptServiceHandler (PEER_ACCEPTOR *&new_socket_)
 Default strategy is to accept new connection.
virtual int activateServiceHandler (PEER_ACCEPTOR *new_socket_)
 Defines the concurrency strategy.

Protected Attributes

PEER_ACCEPTOR m_listenSocket
 Underlying communication stream.
- Protected Attributes inherited from ASSA::EventHandler
std::string m_id

Private Attributes

Reactorm_reactor
 Reactor to use.

Detailed Description

template<class SERVICE_HANDLER, class PEER_ACCEPTOR>
class ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >

Definition at line 43 of file Acceptor.h.

Constructor & Destructor Documentation

template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::Acceptor ( Reactor r_)
inline

Default constructor.

Parameters
r_Reactor to use

Definition at line 144 of file Acceptor.h.

References trace.

: m_reactor (r_)
{
trace("Acceptor::Acceptor");
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::~Acceptor ( )
inlinevirtual

Do-nothing destructor.

Underlying PEER_ACCEPTOR stream will be closed during its own destruction sequence.

Definition at line 153 of file Acceptor.h.

References trace.

{
trace("Acceptor::~Acceptor");
}

Member Function Documentation

template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::acceptServiceHandler ( PEER_ACCEPTOR *&  new_socket_)
inlineprotectedvirtual

Default strategy is to accept new connection.

Derived class can change this strategy by overloading this method.

Parameters
new_socket_On return will have a pointer to newly created PEER_STREAM, or =0 if failed
Returns
0 on success, -1 on error.

Definition at line 198 of file Acceptor.h.

References trace.

{
trace("Acceptor::acceptServiceHandler");
new_socket_ = m_listenSocket.accept ();
return new_socket_ ? 0 : -1;
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::activateServiceHandler ( PEER_ACCEPTOR *  new_socket_)
protectedvirtual

Defines the concurrency strategy.

Default is to create SERVICE_HANDLERin current process(thread), call its open() methid and let Reactor handle its I/O events. Derived class changes this strategy by overloading this class.

Parameters
new_socket_[in] PEER_STREAM pointer to activate
Returns
0 on success, -1 on error.

Definition at line 208 of file Acceptor.h.

References SH, and trace.

{
trace("Acceptor::activateServiceHandler");
if (!new_socket_) {
return -1;
}
SH* sh = makeServiceHandler (new_socket_);
if (sh->open () < 0) {
sh->close ();
}
return 0;
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::close ( void  )
inlinevirtual

Close PEER_ACCEPTOR stream.

Returns
0 on success, -1 on error.

Definition at line 161 of file Acceptor.h.

References trace.

{
trace("Acceptor::close");
m_listenSocket.close ();
return 0;
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::handle_close ( int  fd)
inlinevirtual

Callback invoked by Reactor if PEER_ACCEPTOR stream went bad, or Reactor has been commanded to stop event processing.

This method should always return -1, if stream cannot be repared. Derived class can change this strategy by overloading this method. If called object is other then Reactor, an explicit call to Reactor::removeHandler (this->id()) is required. By default behavior, Acceptor will destroy itself.

Returns
-1 always

Reimplemented from ASSA::EventHandler.

Definition at line 171 of file Acceptor.h.

References DL, ASSA::REACT, and trace.

{
trace("Acceptor::handle_close");
// Reactor::get_instance ()->removeHandler (this->id());
// NOT IMPLEMENTED: This spot requires validation
// whether Acceptor is created on the heap or in
// automatic memory.
DL ((REACT,"Deleted acceptor \"%s\"\n", get_id ().c_str ()));
delete this;
return -1;
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::handle_read ( int  fd)
virtual

Callback invoked by Reactor when new connection requests is detected.

Default strategy is to accept ALL awaiting incoming connections at once. Derived class can change this strategy by overloading this method.

Returns
0 on success, -1 on error. Returning -1 will effectively instruct Reactor to remove this Handler from the Reactor.

Reimplemented from ASSA::EventHandler.

Definition at line 252 of file Acceptor.h.

References PA, ASSA::FdSet::reset(), ASSA::FdSet::setFd(), and trace.

{
trace("Acceptor<>::handle_read");
FdSet mask;
timeval poll = {0, 0};
PA* new_socket = 0;
int fd = m_listenSocket.getHandler ();
if (fd != fd_) {
return -1;
}
do {
if ( acceptServiceHandler (new_socket) == -1 ) {
return -1;
}
if ( !activateServiceHandler (new_socket) == -1 ) {
return -1;
}
mask.reset ();
mask.setFd (fd);
}
while ((::select (fd+1, &mask, NULL, NULL, &poll) == 1));
return 0;
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
SERVICE_HANDLER * ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::makeServiceHandler ( PEER_ACCEPTOR *  sock_)
inlineprotectedvirtual

Defines creation strategy for ServiceHandler.

Returns
pointer to SERVICE_HANDLER

Definition at line 188 of file Acceptor.h.

References trace.

{
trace("Acceptor<>::makeServiceHandler");
return new SERVICE_HANDLER (sock_);
}
template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
int ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::open ( const Address local_addr_)
virtual

Initialize listener endpoint and Acceptor with Reactor.

Derive classes can change this strategy by overloading this method.

Returns
0 on success, -1 on error. An error can be if either PEER_ACCEPTOR's open() or bind() failed.

Definition at line 224 of file Acceptor.h.

References DL, ASSA::Address::getAddress(), ASSA::READ_EVENT, ASSA::TRACE, and trace.

{
trace("Acceptor::open");
if ( !m_listenSocket.open (local_addr_.getAddress ()->sa_family) ) {
return -1;
}
if ( !m_listenSocket.bind (local_addr_) ) {
return -1;
}
this, m_listenSocket.getHandler (), READ_EVENT);
DL((TRACE,"Opened acceptor for fd=%d\n",
m_listenSocket.getHandler ()));
return 0;
}

Member Data Documentation

template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
PEER_ACCEPTOR ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::m_listenSocket
protected

Underlying communication stream.

Definition at line 123 of file Acceptor.h.

template<class SERVICE_HANDLER , class PEER_ACCEPTOR >
Reactor* ASSA::Acceptor< SERVICE_HANDLER, PEER_ACCEPTOR >::m_reactor
private

Reactor to use.

Definition at line 129 of file Acceptor.h.


The documentation for this class was generated from the following file: