summaryrefslogtreecommitdiff
path: root/TAO/CIAO/tests/RTCCM/Priority_Test/Controllers/Rate_Controller.h
blob: 8da42be49a3de675b5ff7454d04adfea986b1e55 (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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// $Id$

/**
 * @file Rate_Controller.h
 *
 * Header file for the Rate Controller and Rate ControllerHome
 * component implementations.  These controller trigger a remote
 * worker at some rate to do some amount of work.
 *
 * We should make "hertz" a configurable parameter using a property
 * file, but, unfortunately, CIAO doesn't support this feature when
 * this executor at this time.  Therefore, we use different entry
 * points for the DLL to control the rate of the Rate_Controller.
 *
 * define macro: COLLECT_AND_DUMP_SAMPLE_HISTORY to collect and dump
 * sample history.
 *
 * @author Nanbor Wang <nanbor@cse.wustl.edu>
 */

#ifndef RATE_CONTROLLER_H
#define RATE_CONTROLLER_H

#include "ControllerEIC.h"
#include "tao/LocalObject.h"
#include "Pulser.h"
#include "ace/High_Res_Timer.h"
#include "ace/Stats.h"
#include "ace/Sample_History.h"

// The namespace name for the actual implementation classes doesn't
// really matter.  Since there may be several different
// implementations for a component, they can very well be in different
// namespaces.
namespace MyImpl
{
  /**
   * @class Rate_Controller_i
   *
   * A generic controller implementation.
   */
  class CONTROLLER_EXEC_Export Rate_Controller_i :
    public virtual PTImpl::Pulse_Handler,
    public virtual Priority_Test::Controller_Exec,
    // CIAO container implementation depends on correct reference
    // counting of local interfaces, so we take a short cut to
    public virtual TAO_Local_RefCounted_Object
  {
  public:
    /// Default constructor.
    Rate_Controller_i (CORBA::Long hertz);

    /// Default destructor.
    ~Rate_Controller_i ();

    // Operations from Priority_Test::Controller

    virtual void
    start (CORBA::Long arg
           ACE_ENV_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException));

    virtual void
    stop (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException));

    // Operations from Components::SessionComponent

    virtual void
    set_session_context (Components::SessionContext_ptr ctx
                         ACE_ENV_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException,
                       Components::CCMException));

    virtual void
    ccm_activate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException,
                       Components::CCMException));

    virtual void
    ccm_passivate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException,
                       Components::CCMException));

    virtual void
    ccm_remove (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException,
                       Components::CCMException));

    /// Callback
    virtual void
    pulse (void);

  protected:
    const CORBA::Long rate_;

    CORBA::Long work_;

    /// Copmponent specific context
    Priority_Test::CCM_Controller_Context_var context_;

    /// Pulser generate periodical events
    PTImpl::Pulser pulser_;

    // ------ Statistic related variables --------

    /// Amount of memory to allocate for performance samples.
    static const int sample_time_;     // in minute

    /// Mark the time when the "start method" is called.
    ACE_hrtime_t start_time_;

#if defined (COLLECT_AND_DUMP_SAMPLE_HISTORY)
    typedef ACE_Sample_History SAMPLER;
#else
    typedef ACE_Basic_Stats SAMPLER;
#endif /* COLLECT_AND_DUMP_SAMPLE_HISTORY */
    SAMPLER *sampler_;
  };

  /**
   * @class Controller_exec_i
   *
   * CB_Worker home executor implementation class.
   */
  class CONTROLLER_EXEC_Export Rate_Controller_Home_i :
    public virtual Priority_Test::CCM_ControllerHome,
    public virtual TAO_Local_RefCounted_Object
  {
  public:
    /// Default ctor.
    Rate_Controller_Home_i (CORBA::Long hertz);

    /// Default dtor.
    ~Rate_Controller_Home_i ();

    // Explicit home operations.

    // Implicit home operations.

    virtual ::Components::EnterpriseComponent_ptr
    create (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
      ACE_THROW_SPEC ((CORBA::SystemException,
                       Components::CCMException));

  private:
    CORBA::Long hertz_;
  };

}

// Executor DLL entry point.  CIAO's deployment and assembly framework
// invokes this function on the resulting DLL to get the home executor.
extern "C" CONTROLLER_EXEC_Export ::Components::HomeExecutorBase_ptr
createControllerHome25_Impl (void);

extern "C" CONTROLLER_EXEC_Export ::Components::HomeExecutorBase_ptr
createControllerHome50_Impl (void);

extern "C" CONTROLLER_EXEC_Export ::Components::HomeExecutorBase_ptr
createControllerHome75_Impl (void);

#endif /* RATE_CONTROLLER_H */