server.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 576 行 · 第 1/2 页
CPP
576 行
// Sleep for a random amount of time between 0 and 2
// seconds. Note that it's ok to use rand() here because we
// are running within the critical section defined by the
// Thread_Mutex.
ACE_OS::sleep (ACE_OS::rand () % 2);
if (*shared_var != 1)
{
ACE_ERROR ((LM_ERROR,
"Expected shared_var to still be 1 after sleeping\n"));
*data->error_flag = 1;
}
*shared_var = 0;
mutex->unlock ();
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("(%P|%t) = unlocked on iteration %d\n"),
i));
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in mutex_test_thread()");
*data->error_flag = 1;
}
ACE_ENDTRY;
return 0;
}
static int
test_mutex_threads (RTCORBA::RTORB_ptr rt_orb)
{
// test the RTCORBA::Mutex implementation be spawning many threads
// that repeatedly content for a lock. This code is based on the
// tests/Thread_Mutex_Test code.
Mutex_Test_Data test_data;
const u_int n_threads =
#if defined (__Lynx__)
3; /* It just doesn't work with 4 threads. (Advice from Thread_Mutex_Test.cpp) */
#else /* ! __Lynx__ */
MAX_THREADS;
#endif /* ! __Lynx__ */
int shared_var = 0;
int error_flag = 0;
ACE_TRY_NEW_ENV
{
RTCORBA::Mutex_ptr mutex = rt_orb->create_mutex (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
test_data.mutex = mutex;
test_data.shared_var = &shared_var;
test_data.error_flag = &error_flag;
if (ACE_Thread_Manager::instance ()->spawn_n (n_threads,
ACE_THR_FUNC (mutex_test_thread),
(void *) &test_data,
THR_NEW_LWP | THR_DETACHED) == -1)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n%a"),
ACE_TEXT ("thread create failed")));
// Wait for the threads to exit.
ACE_Thread_Manager::instance ()->wait ();
CORBA::release (mutex);
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in test_mutex_threads()");
return -1;
}
ACE_ENDTRY;
return error_flag;
}
static void *
mutex_test_try_lock_thread (void *args)
{
// test out try_lock() failure cases
Mutex_Test_Data *data = ACE_reinterpret_cast (Mutex_Test_Data *, args);
RTCORBA::Mutex_ptr mutex = data->mutex;
CORBA::Boolean result;
ACE_TRY_NEW_ENV
{
// check that try_lock (0) returns false
ACE_DEBUG ((LM_DEBUG,"attempting try_lock (0) - expect failure (but no exceptions) \n"));
result = mutex->try_lock (0u ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (result)
{
ACE_ERROR ((LM_ERROR,
"try_lock succeeded, but expected a failure\n"));
*data->error_flag = 1;
}
if (test_try_lock_flag)
{
ACE_High_Res_Timer timer;
// Check that try_lock (timeout) returns false (and times
// out)
ACE_DEBUG ((LM_DEBUG,
"attempting try_lock (5 sec) - expect failure after 5 secs (but no exceptions)\n"));
timer.start ();
result = mutex->try_lock (50000000u /*5sec*/ ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
timer.stop ();
if (result)
{
ACE_ERROR ((LM_ERROR,
"try_lock (timeout) succeeded, but expected a failure\n"));
*data->error_flag = 1;
}
ACE_Time_Value measured;
timer.elapsed_time (measured);
ACE_DEBUG ((LM_DEBUG,
"try_lock returned after %u secs, %u usecs\n",
measured.sec(),
measured.usec()));
if ((measured.sec() == 4 && measured.usec() >= 500000)
|| (measured.sec() == 5 && measured.usec() <= 500000))
/* success */;
else
{
ACE_ERROR ((LM_ERROR,
"try_lock timed out not as expected\n"));
*data->error_flag = 1;
}
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in mutex_test_try_lock_thread()");
*data->error_flag = 1;
}
ACE_ENDTRY;
return 0;
}
static int
test_mutex_try_lock (RTCORBA::RTORB_ptr rt_orb)
{
Mutex_Test_Data test_data;
CORBA::Boolean result;
int shared_var = 0;
int error_flag = 0;
ACE_TRY_NEW_ENV
{
RTCORBA::Mutex_ptr mutex = rt_orb->create_mutex (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Test out try_lock and keep the lock so that the spawned task
// can test out try_lock failure cases
result = mutex->try_lock (0u ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (!result)
ACE_ERROR_RETURN ((LM_ERROR,
"try_lock failed\n"),
-1);
test_data.mutex = mutex;
test_data.shared_var = &shared_var;
test_data.error_flag = &error_flag;
ACE_DEBUG ((LM_DEBUG,
"Spawning the test thread\n"));
if (ACE_Thread_Manager::instance ()->spawn (ACE_THR_FUNC (mutex_test_try_lock_thread),
(void *) &test_data,
THR_NEW_LWP | THR_DETACHED) == -1)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p\n%a"),
ACE_TEXT ("thread create failed")));
// Wait for the threads to exit.
ACE_Thread_Manager::instance ()->wait ();
CORBA::release (mutex);
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in test_mutex_try_lock()");
return -1;
}
ACE_ENDTRY;
return error_flag;
}
#endif /* ACE_HAS_THREADS */
int
main (int argc, char *argv[])
{
ACE_TRY_NEW_ENV
{
// ORB.
CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Parse arguments.
if (parse_args (argc, argv) != 0)
return -1;
// RTORB.
CORBA::Object_var object =
orb->resolve_initial_references ("RTORB" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow (object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (check_for_nil (rt_orb.in (), "RTORB") == -1)
return -1;
ACE_DEBUG ((LM_DEBUG,
"Running RTCORBA Mutex unit tests\n"));
if (test_mutex_simple (rt_orb.in ()) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"test_mutex_simple failed\n"),
-1);
#if (TAO_HAS_NAMED_RT_MUTEXES == 1)
if (test_named_mutex_simple (rt_orb.in ()) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"test_named_mutex_simple failed\n"),
-1);
if (test_named_mutex_exception (rt_orb. in ()) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"test_named_mutex_exception failed\n"),
-1);
#else
ACE_DEBUG ((LM_DEBUG,
"Named RT_Mutex support is not enabled. "
"Skipping Named RT_Mutex tests.\n"));
#endif /* TAO_HAS_NAMED_RT_MUTEXES == 1 */
#if defined (ACE_HAS_THREADS)
if (test_mutex_threads (rt_orb.in ()) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"test_mutex_threads failed\n"),
-1);
else if (test_mutex_try_lock (rt_orb.in ()) != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"test_mutex_try_lock failed\n"),
-1);
#endif /* ACE_HAS_THREADS */
ACE_DEBUG ((LM_DEBUG, "Mutex test finished\n\n"));
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in Mutex test server:");
return -1;
}
ACE_ENDTRY;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?