summaryrefslogtreecommitdiff
path: root/ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h')
-rw-r--r--ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h365
1 files changed, 365 insertions, 0 deletions
diff --git a/ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h b/ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h
new file mode 100644
index 00000000000..8efc5a79efd
--- /dev/null
+++ b/ACE/TAO/performance-tests/Cubit/TAO/MT_Cubit/Task_Client.h
@@ -0,0 +1,365 @@
+/* -*- C++ -*- */
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/tests
+//
+// = FILENAME
+// Task_Client.h
+//
+// = AUTHOR
+// Andy Gokhale, Sumedh Mungee, Sergio Flores-Gaitan, and
+// Nagarajan Surendran.
+//
+// ============================================================================
+
+#ifndef TASK_CLIENT_H
+#define TASK_CLIENT_H
+
+#include "ace/config-all.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Task.h"
+#include "ace/Thread_Manager.h"
+#include "ace/Get_Opt.h"
+#include "ace/Profile_Timer.h"
+#include "ace/ARGV.h"
+#include "ace/Sched_Params.h"
+#include "ace/High_Res_Timer.h"
+#include "ace/Containers.h"
+
+#include "cubitC.h"
+#include "cubit_i.h"
+#include "Globals.h"
+#include "Timer.h"
+
+#if defined (CHORUS_MVME)
+# include "pccTimer.h"
+#endif /* CHORUS_MVME */
+
+// FUZZ: disable check_for_math_include
+#if defined(ACE_HAS_EXCEPTIONS) && !defined (__KCC) && !defined (__xlC__) && \
+ (!defined __GNUG__ || !defined (DIGITAL_UNIX))
+ // Some plaforms define an exception structure in math.h...
+# if defined (__GNUG__)
+ // And some compilers have this workaround. Disable it with this
+ // #define, to avoid warning about multiple #defines of exception.
+# define _MATH_H_WRAPPER
+# endif /* __GNUG__ */
+# define exception _math_exception
+# include /**/ <math.h>
+# undef exception
+#else
+# include /**/ <math.h>
+#endif /* ACE_HAS_EXCEPTIONS */
+
+#if defined (ACE_HAS_QUANTIFY)
+# define START_QUANTIFY quantify_start_recording_data ();
+# define STOP_QUANTIFY quantify_stop_recording_data();
+# define CLEAR_QUANTIFY quantify_clear_data ();
+#else /* ! ACE_HAS_QUANTIFY */
+# define START_QUANTIFY
+# define STOP_QUANTIFY
+# define CLEAR_QUANTIFY
+#endif /* ! ACE_HAS_QUANTIFY */
+
+
+enum Cubit_Datatypes
+{
+ // = The various datatypes the client and the server can exchange.
+ CB_OCTET,
+ CB_SHORT,
+ CB_LONG,
+ CB_STRUCT,
+
+ // = Rate constants.
+ CB_20HZ_CONSUMER = 0,
+ CB_10HZ_CONSUMER = 1,
+ CB_5HZ_CONSUMER = 2,
+ CB_1HZ_CONSUMER = 3,
+
+ CB_20HZ_CONSUMER_RATE = 20,
+ CB_10HZ_CONSUMER_RATE = 10,
+ CB_5HZ_CONSUMER_RATE = 5,
+ CB_1HZ_CONSUMER_RATE = 1,
+
+ CB_HIGH_PRIORITY_RATE = 20,
+ CB_LOW_PRIORITY_RATE = 10
+};
+
+typedef ACE_Unbounded_Queue<ACE_timer_t> JITTER_ARRAY;
+typedef ACE_Unbounded_Queue_Iterator<ACE_timer_t> JITTER_ARRAY_ITERATOR;
+
+class Task_State
+{
+ // = TITLE
+ // Maintains state common to multiple Cubit clients.
+ //
+ // = DESCRIPTION
+ // This class maintains state which is common to the potentially
+ // multiple concurrent clients.
+public:
+ Task_State (void);
+ // Constructor.
+
+ int parse_args (int argc,ACE_TCHAR **argv);
+ // parses the arguments with the provided argc and argv.
+
+ ~Task_State (void);
+ // Destructor
+
+ ACE_Barrier *barrier_;
+ // Barrier for the multiple clients to synchronize after binding to
+ // the servants.
+
+ const char *key_;
+ // All cubit objects will have this as prefix to its key.
+
+ u_int loop_count_;
+ // Number of times to loop, making calls.
+
+ u_int thread_count_;
+ // Number of concurrent clients to create.
+
+ ACE_timer_t *latency_;
+ // Array to store the latency for every client, indexed by
+ // thread-id.
+
+ int *ave_latency_;
+ // Int array to store the latencies.
+
+ Cubit_Datatypes datatype_;
+ // Which datatype to use to make the calls.
+
+ TAO_SYNCH_MUTEX lock_;
+ // Lock to protect access to this object.
+
+ u_int thread_per_rate_;
+ // Flag for the thread_per_rate test.
+
+ JITTER_ARRAY **global_jitter_array_;
+ // This array stores the latency seen by each client for each
+ // request, to be used later to compute jitter.
+
+ u_int *count_;
+ // This array stores the call count of each thread. They will not
+ // always have the same call count.
+
+ u_int shutdown_;
+ // Flag that indicates if we are going to call the shutdown methos
+ // for the servant.
+
+ u_int oneway_;
+ // Flag that indicates if we are going to use oneway calls instead
+ // of two-way.
+
+ char *one_ior_;
+ // Ior array used if utilization test is run.
+
+ u_int one_to_n_test_;
+ // indicates whether we are running the "1 to n" test, which has 1
+ // low priority servant and n low priority clients.
+
+ u_int context_switch_test_;
+ // flag to run context switch test
+
+ char **iors_;
+ // Array of pointers used to hold the ior strings read from the ior file
+ // that the server created.
+
+ int iors_count_;
+ // count on the number of iors
+
+ ACE_TCHAR *ior_file_;
+ // Name of the filename that the server used to store the iors.
+
+ u_int granularity_;
+ // this is the granularity of the timing of the CORBA requests. A
+ // value of 5 represents that we will take time every 5 requests,
+ // instead of the default of every request (1).
+
+ u_int use_utilization_test_;
+ // flag to indicate we are to use the utilization test. By default
+ // we do not use it, because it can cause starvation with real-time
+ // threads
+
+ u_int high_priority_loop_count_;
+ // Number of times the high priority looped. We are going to loop
+ // as long as there is low priority clients running, so as to
+ // maintain high priority traffic as long as low priority traffic is
+ // going through.
+
+ ACE_SYNCH_SEMAPHORE *semaphore_;
+ // semaphore in order for the high priority client to keep running
+ // as long as the low priority clients are running. See explanation
+ // of "high_priority_loop_count_" member in this class.
+
+ u_int use_multiple_priority_;
+ // flag to indicate we are to use multiple priorities for the low
+ // priority clients. By default we use only one priority for all
+ // client threads.
+
+ ACE_High_Res_Timer timer_;
+ // global timer to be started by the utilization task.
+
+ int ready_;
+ // ready flag used by the high priority thread to wake up the low
+ // priority threads after it's parsed the arguments.
+
+ TAO_SYNCH_MUTEX ready_mtx_;
+ // mutex for the condition variable.
+
+ TAO_SYNCH_CONDITION ready_cnd_;
+ // condition variable for the low priority threads to wait
+ //until the high priority thread is done with the arguments parsing.
+
+ u_int remote_invocations_;
+ // flag to indicate whether we make remote versus local invocations
+ // to calculate accurately the ORB overhead.
+
+ ACE_timer_t util_test_time_;
+ // holds the total time for the utilization test to complete.
+};
+
+class Client : public ACE_Task<ACE_SYNCH>
+{
+ // = TITLE
+ // The Cubit client.
+ //
+ // = DESCRIPTION
+ // This class implements the Cubit Client, which is an active object.
+ // `n' threads execute svc, and make 2way CORBA calls on the server
+public:
+ Client (ACE_Thread_Manager *,
+ Task_State *ts,
+ int argc,
+ ACE_TCHAR **argv,
+ u_int id);
+ // Constructor, with a pointer to the common task state.
+
+ ~Client (void);
+ // destructor.
+
+ virtual int svc (void);
+ // The thread function.
+
+ ACE_timer_t get_high_priority_latency (void);
+ // Returns the latency of the high priority thread in usecs.
+
+ ACE_timer_t get_low_priority_latency (void);
+ // Returns the average latency found for the low
+ // priority threads in usecs.
+
+ ACE_timer_t get_high_priority_jitter (void);
+ // Returns the high priority jitter in usecs.
+
+ ACE_timer_t get_low_priority_jitter (void);
+ // Returns the jitter for all the low priority
+ // thread request in usecs.
+
+ ACE_timer_t get_latency (u_int thread_id);
+ // gets the average latency for that thread.
+
+ ACE_timer_t get_jitter (u_int id);
+ // gets the jitter for this thread.
+
+ static int func (u_int i);
+ // Arbitrary generator used by the client to create the numbers to be
+ // cubed.
+
+private:
+ CORBA::ORB_ptr init_orb (void);
+ // initialize the ORB.
+
+ void read_ior (void);
+ // reads the cubit ior from a file.
+
+ int get_cubit (CORBA::ORB_ptr orb);
+ // gets the cubit object.
+
+ int run_tests (void);
+ // Run the various tests.
+
+ int make_request (void);
+ // make a CORBA request depending on the datatype.
+
+ int do_test (void);
+ // makes the corba requests.
+
+ int cube_octet (void);
+ // call cube_octet method on the cubit object.
+
+ int cube_short (void);
+ // call cube short on the cubit object.
+
+ int cube_long (void);
+ // call cube long on the cubit object.
+
+ int cube_struct (void);
+ // call cube struct on the cubit object.
+
+ void print_stats (void);
+ // prints the latency stats.
+
+ void put_latency (JITTER_ARRAY *jitter,
+ ACE_timer_t latency,
+ u_int thread_id,
+ u_int count);
+ // Records the latencies in the <Task_State>.
+
+ int parse_args (int, char **);
+ // Parses the arguments.
+
+ void find_frequency (void);
+ // determines the frequency at which to make calls depending on the
+ // id of the thread.
+
+ ACE_timer_t calc_delta (ACE_timer_t real_time,
+ ACE_timer_t delta);
+ // calculate the delta value.
+
+ Cubit_ptr cubit_;
+ // pointer to the cubit object.
+
+ Cubit_i cubit_impl_;
+ // cubit implementation object.
+
+ Task_State *ts_;
+ // Pointer to shared state.
+
+ u_int num_;
+ // number used for cubing.
+
+ u_int id_;
+ // unique id of the task
+
+ u_int call_count_;
+ // count of the number of calls made.
+
+ u_int error_count_;
+ // number of calls that failed.
+
+ JITTER_ARRAY *my_jitter_array_;
+ // ACE Unbounded set holding the latency values for all the
+ // requests of this thread.
+
+ MT_Cubit_Timer *timer_;
+ // Timer using pccTimer for chorus and ACE_Timer for other platforms.
+
+ ACE_timer_t frequency_;
+ // frequency of CORBA requests.
+
+ ACE_timer_t latency_;
+ // aggregate latency of the requests.
+
+ // command-line arguments.
+ int argc_;
+ ACE_TCHAR **argv_;
+};
+
+#endif /* !defined (TASK_CLIENT_H) */