summaryrefslogtreecommitdiff
path: root/tests/Process_Mutex_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Process_Mutex_Test.cpp')
-rw-r--r--tests/Process_Mutex_Test.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/tests/Process_Mutex_Test.cpp b/tests/Process_Mutex_Test.cpp
new file mode 100644
index 00000000000..7314e9e71f8
--- /dev/null
+++ b/tests/Process_Mutex_Test.cpp
@@ -0,0 +1,131 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// tests
+//
+// = FILENAME
+// Process_Mutex_Test.cpp
+//
+// = DESCRIPTION
+// Tests a Process Mutex shared between multiple processes
+//
+// = AUTHOR
+// Irfan Pyarali
+//
+// ============================================================================
+
+#include "ace/Synch.h"
+#include "ace/Process.h"
+#include "ace/Get_Opt.h"
+#include "test_config.h"
+
+static int release_mutex = 1;
+static int child_process = 0;
+static char *mutex_name = ACE_DEFAULT_MUTEX;
+
+// Explain usage and exit.
+static void
+print_usage_and_die (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ "usage: %n [-d (don't release mutex)] [-c (child process)] [-n mutex name] \n"));
+ ACE_OS::exit (1);
+}
+
+// Parse the command-line arguments and set options.
+static void
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opt (argc, argv, "dcn:");
+
+ int c;
+
+ while ((c = get_opt ()) != -1)
+ switch (c)
+ {
+ case 'd':
+ ::release_mutex = 0;
+ break;
+ case 'c':
+ ::child_process = 1;
+ break;
+ case 'n':
+ ::mutex_name = get_opt.optarg;
+ break;
+ default:
+ print_usage_and_die ();
+ break;
+ }
+}
+
+static void
+doit ()
+{
+ ACE_Process_Mutex mutex (::mutex_name);
+ // Make sure the constructor succeeded
+ ACE_ASSERT (ACE_LOG_MSG->op_status () == 0);
+ // Grab the lock
+ ACE_ASSERT (mutex.acquire () == 0);
+ ACE_DEBUG ((LM_DEBUG, "(%P) Mutex acquired %s\n", ::mutex_name));
+ ACE_DEBUG ((LM_DEBUG, "(%P) Working....\n"));
+ // work
+ ACE_OS::sleep (2);
+ // Check if we need to release the mutex
+ if (::release_mutex == 1)
+ {
+ ACE_DEBUG ((LM_DEBUG, "(%P) Releasing the mutex %s\n", ::mutex_name));
+ ACE_ASSERT (mutex.release () == 0);
+ }
+}
+
+int
+main (int argc, char *argv[])
+{
+ ::parse_args (argc, argv);
+
+ // Child process code
+ if (::child_process)
+ {
+ ACE_APPEND_LOG ("Process_Mutex_Test-children");
+ ::doit ();
+ ACE_END_LOG;
+ }
+ else
+ {
+ ACE_START_TEST ("Process_Mutex_Test");
+ ACE_INIT_LOG ("Process_Mutex_Test-children");
+
+ char *s_argv[6];
+ s_argv[0] = "Process_Mutex_Test" ACE_PLATFORM_EXE_SUFFIX;
+ s_argv[1] = "-c"; // child/slave process
+ s_argv[2] = "-n";
+ s_argv[3] = ::mutex_name;
+ if (::release_mutex == 0)
+ s_argv[4] = "-d";
+ else
+ s_argv[4] = 0;
+ s_argv[5] = 0;
+
+ // Spawn ACE_MAX_ITERATIONS processes which will contend for the lock
+ ACE_Process servers[ACE_MAX_ITERATIONS];
+ for (int i = 0; i < ACE_MAX_ITERATIONS; i++)
+ {
+ ACE_ASSERT (servers[i].start (s_argv) != -1);
+
+ ACE_DEBUG ((LM_DEBUG, "Server forked with pid = %d.\n", servers[i].getpid ()));
+
+ }
+
+ for (i = 0; i < ACE_MAX_ITERATIONS; i++)
+ {
+ // Wait for the process we created to exit.
+ ACE_ASSERT (servers[i].wait () != -1);
+ ACE_DEBUG ((LM_DEBUG, "Server %d finished\n", servers[i].getpid ()));
+ }
+ ACE_END_TEST;
+ }
+
+ return 0;
+}