summaryrefslogtreecommitdiff
path: root/TAO/examples/RTCORBA/Activity/Activity.h
blob: e2e303f127f285ea1a095b1498a770b57c15d9ab (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
/* -*- C++ -*- */
//=============================================================================
/**
 *  @file Activity.h
 *
 *  $Id$
 *
 *  An activity is a process that contains Tasks.
 *  Each Task is composed of certain units of Jobs.
 *  A Job can perform work that is local/remote.
 *  Each Job is identified with a name.
 *
 *  @author Pradeep Gore <pradeep@cs.wustl.edu>
 */
//=============================================================================
#ifndef ACTIVITY_H
#define ACTIVITY_H

#include "ace/Singleton.h"
#include "ace/Sched_Params.h"
#include "orbsvcs/CosNamingC.h"
#include "tao/RTPortableServer/RTPortableServer.h"
#include "activity_export.h"

class ACE_Barrier;
class Job_i;
class Periodic_Task;
class Builder;

/**
 * @class Activity
 *
 * @brief Driver class that maintains the orb and collections of objects for
 * generating activity in this process.
 *
 */
class activity_Export Activity
{
  friend class ACE_Singleton<Activity, ACE_Null_Mutex>;

private:
  Activity ();
  ~Activity ();

public:
  /// initialize the ORB et. al.
  int init (int& argc, char *argv [] ACE_ENV_ARG_DECL);


  /// Activate the tasks, jobs, poas.
  void run (int argc, char *argv[] ACE_ENV_ARG_DECL);

  /// Resolve the naming service.
  int resolve_naming_service (ACE_ENV_SINGLE_ARG_DECL);

  /// = Accessors
  CORBA::ORB_ptr orb (void);
  RTCORBA::RTORB_ptr rt_orb (void);
  RTCORBA::Current_ptr current (void);
  long scope_policy (void);
  long sched_policy (void);
  void builder (Builder* builder);

  /// Returns priority if server declared model else -1
  CORBA::Short get_server_priority (CORBA::Object_ptr server
                                    ACE_ENV_ARG_DECL);
  /// = Callbacks
  /// Task ended notification
  void task_ended (Periodic_Task* ended_task);

  /// Job shutdown notification
  void job_ended (Job_i* ended_job);

  protected:
  /// Init sched mode.
  int init_sched (void);

  /// = Activation methods.
  /// Activate the POA's
  void activate_poa_list (ACE_ENV_SINGLE_ARG_DECL);

  /// Activate the task list.
  void activate_schedule (ACE_ENV_SINGLE_ARG_DECL);

  /// Activate the Job's
  void activate_job_list (ACE_ENV_SINGLE_ARG_DECL);

  /// Check if we should process exit
  void check_ifexit (void);

  /// = Data members

  /// The Builder object.
  Builder* builder_;

  /// = Policies
  long thr_sched_policy_;
  long thr_scope_policy_;
  ACE_Sched_Params::Policy sched_policy_;

  /// ACE_Barrier to synch. tasks.
  ACE_Barrier* barrier_;

  /// Mutex to serialize access to our internal state.
  ACE_Lock* state_lock_;

  /// The ORB that we use.
  CORBA::ORB_var orb_;

  /// RT ORB
  RTCORBA::RTORB_var rt_orb_;

  /// Current
  RTCORBA::Current_var current_;

  /// Reference to the root poa.
  PortableServer::POA_var root_poa_;

  /// A naming context.
  CosNaming::NamingContextExt_var naming_;

  /// Count the number of periodic tasks active.
  int active_task_count_;

  /// Count the number of Jobs active
  int active_job_count_;
};

typedef ACE_Singleton<Activity, ACE_Null_Mutex> ACTIVITY;

#endif /* ACTIVITY_H */