summaryrefslogtreecommitdiff
path: root/ACE/tests/Upgradable_RW_Test.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/tests/Upgradable_RW_Test.h')
-rw-r--r--ACE/tests/Upgradable_RW_Test.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/ACE/tests/Upgradable_RW_Test.h b/ACE/tests/Upgradable_RW_Test.h
new file mode 100644
index 00000000000..d9f79c313bf
--- /dev/null
+++ b/ACE/tests/Upgradable_RW_Test.h
@@ -0,0 +1,156 @@
+
+//=============================================================================
+/**
+ * @file Upgradable_RW_Test.h
+ *
+ * $Id$
+ *
+ * This class gets its own header file to work around AIX C++
+ * compiler "features" related to template instantiation... It is
+ * only used by Upgradable_RW_Test.cpp.
+ *
+ *
+ * @author Michael Kircher <mk1@cs.wustl.edu>
+ */
+//=============================================================================
+
+
+#ifndef ACE_TESTS_UPGRADABLE_RW_TEST_H
+#define ACE_TESTS_UPGRADABLE_RW_TEST_H
+
+#include "test_config.h"
+#include "ace/Barrier.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "ace/Task.h"
+#include "ace/Thread.h"
+#include "ace/Thread_Manager.h"
+#include "ace/Get_Opt.h"
+#include "ace/SString.h"
+#include "ace/Profile_Timer.h"
+
+class Element;
+
+ /**
+ * @class Element
+ *
+ * @brief The members for the double linked list.
+ */
+class Element
+{
+ friend class ACE_Double_Linked_List<Element>;
+ friend class ACE_Double_Linked_List_Iterator_Base<Element>;
+ friend class ACE_Double_Linked_List_Iterator<Element>;
+ friend class ACE_Double_Linked_List_Reverse_Iterator<Element>;
+
+public:
+ Element (ACE_CString *item = 0,
+ Element *p = 0,
+ Element *n = 0)
+ : prev_ (p),
+ next_(n),
+ item_(item)
+ {
+ }
+
+ ACE_CString *value (void)
+ {
+ return this->item_;
+ }
+
+private:
+ Element *prev_;
+ Element *next_;
+ ACE_CString *item_;
+};
+
+typedef ACE_Double_Linked_List<Element> Linked_List;
+
+/**
+ * @class Time_Calculation
+ *
+ * @brief class to do time calculations thread safe
+ */
+class Time_Calculation
+{
+public:
+ Time_Calculation (void)
+ : reported_times_ (0)
+ {
+ times_.real_time = 0;
+ times_.user_time = 0;
+ times_.system_time = 0;
+ }
+
+ /// take the time of the thread and add it to
+ void report_time (ACE_Profile_Timer::ACE_Elapsed_Time &elapsed_time);
+
+ void print_stats (void);
+
+private:
+ /// add the times incrementally
+ ACE_Profile_Timer::ACE_Elapsed_Time times_;
+
+ /// protect the time
+ ACE_SYNCH_MUTEX mutex_;
+
+ /// count how many threads gave me the elapsed_time
+ unsigned int reported_times_;
+};
+
+/**
+ * @class Reader_Task
+ *
+ * @brief A Task for readers
+ */
+class Reader_Task : public ACE_Task_Base
+{
+public:
+ Reader_Task (Time_Calculation &time_Calculation,
+ ACE_Barrier &barrier)
+ : time_Calculation_ (time_Calculation),
+ barrier_(barrier)
+ {
+ };
+
+ virtual int svc (void);
+
+private:
+ /// keep a reference to the time calculation class
+ Time_Calculation &time_Calculation_;
+
+ /// keep this reference for the barrier, in order
+ /// to allow a "nice" start
+ ACE_Barrier &barrier_;
+};
+
+/**
+ * @class Writer_Task
+ *
+ * @brief A Task for wirters.
+ */
+class Writer_Task : public ACE_Task_Base
+{
+public:
+ Writer_Task (Time_Calculation &time_Calculation,
+ ACE_Barrier &barrier)
+ : time_Calculation_ (time_Calculation),
+ barrier_(barrier)
+ {
+ };
+
+ virtual int svc (void);
+
+private:
+ /// keep a reference to the time calculation class
+ Time_Calculation &time_Calculation_;
+
+ /// keep this reference for the barrier, in order
+ /// to allow a "nice" start
+ ACE_Barrier &barrier_;
+};
+
+#endif /* ACE_TESTS_UPGRADABLE_RW_TEST_H */