diff options
Diffstat (limited to 'tests/Process_Mutex_Test.cpp')
-rw-r--r-- | tests/Process_Mutex_Test.cpp | 131 |
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; +} |