Thread: [complement-svn] SF.net SVN: complement:[1971] trunk/complement/explore/lib/sockios/ut
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2008-10-13 10:34:58
|
Revision: 1971 http://complement.svn.sourceforge.net/complement/?rev=1971&view=rev Author: complement Date: 2008-10-13 10:34:44 +0000 (Mon, 13 Oct 2008) Log Message: ----------- fix test: 'all data available after sockstream was closed' processor_core test split into four tests; in the test of 'all data available after sockstream was closed' the key string checked _after_ check that all worker's dtor's pass. This allow to avoid check ambiguty. Modified Paths: -------------- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc trunk/complement/explore/lib/sockios/ut/sockios2_test.h trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:33:59 UTC (rev 1970) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:34:44 UTC (rev 1971) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/07/01 15:28:50 yeti> +// -*- C++ -*- Time-stamp: <08/10/06 13:33:08 ptr> /* * @@ -318,149 +318,159 @@ // prss->close(); // } -int EXAM_IMPL(sockios2_test::processor_core) +int EXAM_IMPL(sockios2_test::processor_core_one_local) { - { - connect_processor<worker> prss( 2008 ); + connect_processor<worker> prss( 2008 ); - EXAM_CHECK( prss.good() ); - EXAM_CHECK( prss.is_open() ); + EXAM_CHECK( prss.good() ); + EXAM_CHECK( prss.is_open() ); - { - sockstream s( "localhost", 2008 ); + { + sockstream s( "localhost", 2008 ); - EXAM_CHECK( s.good() ); - EXAM_CHECK( s.is_open() ); + EXAM_CHECK( s.good() ); + EXAM_CHECK( s.is_open() ); // for ( int i = 0; i < 64; ++i ) { // give chance to process it // std::tr2::this_thread::yield(); // } - unique_lock<mutex> lk( worker::lock ); + unique_lock<mutex> lk( worker::lock ); - EXAM_CHECK( worker::cnd.timed_wait( lk, milliseconds( 500 ), worker::visits_counter1 ) ); - worker::visits = 0; - } + // worker's ctor visited once: + EXAM_CHECK( worker::cnd.timed_wait( lk, milliseconds( 500 ), worker::visits_counter1 ) ); + worker::visits = 0; + } - // for ( int i = 0; i < 64; ++i ) { // give chance for system - // std::tr2::this_thread::yield(); - // } + // for ( int i = 0; i < 64; ++i ) { // give chance for system + // std::tr2::this_thread::yield(); + // } - unique_lock<mutex> lksrv( worker::lock ); - EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); - } + unique_lock<mutex> lksrv( worker::lock ); + // worker's dtor pass, no worker's objects left + EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(sockios2_test::processor_core_two_local) +{ { + // check precondition lock_guard<mutex> lk( worker::lock ); EXAM_CHECK( worker::cnt == 0 ); } - { - connect_processor<worker> prss( 2008 ); + connect_processor<worker> prss( 2008 ); - EXAM_CHECK( prss.good() ); - EXAM_CHECK( prss.is_open() ); + EXAM_CHECK( prss.good() ); + EXAM_CHECK( prss.is_open() ); - { - sockstream s1( "localhost", 2008 ); + { + sockstream s1( "localhost", 2008 ); - EXAM_CHECK( s1.good() ); - EXAM_CHECK( s1.is_open() ); + EXAM_CHECK( s1.good() ); + EXAM_CHECK( s1.is_open() ); - sockstream s2( "localhost", 2008 ); + sockstream s2( "localhost", 2008 ); - EXAM_CHECK( s2.good() ); - EXAM_CHECK( s2.is_open() ); + EXAM_CHECK( s2.good() ); + EXAM_CHECK( s2.is_open() ); // for ( int i = 0; i < 1024; ++i ) { // give chance to process it // std::tr2::this_thread::yield(); // } - unique_lock<mutex> lk( worker::lock ); + unique_lock<mutex> lk( worker::lock ); - EXAM_CHECK( worker::cnd.timed_wait( lk, milliseconds( 500 ), worker::visits_counter2 ) ); - worker::visits = 0; - } + // two worker's ctors visited (two connects) + EXAM_CHECK( worker::cnd.timed_wait( lk, milliseconds( 500 ), worker::visits_counter2 ) ); + worker::visits = 0; + } - // for ( int i = 0; i < 64; ++i ) { // give chance for system - // std::tr2::this_thread::yield(); - // } - unique_lock<mutex> lksrv( worker::lock ); - EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); - } + // for ( int i = 0; i < 64; ++i ) { // give chance for system + // std::tr2::this_thread::yield(); + // } + unique_lock<mutex> lksrv( worker::lock ); + // both worker's dtors pass, no worker's objects left + EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(sockios2_test::processor_core_getline) +{ { + // check precondition lock_guard<mutex> lk( worker::lock ); EXAM_CHECK( worker::cnt == 0 ); } + // check income data before sockstream was closed + connect_processor<worker> prss( 2008 ); - // check income data before sockstream was closed + EXAM_CHECK( prss.good() ); + EXAM_CHECK( prss.is_open() ); + { - connect_processor<worker> prss( 2008 ); + sockstream s1( "localhost", 2008 ); - EXAM_CHECK( prss.good() ); - EXAM_CHECK( prss.is_open() ); + EXAM_CHECK( s1.good() ); + EXAM_CHECK( s1.is_open() ); - { - sockstream s1( "localhost", 2008 ); + s1 << "Hello, world!" << endl; - EXAM_CHECK( s1.good() ); - EXAM_CHECK( s1.is_open() ); + unique_lock<mutex> lk( worker::lock ); + EXAM_CHECK( worker::line_cnd.timed_wait( lk, milliseconds( 500 ), worker::rd_counter1 ) ); - s1 << "Hello, world!" << endl; + // cerr << worker::line << endl; + EXAM_CHECK( worker::line == "Hello, world!" ); + worker::line = ""; + worker::rd = 0; + } - unique_lock<mutex> lk( worker::lock ); - EXAM_CHECK( worker::line_cnd.timed_wait( lk, milliseconds( 500 ), worker::rd_counter1 ) ); + // for ( int i = 0; i < 64; ++i ) { // give chance for system + // std::tr2::this_thread::yield(); + // } - // cerr << worker::line << endl; - EXAM_CHECK( worker::line == "Hello, world!" ); - worker::line = ""; - worker::rd = 0; - } + unique_lock<mutex> lksrv( worker::lock ); + // worker's dtor pass, no worker's objects left + EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); - // for ( int i = 0; i < 64; ++i ) { // give chance for system - // std::tr2::this_thread::yield(); - // } + return EXAM_RESULT; +} - unique_lock<mutex> lksrv( worker::lock ); - EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); - } - +int EXAM_IMPL(sockios2_test::processor_core_income_data) +{ // check after sockstream was closed, i.e. ensure, that all data available - // was read before stream was closed - { - connect_processor<worker> prss( 2008 ); + connect_processor<worker> prss( 2008 ); - EXAM_CHECK( prss.good() ); - EXAM_CHECK( prss.is_open() ); + EXAM_CHECK( prss.good() ); + EXAM_CHECK( prss.is_open() ); - { - sockstream s1( "localhost", 2008 ); + { + sockstream s1( "localhost", 2008 ); - EXAM_CHECK( s1.good() ); - EXAM_CHECK( s1.is_open() ); + EXAM_CHECK( s1.good() ); + EXAM_CHECK( s1.is_open() ); - s1 << "Hello, world!" << endl; - } + s1 << "Hello, world!" << endl; + } - { - unique_lock<mutex> lk( worker::lock ); - EXAM_CHECK( worker::line_cnd.timed_wait( lk, milliseconds( 500 ), worker::rd_counter1 ) ); - } + { + unique_lock<mutex> lk( worker::lock ); + EXAM_CHECK( worker::line_cnd.timed_wait( lk, milliseconds( 500 ), worker::rd_counter1 ) ); + } - // cerr << worker::line << endl; - EXAM_CHECK( worker::line == "Hello, world!" ); - worker::line = ""; - worker::rd = 0; - - for ( int i = 0; i < 64; ++i ) { // give chance for system - std::tr2::this_thread::yield(); - } - // { - // unique_lock<mutex> lksrv( worker::lock ); - // EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); - // } + { + unique_lock<mutex> lksrv( worker::lock ); + EXAM_CHECK( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ) ); } + EXAM_CHECK( worker::line == "Hello, world!" ); + worker::line = ""; + worker::rd = 0; + return EXAM_RESULT; } Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.h =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:33:59 UTC (rev 1970) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:34:44 UTC (rev 1971) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/07/01 12:21:46 yeti> +// -*- C++ -*- Time-stamp: <08/10/06 13:28:39 ptr> /* * @@ -23,7 +23,10 @@ int EXAM_DECL(srv_core); int EXAM_DECL(connect_disconnect); int EXAM_DECL(disconnect); - int EXAM_DECL(processor_core); + int EXAM_DECL(processor_core_one_local); + int EXAM_DECL(processor_core_two_local); + int EXAM_DECL(processor_core_getline); + int EXAM_DECL(processor_core_income_data); int EXAM_DECL(fork); int EXAM_DECL(srv_sigpipe); int EXAM_DECL(read0); Modified: trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:33:59 UTC (rev 1970) +++ trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:34:44 UTC (rev 1971) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/07/01 12:57:40 yeti> +// -*- C++ -*- Time-stamp: <08/10/06 13:30:03 ptr> /* * @@ -80,9 +80,12 @@ t.add( &sockios2_test::read0, test2, "sockios2_test::read0", t.add( &sockios2_test::srv_sigpipe, test2, "sockios2_test::srv_sigpipe", t.add( &sockios2_test::fork, test2, "sockios2_test::fork", - tc[3] = t.add( &sockios2_test::processor_core, test2, "sockios2_test::processor_core", - t.add( &sockios2_test::connect_disconnect, test2, "sockios2_test::connect_disconnect", - t.add( &sockios2_test::srv_core, test2, "sockios2_test::srv_core" ) ) ) ) ) ); + tc[3] = t.add( &sockios2_test::processor_core_income_data, test2, "all data available after sockstream was closed", + t.add( &sockios2_test::processor_core_getline, test2, "check income data before sockstream was closed", + t.add( &sockios2_test::processor_core_two_local, test2, "two local connects to connection processor", + t.add( &sockios2_test::processor_core_one_local, test2, "one local connect to connection processor", + t.add( &sockios2_test::connect_disconnect, test2, "sockios2_test::connect_disconnect", + t.add( &sockios2_test::srv_core, test2, "sockios2_test::srv_core" ) ) ) ) ) ) ) ) ); t.add( &sockios2_test::disconnect, test2, "sockios2_test::disconnect", tc[3] ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2008-10-13 10:39:16
|
Revision: 1977 http://complement.svn.sourceforge.net/complement/?rev=1977&view=rev Author: complement Date: 2008-10-13 10:39:06 +0000 (Mon, 13 Oct 2008) Log Message: ----------- test for trail-of-data with client and server in different processes Result negative: as in case of the single process for client and server, sometimes I can't read trailing data. Further investigation required. Allow srv_sigpipe test: it pass at fighter. disconnect test fail and lead to deadlock. read0 (i.e. test with SIGCHLD signal on read) pass at fighter. Modified Paths: -------------- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc trunk/complement/explore/lib/sockios/ut/sockios2_test.h trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:38:22 UTC (rev 1976) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:39:06 UTC (rev 1977) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/08 22:42:20 yeti> +// -*- C++ -*- Time-stamp: <08/10/09 01:43:37 ptr> /* * @@ -440,6 +440,26 @@ return EXAM_RESULT; } + +/* + * If server and client both in the same process (sure?), server can + * see signal about close client socket _before_ it receive the rest of data + * (tcp stack implemenation dependent?). + * So sockios2_test::processor_core_income_data may not fill line + * with "Hello, world!". + * + * But if server and client situated in different processes, server will see + * FYN _after_ it read all data. + * + * Tests processor_core_income_data and income_data (below) are the same, + * except first has client and server in the same process, while second + * has server in child process. See commented line: + * // EXAM_CHECK( worker::line == "Hello, world!" ); // <-- may fail + * in the first test. + * + * Good text above. But wrong. + */ + int EXAM_IMPL(sockios2_test::processor_core_income_data) { // check after sockstream was closed, i.e. ensure, that all data available @@ -474,6 +494,88 @@ return EXAM_RESULT; } +int EXAM_IMPL(sockios2_test::income_data) +{ + const char fname[] = "/tmp/sockios2_test.shm"; + + // worker::lock.lock(); + worker::visits = 0; + worker::line = ""; + worker::rd = 0; + // worker::lock.unlock(); + + try { + xmt::shm_alloc<0> seg; + seg.allocate( fname, 4096, xmt::shm_base::create | xmt::shm_base::exclusive, 0660 ); + + xmt::allocator_shm<barrier_ip,0> shm; + barrier_ip& b = *new ( shm.allocate( 1 ) ) barrier_ip(); + + try { + + EXAM_CHECK( worker::visits == 0 ); + + this_thread::fork(); + + int res = 0; + { + connect_processor<worker> prss( 2008 ); + + EXAM_CHECK_ASYNC_F( worker::visits == 0, res ); + + b.wait(); // -- align here + + EXAM_CHECK_ASYNC_F( prss.good(), res ); + EXAM_CHECK_ASYNC_F( prss.is_open(), res ); + + { + unique_lock<mutex> lk( worker::lock ); + EXAM_CHECK_ASYNC_F( worker::line_cnd.timed_wait( lk, milliseconds( 500 ), worker::rd_counter1 ), res ); + } + + { + unique_lock<mutex> lksrv( worker::lock ); + EXAM_CHECK_ASYNC_F( worker::cnd.timed_wait( lksrv, milliseconds( 500 ), worker::counter0 ), res ); + } + + EXAM_CHECK_ASYNC_F( worker::line == "Hello, world!", res ); // <-- may fail + } + + exit( res ); + } + catch ( std::tr2::fork_in_parent& child ) { + b.wait(); // -- align here + + { + sockstream s1( "localhost", 2008 ); + + EXAM_CHECK( s1.good() ); + EXAM_CHECK( s1.is_open() ); + + s1 << "Hello, world!" << endl; + } + + 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" ); + } + + EXAM_CHECK( worker::visits == 0 ); + } + shm.deallocate( &b ); + seg.deallocate(); + unlink( fname ); + } + catch ( xmt::shm_bad_alloc& err ) { + EXAM_ERROR( err.what() ); + } + + return EXAM_RESULT; +} + class srv_reader { public: @@ -550,7 +652,7 @@ s.rdbuf()->shutdown( sock_base::stop_in | sock_base::stop_out ); - // s.close(); // should work with this line commened, but sorry + s.close(); // should work with this line commened, but sorry int stat = -1; EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); @@ -696,7 +798,7 @@ int EXAM_IMPL(sockios2_test::srv_sigpipe) { - throw exam::skip_exception(); + // throw exam::skip_exception(); const char fname[] = "/tmp/sockios2_test.shm"; try { @@ -754,9 +856,9 @@ EXAM_CHECK( r.good() ); EXAM_CHECK( r.is_open() ); - for ( int i = 0; i < 64; ++i ) { // give chance for system - std::tr2::this_thread::yield(); - } + // for ( int i = 0; i < 64; ++i ) { // give chance for system + // std::tr2::this_thread::yield(); + // } } shm.deallocate( &b ); seg.deallocate(); @@ -779,16 +881,16 @@ int n = 1; - cerr << "align 3\n"; + // cerr << "align 3\n"; bb->wait(); // <-- align 3 - cerr << "align 3 pass\n"; + // cerr << "align 3 pass\n"; s.write( (const char *)&n, sizeof( int ) ).flush(); EXAM_CHECK_ASYNC( s.good() ); } ~interrupted_writer() - { cerr << "~~\n"; } + { /* cerr << "~~\n"; */ } void connect( sockstream& s ) { } @@ -798,12 +900,12 @@ sockstream s( "localhost", 2008 ); int buff = 0; - cerr << "align 2" << endl; + // cerr << "align 2" << endl; b->wait(); // <-- align 2 - cerr << "align 2 pass" << endl; + // cerr << "align 2 pass" << endl; EXAM_CHECK_ASYNC( s.read( (char *)&buff, sizeof(int) ).good() ); // <---- key line - cerr << "read pass" << endl; + // cerr << "read pass" << endl; EXAM_CHECK_ASYNC( buff == 1 ); } @@ -835,12 +937,12 @@ bb.wait(); // <-- align 2 - cerr << "system" << endl; + // cerr << "system" << endl; system( "echo > /dev/null" ); // <------ key line - cerr << "after system" << endl; + // cerr << "after system" << endl; bnew.wait(); // <-- align 3 - cerr << "after align 3" << endl; + // cerr << "after align 3" << endl; t.join(); Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.h =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:38:22 UTC (rev 1976) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:39:06 UTC (rev 1977) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/06 13:28:39 ptr> +// -*- C++ -*- Time-stamp: <08/10/09 00:36:27 ptr> /* * @@ -28,6 +28,7 @@ int EXAM_DECL(processor_core_getline); int EXAM_DECL(processor_core_income_data); int EXAM_DECL(fork); + int EXAM_DECL(income_data); int EXAM_DECL(srv_sigpipe); int EXAM_DECL(read0); }; Modified: trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:38:22 UTC (rev 1976) +++ trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:39:06 UTC (rev 1977) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/06 13:30:03 ptr> +// -*- C++ -*- Time-stamp: <08/10/09 00:39:27 ptr> /* * @@ -32,7 +32,7 @@ int main( int argc, const char** argv ) { - exam::test_suite::test_case_type tc[4]; + exam::test_suite::test_case_type tc[5]; exam::test_suite t( "libsockios test" ); @@ -79,7 +79,7 @@ t.add( &sockios2_test::read0, test2, "sockios2_test::read0", t.add( &sockios2_test::srv_sigpipe, test2, "sockios2_test::srv_sigpipe", - t.add( &sockios2_test::fork, test2, "sockios2_test::fork", + tc[4] = t.add( &sockios2_test::fork, test2, "sockios2_test::fork", tc[3] = t.add( &sockios2_test::processor_core_income_data, test2, "all data available after sockstream was closed", t.add( &sockios2_test::processor_core_getline, test2, "check income data before sockstream was closed", t.add( &sockios2_test::processor_core_two_local, test2, "two local connects to connection processor", @@ -88,6 +88,7 @@ t.add( &sockios2_test::srv_core, test2, "sockios2_test::srv_core" ) ) ) ) ) ) ) ) ); t.add( &sockios2_test::disconnect, test2, "sockios2_test::disconnect", tc[3] ); + t.add( &sockios2_test::income_data, test2, "all data available after sockstream was closed, different processes", tc[4] ); Opts opts; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2008-10-13 10:40:06
|
Revision: 1978 http://complement.svn.sourceforge.net/complement/?rev=1978&view=rev Author: complement Date: 2008-10-13 10:39:50 +0000 (Mon, 13 Oct 2008) Log Message: ----------- Simplest test for server stalling after client close connection Server side stack (i.e. child process): \#0 0xb80d3424 in __kernel_vsyscall () \#1 0xb7f63535 in pthread_join () from /lib/libpthread.so.0 \#2 0xb80c3738 in stlp_std::tr2::thread_base::join (this=0xbfbee488) at thread.cc:394 \#3 0x08085702 in ~connect_processor (this=0xbfbee310) at ../../../include/sockios/socksrv.h:255 \#4 0x08060694 in sockios2_test::disconnect_rawclnt (this=0xbfbee94e, __exam_ts=0xbfbee8cc, __exam_counter=0) at sockios2_test.cc:638 \#5 0x0808ca6a in exam::detail::method_invoker<sockios2_test>::operator() (this=0x9aae63c, ts=0xbfbee8cc, count=0) at ../../../include/exam/suite.h:95 \#6 0x0808ca8e in exam::detail::call_impl_t<exam::detail::method_invoker<sockios2_test> >::invoke ( this=0x9aae638, s=0xbfbee8cc, count=0) at ../../../include/exam/suite.h:54 \#7 0xb80837ac in exam::detail::call::operator() (this=0x9aae638, ts=0xbfbee8cc, count=0) at ../../include/exam/suite.h:119 \#8 0xb8083843 in exam::detail::test_case::operator() (this=0x9aae638, ts=0xbfbee8cc, count=0) at ../../include/exam/suite.h:138 \#9 0xb8081bde in exam::test_suite::run_test_case (this=0xbfbee8cc, v=16, n=0) at suite.cc:255 \#10 0xb80822c5 in exam::test_suite::single (this=0xbfbee8cc, one=16) at suite.cc:125 \#11 0x0808ab8a in main (argc=1, argv=0xbfbeedb4) at sockios_test_suite.cc:135 (gdb) info threads 3 Thread 0xb7d63b90 (LWP 17358) 0xb80d3424 in __kernel_vsyscall () 2 Thread 0xb7562b90 (LWP 17359) 0xb80d3424 in __kernel_vsyscall () 1 Thread 0xb7d648e0 (LWP 17357) 0xb80d3424 in __kernel_vsyscall () \#0 0xb80d3424 in __kernel_vsyscall () \#1 0xb7f666c5 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib/libpthread.so.0 \#2 0x0807d439 in stlp_std::tr2::__condition_variable<false>::wait (this=0x9aaf564, lock=@0xb75621b8) at ../../../include/mt/condition_variable:104 \#3 0x0807d4d4 in stlp_std::tr2::__condition_variable<false>::wait<stlp_std::basic_sockbuf<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >::rdready_t> (this=0x9aaf564, lock=@0xb75621b8, pred= {b = @0x9aaf4dc}) at ../../../include/mt/condition_variable:116 \#4 0x0807d62d in stlp_std::basic_sockbuf<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >::underflow (this=0x9aaf4dc) at ../../../include/sockios/sockstream.cc:325 \#5 0x0806258e in stlp_std::basic_streambuf<char, stlp_std::char_traits<char> >::uflow (this=0x9aaf4dc) at /export/home/ptr/STLport.lab/STLport/stlport/stl/_streambuf.c:165 \#6 0x08061d72 in stlp_std::basic_streambuf<char, stlp_std::char_traits<char> >::sbumpc ( this=0x9aaf4dc) at /export/home/ptr/STLport.lab/STLport/stlport/stl/_streambuf.h:229 \#7 0x0807f4d9 in stlp_std::priv::__read_unbuffered<char, stlp_std::char_traits<char>, stlp_std::priv::_Constant_unary_fun<bool, int> > (__that=0x9aaf4d0, __buf=0x9aaf4dc, _Num=4, __s=0xb75622b8 "1234$?\222\006\b\020?\228?\190?\191?\204?\227?\190?\191?\248\"V?\183?\215?\218\a\b?\236\"V?\183?\160?\243?\170\t\020?\227?\190?\191", __is_delim={_M_val = false}, __extract_delim=false, __append_null=false, __is_getline=false) at /export/home/ptr/STLport.lab/STLport/stlport/stl/_istream.c:597 \#8 0x0807fa75 in stlp_std::basic_istream<char, stlp_std::char_traits<char> >::read (this=0x9aaf4d0, __s=0xb75622b8 "1234$?\222\006\b\020?\228?\190?\191?\204?\227?\190?\191?\248\"V?\183?\215?\218\a\b?\236\"V?\183?\160?\243?\170\t\020?\227?\190?\191", __n=4) at /export/home/ptr/STLport.lab/STLport/stlport/stl/_istream.c:796 \#9 0x0807fb36 in srv_reader::connect (this=0x9aaf428, s=@0x9aaf4d0) at sockios2_test.cc:590 \#10 0x080830a9 in stlp_std::connect_processor<srv_reader, char, stlp_std::char_traits<char>, stlp_std::allocator<char>, &(srv_reader::connect(stlp_std::basic_sockstream<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >&))>::worker (this=0xbfbee310) at ../../../include/sockios/socksrv.cc:296 \#11 0x08083315 in stlp_std::connect_processor<srv_reader, char, stlp_std::char_traits<char>, stlp_std::allocator<char>, &(srv_reader::connect(stlp_std::basic_sockstream<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >&))>::loop (me=0xbfbee310) at ../../../include/sockios/socksrv.h:285 \#12 0x0806e932 in stlp_std::tr2::basic_thread<0u, 0u>::_call<void (*)(stlp_std::connect_processor<srv_reader, char, stlp_std::char_traits<char>, stlp_std::allocator<char>, &(srv_reader::connect(stlp_std::basic_sockstream<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >&))>*), stlp_std::connect_processor<srv_reader, char, stlp_std::char_traits<char>, stlp_std::allocator<char>, &(srv_reader::connect(stlp_std::basic_sockstream<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >&))>*> ( p=0xbfbee488) at ../../../include/mt/thread:477 \#13 0xb7f62120 in start_thread () from /lib/libpthread.so.0 \#14 0xb7eed3fe in clone () from /lib/libc.so.6 \#0 0xb80d3424 in __kernel_vsyscall () \#1 0xb7eedc06 in epoll_wait () from /lib/libc.so.6 \#2 0x08082202 in stlp_std::detail::sockmgr<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >::io_worker (this=0x9aaf1d0) at ../../../include/sockios/sockmgr.cc:33 \#3 0x08082567 in stlp_std::detail::sockmgr<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >::_loop (me=0x9aaf1d0) at ../../../include/sockios/sockmgr.h:147 \#4 0x0806e622 in stlp_std::tr2::basic_thread<0u, 0u>::_call<void (*)(stlp_std::detail::sockmgr<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >*), stlp_std::detail::sockmgr<char, stlp_std::char_traits<char>, stlp_std::allocator<char> >*> (p=0x9aaf260) at ../../../include/mt/thread:477 \#5 0xb7f62120 in start_thread () from /lib/libpthread.so.0 \#6 0xb7eed3fe in clone () from /lib/libc.so.6 Modified Paths: -------------- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc trunk/complement/explore/lib/sockios/ut/sockios2_test.h trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:39:06 UTC (rev 1977) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.cc 2008-10-13 10:39:50 UTC (rev 1978) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/09 01:43:37 ptr> +// -*- C++ -*- Time-stamp: <08/10/10 23:20:58 ptr> /* * @@ -599,6 +599,90 @@ std::tr2::condition_event srv_reader::cnd; +int EXAM_IMPL(sockios2_test::disconnect_rawclnt) +{ + // throw exam::skip_exception(); + + const char fname[] = "/tmp/sockios2_test.shm"; + xmt::shm_alloc<0> seg; + + try { + seg.allocate( fname, 4096, xmt::shm_base::create | xmt::shm_base::exclusive, 0660 ); + } + catch ( xmt::shm_bad_alloc& err ) { + EXAM_ERROR( err.what() ); + try { + seg.allocate( fname, 4096, 0, 0660 ); + } + catch ( xmt::shm_bad_alloc& err2 ) { + EXAM_ERROR( err.what() ); + return EXAM_RESULT; + } + } + + xmt::allocator_shm<barrier_ip,0> shm; + barrier_ip& b = *new ( shm.allocate( 1 ) ) barrier_ip(); + + try { + this_thread::fork(); + + int res = 0; + + { + connect_processor<srv_reader> prss( 2008 ); + + EXAM_CHECK_ASYNC_F( prss.good(), res ); + + b.wait(); + + EXAM_CHECK_ASYNC_F( srv_reader::cnd.timed_wait( milliseconds( 800 ) ), res ); + // srv_reader::cnd.wait(); + } + + exit( res ); + } + catch ( std::tr2::fork_in_parent& child ) { + b.wait(); + + char buf[] = "1234"; + + int fd = socket( PF_INET, SOCK_STREAM, 0 ); + + EXAM_CHECK( fd != 0 ); + + union sockaddr_t { + sockaddr_in inet; + sockaddr any; + } address; + + int port = 2008; + + address.inet.sin_family = AF_INET; + address.inet.sin_port = ((((port) >> 8) & 0xff) | (((port) & 0xff) << 8)); + address.inet.sin_addr = std::findhost( "localhost" ); + + EXAM_CHECK( connect( fd, &address.any, sizeof( address ) ) != -1 ); + + EXAM_CHECK( ::write( fd, buf, 4 ) == 4 ); + + ::close( fd ); + + int stat = -1; + EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + if ( WIFEXITED(stat) ) { + EXAM_CHECK( WEXITSTATUS(stat) == 0 ); + } else { + EXAM_ERROR( "child fail" ); + } + } + + shm.deallocate( &b ); + seg.deallocate(); + unlink( fname ); + + return EXAM_RESULT; +} + int EXAM_IMPL(sockios2_test::disconnect) { throw exam::skip_exception(); Modified: trunk/complement/explore/lib/sockios/ut/sockios2_test.h =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:39:06 UTC (rev 1977) +++ trunk/complement/explore/lib/sockios/ut/sockios2_test.h 2008-10-13 10:39:50 UTC (rev 1978) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/09 00:36:27 ptr> +// -*- C++ -*- Time-stamp: <08/10/10 23:05:17 ptr> /* * @@ -23,6 +23,7 @@ int EXAM_DECL(srv_core); int EXAM_DECL(connect_disconnect); int EXAM_DECL(disconnect); + int EXAM_DECL(disconnect_rawclnt); int EXAM_DECL(processor_core_one_local); int EXAM_DECL(processor_core_two_local); int EXAM_DECL(processor_core_getline); Modified: trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:39:06 UTC (rev 1977) +++ trunk/complement/explore/lib/sockios/ut/sockios_test_suite.cc 2008-10-13 10:39:50 UTC (rev 1978) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/10/09 00:39:27 ptr> +// -*- C++ -*- Time-stamp: <08/10/10 23:22:23 ptr> /* * @@ -88,6 +88,7 @@ t.add( &sockios2_test::srv_core, test2, "sockios2_test::srv_core" ) ) ) ) ) ) ) ) ); t.add( &sockios2_test::disconnect, test2, "sockios2_test::disconnect", tc[3] ); + t.add( &sockios2_test::disconnect_rawclnt, test2, "disconnect raw client", tc[3] ); t.add( &sockios2_test::income_data, test2, "all data available after sockstream was closed, different processes", tc[4] ); Opts opts; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |