[complement-svn] SF.net SVN: complement: [1500] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-02-01 10:00:23
|
Revision: 1500 http://svn.sourceforge.net/complement/?rev=1500&view=rev Author: complement Date: 2007-02-01 02:00:21 -0800 (Thu, 01 Feb 2007) Log Message: ----------- reduce amount of code; try to 'join' to already closed threads, wait other in loop Modified Paths: -------------- trunk/complement/explore/lib/mt/ChangeLog trunk/complement/explore/lib/mt/Makefile.inc trunk/complement/explore/lib/mt/thr_mgr.cc trunk/complement/explore/test/mt/mt_test_suite.cc Modified: trunk/complement/explore/lib/mt/ChangeLog =================================================================== --- trunk/complement/explore/lib/mt/ChangeLog 2007-01-31 14:50:54 UTC (rev 1499) +++ trunk/complement/explore/lib/mt/ChangeLog 2007-02-01 10:00:21 UTC (rev 1500) @@ -1,3 +1,12 @@ +2007-02-01 Petr Ovtchenkov <pt...@is...> + + * thr_mgr.cc: reduce amount of code; try to 'join' to already + closed threads, wait other in loop. [this is attempt to find + workaround for deadlock within glibc, but speedup release + already free resources too] + + * libxmt: version 1.9.5 + 2007-01-30 Petr Ovtchenkov <pt...@is...> * shm.h: add named objects manager in shared segment Modified: trunk/complement/explore/lib/mt/Makefile.inc =================================================================== --- trunk/complement/explore/lib/mt/Makefile.inc 2007-01-31 14:50:54 UTC (rev 1499) +++ trunk/complement/explore/lib/mt/Makefile.inc 2007-02-01 10:00:21 UTC (rev 1500) @@ -1,8 +1,8 @@ -# -*- Makefile -*- Time-stamp: <06/11/29 01:59:50 ptr> +# -*- Makefile -*- Time-stamp: <07/02/01 11:14:39 ptr> LIBNAME = xmt MAJOR = 1 MINOR = 9 -PATCH = 4 +PATCH = 5 SRC_CC = xmt.cc thr_mgr.cc time.cc uid.cc shm.cc SRC_C = fl.c Modified: trunk/complement/explore/lib/mt/thr_mgr.cc =================================================================== --- trunk/complement/explore/lib/mt/thr_mgr.cc 2007-01-31 14:50:54 UTC (rev 1499) +++ trunk/complement/explore/lib/mt/thr_mgr.cc 2007-02-01 10:00:21 UTC (rev 1500) @@ -1,7 +1,7 @@ -// -*- C++ -*- Time-stamp: <06/12/13 17:54:09 ptr> +// -*- C++ -*- Time-stamp: <07/02/01 11:18:04 ptr> /* - * Copyright (c) 1997-1999, 2002, 2005, 2006 + * Copyright (c) 1997-1999, 2002, 2005-2007 * Petr Ovtchenkov * * Portion Copyright (c) 1999-2001 @@ -26,6 +26,25 @@ { return !__x->good(); } }; +struct rm_if_bad_thread : + public unary_function<Thread *,bool> +{ + bool operator()(Thread *__x); +}; + +bool rm_if_bad_thread::operator()(Thread *__x) +{ + if ( __x == 0 ) { + return true; + } + if ( !__x->good() ) { + __x->join(); + delete __x; + return true; + } + return false; +} + __FIT_DECLSPEC ThreadMgr::~ThreadMgr() { ThreadMgr::join(); @@ -33,70 +52,39 @@ __FIT_DECLSPEC void ThreadMgr::join() { - Locker lk( _lock ); - container_type::iterator i = _M_c.begin(); + // xmt::block_signal( SIGINT ); + // xmt::block_signal( SIGTERM ); + // xmt::block_signal( SIGPIPE ); + // xmt::block_signal( SIGCHLD ); + // xmt::block_signal( SIGPOLL ); - while ( i != _M_c.end() ) { - if ( (*i)->good() ) { - // (*i)->kill( SIGTERM ); - } - (*i)->join(); - delete *i; - _M_c.erase( i++ ); + Locker lk( _lock ); + _M_c.erase( remove_if( _M_c.begin(), _M_c.end(), rm_if_bad_thread() ), _M_c.end() ); + while ( !_M_c.empty() ) { + xmt::delay( xmt::timespec(0,100000000) ); + _M_c.erase( remove_if( _M_c.begin(), _M_c.end(), rm_if_bad_thread() ), _M_c.end() ); } } - __FIT_DECLSPEC void ThreadMgr::launch( Thread::entrance_type entrance, const void *p, size_t psz, unsigned flags, size_t stack_sz ) { - MT_REENTRANT( _lock, _x1 ); - container_type::iterator i = _M_c.begin(); - - while ( i != _M_c.end() ) { - if ( !(*i)->good() ) { - (*i)->join(); - delete *i; - _M_c.erase( i++ ); - } else { - ++i; - } - } - + Locker lk( _lock ); + _M_c.erase( remove_if( _M_c.begin(), _M_c.end(), rm_if_bad_thread() ), _M_c.end() ); _M_c.push_back( new Thread( entrance, p, psz, flags, stack_sz ) ); } __FIT_DECLSPEC void ThreadMgr::garbage_collector() { - MT_REENTRANT( _lock, _x1 ); - container_type::iterator i = _M_c.begin(); - - while ( i != _M_c.end() ) { - if ( !(*i)->good() ) { - (*i)->join(); - delete *i; - _M_c.erase( i++ ); - } else { - ++i; - } - } + Locker lk( _lock ); + _M_c.erase( remove_if( _M_c.begin(), _M_c.end(), rm_if_bad_thread() ), _M_c.end() ); } ThreadMgr::container_type::size_type ThreadMgr::size() { - MT_REENTRANT( _lock, _x1 ); - container_type::iterator i = _M_c.begin(); - - while ( i != _M_c.end() ) { - if ( !(*i)->good() ) { - (*i)->join(); - delete *i; - _M_c.erase( i++ ); - } else { - ++i; - } - } + Locker lk( _lock ); + _M_c.erase( remove_if( _M_c.begin(), _M_c.end(), rm_if_bad_thread() ), _M_c.end() ); return _M_c.size(); } Modified: trunk/complement/explore/test/mt/mt_test_suite.cc =================================================================== --- trunk/complement/explore/test/mt/mt_test_suite.cc 2007-01-31 14:50:54 UTC (rev 1499) +++ trunk/complement/explore/test/mt/mt_test_suite.cc 2007-02-01 10:00:21 UTC (rev 1500) @@ -1,7 +1,7 @@ -// -*- C++ -*- Time-stamp: <07/01/29 15:36:45 ptr> +// -*- C++ -*- Time-stamp: <07/01/31 23:51:46 ptr> /* - * Copyright (c) 2006 + * Copyright (c) 2006, 2007 * Petr Ovtchenkov * * Licensed under the Academic Free License Version 3.0 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |