summaryrefslogtreecommitdiff
path: root/TAO/tao/Synch_Reply_Dispatcher.h
blob: ec6aabe157ba7d24585485d39c495661ccec3662 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// This may look like C, but it's really -*- C++ -*-


//=============================================================================
/**
 *  @file    Synch_Reply_Dispatcher.h
 *
 *  $Id$
 *
 *   Dispatch the reply appropriately.
 *
 *
 *  @author  Alexander Babu Arulanthu <alex@cs.wustl.edu>
 */
//=============================================================================


#ifndef TAO_SYNCH_REPLY_DISPATCHER_H
#define TAO_SYNCH_REPLY_DISPATCHER_H
#include "ace/pre.h"

#include "tao/Reply_Dispatcher.h"
#include "tao/GIOP_Message_Version.h"

#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */

class TAO_Wait_Strategy;
class TAO_Pluggable_Reply_Params;

/**
 * @class TAO_Synch_Reply_Dispatcher
 *
 * @brief Reply dispatcher for Synchoronous Method Invocation (SMI)s.
 *
 */
class TAO_Export TAO_Synch_Reply_Dispatcher : public TAO_Reply_Dispatcher
{

public:
  /// Constructor.
  TAO_Synch_Reply_Dispatcher (TAO_ORB_Core *orb_core,
                              IOP::ServiceContextList &sc);

  /// Destructor.
  virtual ~TAO_Synch_Reply_Dispatcher (void);

  /// Return the reply CDR.
  TAO_InputCDR &reply_cdr (void);

  /// A flag to check if the reply
  int &reply_received (void);

  virtual int dispatch_reply (TAO_Pluggable_Reply_Params &params);

  // Commented for the time being - Bala
  // virtual TAO_GIOP_Message_State *message_state (void);

  virtual void dispatcher_bound (TAO_Transport *);

  virtual void connection_closed (void);

protected:
  /// The service context list
  IOP::ServiceContextList &reply_service_info_;

private:
  /// Flag that indicates the reply  has been received.
  int reply_received_;

  /// Cache the ORB Core pointer.
  TAO_ORB_Core *orb_core_;

  /// Save the wait strategy to signal the waiting threads (if
  /// appropriate).
  TAO_Wait_Strategy *wait_strategy_;

  /* @@todo: At some point of time we are going to get to a situation
     where TAO has huge stack sizes. Need to think on how we would
     deal with that. One idea would be to push these things on TSS as
     this is created by the thread on a per invocation basis. Post 1.2
     would be a nice time for that I guess
  */

  /// The buffer that is used to initialise the data block
  char buf_[ACE_CDR::DEFAULT_BUFSIZE];

  /// datablock that is created on teh stack to initialise the CDR
  /// stream underneath.
  ACE_Data_Block db_;

  /// CDR stream which has the reply information that needs to be
  /// demarshalled by the stubs
  TAO_InputCDR reply_cdr_;

  /**
   * The condition variable used to signal the waiting thread in the
   * Leader/Followers model.  The variable is acquired in the thread
   * that binds the Reply_Dispatcher to its transport, and then passed
   * to the Waiting_Strategy to do the signalling, if needed.
   */
  TAO_SYNCH_CONDITION *leader_follower_condition_variable_;
};

#include "ace/post.h"
#endif /* TAO_REPLY_DISPATCHER_H */