#ifndef JAWS_BUILD_DLL #define JAWS_BUILD_DLL #endif #include "jaws3/Protocol_Handler.h" #include "jaws3/Concurrency.h" JAWS_Protocol_State::~JAWS_Protocol_State () { } JAWS_Protocol_Handler::JAWS_Protocol_Handler ( JAWS_Protocol_State *state , void *data ) : state_ (state) , data_ (data) , mb_ (& this->db_) { this->db_.base ((char *) this, 0 /* an infinite queue */); } JAWS_Protocol_Handler::~JAWS_Protocol_Handler () { this->mb_.replace_data_block (0); } int JAWS_Protocol_Handler::service () { if (this->state_ == 0) return -1; return this->state_->service (this, this->data_); } void JAWS_Protocol_Handler::event_complete ( const JAWS_Event_Result &result , void *act ) { // This call is done in the context of the dispatching // thread (e.g., by the Reactor thread, or by one of the // threads in the Proactor, or by the invoker of the IO // if the IO is synchronous). this->state_ = this->state_->transition (result, this->data_, act); // At this point, we need to cue this Handler back into // the concurrency mechanism. This probably means the // Message Queue of some Concurrency Task. JAWS_Concurrency::instance ()->putq (this); // Doing it this way is less efficient than calling into // the service() method of the next state directly from // here, but it gains the flexibility of a more modular // concurrency mechanism. }