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 164 165 166 167 168
|
// $Id: group.cpp 82330 2008-07-15 17:30:06Z parsons $
#include "ace/OS_NS_unistd.h"
#include "ace/streams.h"
#include "ace/Monitor_Point_Registry.h"
#include "ace/Monitor_Admin_Manager.h"
#include "ace/Monitor_Control/Monitor_Control.h"
#include "examples/Monitor/MC_Test_Utilities.h"
#if defined (ACE_HAS_MONITOR_FRAMEWORK) && (ACE_HAS_MONITOR_FRAMEWORK == 1)
using namespace ACE_VERSIONED_NAMESPACE_NAME::ACE::Monitor_Control;
/// Subclass of ACE_Task_Base, meaning that the override of
/// the svc() method below will run in a new thread when
/// activate() is called on a class instance.
class Monitor_Checker : public ACE_Task_Base
{
public:
int svc (void)
{
/// Get an instance of the MC service singleton.
MC_ADMINMANAGER* mgr =
ACE_Dynamic_Service<Monitor_Admin_Manager>::instance ("MC_ADMINMANAGER");
ACE::Monitor_Control::Monitor_Base *cpu_monitor =
mgr->admin ().monitor_point ("OS/Processor/CPULoad");
ACE::Monitor_Control::Monitor_Base *memory_monitor =
mgr->admin ().monitor_point ("OS/Memory/TotalUsage");
ACE::Monitor_Control::Monitor_Base *bytes_monitor =
mgr->admin ().monitor_point ("OS/Network/BytesSent");
/// Query the monitor for its data every 2 seconds, and call the
/// appropriate display function.
for (int i = 0; i < 10; ++i)
{
ACE_OS::sleep (2);
Monitor_Control_Types::Data cpu_data (cpu_monitor->type ());
cpu_monitor->retrieve (cpu_data);
MC_Test_Utilities::display_cpu_load (cpu_data);
Monitor_Control_Types::Data mem_data (memory_monitor->type ());
memory_monitor->retrieve (mem_data);
MC_Test_Utilities::display_memory_usage (mem_data);
Monitor_Control_Types::Data bytes_data (bytes_monitor->type ());
bytes_monitor->retrieve (bytes_data);
MC_Test_Utilities::display_bytes_sent (bytes_data);
cout << endl;
}
cpu_monitor->remove_ref ();
memory_monitor->remove_ref ();
bytes_monitor->remove_ref ();
return 0;
}
};
#endif /* ACE_HAS_MONITOR_FRAMEWORK==1 */
int
ACE_TMAIN (int /* argc */, ACE_TCHAR * /* argv */ [])
{
#if defined (ACE_HAS_MONITOR_FRAMEWORK) && (ACE_HAS_MONITOR_FRAMEWORK == 1)
/// Creates these future group members without automatic update.
Monitor_Base *cpu_load_monitor =
create_os_monitor<CPU_LOAD_MONITOR> ();
Monitor_Base *bytes_sent_monitor =
create_os_monitor<BYTES_SENT_MONITOR> ();
Monitor_Base *memory_usage_monitor =
create_os_monitor<MEMORY_USAGE_MONITOR> ();
Monitor_Group *group = new Monitor_Group ("Test_Group");
group->add_member (cpu_load_monitor);
group->add_member (bytes_sent_monitor);
group->add_member (memory_usage_monitor);
/// Register the group as an auto-updated monitor point.
MC_ADMINMANAGER* mgr =
ACE_Dynamic_Service<MC_ADMINMANAGER>::instance ("MC_ADMINMANAGER");
bool good_add = mgr->admin ().monitor_point (group, ACE_Time_Value (2));
if (!good_add)
{
ACE_ERROR ((LM_ERROR,
"Group monitor \"%s\" registration failed.\n",
group->name ()));
}
/// A quick test of the registry's name cache.
Monitor_Control_Types::NameList mc_names =
Monitor_Point_Registry::instance ()->names ();
cout << "stored in monitor point registry:" << endl << endl;
for (Monitor_Control_Types::NameList::Iterator i (mc_names);
!i.done ();
i.advance ())
{
ACE_CString *item = 0;
i.next (item);
cout << item->c_str () << endl;
}
cout << endl;
/// Runs the reactor's event loop in a separate thread so the timer(s)
/// can run concurrently with the application.
START_PERIODIC_MONITORS;
/// Run the monitor checker in a separate thread.
Monitor_Checker monitor_checker;
monitor_checker.activate ();
char * str_array[5] = {0};
for (int i = 0; i < 10; ++i)
{
ACE_OS::sleep (1);
/// Alternate between letting the CPU sleep and keeping it
/// busy.
if (i % 2 == 0)
{
ACE_OS::sleep (1);
}
else
{
for (unsigned long j = 0; j < 5050505; j++)
{
(void) ACE::gcd (2419233733UL, 567715713UL);
}
}
/// Allocate a large string in each of the first 5 loops,
/// free them in the last 5 loops.
if (i < 5)
{
str_array[i] = new char[1024*1024*10];
}
else
{
delete [] str_array[i - 5];
}
}
/// End the reactor's event loop, stopping the timer(s).
STOP_PERIODIC_MONITORS;
cpu_load_monitor->remove_ref ();
bytes_sent_monitor->remove_ref ();
memory_usage_monitor->remove_ref ();
group->remove_ref ();
#endif /* ACE_HAS_MONITOR_FRAMEWORK==1 */
return 0;
}
|