[complement-svn] SF.net SVN: complement: [1722] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-09-05 11:10:45
|
Revision: 1722 http://complement.svn.sourceforge.net/complement/?rev=1722&view=rev Author: complement Date: 2007-09-05 04:10:42 -0700 (Wed, 05 Sep 2007) Log Message: ----------- looks like non-POD return from thread is unstable, and should be avoided; replace union rec_code by void * or long, depends upon operation environment Modified Paths: -------------- trunk/complement/explore/include/mt/xmt.h trunk/complement/explore/include/sockios/sockmgr.cc trunk/complement/explore/include/sockios/sockmgr.h trunk/complement/explore/include/stem/Cron.h trunk/complement/explore/include/stem/EvManager.h trunk/complement/explore/include/stem/NetTransport.h trunk/complement/explore/lib/mt/ChangeLog trunk/complement/explore/lib/mt/Makefile.inc trunk/complement/explore/lib/mt/ut/flck.cc trunk/complement/explore/lib/mt/ut/lfs.cc trunk/complement/explore/lib/mt/ut/mt_test.cc trunk/complement/explore/lib/mt/ut/mt_test.h trunk/complement/explore/lib/mt/ut/mt_test_suite.cc trunk/complement/explore/lib/mt/ut/signal-1.cc trunk/complement/explore/lib/mt/ut/signal-2.cc trunk/complement/explore/lib/mt/ut/signal-3.cc trunk/complement/explore/lib/mt/xmt.cc trunk/complement/explore/lib/sockios/ChangeLog trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc trunk/complement/explore/lib/sockios/ut/sockios_test.cc trunk/complement/explore/lib/stem/ChangeLog trunk/complement/explore/lib/stem/Cron.cc trunk/complement/explore/lib/stem/EvManager.cc trunk/complement/explore/lib/stem/NetTransport.cc trunk/complement/explore/lib/stem/ut/unit_test.cc Modified: trunk/complement/explore/include/mt/xmt.h =================================================================== --- trunk/complement/explore/include/mt/xmt.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/mt/xmt.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1377,13 +1377,14 @@ class Thread { public: - union ret_code - { - void *pword; - long iword; - }; +#ifdef _PTHREADS + typedef void * ret_t; +#endif +#ifdef __FIT_WIN32THREADS + typedef long ret_t; +#endif - typedef ret_code (*entrance_type)( void * ); + typedef ret_t (*entrance_type)( void * ); #ifdef __FIT_WIN32THREADS typedef unsigned long thread_key_type; typedef HANDLE thread_id_type; @@ -1444,7 +1445,7 @@ __FIT_DECLSPEC void launch( entrance_type entrance, const void *p = 0, size_t psz = 0, size_t stack_sz = 0 ); - __FIT_DECLSPEC ret_code join(); + __FIT_DECLSPEC ret_t join(); __FIT_DECLSPEC int suspend(); __FIT_DECLSPEC int resume(); __FIT_DECLSPEC int kill( int sig ); Modified: trunk/complement/explore/include/sockios/sockmgr.cc =================================================================== --- trunk/complement/explore/include/sockios/sockmgr.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/sockios/sockmgr.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/11 21:14:42 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:54:04 ptr> /* * Copyright (c) 1997-1999, 2002, 2003, 2005-2007 @@ -258,14 +258,71 @@ template <class Connect> bool sockmgr_stream_MP<Connect>::accept_udp() { -#if 0 if ( !is_open() ) { return false; } + _xsockaddr addr; socklen_t sz = sizeof( sockaddr_in ); - _xsockaddr addr; + bool _in_buf; + do { + _in_buf = false; + _pfd[0].revents = 0; + _pfd[1].revents = 0; + while ( poll( &_pfd[0], /* _pfd.size() */ 1, -1 ) < 0 ) { // wait infinite + if ( errno == EINTR ) { // may be interrupted, check and ignore + errno = 0; + continue; + } + return false; // poll wait infinite, so it can't return 0 (timeout), so it return -1. + } + + // New connction open before data read from opened sockets. + // This policy may be worth to revise. + + if ( (_pfd[0].revents & POLLERR) != 0 /* || (_pfd[1].revents & POLLERR) != 0 */ ) { + return false; // return 0 only for binded socket, or control socket + } + + if ( _pfd[0].revents != 0 ) { + xmt::scoped_lock lk(_fd_lck); + if ( !is_open_unsafe() ) { // may be already closed + return false; + } + // poll found event on binded socket + // get address of caller only + char buff[65535]; + ::recvfrom( fd(), buff, 65535, MSG_PEEK, &addr.any, &sz ); + try { + xmt::scoped_lock _l( _c_lock ); + // if addr.any pesent in _M_c + typename container_type::iterator i = + find_if( _M_c.begin(), _M_c.end(), bind2nd( _M_comp_inet, addr.any ) ); + if ( i == _M_c.end() ) { + _M_c.push_back( _Connect() ); + _M_c.back().open( fd(), addr.any, sock_base::sock_dgram ); + _Connect *cl_new = &_M_c.back(); + } + // + // ... + // + } + catch ( ... ) { + } + } +#if 0 + if ( _pfd[1].revents != 0 ) { // fd come back for poll + pollfd rfd; + ::read( _pfd[1].fd, reinterpret_cast<char *>(&rfd.fd), sizeof(sock_base::socket_type) ); + rfd.events = POLLIN; + rfd.revents = 0; + _pfd.push_back( rfd ); + } +#endif + } while ( /* !_shift_fd() && */ !_in_buf ); + +#if 0 if ( poll( &_pfd[0], 1, -1 ) < 0 ) { // wait infinite return false; // poll wait infinite, so it can't return 0 (timeout), so it return -1. } @@ -316,14 +373,12 @@ } template <class Connect> -xmt::Thread::ret_code sockmgr_stream_MP<Connect>::loop( void *p ) +xmt::Thread::ret_t sockmgr_stream_MP<Connect>::loop( void *p ) { _Self_type *me = static_cast<_Self_type *>(p); me->loop_id.pword( _idx ) = me; // push pointer to self for signal processing - xmt::Thread::ret_code rtc; - xmt::Thread::ret_code rtc_observer; - rtc.iword = 0; - rtc_observer.iword = 0; + xmt::Thread::ret_t rtc = 0; + xmt::Thread::ret_t rtc_observer = 0; xmt::Thread thr_observer; @@ -336,8 +391,8 @@ if ( thr_observer.bad() ) { if ( thr_observer.is_join_req() ) { rtc_observer = thr_observer.join(); - if ( rtc_observer.iword != 0 ) { - rtc.iword = -2; // there was connect_processor that was killed + if ( rtc_observer != 0 ) { + rtc = reinterpret_cast<xmt::Thread::ret_t>(-2); // there was connect_processor that was killed } } thr_observer.launch( observer, me, 0, PTHREAD_STACK_MIN * 2 ); @@ -345,7 +400,7 @@ } } catch ( ... ) { - rtc.iword = -1; + rtc = reinterpret_cast<xmt::Thread::ret_t>(-1); } xmt::block_signal( SIGINT ); @@ -367,19 +422,18 @@ rtc_observer = thr_observer.join(); me->_M_c.clear(); // FIN still may not come yet; force close - if ( rtc_observer.iword != 0 && rtc.iword == 0 ) { - rtc.iword = -2; // there was connect_processor that was killed + if ( rtc_observer != 0 && rtc == 0 ) { + rtc = reinterpret_cast<xmt::Thread::ret_t>(-2); // there was connect_processor that was killed } return rtc; } template <class Connect> -xmt::Thread::ret_code sockmgr_stream_MP<Connect>::connect_processor( void *p ) +xmt::Thread::ret_t sockmgr_stream_MP<Connect>::connect_processor( void *p ) { _Self_type *me = static_cast<_Self_type *>(p); - xmt::Thread::ret_code rtc; - rtc.iword = 0; + xmt::Thread::ret_t rtc = 0; try { timespec idle( me->_idle ); @@ -449,18 +503,17 @@ } while ( me->_is_follow() && idle_count < 2 ); } catch ( ... ) { - rtc.iword = -1; + rtc = reinterpret_cast<xmt::Thread::ret_t>(-1); } return rtc; } template <class Connect> -xmt::Thread::ret_code sockmgr_stream_MP<Connect>::observer( void *p ) +xmt::Thread::ret_t sockmgr_stream_MP<Connect>::observer( void *p ) { _Self_type *me = static_cast<_Self_type *>(p); - xmt::Thread::ret_code rtc; - rtc.iword = 0; + xmt::Thread::ret_t rtc = 0; int pool_size[3]; // size_t thr_pool_size[3]; timespec tpop; @@ -518,11 +571,11 @@ } if ( mgr.size() > 0 ) { mgr.signal( SIGTERM ); - rtc.iword = -1; + rtc = reinterpret_cast<xmt::Thread::ret_t>(-1); } } catch ( ... ) { - rtc.iword = -1; + rtc = reinterpret_cast<xmt::Thread::ret_t>(-1); } return rtc; @@ -802,14 +855,11 @@ } template <class Connect> -xmt::Thread::ret_code sockmgr_stream_MP_SELECT<Connect>::loop( void *p ) +xmt::Thread::ret_t sockmgr_stream_MP_SELECT<Connect>::loop( void *p ) { _Self_type *me = static_cast<_Self_type *>(p); me->loop_id.pword( _idx ) = me; // push pointer to self for signal processing - xmt::Thread::ret_code rtc; - rtc.iword = 0; - try { _Connect *s; unsigned _sfd; @@ -843,8 +893,8 @@ } me->close(); me->_c_lock.unlock(); - rtc.iword = -1; - return rtc; + + return reinterpret_cast<xmt::Thread::ret_t>(-1); // throw; } @@ -863,7 +913,7 @@ me->close(); me->_c_lock.unlock(); - return rtc; + return 0; } #endif // !__FIT_NO_SELECT Modified: trunk/complement/explore/include/sockios/sockmgr.h =================================================================== --- trunk/complement/explore/include/sockios/sockmgr.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/sockios/sockmgr.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/08/31 09:55:36 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:45:19 ptr> /* * Copyright (c) 1997-1999, 2002, 2003, 2005-2007 @@ -251,9 +251,9 @@ typedef std::deque<typename _Sequence::iterator> _connect_pool_sequence; void _open( sock_base::stype t = sock_base::sock_stream ); - static xmt::Thread::ret_code loop( void * ); - static xmt::Thread::ret_code connect_processor( void * ); - static xmt::Thread::ret_code observer( void * ); + static xmt::Thread::ret_t loop( void * ); + static xmt::Thread::ret_t connect_processor( void * ); + static xmt::Thread::ret_t observer( void * ); struct fd_equal : public std::binary_function<_Connect,int,bool> @@ -391,7 +391,7 @@ protected: void _open( sock_base::stype t = sock_base::sock_stream ); - static xmt::Thread::ret_code loop( void * ); + static xmt::Thread::ret_t loop( void * ); struct _Connect { sockstream *s; Modified: trunk/complement/explore/include/stem/Cron.h =================================================================== --- trunk/complement/explore/include/stem/Cron.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/stem/Cron.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/11 21:20:12 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:08:54 ptr> /* * Copyright (c) 1998, 2002, 2003, 2005, 2007 @@ -152,7 +152,7 @@ __FIT_DECLSPEC void EmptyStop(); private: - static xmt::Thread::ret_code _loop( void * ); + static xmt::Thread::ret_t _loop( void * ); xmt::Thread _thr; xmt::condition cond; Modified: trunk/complement/explore/include/stem/EvManager.h =================================================================== --- trunk/complement/explore/include/stem/EvManager.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/stem/EvManager.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/11 21:17:27 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:09:05 ptr> /* * Copyright (c) 1995-1999, 2002, 2003, 2005, 2006 @@ -239,7 +239,7 @@ const addr_type _x_high; addr_type _x_id; - static xmt::Thread::ret_code _Dispatch( void * ); + static xmt::Thread::ret_t _Dispatch( void * ); bool not_finished(); Modified: trunk/complement/explore/include/stem/NetTransport.h =================================================================== --- trunk/complement/explore/include/stem/NetTransport.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/include/stem/NetTransport.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/12/13 13:22:52 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:10:17 ptr> /* * Copyright (c) 1997-1999, 2002, 2003, 2005, 2006 @@ -97,14 +97,14 @@ virtual __FIT_DECLSPEC void close(); int join() - { return _thr.join().iword; } + { return reinterpret_cast<int>(_thr.join()); } private: NetTransportMgr( const NetTransportMgr& ); NetTransportMgr& operator =( const NetTransportMgr& ); protected: - static xmt::Thread::ret_code _loop( void * ); + static xmt::Thread::ret_t _loop( void * ); xmt::Thread _thr; std::sockstream _channel; }; Modified: trunk/complement/explore/lib/mt/ChangeLog =================================================================== --- trunk/complement/explore/lib/mt/ChangeLog 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ChangeLog 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,3 +1,17 @@ +2007-09-05 Petr Ovtchenkov <pt...@is...> + + * xmt.h, xmt.cc: looks like non-POD return from thread is unstable, + and should be avoided; replace union rec_code by void * or long, + depends upon operation environment; + + * ut/signal-1.cc, ut/signal-2.cc, ut/signal-3.cc: ditto; + + * ut/flck.cc, ut/mt_test.cc, ut/mt_test.h: ditto; + + * ut/lfs.cc, ut/mt_test_suite.cc: ditto; + + * libxmt: version 1.12.0 + 2007-08-27 Petr Ovtchenkov <pt...@is...> * shm.h: use namespace std for max. Modified: trunk/complement/explore/lib/mt/Makefile.inc =================================================================== --- trunk/complement/explore/lib/mt/Makefile.inc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/Makefile.inc 2007-09-05 11:10:42 UTC (rev 1722) @@ -2,7 +2,7 @@ LIBNAME = xmt MAJOR = 1 -MINOR = 11 +MINOR = 12 PATCH = 0 SRC_CC = xmt.cc thr_mgr.cc time.cc uid.cc shm.cc SRC_C = fl.c Modified: trunk/complement/explore/lib/mt/ut/flck.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/flck.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/flck.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/16 21:34:09 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:00:06 ptr> /* * Copyright (c) 2004, 2006, 2007 @@ -30,11 +30,8 @@ static mutex b; static int cnt = 0; -static Thread::ret_code thread_func( void * ) +static Thread::ret_t thread_func( void * ) { - Thread::ret_code rt; - rt.iword = 0; - try { for ( int count = 0; count < 10; ++count ) { int fd = open( fname, O_RDWR | O_CREAT | O_APPEND, 00666 ); @@ -83,17 +80,14 @@ b.lock(); BOOST_MESSAGE( "* The error returned: " << check << ", errno " << errno ); b.unlock(); - rt.iword = -1; + return reinterpret_cast<Thread::ret_t>(-1); } - return rt; + return 0; } -static Thread::ret_code thread_func_r( void * ) +static Thread::ret_t thread_func_r( void * ) { - Thread::ret_code rt; - rt.iword = 0; - char buf[64]; // buf[14] = 0; int ln = 0; @@ -200,10 +194,10 @@ b.lock(); BOOST_MESSAGE( "* The error returned: " << check << ", errno " << errno << ' ' << buf ); b.unlock(); - rt.iword = -1; + return reinterpret_cast<Thread::ret_t>(-1); } - return rt; + return 0; } int EXAM_IMPL(flock_test) Modified: trunk/complement/explore/lib/mt/ut/lfs.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/lfs.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/lfs.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/16 21:33:58 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:01:28 ptr> /* * Copyright (c) 2004, 2006, 2007 @@ -31,11 +31,8 @@ static int cnt = 0; static condition cnd; -static Thread::ret_code thread_func( void * ) +static Thread::ret_t thread_func( void * ) { - Thread::ret_code rt; - rt.iword = 0; - try { for ( int count = 0; count < 10; ++count ) { olfstream s( fname, ios_base::out | ios_base::app ); @@ -75,17 +72,14 @@ } catch ( ... ) { BOOST_REQUIRE( false ); - rt.iword = -1; + return reinterpret_cast<Thread::ret_t>(-1); } - return rt; + return 0; } -static Thread::ret_code thread_func_r( void * ) +static Thread::ret_t thread_func_r( void * ) { - Thread::ret_code rt; - rt.iword = 0; - try { string buf; int ln = 0; @@ -141,17 +135,14 @@ b.lock(); BOOST_REQUIRE( false ); b.unlock(); - rt.iword = -1; + return reinterpret_cast<Thread::ret_t>(-1); } - return rt; + return 0; } -static Thread::ret_code thread_func_manip( void * ) +static Thread::ret_t thread_func_manip( void * ) { - Thread::ret_code rt; - rt.iword = 0; - for ( int count = 0; count < 10; ++count ) { olfstream s( fname, ios_base::out | ios_base::app ); @@ -183,14 +174,11 @@ s.close(); } - return rt; + return 0; } -static Thread::ret_code thread_func_manip_r( void * ) +static Thread::ret_t thread_func_manip_r( void * ) { - Thread::ret_code rt; - rt.iword = 0; - string buf; cnd.try_wait(); @@ -232,7 +220,7 @@ s.close(); } - return rt; + return 0; } int EXAM_IMPL(lfs_test) Modified: trunk/complement/explore/lib/mt/ut/mt_test.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/mt_test.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/mt_test.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/08/06 10:03:33 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:31:04 ptr> /* * Copyright (c) 2006, 2007 @@ -46,14 +46,11 @@ static int x = 0; -xmt::Thread::ret_code thread_entry_call( void * ) +xmt::Thread::ret_t thread_entry_call( void * ) { x = 1; - xmt::Thread::ret_code rt; - rt.iword = 2; - - return rt; + return reinterpret_cast<xmt::Thread::ret_t>(2); } int EXAM_IMPL(mt_test::join_test) @@ -62,7 +59,7 @@ xmt::Thread t( thread_entry_call ); - EXAM_CHECK( t.join().iword == 2 ); + EXAM_CHECK( reinterpret_cast<int>(t.join()) == 2 ); EXAM_CHECK( x == 1 ); @@ -73,15 +70,12 @@ * Start two threads, align ones on barrier, join. */ -xmt::Thread::ret_code thread2_entry_call( void *p ) +xmt::Thread::ret_t thread2_entry_call( void *p ) { - xmt::Thread::ret_code rt; - rt.iword = 1; - xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); - return rt; + return reinterpret_cast<xmt::Thread::ret_t>(1); } int EXAM_IMPL(mt_test::barrier2) @@ -91,8 +85,9 @@ xmt::Thread t1( thread2_entry_call, &b ); xmt::Thread t2( thread2_entry_call, &b ); - EXAM_CHECK( t2.join().iword == 1 ); - EXAM_CHECK( t1.join().iword == 1 ); + EXAM_CHECK( reinterpret_cast<int>(t2.join()) == 1 ); + // std::cerr << t2.join() << std::endl; + EXAM_CHECK( reinterpret_cast<int>(t1.join()) == 1 ); return EXAM_RESULT; } @@ -102,16 +97,13 @@ * relinquish control to other; join (within Thread dtors) */ -xmt::Thread::ret_code thread3_entry_call( void *p ) +xmt::Thread::ret_t thread3_entry_call( void *p ) { - xmt::Thread::ret_code rt; - rt.iword = 0; - xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); EXAM_CHECK_ASYNC( xmt::Thread::yield() == 0 ); - return rt; + return 0; } int EXAM_IMPL(mt_test::yield) @@ -139,7 +131,7 @@ static xmt::mutex m1; -xmt::Thread::ret_code thr1( void *p ) +xmt::Thread::ret_t thr1( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -154,13 +146,10 @@ m1.unlock(); - xmt::Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } -xmt::Thread::ret_code thr2( void *p ) +xmt::Thread::ret_t thr2( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -173,10 +162,7 @@ x = 2; m1.unlock(); - xmt::Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } int EXAM_IMPL(mt_test::mutex_test) @@ -208,7 +194,7 @@ #ifdef __FIT_PTHREAD_SPINLOCK static xmt::spinlock sl1; -xmt::Thread::ret_code thr1s( void *p ) +xmt::Thread::ret_t thr1s( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -223,13 +209,10 @@ sl1.unlock(); - xmt::Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } -xmt::Thread::ret_code thr2s( void *p ) +xmt::Thread::ret_t thr2s( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -242,10 +225,7 @@ x = 2; sl1.unlock(); - xmt::Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } #endif @@ -309,7 +289,7 @@ m2.unlock(); } -xmt::Thread::ret_code thr1r( void *p ) +xmt::Thread::ret_t thr1r( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -326,14 +306,10 @@ m2.unlock(); - xmt::Thread::ret_code rt; - - rt.iword = 0; - - return rt; + return 0; } -xmt::Thread::ret_code thr2r( void *p ) +xmt::Thread::ret_t thr2r( void *p ) { xmt::barrier& b = *reinterpret_cast<xmt::barrier *>(p); b.wait(); @@ -351,11 +327,7 @@ m2.unlock(); - xmt::Thread::ret_code rt; - - rt.iword = 0; - - return rt; + return 0; } int EXAM_IMPL(mt_test::recursive_mutex_test) @@ -926,21 +898,18 @@ static int my_thr_scnt = 0; static xmt::mutex lock; -xmt::Thread::ret_code thread_mgr_entry_call( void * ) +xmt::Thread::ret_t thread_mgr_entry_call( void * ) { lock.lock(); ++my_thr_cnt; ++my_thr_scnt; lock.unlock(); - xmt::Thread::ret_code rt; - rt.iword = 0; - lock.lock(); --my_thr_cnt; lock.unlock(); - return rt; + return 0; } int EXAM_IMPL(mt_test::thr_mgr) Modified: trunk/complement/explore/lib/mt/ut/mt_test.h =================================================================== --- trunk/complement/explore/lib/mt/ut/mt_test.h 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/mt_test.h 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/16 21:01:43 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:02:19 ptr> /* * Copyright (c) 2006, 2007 @@ -32,7 +32,7 @@ int EXAM_DECL(thr_mgr); private: - // static xmt::Thread::ret_code thread_entry_call( void * ); + // static xmt::Thread::ret_t thread_entry_call( void * ); // static int x; }; Modified: trunk/complement/explore/lib/mt/ut/mt_test_suite.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/mt_test_suite.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/mt_test_suite.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/17 10:20:08 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:29:06 ptr> /* * Copyright (c) 2006, 2007 @@ -62,28 +62,5 @@ t.add( &shm_test::shm_segment, shmtest, "mt_test::shm_segment" ) ) ) ) ); - // add( barrier_tc, 0, 2 ); - // add( join_tc ); - // add( barrier2_tc, 0, 3 ); - // add( yield_tc, 0, 3 ); - // add( mutex_test_tc, 0, 3 ); -#ifdef __FIT_PTHREAD_SPINLOCK - // add( spinlock_test_tc, 0, 3 ); -#endif - // add( recursive_mutex_test_tc, 0, 3 ); - - // add( fork_tc ); - // add( pid_tc ); - // add( shm_segment_tc ); - // add( shm_alloc_tc ); - // add( fork_shm_tc, 0, 5 ); - // add( shm_nm_obj_tc, 0, 5 ); - - // add( thr_mgr_tc ); - - // add( shm_init_tc ); - // add( shm_nm_obj_more_tc ); - // add( shm_finit_tc ); - return t.girdle(); }; Modified: trunk/complement/explore/lib/mt/ut/signal-1.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/signal-1.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/signal-1.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/17 09:49:18 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:03:41 ptr> /* * Copyright (c) 2003, 2006, 2007 @@ -23,8 +23,8 @@ * handler (within thread 1): v == 1?; v = 4 */ -static Thread::ret_code thread_one( void * ); -static Thread::ret_code thread_two( void * ); +static Thread::ret_t thread_one( void * ); +static Thread::ret_t thread_two( void * ); static Thread *th_one = 0; static Thread *th_two = 0; @@ -54,7 +54,7 @@ } } -Thread::ret_code thread_one( void * ) +Thread::ret_t thread_one( void * ) { xmt::unblock_signal( SIGINT ); // we wait this signal // Default handler make exit() call: @@ -68,13 +68,10 @@ th_one->kill( SIGINT ); // send signal SIGINT to self - Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } -Thread::ret_code thread_two( void * ) +Thread::ret_t thread_two( void * ) { cnd.set( false ); @@ -89,10 +86,7 @@ EXAM_CHECK_ASYNC( v == 4 ); - Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } int EXAM_IMPL(signal_1_test) Modified: trunk/complement/explore/lib/mt/ut/signal-2.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/signal-2.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/signal-2.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/16 21:34:49 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:04:38 ptr> /* * Copyright (c) 2003, 2006, 2007 @@ -17,8 +17,8 @@ using namespace std; using namespace xmt; -static Thread::ret_code thread_one( void * ); -static Thread::ret_code thread_two( void * ); +static Thread::ret_t thread_one( void * ); +static Thread::ret_t thread_two( void * ); static Thread *th_one = 0; static Thread *th_two = 0; @@ -40,11 +40,8 @@ } } -Thread::ret_code thread_one( void * ) +Thread::ret_t thread_one( void * ) { - Thread::ret_code rt; - rt.iword = 0; - try { xmt::unblock_signal( SIGINT ); // we wait this signal // I set own handler, that throw signal: @@ -77,10 +74,10 @@ v = 5; } - return rt; + return 0; } -Thread::ret_code thread_two( void * ) +Thread::ret_t thread_two( void * ) { try { // pm.lock(); @@ -108,10 +105,7 @@ // v = 5; } - Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } int EXAM_IMPL(signal_2_test) Modified: trunk/complement/explore/lib/mt/ut/signal-3.cc =================================================================== --- trunk/complement/explore/lib/mt/ut/signal-3.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/ut/signal-3.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/17 09:50:35 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:05:31 ptr> /* * Copyright (c) 2003, 2006, 2007 @@ -28,8 +28,8 @@ * */ -static Thread::ret_code thread_one( void * ); -static Thread::ret_code thread_two( void * ); +static Thread::ret_t thread_one( void * ); +static Thread::ret_t thread_two( void * ); static Thread *th_one = 0; static Thread *th_two = 0; @@ -59,7 +59,7 @@ } } -Thread::ret_code thread_one( void * ) +Thread::ret_t thread_one( void * ) { EXAM_CHECK_ASYNC( v == 1 ); @@ -67,13 +67,10 @@ th_two->kill( SIGINT ); // send signal SIGINT to self - Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } -Thread::ret_code thread_two( void * ) +Thread::ret_t thread_two( void * ) { xmt::signal_handler( SIGINT, handler ); xmt::block_signal( SIGINT ); // block signal @@ -90,10 +87,7 @@ EXAM_CHECK_ASYNC( v == 4 ); - Thread::ret_code rt; - rt.iword = 0; - - return rt; + return 0; } int EXAM_IMPL(signal_3_test) Modified: trunk/complement/explore/lib/mt/xmt.cc =================================================================== --- trunk/complement/explore/lib/mt/xmt.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/mt/xmt.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -397,28 +397,26 @@ } __FIT_DECLSPEC -Thread::ret_code Thread::join() +Thread::ret_t Thread::join() { - ret_code rt; + ret_t rt = 0; #ifdef __FIT_WIN32THREADS - rt.iword = 0; if ( !_not_run() ) { WaitForSingleObject( _id, -1 ); - GetExitCodeThread( _id, &rt.iword ); + GetExitCodeThread( _id, &rt ); CloseHandle( _id ); // Locker lk( _llock ); _id = bad_thread_id; } #endif // __FIT_WIN32THREADS #if defined(__FIT_UITHREADS) || defined(_PTHREADS) - rt.pword = 0; if ( is_join_req() ) { # ifdef _PTHREADS - pthread_join( _rip_id, &rt.pword ); + pthread_join( _rip_id, &rt ); # endif # ifdef __FIT_UITHREADS - thr_join( _rip_id, 0, &rt.pword ); + thr_join( _rip_id, 0, &rt ); # endif // Locker lk( _llock ); _rip_id = bad_thread_id; @@ -509,14 +507,10 @@ void Thread::_exit( int code ) { #ifdef _PTHREADS - ret_code v; - v.iword = code; - pthread_exit( v.pword ); + pthread_exit( reinterpret_cast<ret_t>(code) ); #endif #ifdef __FIT_UITHREADS - ret_code v; - v.iword = code; - thr_exit( v.pword ); + thr_exit( reinterpret_cast<ret_t>(code) ); #endif #ifdef __FIT_WIN32THREADS ExitThread( code ); @@ -786,7 +780,7 @@ // of me->_entrance!!! void *_param = me->_param; size_t _param_sz = me->_param_sz; - ret_code ret; + ret_t ret = 0; //#ifdef _PTHREADS //# ifndef __hpux @@ -846,7 +840,7 @@ #ifndef _WIN32 cerr << e.what() << endl; #endif - ret.iword = -1; + ret = reinterpret_cast<ret_t>(-1); } catch ( int sig ) { if ( (me->_flags & (daemon | detached)) != 0 ) { // otherwise join expected @@ -866,7 +860,7 @@ #ifndef _WIN32 cerr << "\n--- Thread: signal " << sig /* (_sig_ ? _sig_ : "unknown") */ << " detected ---" << endl; #endif - ret.iword = sig; + ret = reinterpret_cast<ret_t>(sig); } catch ( ... ) { if ( (me->_flags & (daemon | detached)) != 0 ) { // otherwise join expected @@ -884,7 +878,7 @@ #ifndef _WIN32 cerr << "\n--- Thread: unknown exception occur ---" << endl; #endif - ret.iword = -1; + ret = reinterpret_cast<ret_t>(-1); } try { @@ -895,14 +889,14 @@ } } catch ( ... ) { - ret.iword = -1; + ret = reinterpret_cast<ret_t>(-1); } #if defined( __SUNPRO_CC ) && defined( __i386 ) - Thread::_exit( ret.iword ); + Thread::_exit( ret ); #endif - return ret.pword; + return ret; } #ifdef _WIN32 #pragma warning( default : 4101 ) Modified: trunk/complement/explore/lib/sockios/ChangeLog =================================================================== --- trunk/complement/explore/lib/sockios/ChangeLog 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/sockios/ChangeLog 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,3 +1,11 @@ +2007-09-05 Petr Ovtchenkov <pt...@is...> + + * sockmgr.h, sockmgr.cc: looks like non-POD return from thread is + unstable, and should be avoided; replace union rec_code by void * + or long, depends upon operation environment; + + * ut/ConnectionProcessor.cc, ut/sockios_test.cc: ditto. + 2007-09-01 Petr Ovtchenkov <pt...@is...> * sockstream: clean; add inet_sockaddr() method, that return Modified: trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/sockios/ut/ConnectionProcessor.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/18 23:10:22 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:39:10 ptr> /* * @@ -384,10 +384,9 @@ static srv_type *srv_p; condition cnd; -Thread::ret_code server_proc( void * ) +Thread::ret_t server_proc( void * ) { - Thread::ret_code rt; - rt.iword = 0; + unsigned rt = 0; cnd.set( false ); srv_type srv( port ); // start server @@ -395,20 +394,19 @@ ::srv_p = &srv; if ( !srv.is_open() || !srv.good() ) { - ++rt.iword; + ++rt; } cnd.set( true ); srv.wait(); - return rt; + return reinterpret_cast<Thread::ret_t>(rt); } -Thread::ret_code client_proc( void * ) +Thread::ret_t client_proc( void * ) { - Thread::ret_code rt; - rt.iword = 0; + unsigned rt = 0; cnd.try_wait(); @@ -420,7 +418,7 @@ getline( sock, buf ); if ( !sock.is_open() || !sock.good() ) { - ++rt.iword; + ++rt; } EXAM_CHECK_ASYNC( buf == "hello" ); @@ -445,7 +443,7 @@ EXAM_MESSAGE_ASYNC( "Client end" ); - return rt; + return reinterpret_cast<Thread::ret_t>(rt); } int EXAM_IMPL(trivial_sockios_test::srv_close_connection) @@ -454,8 +452,8 @@ cnd_close.set( false ); Thread client( client_proc ); - EXAM_CHECK( client.join().iword == 0 ); - EXAM_CHECK( srv.join().iword == 0 ); + EXAM_CHECK( client.join() == 0 ); + EXAM_CHECK( srv.join() == 0 ); return EXAM_RESULT; } @@ -519,11 +517,8 @@ std::sockstream *psock = 0; -Thread::ret_code thread_entry_call( void * ) +Thread::ret_t thread_entry_call( void * ) { - Thread::ret_code rt; - rt.iword = 0; - cnd.set( true ); EXAM_MESSAGE_ASYNC( "Client start" ); @@ -536,7 +531,7 @@ cnd_close.set( true ); psock->read( &c, 1 ); - return rt; + return 0; } int EXAM_IMPL(trivial_sockios_test::client_close_socket) Modified: trunk/complement/explore/lib/sockios/ut/sockios_test.cc =================================================================== --- trunk/complement/explore/lib/sockios/ut/sockios_test.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/sockios/ut/sockios_test.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/18 09:22:46 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 00:44:02 ptr> /* * @@ -177,12 +177,8 @@ { } -xmt::Thread::ret_code client_thr( void *p ) +xmt::Thread::ret_t client_thr( void *p ) { - xmt::Thread::ret_code ret; - - ret.iword = 0; - sockstream s( "localhost", port ); char buf[1024]; @@ -200,7 +196,7 @@ xmt::Thread::yield(); } - return ret; + return 0; } void sigpipe_handler( int sig, siginfo_t *si, void * ) @@ -459,9 +455,8 @@ // pr_lock.unlock(); } -xmt::Thread::ret_code thread_entry( void *par ) +xmt::Thread::ret_t thread_entry( void *par ) { - xmt::Thread::ret_code rt; xmt::condition& cnd = *reinterpret_cast<xmt::condition *>(par); // sem.wait(); // wait server for listen us @@ -475,8 +470,7 @@ EXAM_CHECK_ASYNC( buff == 1 ); // cerr << "Read pass" << endl; - rt.iword = 0; - return rt; + return 0; } int EXAM_IMPL(sockios_test::read0) @@ -531,6 +525,8 @@ catch ( xmt::shm_bad_alloc& err ) { EXAM_ERROR( err.what() ); } + + return EXAM_RESULT; } /* ************************************************************ */ Modified: trunk/complement/explore/lib/stem/ChangeLog =================================================================== --- trunk/complement/explore/lib/stem/ChangeLog 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/stem/ChangeLog 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,3 +1,11 @@ +2007-09-05 Petr Ovtchenkov <pt...@is...> + + * Cron.h, NetTransport.h, EvManager.h: looks like non-POD return + from thread is unstable, and should be avoided; replace union + rec_code by void * or long, depends upon operation environment; + + * Cron.cc, NetTransport.cc, EvManager.cc, ut/unit_test.cc: idem. + 2007-08-25 Petr Ovtchenkov <pt...@is...> * EvManager.h, NetTransport.cc: use ostream and trace flags Modified: trunk/complement/explore/lib/stem/Cron.cc =================================================================== --- trunk/complement/explore/lib/stem/Cron.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/stem/Cron.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/12/15 03:12:28 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:04:08 ptr> /* * Copyright (c) 1998, 2002, 2003, 2005, 2006 @@ -172,7 +172,7 @@ // do nothing } -xmt::Thread::ret_code Cron::_loop( void *p ) +xmt::Thread::ret_t Cron::_loop( void *p ) { // After creation cron loop (one per every Cron object), // this loop should exit in following cases: @@ -182,9 +182,6 @@ // after Add (Cron entry) event. Cron& me = *reinterpret_cast<Cron *>(p); - xmt::Thread::ret_code rt; - rt.iword = 0; - me.PushState( CRON_ST_STARTED ); timespec abstime; @@ -235,7 +232,7 @@ } } - return rt; + return 0; } Modified: trunk/complement/explore/lib/stem/EvManager.cc =================================================================== --- trunk/complement/explore/lib/stem/EvManager.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/stem/EvManager.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/08/17 22:22:13 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:04:58 ptr> /* * @@ -75,11 +75,9 @@ return !_dispatch_stop; } -xmt::Thread::ret_code EvManager::_Dispatch( void *p ) +xmt::Thread::ret_t EvManager::_Dispatch( void *p ) { EvManager& me = *reinterpret_cast<EvManager *>(p); - xmt::Thread::ret_code rt; - rt.iword = 0; xmt::mutex& lq = me._lock_queue; queue_type& in_ev_queue = me.in_ev_queue; queue_type& out_ev_queue = me.out_ev_queue; @@ -102,7 +100,7 @@ } } - return rt; + return 0; } __FIT_DECLSPEC Modified: trunk/complement/explore/lib/stem/NetTransport.cc =================================================================== --- trunk/complement/explore/lib/stem/NetTransport.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/stem/NetTransport.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/03/12 17:25:23 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:06:19 ptr> /* * @@ -437,12 +437,10 @@ join(); } -xmt::Thread::ret_code NetTransportMgr::_loop( void *p ) +xmt::Thread::ret_t NetTransportMgr::_loop( void *p ) { NetTransportMgr& me = *reinterpret_cast<NetTransportMgr *>(p); Event ev; - xmt::Thread::ret_code rt; - rt.iword = 0; gaddr_type dst; gaddr_type src; @@ -501,10 +499,10 @@ catch ( ... ) { me.NetTransport_base::close(); // throw; - rt.iword = -1; + return reinterpret_cast<xmt::Thread::ret_t>(-1); } - return rt; + return 0; } __FIT_DECLSPEC Modified: trunk/complement/explore/lib/stem/ut/unit_test.cc =================================================================== --- trunk/complement/explore/lib/stem/ut/unit_test.cc 2007-09-04 07:29:28 UTC (rev 1721) +++ trunk/complement/explore/lib/stem/ut/unit_test.cc 2007-09-05 11:10:42 UTC (rev 1722) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/20 00:21:37 ptr> +// -*- C++ -*- Time-stamp: <07/09/05 01:08:18 ptr> /* * Copyright (c) 2002, 2003, 2006, 2007 @@ -62,8 +62,8 @@ int EXAM_DECL(boring_manager); int EXAM_DECL(convert); - static xmt::Thread::ret_code thr1( void * ); - static xmt::Thread::ret_code thr1new( void * ); + static xmt::Thread::ret_t thr1( void * ); + static xmt::Thread::ret_t thr1new( void * ); private: }; @@ -89,7 +89,7 @@ xmt::Thread t1( thr1 ); - EXAM_CHECK( t1.join().iword == 0 ); + EXAM_CHECK( t1.join() == 0 ); node.wait(); @@ -98,11 +98,8 @@ return EXAM_RESULT; } -xmt::Thread::ret_code stem_test::thr1( void * ) +xmt::Thread::ret_t stem_test::thr1( void * ) { - xmt::Thread::ret_code rt; - rt.iword = 0; - Node node( 2001 ); EDS::Event ev( NODE_EV1 ); @@ -110,7 +107,7 @@ ev.dest( 2000 ); node.Send( ev ); - return rt; + return 0; } int EXAM_IMPL(stem_test::basic1new) @@ -145,11 +142,8 @@ return EXAM_RESULT; } -xmt::Thread::ret_code stem_test::thr1new( void * ) +xmt::Thread::ret_t stem_test::thr1new( void * ) { - xmt::Thread::ret_code rt; - rt.iword = 0; - NewNode *node = new NewNode( 2001 ); EDS::Event ev( NODE_EV1 ); @@ -159,7 +153,7 @@ delete node; - return rt; + return 0; } int EXAM_IMPL(stem_test::dl) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |