42template<
class SERVICE_HANDLER,
class PEER_ACCEPTOR>
68 virtual int close (
void);
134#define SH SERVICE_HANDLER
135#define PA PEER_ACCEPTOR
141template<
class SH,
class PA>
147 trace(
"Acceptor::Acceptor");
150template<
class SH,
class PA>
155 trace(
"Acceptor::~Acceptor");
158template<
class SH,
class PA>
163 trace(
"Acceptor::close");
164 m_listenSocket.close ();
168template<
class SH,
class PA>
173 trace(
"Acceptor::handle_close");
180 DL ((
REACT,
"Deleted acceptor \"%s\"\n", get_id ().c_str ()));
185template<
class SH,
class PA>
186inline SERVICE_HANDLER*
190 trace(
"Acceptor<>::makeServiceHandler");
192 return new SERVICE_HANDLER (sock_);
195template<
class SH,
class PA>
200 trace(
"Acceptor::acceptServiceHandler");
202 new_socket_ = m_listenSocket.accept ();
203 return new_socket_ ? 0 : -1;
206template<
class SH,
class PA>
int
210 trace(
"Acceptor::activateServiceHandler");
215 SH* sh = makeServiceHandler (new_socket_);
216 if (sh->open () < 0) {
222template<
class SH,
class PA>
int
226 trace(
"Acceptor::open");
228 if ( !m_listenSocket.open (local_addr_.
getAddress ()->sa_family) ) {
232 if ( !m_listenSocket.bind (local_addr_) ) {
236 m_reactor->registerIOHandler (
237 this, m_listenSocket.getHandler (),
READ_EVENT);
239 DL((
TRACE,
"Opened acceptor for fd=%d\n",
240 m_listenSocket.getHandler ()));
250template <
class SH,
class PA>
int
254 trace(
"Acceptor<>::handle_read");
257 timeval poll = {0, 0};
260 int fd = m_listenSocket.getHandler ();
267 if ( acceptServiceHandler (new_socket) == -1 ) {
270 if ( !activateServiceHandler (new_socket) == -1 ) {
276 while ((::select (fd+1, &mask, NULL, NULL, &poll) == 1));
Address is an abstraction for INET or UNIX-domain address data type.
An abstract interface for handling I/O events, timers, and such.
An abstraction to message logging facility.
#define trace(s)
trace() is used to trace function call chain in C++ program.
#define DL(X)
A macro for writing debug message to the Logger.
An implementation of Reactor pattern.
This abstract class provides generic interface for processing services.
virtual int acceptServiceHandler(PEER_ACCEPTOR *&new_socket_)
Default strategy is to accept new connection.
PEER_ACCEPTOR m_listenSocket
Underlying communication stream.
int handle_read(int fd)
Callback invoked by Reactor when new connection requests is detected.
virtual SERVICE_HANDLER * makeServiceHandler(PEER_ACCEPTOR *sock_)
Defines creation strategy for ServiceHandler.
virtual int handle_close(int fd)
Callback invoked by Reactor if PEER_ACCEPTOR stream went bad, or Reactor has been commanded to stop e...
Reactor * m_reactor
Reactor to use.
virtual int close(void)
Close PEER_ACCEPTOR stream.
virtual ~Acceptor()
Do-nothing destructor.
Acceptor(Reactor *r_)
Default constructor.
virtual int activateServiceHandler(PEER_ACCEPTOR *new_socket_)
Defines the concurrency strategy.
virtual int open(const Address &local_addr_)
Initialize listener endpoint and Acceptor with Reactor.
virtual SA * getAddress() const =0
Retrieve pointer to the address structure.
void reset()
Reset every bit in the set (OFF).
bool setFd(handler_t fd_)
Set flag (ON) for the argument fd.
@ READ_EVENT
Notify when there will be at least 1 byte available for reading from IO channel without blocking .
@ REACT
Class Reactor/PrioriyQueue messages
@ TRACE
Function call trace