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.cpp210
1 files changed, 0 insertions, 210 deletions
diff --git a/tests/Process_Mutex_Test.cpp b/tests/Process_Mutex_Test.cpp
deleted file mode 100644
index a7d75c4f75d..00000000000
--- a/tests/Process_Mutex_Test.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-// $Id$
-// ============================================================================
-//
-// = LIBRARY
-// tests
-//
-// = FILENAME
-// Process_Mutex_Test.cpp
-//
-// = DESCRIPTION
-// Tests an <ACE_Process_Mutex> shared between multiple child processes.
-//
-// = AUTHOR
-// Irfan Pyarali <irfan@cs.wustl.edu>
-//
-// ============================================================================
-
-#include "test_config.h"
-#include "ace/Mutex.h"
-#include "ace/Process.h"
-#include "ace/Process_Mutex.h"
-#include "ace/Get_Opt.h"
-#include "ace/ACE.h"
-#include "ace/OS_NS_stdio.h"
-#include "ace/OS_NS_string.h"
-#include "ace/OS_NS_fcntl.h"
-#include "ace/os_include/os_dirent.h"
-
-ACE_RCSID(tests, Process_Mutex_Test, "$Id$")
-
-static int release_mutex = 1;
-static int child_process = 0;
-static const ACE_TCHAR *mutex_name = ACE_DEFAULT_MUTEX;
-#if defined (__Lynx__)
-static const u_int n_processes = 4;
-#else /* ! __Lynx__ */
-static const u_int n_processes = ACE_MAX_PROCESSES;
-#endif /* ! __Lynx__ */
-
-// Explain usage and exit.
-static void
-print_usage_and_die (void)
-{
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("usage: %n [-d (don't release mutex)] ")
- ACE_TEXT ("[-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, ACE_TCHAR *argv[])
-{
- ACE_Get_Opt get_opt (argc, argv, ACE_TEXT("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.opt_arg ();
- break;
- default:
- print_usage_and_die ();
- break;
- }
-}
-
-static void
-acquire_release (void)
-{
- ACE_Process_Mutex mutex (mutex_name);
-
- // Make sure the constructor succeeded
- ACE_ASSERT (ACE_LOG_MSG->op_status () == 0);
-
- // To see if we really are the only holder of the mutex below,
- // we'll try to create a file with exclusive access. If the file
- // already exists, we're not the only one holding the mutex.
- ACE_TCHAR mutex_check[MAXPATHLEN+1];
- ACE_OS::strncpy (mutex_check, mutex_name, MAXPATHLEN);
- ACE_OS::strncat (mutex_check, ACE_TEXT ("_checker"), MAXPATHLEN);
-
- // Grab the lock
- int mutex_acq = mutex.acquire ();
- ACE_ASSERT (mutex_acq == 0);
-
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("(%P) Mutex acquired %s\n"),
- mutex_name));
-
- ACE_HANDLE checker_handle = ACE_OS::open (mutex_check, O_CREAT | O_EXCL);
- if (checker_handle == ACE_INVALID_HANDLE)
- {
- ACE_ASSERT (errno != EEXIST);
- ACE_DEBUG ((LM_WARNING, ACE_TEXT ("(%P): %p\n"),
- ACE_TEXT ("checker file open")));
- }
- else
- ACE_OS::close (checker_handle);
-
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("(%P) Working....\n")));
-
- // Do some "work", i.e., just sleep for a couple of seconds.
- ACE_OS::sleep (2);
-
- // Free up the check file for the next acquirer.
- ACE_OS::unlink (mutex_check);
-
- // Check if we need to release the mutex
- if (release_mutex == 1)
- {
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("(%P) Releasing the mutex %s\n"),
- mutex_name));
- int mutex_release = mutex.release ();
- ACE_ASSERT (mutex_release == 0);
- }
-}
-
-int
-run_main (int argc, ACE_TCHAR *argv[])
-{
- parse_args (argc, argv);
-
- // Child process code.
- if (child_process)
- {
- ACE_TCHAR lognm[MAXPATHLEN];
- int mypid (ACE_OS::getpid ());
- ACE_OS::sprintf(lognm, ACE_TEXT ("Process_Mutex_Test-child-%d"), mypid);
-
- ACE_START_TEST (lognm);
- acquire_release ();
- ACE_END_LOG;
- }
- else
- {
- ACE_START_TEST (ACE_TEXT ("Process_Mutex_Test"));
-# if !defined( ACE_HAS_SYSV_IPC) || defined( ACE_USES_MUTEX_FOR_PROCESS_MUTEX )
- // When Process_Mutex is pthreads based, then the owner of mutex destroys it
- // in destructor. This may disturb the other processes which still uses the
- // mutex. It is safer then to hold the mutex in main process, and destroy it after
- // children finish. This is temporary solution, and in future pthread base
- // Process_Mutex shall control the destruction of mutex better.
- ACE_Process_Mutex mutex( mutex_name );
-# endif
-
-#if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
- static const ACE_TCHAR* format = ACE_TEXT ("%ls -c -n %ls%ls");
-#else
- static const ACE_TCHAR* format = ACE_TEXT ("%s -c -n %s%s");
-#endif /* !ACE_WIN32 && ACE_USES_WCHAR */
- ACE_Process_Options options;
- options.command_line (format, argv[0], mutex_name,
- release_mutex == 0 ? ACE_TEXT (" -d") : ACE_TEXT (""));
-
- // Spawn <n_processes> child processes that will contend for the
- // lock.
- ACE_Process children[n_processes];
- size_t i;
-
- for (i = 0;
- i < n_processes;
- i++)
- {
- // Spawn the child process.
- int result = children[i].spawn (options);
- ACE_ASSERT (result != -1);
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("Parent spawned child process with pid = %d.\n"),
- children[i].getpid ()));
-
- // Give the newly spawned child process a chance to start...
- // David Levine thinks this sleep() is required because
- // calling ::waitpid () before a fork'ed child has actually
- // been created may be a problem on some platforms. It's
- // not enough for fork() to have returned to the parent.
- ACE_OS::sleep (1);
- }
-
- for (i = 0; i < n_processes; i++)
- {
- ACE_exitcode child_status;
- // Wait for the child processes we created to exit.
- int wait_result = children[i].wait (&child_status);
- ACE_ASSERT (wait_result != -1);
- if (child_status == 0)
- ACE_DEBUG ((LM_DEBUG,
- ACE_TEXT ("Child %d finished ok\n"),
- children[i].getpid ()));
- else
- ACE_ERROR ((LM_ERROR,
- ACE_TEXT ("Child %d finished with status %d\n"),
- children[i].getpid (), child_status));
- }
-
- ACE_END_TEST;
- }
-
- return 0;
-}