libassa 3.5.1
Loading...
Searching...
No Matches
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_HANDLERmakeServiceHandler (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

◆ Acceptor()

Default constructor.

Parameters
r_Reactor to use

Definition at line 143 of file Acceptor.h.

145 : m_reactor (r_)
146{
147 trace("Acceptor::Acceptor");
148}
#define trace(s)
trace() is used to trace function call chain in C++ program.
Definition Logger.h:429
Reactor * m_reactor
Reactor to use.
Definition Acceptor.h:129

References trace.

◆ ~Acceptor()

Do-nothing destructor.

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

Definition at line 152 of file Acceptor.h.

154{
155 trace("Acceptor::~Acceptor");
156}

References trace.

Member Function Documentation

◆ acceptServiceHandler()

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 197 of file Acceptor.h.

199{
200 trace("Acceptor::acceptServiceHandler");
201
202 new_socket_ = m_listenSocket.accept ();
203 return new_socket_ ? 0 : -1;
204}
PEER_ACCEPTOR m_listenSocket
Underlying communication stream.
Definition Acceptor.h:123

References trace.

◆ activateServiceHandler()

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 207 of file Acceptor.h.

209{
210 trace("Acceptor::activateServiceHandler");
211
212 if (!new_socket_) {
213 return -1;
214 }
215 SH* sh = makeServiceHandler (new_socket_);
216 if (sh->open () < 0) {
217 sh->close ();
218 }
219 return 0;
220}
#define SH
Definition Acceptor.h:134
virtual SERVICE_HANDLER * makeServiceHandler(PEER_ACCEPTOR *sock_)
Defines creation strategy for ServiceHandler.
Definition Acceptor.h:188

References SH, and trace.

◆ close()

Close PEER_ACCEPTOR stream.

Returns
0 on success, -1 on error.

Definition at line 160 of file Acceptor.h.

162{
163 trace("Acceptor::close");
164 m_listenSocket.close ();
165 return 0;
166}

References trace.

◆ handle_close()

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 170 of file Acceptor.h.

172{
173 trace("Acceptor::handle_close");
174
175 // Reactor::get_instance ()->removeHandler (this->id());
176
177 // NOT IMPLEMENTED: This spot requires validation
178 // whether Acceptor is created on the heap or in
179 // automatic memory.
180 DL ((REACT,"Deleted acceptor \"%s\"\n", get_id ().c_str ()));
181 delete this;
182 return -1;
183}
#define DL(X)
A macro for writing debug message to the Logger.
Definition Logger.h:273
std::string get_id() const
Retrieve EventHandler ID.
@ REACT
Class Reactor/PrioriyQueue messages
Definition LogMask.h:39

References DL, ASSA::REACT, and trace.

◆ handle_read()

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 251 of file Acceptor.h.

253{
254 trace("Acceptor<>::handle_read");
255
256 FdSet mask;
257 timeval poll = {0, 0};
258 PA* new_socket = 0;
259
260 int fd = m_listenSocket.getHandler ();
261
262 if (fd != fd_) {
263 return -1;
264 }
265
266 do {
267 if ( acceptServiceHandler (new_socket) == -1 ) {
268 return -1;
269 }
270 if ( !activateServiceHandler (new_socket) == -1 ) {
271 return -1;
272 }
273 mask.reset ();
274 mask.setFd (fd);
275 }
276 while ((::select (fd+1, &mask, NULL, NULL, &poll) == 1));
277
278 return 0;
279}
#define PA
Definition Acceptor.h:135
virtual int acceptServiceHandler(PEER_ACCEPTOR *&new_socket_)
Default strategy is to accept new connection.
Definition Acceptor.h:198
virtual int activateServiceHandler(PEER_ACCEPTOR *new_socket_)
Defines the concurrency strategy.
Definition Acceptor.h:208

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

◆ makeServiceHandler()

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 187 of file Acceptor.h.

189{
190 trace("Acceptor<>::makeServiceHandler");
191
192 return new SERVICE_HANDLER (sock_);
193}

References trace.

◆ open()

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 223 of file Acceptor.h.

225{
226 trace("Acceptor::open");
227
228 if ( !m_listenSocket.open (local_addr_.getAddress ()->sa_family) ) {
229 return -1;
230 }
231
232 if ( !m_listenSocket.bind (local_addr_) ) {
233 return -1;
234 }
235
237 this, m_listenSocket.getHandler (), READ_EVENT);
238
239 DL((TRACE,"Opened acceptor for fd=%d\n",
240 m_listenSocket.getHandler ()));
241
242 return 0;
243}
bool registerIOHandler(EventHandler *eh_, handler_t fd_, EventType et_=RWE_EVENTS)
Register I/O Event handler with Reactor.
Definition Reactor.cpp:93
@ READ_EVENT
Notify when there will be at least 1 byte available for reading from IO channel without blocking .
@ TRACE
Function call trace
Definition LogMask.h:26

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

Member Data Documentation

◆ m_listenSocket

Underlying communication stream.

Definition at line 123 of file Acceptor.h.

◆ m_reactor

Reactor to use.

Definition at line 129 of file Acceptor.h.


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