[complement-svn] SF.net SVN: complement: [1726] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-09-07 11:03:35
|
Revision: 1726 http://complement.svn.sourceforge.net/complement/?rev=1726&view=rev Author: complement Date: 2007-09-07 04:03:24 -0700 (Fri, 07 Sep 2007) Log Message: ----------- added macro EXAM_CHECK_ASYNC_F, EXAM_ERROR_ASYNC_F Modified Paths: -------------- trunk/complement/explore/include/exam/suite.h trunk/complement/explore/lib/exam/ChangeLog trunk/complement/explore/lib/mt/ut/mt_test.cc trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc Modified: trunk/complement/explore/include/exam/suite.h =================================================================== --- trunk/complement/explore/include/exam/suite.h 2007-09-07 10:54:55 UTC (rev 1725) +++ trunk/complement/explore/include/exam/suite.h 2007-09-07 11:03:24 UTC (rev 1726) @@ -324,24 +324,28 @@ # define EXAM_RESULT __exam_counter # define EXAM_CHECK(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); __exam_counter |= 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) # define EXAM_CHECK_ASYNC(C) if ( !(C) ) { exam::test_suite::report_async( __FILE__, __LINE__, false, #C ); } else exam::test_suite::report_async( __FILE__, __LINE__, true, #C ) +# define EXAM_CHECK_ASYNC_F(C,V) if ( !(C) ) { exam::test_suite::report_async( __FILE__, __LINE__, false, #C ); V |= 1; } else exam::test_suite::report_async( __FILE__, __LINE__, true, #C ) # define EXAM_MESSAGE(M) __exam_ts->report( __FILE__, __LINE__, true, M ) # define EXAM_MESSAGE_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, true, M ) # define EXAM_REQUIRE(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); return 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) # define EXAM_FAIL(M) __exam_ts->report( __FILE__, __LINE__, false, M ); return 1 # define EXAM_ERROR(M) __exam_ts->report( __FILE__, __LINE__, false, M ); __exam_counter |= 1 # define EXAM_ERROR_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, false, M ) +# define EXAM_ERROR_ASYNC_F(M,V) exam::test_suite::report_async( __FILE__, __LINE__, false, M ); V |= 1 #else # define EXAM_IMPL(F) F( exam::test_suite *, int ) # define EXAM_DECL(F) F( exam::test_suite *, int = 0 ) # define EXAM_RESULT 0 # define EXAM_CHECK(C) (C) # define EXAM_CHECK_ASYNC(C) (C) +# define EXAM_CHECK_ASYNC_F(C,V) (C) # define EXAM_MESSAGE(M) # define EXAM_MESSAGE_ASYNC(M) # define EXAM_REQUIRE(C) (C) # define EXAM_FAIL(M) # define EXAM_ERROR(M) # define EXAM_ERROR_ASYNC(M) +# define EXAM_ERROR_ASYNC_F(M,V) #endif Modified: trunk/complement/explore/lib/exam/ChangeLog =================================================================== --- trunk/complement/explore/lib/exam/ChangeLog 2007-09-07 10:54:55 UTC (rev 1725) +++ trunk/complement/explore/lib/exam/ChangeLog 2007-09-07 11:03:24 UTC (rev 1726) @@ -1,3 +1,10 @@ +2007-09-07 Petr Ovtchenkov <pt...@is...> + + * suite.h: added macro EXAM_CHECK_ASYNC_F, EXAM_ERROR_ASYNC_F + that useful to set passed value to non-zero; useful for non-zero + exit status after fork or thread [may be checked in parent process + or thread]. + 2007-09-04 Petr Ovtchenkov <pt...@is...> * logger.h, logger.cc: added trivial_time_logger for performance Modified: trunk/complement/explore/lib/mt/ut/mt_test.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/mt_test.cc 2007-09-07 10:54:55 UTC (rev 1725) +++ trunk/complement/explore/lib/mt/ut/mt_test.cc 2007-09-07 11:03:24 UTC (rev 1726) @@ -99,11 +99,12 @@ xmt::Thread::ret_t thread3_entry_call( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); - EXAM_CHECK_ASYNC( xmt::Thread::yield() == 0 ); + EXAM_CHECK_ASYNC_F( xmt::Thread::yield() == 0, flag ); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } int EXAM_IMPL(mt_test::yield) @@ -133,24 +134,27 @@ xmt::Thread::ret_t thr1( void *p ) { + int flag = 0; + xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); m1.lock(); - EXAM_CHECK_ASYNC( x == 0 ); + EXAM_CHECK_ASYNC_F( x == 0, flag ); xmt::Thread::yield(); - EXAM_CHECK_ASYNC( x == 0 ); + EXAM_CHECK_ASYNC_F( x == 0, flag ); x = 1; m1.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } xmt::Thread::ret_t thr2( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); for ( int i = 0; i < 128; ++i ) { @@ -158,11 +162,11 @@ } m1.lock(); - EXAM_CHECK_ASYNC( x == 1 ); + EXAM_CHECK_ASYNC_F( x == 1, flag ); x = 2; m1.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } int EXAM_IMPL(mt_test::mutex_test) @@ -173,8 +177,8 @@ xmt::Thread t1( thr1, &b ); xmt::Thread t2( thr2, &b ); - t1.join(); - t2.join(); + EXAM_CHECK( t1.join() == 0 ); + EXAM_CHECK( t2.join() == 0 ); EXAM_CHECK( x == 2 ); @@ -196,24 +200,26 @@ xmt::Thread::ret_t thr1s( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); sl1.lock(); - EXAM_CHECK_ASYNC( x == 0 ); + EXAM_CHECK_ASYNC_F( x == 0, flag ); xmt::Thread::yield(); - EXAM_CHECK_ASYNC( x == 0 ); + EXAM_CHECK_ASYNC_F( x == 0, flag ); x = 1; sl1.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } xmt::Thread::ret_t thr2s( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); for ( int i = 0; i < 128; ++i ) { @@ -221,11 +227,11 @@ } sl1.lock(); - EXAM_CHECK_ASYNC( x == 1 ); + EXAM_CHECK_ASYNC_F( x == 1, flag ); x = 2; sl1.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } #endif @@ -239,8 +245,8 @@ xmt::Thread t1( thr1s, &b ); xmt::Thread t2( thr2s, &b ); - t1.join(); - t2.join(); + EXAM_CHECK( t1.join() == 0 ); + EXAM_CHECK( t2.join() == 0 ); EXAM_CHECK( x == 2 ); #endif @@ -291,26 +297,28 @@ xmt::Thread::ret_t thr1r( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); m2.lock(); - EXAM_CHECK_ASYNC( x == 0 ); + EXAM_CHECK_ASYNC_F( x == 0, flag ); x = 1; xmt::Thread::yield(); - EXAM_CHECK_ASYNC( x == 1 ); + EXAM_CHECK_ASYNC_F( x == 1, flag ); recursive(); - EXAM_CHECK_ASYNC( x == 2 ); + EXAM_CHECK_ASYNC_F( x == 2, flag ); x = 3; m2.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } xmt::Thread::ret_t thr2r( void *p ) { + int flag = 0; xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -320,14 +328,14 @@ m2.lock(); - EXAM_CHECK_ASYNC( x == 3 ); + EXAM_CHECK_ASYNC_F( x == 3, flag ); xmt::Thread::yield(); recursive(); - EXAM_CHECK_ASYNC( x == 2 ); + EXAM_CHECK_ASYNC_F( x == 2, flag ); m2.unlock(); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(flag); } int EXAM_IMPL(mt_test::recursive_mutex_test) @@ -338,8 +346,8 @@ xmt::Thread t1( thr1r, &b ); xmt::Thread t2( thr2r, &b ); - t1.join(); - t2.join(); + EXAM_CHECK( t1.join() == 0 ); + EXAM_CHECK( t2.join() == 0 ); EXAM_CHECK( x == 2 ); @@ -388,8 +396,13 @@ fcnd.set( true ); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } catch ( ... ) { } @@ -432,10 +445,12 @@ try { xmt::fork(); + int flag = 0; + try { // Child code - EXAM_CHECK_ASYNC( my_pid == xmt::getppid() ); + EXAM_CHECK_ASYNC_F( my_pid == xmt::getppid(), flag ); *reinterpret_cast<pid_t *>(static_cast<char *>(buf) + sizeof(xmt::__condition<true>)) = xmt::getpid(); fcnd.set( true ); @@ -444,7 +459,7 @@ catch ( ... ) { } - exit( 0 ); + exit( flag ); } catch ( xmt::fork_in_parent& child ) { try { @@ -454,8 +469,13 @@ EXAM_CHECK( *reinterpret_cast<pid_t *>(static_cast<char *>(buf) + sizeof(xmt::__condition<true>)) == child.pid() ); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } catch ( ... ) { } @@ -656,8 +676,13 @@ fcnd.set( true ); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } catch ( ... ) { } @@ -701,6 +726,8 @@ try { xmt::fork(); + int eflag = 0; + try { // Child code @@ -719,16 +746,16 @@ fcnd_ch.set( true ); } catch ( const xmt::shm_bad_alloc& err ) { - EXAM_ERROR_ASYNC( err.what() ); + EXAM_ERROR_ASYNC_F( err.what(), eflag ); } catch ( const std::invalid_argument& err ) { - EXAM_ERROR_ASYNC( err.what() ); + EXAM_ERROR_ASYNC_F( err.what(), eflag ); } catch ( ... ) { - EXAM_ERROR_ASYNC( "Fail in child" ); + EXAM_ERROR_ASYNC_F( "Fail in child", eflag ); } - exit( 0 ); + exit( eflag ); } catch ( xmt::fork_in_parent& child ) { try { @@ -736,8 +763,13 @@ fcnd.try_wait(); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } catch ( ... ) { EXAM_ERROR( "Fail in parent" ); @@ -802,6 +834,8 @@ try { xmt::fork(); + int eflag = 0; + try { xmt::shm_name_mgr<1>& nm_ch = seg1.name_mgr(); xmt::allocator_shm<xmt::__condition<true>,1> shm_ch; @@ -810,14 +844,19 @@ nm_ch.release<xmt::__condition<true> >( ObjName ); } catch ( const std::invalid_argument& err ) { - EXAM_ERROR_ASYNC( err.what() ); + EXAM_ERROR_ASYNC_F( err.what(), eflag ); } - exit( 0 ); + exit( eflag ); } catch ( xmt::fork_in_parent& child ) { fcnd.try_wait(); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } nm.release<xmt::__condition<true> >( ObjName ); // fcnd should be destroyed here @@ -828,6 +867,8 @@ try { xmt::fork(); + int eflag = 0; + try { xmt::shm_name_mgr<1>& nm_ch = seg1.name_mgr(); xmt::allocator_shm<xmt::__condition<true>,1> shm_ch; @@ -836,15 +877,20 @@ nm_ch.release<xmt::__condition<true> >( ObjName ); } catch ( const std::invalid_argument& err ) { - EXAM_ERROR_ASYNC( err.what() ); + EXAM_ERROR_ASYNC_F( err.what(), eflag ); } - exit( 0 ); + exit( eflag ); } catch ( xmt::fork_in_parent& child ) { fcnd1.try_wait(); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } nm.release<xmt::__condition<true> >( ObjName ); // fcnd should be destroyed here @@ -856,6 +902,7 @@ try { xmt::fork(); + int eflag = 0; try { xmt::shm_name_mgr<1>& nm_ch = seg1.name_mgr(); xmt::allocator_shm<xmt::__barrier<true>,1> shm_ch; @@ -864,15 +911,20 @@ nm_ch.release<xmt::__barrier<true> >( ObjName ); } catch ( const std::invalid_argument& err ) { - EXAM_ERROR_ASYNC( err.what() ); + EXAM_ERROR_ASYNC_F( err.what(), eflag ); } - exit( 0 ); + exit( eflag ); } catch ( xmt::fork_in_parent& child ) { b.wait(); - int stat; + int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child interrupted" ); + } } nm.release<xmt::__barrier<true> >( ObjName ); // barrier should be destroyed here } Modified: trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc 2007-09-07 10:54:55 UTC (rev 1725) +++ trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc 2007-09-07 11:03:24 UTC (rev 1726) @@ -393,9 +393,7 @@ ::srv_p = &srv; - if ( !srv.is_open() || !srv.good() ) { - ++rt; - } + EXAM_CHECK_ASYNC_F( srv.is_open() && srv.good(), rt ); cnd.set( true ); @@ -417,11 +415,9 @@ getline( sock, buf ); - if ( !sock.is_open() || !sock.good() ) { - ++rt; - } + EXAM_CHECK_ASYNC_F( sock.is_open() && sock.good(), rt ); - EXAM_CHECK_ASYNC( buf == "hello" ); + EXAM_CHECK_ASYNC_F( buf == "hello", rt ); // xmt::delay( xmt::timespec( 5, 0 ) ); @@ -437,7 +433,7 @@ char a; sock.read( &a, 1 ); - EXAM_CHECK_ASYNC( !sock.good() ); + EXAM_CHECK_ASYNC_F( !sock.good(), rt ); srv_p->close(); @@ -519,19 +515,20 @@ Thread::ret_t thread_entry_call( void * ) { + int eflag = 0; cnd.set( true ); EXAM_MESSAGE_ASYNC( "Client start" ); - EXAM_CHECK_ASYNC( psock->good() ); + EXAM_CHECK_ASYNC_F( psock->good(), eflag ); char c = '0'; psock->read( &c, 1 ); - EXAM_CHECK_ASYNC( c == '1' ); + EXAM_CHECK_ASYNC_F( c == '1', eflag ); cnd_close.set( true ); psock->read( &c, 1 ); - return 0; + return reinterpret_cast<xmt::Thread::ret_t>(eflag); } int EXAM_IMPL(trivial_sockios_test::client_close_socket) @@ -555,7 +552,7 @@ // but call shutdown is what you want here: psock->rdbuf()->shutdown( sock_base::stop_in | sock_base::stop_out ); psock->close(); - thr.join(); + EXAM_CHECK( thr.join() == 0 ); delete psock; srv.close(); // close server, so we don't wait server termination on next line This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |