summaryrefslogtreecommitdiff
path: root/ACE/tests/Process_Manager_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/tests/Process_Manager_Test.cpp')
-rw-r--r--ACE/tests/Process_Manager_Test.cpp98
1 files changed, 95 insertions, 3 deletions
diff --git a/ACE/tests/Process_Manager_Test.cpp b/ACE/tests/Process_Manager_Test.cpp
index 22acac945de..e433098c906 100644
--- a/ACE/tests/Process_Manager_Test.cpp
+++ b/ACE/tests/Process_Manager_Test.cpp
@@ -26,9 +26,13 @@
// ============================================================================
#include "test_config.h"
+#include "ace/SString.h"
+#include "ace/Atomic_Op.h"
+#include "ace/Task.h"
#include "ace/OS_NS_unistd.h"
#include "ace/OS_NS_string.h"
#include "ace/Process_Manager.h"
+#include "ace/Synch_Traits.h"
#include "ace/Get_Opt.h"
#include "ace/Thread.h"
#include "ace/Reactor.h"
@@ -103,8 +107,72 @@ const ACE_TCHAR *cmdline_format = ACE_TEXT (".") ACE_DIRECTORY_SEPARATOR_STR ACE
return result;
}
+ACE_CString order;
+
+ACE_Atomic_Op<ACE_SYNCH_MUTEX, int> running_tasks = 0;
+
+class Process_Task : public ACE_Task<ACE_SYNCH>
+{
+public:
+ Process_Task (const ACE_TCHAR *argv0,
+ ACE_Process_Manager &mgr,
+ int sleep_time)
+ : argv0_ (argv0),
+ mgr_ (mgr),
+ sleep_time_ (sleep_time) { }
+
+ int open (void*)
+ {
+ char tmp[10];
+ order += ACE_OS::itoa (sleep_time_, tmp, 10);
+ running_tasks++;
+ activate ();
+ return 0;
+ }
+
+ int svc (void)
+ {
+ int result = 0;
+ ACE_exitcode exitcode;
+ pid_t my_child = spawn_child (argv0_,
+ mgr_,
+ sleep_time_);
+ result = mgr_.wait (my_child,
+ &exitcode);
+ if (result != my_child)
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P) Error: expected to reap child (%d); got %d\n"),
+ my_child,
+ result));
+ if (result == ACE_INVALID_PID)
+ ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%P) %p\n"), ACE_TEXT ("error")));
+ //test_status = 1;
+ }
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P) reaped child, pid %d: %d\n"),
+ my_child,
+ exitcode));
+ char tmp[10];
+ order += ACE_OS::itoa (sleep_time_, tmp, 10);
+ return 0;
+ }
+
+ int close (u_long)
+ {
+ running_tasks--;
+ return 0;
+ }
+
+private:
+ const ACE_TCHAR *argv0_;
+ ACE_Process_Manager &mgr_;
+ int sleep_time_;
+};
+
static int
-command_line_test ()
+command_line_test (void)
{
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Testing for last character of command line\n")));
@@ -351,6 +419,31 @@ run_main (int argc, ACE_TCHAR *argv[])
}
}
+ Process_Task task1 (argv[0], mgr, 3);
+ Process_Task task2 (argv[0], mgr, 2);
+ Process_Task task3 (argv[0], mgr, 1);
+ task1.open (0);
+ task2.open (0);
+ task3.open (0);
+
+ while (running_tasks!=0)
+ {
+ ACE_OS::sleep (1);
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%P) still running tasks\n")));
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%P) result: '%s'\n"),
+ order.c_str ()));
+
+ if (order != "321123")
+ {
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("(%P) wrong order of spawns ('%s', should be '321123')\n"),
+ order.c_str ()));
+ test_status = 1;
+ }
+
#if !defined (ACE_OPENVMS)
// --------------------------------------------------
// Finally, try the reactor stuff...
@@ -379,8 +472,7 @@ run_main (int argc, ACE_TCHAR *argv[])
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("(%P) %d processes left in manager\n"),
nr_procs));
-
-#endif
+#endif /* !defined (ACE_OPENVMS) */
ACE_END_TEST;
return test_status;
}