summaryrefslogtreecommitdiff
path: root/apps/JAWS3/jaws3/Protocol_Handler.cpp
blob: 4b2122b46d01285f1bb9a667f2ba9305b617ce95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// $Id$

#ifndef JAWS_BUILD_DLL
#define JAWS_BUILD_DLL
#endif

#include "jaws3/Protocol_Handler.h"
#include "jaws3/Concurrency.h"

JAWS_Protocol_State::~JAWS_Protocol_State (void)
{
}


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 (void)
{
  this->mb_.replace_data_block (0);
}


int 
JAWS_Protocol_Handler::service (void)
{
  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.
}