summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/orbsvcs/Event/EC_Kokyu_Dispatching.h
blob: ec54bc03226dcd2570d31862557a76971a898363 (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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// -*- C++ -*-

/**
 *  @file   EC_Kokyu_Dispatching.h
 *
 *  $Id$
 *
 *  @author Bryan Thrall (thrall@cs.wustl.edu)
 *
 * Based on previous work by Carlos O'Ryan (coryan@cs.wustl.edu) and
 * Tim Harrison (harrison@cs.wustl.edu) and other members of the DOC group.
 * More details can be found in:
 *
 * http://doc.ece.uci.edu/~coryan/EC/index.html
 */

#ifndef TAO_EC_KOKYU_DISPATCHING_H
#define TAO_EC_KOKYU_DISPATCHING_H
#include /**/ "ace/pre.h"

#include "EC_Dispatching.h"
#include "EC_ProxySupplier.h"

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

#include "orbsvcs/RtecSchedulerC.h"
#include "rtkokyu_event_export.h"

#include "ace/Thread_Manager.h"

#include "Kokyu/Kokyu.h"

class TAO_EC_Event_Channel_Base;

/**
 * @class TAO_EC_Kokyu_Dispatching
 *
 * @brief Dispatching strategy that minimizes priority inversion.
 *
 * This strategy uses multiple queues, each serviced by a thread
 * at different priority.  This minimizes priority inversion
 * because the consumers at higher priority are serviced before
 * consumers at lower priority.
 * It is more flexible than using the supplier thread to dispatch
 * because it allows high-priority suppliers to push events to
 * low-priority consumers (and vice-versa).
 * It also isolates the supplier threads from the time spent on
 * upcalls to the consumer objects, making the system easier to
 * analyze and schedule.
 */
class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Dispatching : public TAO_EC_Dispatching
{
public:
  /// The scheduler is used to find the range of priorities and similar
  /// info.
  TAO_EC_Kokyu_Dispatching (TAO_EC_Event_Channel_Base* ec,
                            int sched_policy,
                            int sched_scope);

  // = The EC_Dispatching methods.
  virtual void activate (void);
  virtual void shutdown (void);
  virtual void push (TAO_EC_ProxyPushSupplier* proxy,
                     RtecEventComm::PushConsumer_ptr consumer,
                     const RtecEventComm::EventSet& event,
                     TAO_EC_QOS_Info& qos_info
                     ACE_ENV_ARG_DECL);
  virtual void push_nocopy (TAO_EC_ProxyPushSupplier* proxy,
                            RtecEventComm::PushConsumer_ptr consumer,
                            RtecEventComm::EventSet& event,
                            TAO_EC_QOS_Info& qos_info
                            ACE_ENV_ARG_DECL);

private:
  ACE_Allocator *allocator_;

  void setup_lanes (void);

  /// The dispatcher
  Kokyu::Dispatcher_Auto_Ptr dispatcher_;

  /// The scheduler
  RtecScheduler::Scheduler_var scheduler_;

  int lanes_setup_;
  int disp_sched_policy_;
  int disp_sched_scope_;
};

// ****************************************************************

class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Shutdown_Command : public Kokyu::Dispatch_Command
{
public:
  /// Constructor
  TAO_EC_Kokyu_Shutdown_Command (ACE_Allocator *allocator);

  /// Command callback
  virtual int execute (void);

protected:
  //Protected so can't be put on stack; must be dynamically allocated
  virtual ~TAO_EC_Kokyu_Shutdown_Command (void);

};

// ****************************************************************

class TAO_RTKokyuEvent_Export TAO_EC_Kokyu_Push_Command : public Kokyu::Dispatch_Command
{
public:
  /// Constructor
  TAO_EC_Kokyu_Push_Command (TAO_EC_ProxyPushSupplier* proxy,
                             RtecEventComm::PushConsumer_ptr consumer,
                             RtecEventComm::EventSet& event,
                             ACE_Allocator* allocator);

  /// Command callback
  virtual int execute (void);

protected:
  //Protected so can't be put on stack; must be dynamically allocated
  virtual ~TAO_EC_Kokyu_Push_Command (void);

private:
  /// The proxy
  TAO_EC_ProxyPushSupplier* proxy_;

  /// The consumer connected to the proxy when the event was pushed.
  RtecEventComm::PushConsumer_var consumer_;

  /// The event
  RtecEventComm::EventSet event_;
};

#if defined (__ACE_INLINE__)
#include "EC_Kokyu_Dispatching.i"
#endif /* __ACE_INLINE__ */

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