[complement-svn] SF.net SVN: complement: [1914] branches/complement-sockios/explore/include/ sockio
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2008-06-26 05:45:31
|
Revision: 1914 http://complement.svn.sourceforge.net/complement/?rev=1914&view=rev Author: complement Date: 2008-06-25 22:45:30 -0700 (Wed, 25 Jun 2008) Log Message: ----------- Change condition processing for loop in connect_processor Fix check listener and related with listener connections. Not finished. Not work properly. Modified Paths: -------------- branches/complement-sockios/explore/include/sockios/socksrv.cc branches/complement-sockios/explore/include/sockios/socksrv.h branches/complement-sockios/explore/include/sockios/sp.cc branches/complement-sockios/explore/include/sockios/sp.h Modified: branches/complement-sockios/explore/include/sockios/socksrv.cc =================================================================== --- branches/complement-sockios/explore/include/sockios/socksrv.cc 2008-06-26 05:45:14 UTC (rev 1913) +++ branches/complement-sockios/explore/include/sockios/socksrv.cc 2008-06-26 05:45:30 UTC (rev 1914) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/06/18 22:25:39 yeti> +// -*- C++ -*- Time-stamp: <08/06/19 21:01:20 yeti> /* * Copyright (c) 2008 @@ -286,24 +286,27 @@ template <class Connect, class charT, class traits, class _Alloc, void (Connect::*C)( std::basic_sockstream<charT,traits,_Alloc>& )> bool connect_processor<Connect, charT, traits, _Alloc, C>::pop_ready( processor& p ) { - { - std::tr2::unique_lock<std::tr2::mutex> lk( rdlock ); + std::tr2::unique_lock<std::tr2::mutex> lk( rdlock ); - cnd.wait( lk, not_empty ); - p = ready_pool.front(); // it may contain p.c == 0, p.s == 0, if !in_work() - ready_pool.pop_front(); - // std::cerr << "pop 1\n"; + if ( !_in_work && ready_pool.empty() ) { + return false; + } + + cnd.wait( lk, not_empty ); + p = ready_pool.front(); // it may contain p.c == 0, p.s == 0, if !in_work() + ready_pool.pop_front(); + // std::cerr << "pop 1\n"; #if 0 - if ( p.c == 0 ) { // wake up, but _in_work may be still true here (in processor pipe?), - return false; // even I know that _in_work <- false before notification... - } // so, check twice + if ( p.c == 0 ) { // wake up, but _in_work may be still true here (in processor pipe?), + return false; // even I know that _in_work <- false before notification... + } // so, check twice #endif + + if ( _in_work ) { + return true; } - // std::cerr << "pop 2\n"; - - std::tr2::lock_guard<std::tr2::mutex> lk(inwlock); - return _in_work ? true : false; + return !ready_pool.empty(); // if !_in_work && ready_pool.empty() return false } template <class Connect, class charT, class traits, class _Alloc, void (Connect::*C)( std::basic_sockstream<charT,traits,_Alloc>& )> @@ -315,16 +318,21 @@ while ( pop_ready( p ) ) { // std::cerr << "worker 1\n"; - (p.c->*C)( *p.s ); - // std::cerr << "worker 2\n"; - if ( p.s->rdbuf()->in_avail() ) { - std::tr2::lock_guard<std::tr2::mutex> lk( rdlock ); - ready_pool.push_back( p ); + if ( p.c != 0 ) { + std::cerr << __FILE__ << ":" << __LINE__ << std::endl; + (p.c->*C)( *p.s ); + // std::cerr << "worker 2\n"; + if ( p.s->rdbuf()->in_avail() ) { + std::tr2::lock_guard<std::tr2::mutex> lk( rdlock ); + ready_pool.push_back( p ); + } else { + std::tr2::lock_guard<std::tr2::mutex> lk( wklock ); + worker_pool[p.s->rdbuf()->fd()] = p; + } + // std::cerr << "worker 3\n"; } else { - std::tr2::lock_guard<std::tr2::mutex> lk( wklock ); - worker_pool[p.s->rdbuf()->fd()] = p; + std::cerr << __FILE__ << ":" << __LINE__ << std::endl; } - // std::cerr << "worker 3\n"; } } @@ -332,13 +340,14 @@ template <class Connect, class charT, class traits, class _Alloc, void (Connect::*C)( std::basic_sockstream<charT,traits,_Alloc>& )> void connect_processor<Connect, charT, traits, _Alloc, C>::stop() { - std::tr2::lock_guard<std::tr2::mutex> lk(inwlock); + std::tr2::lock_guard<std::tr2::mutex> lk2( rdlock ); + _in_work = false; // <--- set before cnd.notify_one(); (below in this func) - - std::tr2::lock_guard<std::tr2::mutex> lk2( rdlock ); - ready_pool.push_back( processor() ); // make ready_pool not empty - // std::cerr << "=== " << ready_pool.size() << std::endl; - cnd.notify_one(); + if ( ready_pool.empty() ) { + ready_pool.push_back( processor() ); // make ready_pool not empty + cnd.notify_one(); + std::cerr << __FILE__ << ":" << __LINE__ << std::endl; + } std::cerr << __FILE__ << ":" << __LINE__ << std::endl; } Modified: branches/complement-sockios/explore/include/sockios/socksrv.h =================================================================== --- branches/complement-sockios/explore/include/sockios/socksrv.h 2008-06-26 05:45:14 UTC (rev 1913) +++ branches/complement-sockios/explore/include/sockios/socksrv.h 2008-06-26 05:45:30 UTC (rev 1914) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/06/18 22:25:25 yeti> +// -*- C++ -*- Time-stamp: <08/06/19 20:14:01 yeti> /* * Copyright (c) 2008 @@ -328,7 +328,6 @@ std::tr2::mutex wklock; std::tr2::mutex rdlock; std::tr2::condition_variable cnd; - std::tr2::mutex inwlock; std::tr2::condition_variable cnd_inwk; std::tr2::thread ploop; Modified: branches/complement-sockios/explore/include/sockios/sp.cc =================================================================== --- branches/complement-sockios/explore/include/sockios/sp.cc 2008-06-26 05:45:14 UTC (rev 1913) +++ branches/complement-sockios/explore/include/sockios/sp.cc 2008-06-26 05:45:30 UTC (rev 1914) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/06/18 22:37:15 yeti> +// -*- C++ -*- Time-stamp: <08/06/19 21:28:42 yeti> /* * Copyright (c) 2008 @@ -143,8 +143,9 @@ { int lfd = check_closed_listener( reinterpret_cast<socks_processor_t*>(_ctl.data.ptr) ); if ( lfd != -1 ) { - descr.erase( -1 ); + descr.erase( lfd ); } + dump_descr(); } break; case rqstop: @@ -175,10 +176,19 @@ listeners_final.insert(static_cast<void *>(ifd->second.p)); std::cerr << __FILE__ << ":" << __LINE__ << std::endl; - check_closed_listener( ifd->second.p ); - + + socks_processor_t* p = ifd->second.p; + descr.erase( ifd ); + int lfd = check_closed_listener( p ); + + if ( lfd != -1 ) { + descr.erase( lfd ); + } + + dump_descr(); + return; } @@ -221,13 +231,15 @@ std::cerr << __FILE__ << ":" << __LINE__ << std::endl; - listeners_final.insert(static_cast<void *>(ifd->second.p)); + socks_processor_t* p = ifd->second.p; + listeners_final.insert( static_cast<void *>(p) ); - check_closed_listener( ifd->second.p ); - descr.erase( ifd ); + check_closed_listener( p ); + std::cerr << __FILE__ << ":" << __LINE__ << std::endl; + dump_descr(); } else { // back to listen errno = 0; epoll_event xev; @@ -289,10 +301,17 @@ if ( info.p != 0 ) { // ... but controlled by processor (*info.p)( ifd->first, typename socks_processor_t::adopt_close_t() ); - check_closed_listener( info.p ); + socks_processor_t* p = info.p; + descr.erase( ifd ); + int lfd = check_closed_listener( p ); + if ( lfd != -1 ) { + descr.erase( lfd ); + } + } else { + descr.erase( ifd ); } - descr.erase( ifd ); std::cerr << __FILE__ << ":" << __LINE__ << std::endl; + dump_descr(); return; } @@ -393,13 +412,23 @@ std::cerr << __FILE__ << ":" << __LINE__ << std::endl; (*info.p)( ifd->first, typename socks_processor_t::adopt_close_t() ); std::cerr << __FILE__ << ":" << __LINE__ << std::endl; - check_closed_listener( info.p ); + + socks_processor_t* p = info.p; + + closed_queue.erase( ev.data.fd ); + descr.erase( ifd ); + + int lfd = check_closed_listener( p ); + if ( lfd != -1 ) { + descr.erase( lfd ); + } } else { std::cerr << __FILE__ << ":" << __LINE__ << std::endl; b->close(); + closed_queue.erase( ev.data.fd ); + descr.erase( ifd ); } - closed_queue.erase( ev.data.fd ); - descr.erase( ifd ); + dump_descr(); } // if ( ev.events & EPOLLHUP ) { // std::cerr << "Poll HUP" << std::endl; @@ -486,7 +515,23 @@ return myfd; } +template<class charT, class traits, class _Alloc> +void sockmgr<charT,traits,_Alloc>::dump_descr() +{ + for ( typename fd_container_type::iterator i = descr.begin(); i != descr.end(); ++i ) { + std::cerr << i->first + << std::hex + << i->second.flags + << " " + << (void*)i->second.b + << " " + << (void*)i->second.p + << std::dec + << endl; + } +} + } // namespace detail } // namespace std Modified: branches/complement-sockios/explore/include/sockios/sp.h =================================================================== --- branches/complement-sockios/explore/include/sockios/sp.h 2008-06-26 05:45:14 UTC (rev 1913) +++ branches/complement-sockios/explore/include/sockios/sp.h 2008-06-26 05:45:30 UTC (rev 1914) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <08/06/18 22:36:24 yeti> +// -*- C++ -*- Time-stamp: <08/06/19 20:30:48 yeti> /* * Copyright (c) 2008 @@ -211,6 +211,7 @@ { return *this; } int check_closed_listener( socks_processor_t* p ); + void dump_descr(); #ifdef __USE_STLPORT_HASH typedef std::hash_map<sock_base::socket_type,fd_info> fd_container_type; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |