[complement-svn] SF.net SVN: complement: [1422] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2006-11-29 08:07:55
|
Revision: 1422 http://svn.sourceforge.net/complement/?rev=1422&view=rev Author: complement Date: 2006-11-29 00:07:54 -0800 (Wed, 29 Nov 2006) Log Message: ----------- nettransport/nettransport name resolving work now Modified Paths: -------------- trunk/complement/explore/include/stem/EvManager.h trunk/complement/explore/lib/stem/EvManager.cc trunk/complement/explore/lib/stem/Names.cc trunk/complement/explore/lib/stem/NetTransport.cc trunk/complement/explore/test/libstem/unit/NameService.cc trunk/complement/explore/test/libstem/unit/unit_test.cc Modified: trunk/complement/explore/include/stem/EvManager.h =================================================================== --- trunk/complement/explore/include/stem/EvManager.h 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/include/stem/EvManager.h 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 16:52:05 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 02:52:45 ptr> /* * Copyright (c) 1995-1999, 2002, 2003, 2005, 2006 @@ -89,6 +89,13 @@ { return l.second < r.second; } public: + + enum traceflags { + notrace = 0, + tracenet = 1, + tracedispatch = 2 + }; + typedef std::queue< Event > queue_type; __FIT_DECLSPEC EvManager(); @@ -106,6 +113,10 @@ __FIT_DECLSPEC addr_type SubscribeRemote( const detail::transport& tr, const gaddr_type& addr, const char *info = 0 ); + __FIT_DECLSPEC addr_type SubscribeRemote( const gaddr_type& addr, + const std::string& info ); + __FIT_DECLSPEC addr_type SubscribeRemote( const gaddr_type& addr, + const char *info = 0 ); __FIT_DECLSPEC bool Unsubscribe( addr_type id ); __FIT_DECLSPEC addr_type reflect( const gaddr_type& addr ) const; __FIT_DECLSPEC gaddr_type reflect( addr_type addr ) const; Modified: trunk/complement/explore/lib/stem/EvManager.cc =================================================================== --- trunk/complement/explore/lib/stem/EvManager.cc 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/lib/stem/EvManager.cc 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 21:47:34 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 10:49:19 ptr> /* * @@ -115,7 +115,7 @@ Locker lk( _lock_xheap ); gaddr_type& gaddr = _ex_heap[id]; gaddr.hid = xmt::hostid(); - gaddr.pid = getpid(); + gaddr.pid = xmt::getpid(); gaddr.addr = id; _ui_heap[gaddr] = id; } @@ -139,7 +139,7 @@ Locker lk( _lock_xheap ); gaddr_type& gaddr = _ex_heap[id]; gaddr.hid = xmt::hostid(); - gaddr.pid = getpid(); + gaddr.pid = xmt::getpid(); gaddr.addr = id; _ui_heap[gaddr] = id; } @@ -168,7 +168,7 @@ Locker lk( _lock_xheap ); gaddr_type& gaddr = _ex_heap[id]; gaddr.hid = xmt::hostid(); - gaddr.pid = getpid(); + gaddr.pid = xmt::getpid(); gaddr.addr = id; _ui_heap[gaddr] = id; } @@ -196,7 +196,7 @@ Locker lk( _lock_xheap ); gaddr_type& gaddr = _ex_heap[id]; gaddr.hid = xmt::hostid(); - gaddr.pid = getpid(); + gaddr.pid = xmt::getpid(); gaddr.addr = id; _ui_heap[gaddr] = id; } @@ -253,6 +253,111 @@ } __FIT_DECLSPEC +addr_type EvManager::SubscribeRemote( const gaddr_type& addr, + const std::string& info ) +{ + cerr << __FILE__ << ":" << __LINE__ << endl; + + addr_type id; + if ( addr.hid == xmt::hostid() && addr.pid == xmt::getpid() ) { // local + cerr << __FILE__ << ":" << __LINE__ << endl; + if ( addr.addr & extbit ) { // may be transit object + Locker lk( _lock_xheap ); + uuid_ext_heap_type::const_iterator i = _ui_heap.find( addr ); + + if ( i != _ui_heap.end() ) { + return i->second; + } + } else { // may be local object + Locker lk( _lock_heap ); + local_heap_type::const_iterator i = heap.find( addr.addr ); + if ( i != heap.end() ) { + return i->first; + } + } + return badaddr; // don't know what I can made + } else { // foreign object + cerr << __FILE__ << ":" << __LINE__ << endl; + Locker lk( _lock_xheap ); + uuid_ext_heap_type::const_iterator i = _ui_heap.find( addr ); + + if ( i != _ui_heap.end() ) { + cerr << __FILE__ << ":" << __LINE__ << endl; + return i->second; + } + gaddr_type peer_zero( addr ); + peer_zero.addr = default_addr; + pair<uuid_tr_heap_type::const_iterator,uuid_tr_heap_type::const_iterator> range = _tr_heap.equal_range( peer_zero ); + cerr << __FILE__ << ":" << __LINE__ << "\n" << peer_zero << endl; + if ( range.first == range.second ) { // no transport + cerr << "#####" << endl;// << __FILE__ << ":" << __LINE__ << endl; + return badaddr; + } + id = create_unique_x(); + for ( uuid_tr_heap_type::const_iterator j = range.first; j != range.second; ++j ) { + _tr_heap.insert( make_pair( addr, j->second ) ); // all available transports + _ch_heap.insert( make_pair( j->second.link, addr ) ); + } + _ex_heap[id] = addr; + _ui_heap[addr] = id; + } + { + Locker lk( _lock_iheap ); + iheap[id] = info; + } + return id; +} + +__FIT_DECLSPEC +addr_type EvManager::SubscribeRemote( const gaddr_type& addr, + const char *info ) +{ + addr_type id; + if ( addr.hid == xmt::hostid() && addr.pid == xmt::getpid() ) { + if ( addr.addr & extbit ) { // may be transit object + Locker lk( _lock_xheap ); + uuid_ext_heap_type::const_iterator i = _ui_heap.find( addr ); + + if ( i != _ui_heap.end() ) { + return i->second; + } + } else { // may be local object + Locker lk( _lock_heap ); + local_heap_type::const_iterator i = heap.find( addr.addr ); + if ( i != heap.end() ) { + return i->first; + } + } + return badaddr; // don't know what I can made + } else { + Locker lk( _lock_xheap ); + uuid_ext_heap_type::const_iterator i = _ui_heap.find( addr ); + + if ( i != _ui_heap.end() ) { + return i->second; + } + gaddr_type peer_zero( addr ); + peer_zero.addr = default_addr; + pair<uuid_tr_heap_type::const_iterator,uuid_tr_heap_type::const_iterator> range = _tr_heap.equal_range( peer_zero ); + if ( range.first == range.second ) { // no transport + return badaddr; + } + id = create_unique_x(); + for ( uuid_tr_heap_type::const_iterator j = range.first; j != range.second; ++j ) { + _tr_heap.insert( make_pair( addr, j->second ) ); // all available transports + _ch_heap.insert( make_pair( j->second.link, addr ) ); + } + _ex_heap[id] = addr; + _ui_heap[addr] = id; + } + if ( info ) { + Locker _x1( _lock_iheap ); + iheap[id] = info; + } + return id; +} + +__FIT_DECLSPEC bool EvManager::Unsubscribe( addr_type id ) { if ( (id & extbit) ) { @@ -291,9 +396,9 @@ if ( stem::superflag != 0 ) { cerr << "%%%%%\n"; cerr << addr << endl; - cerr << dec << getpid() << endl; + cerr << dec << xmt::getpid() << endl; } - if ( addr.hid == xmt::hostid() && addr.pid == getpid() ) { + if ( addr.hid == xmt::hostid() && addr.pid == xmt::getpid() ) { // this host, this process if ( stem::superflag != 0 ) { cerr << "%%%%% 1\n"; @@ -420,7 +525,7 @@ if ( i == _ex_heap.end() ) { // destination not found ostringstream s; s << "external address unknown: " << hex << e.dest() << " from " - << e.src() << ", pid " << getpid() << dec; + << e.src() << ", pid " << xmt::getpid() << dec; throw invalid_argument( s.str() ); } @@ -438,7 +543,7 @@ if ( j == _ex_heap.end() ) { gaddr_type& _gaddr_src = _ex_heap[e.src()]; _gaddr_src.hid = xmt::hostid(); - _gaddr_src.pid = getpid(); + _gaddr_src.pid = xmt::getpid(); _gaddr_src.addr = e.src(); // it may be as local as foreign; if e.src() // is foreign, the object is 'transit object' _ui_heap[_gaddr_src] = e.src(); Modified: trunk/complement/explore/lib/stem/Names.cc =================================================================== --- trunk/complement/explore/lib/stem/Names.cc 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/lib/stem/Names.cc 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 17:12:45 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 10:21:44 ptr> /* * Copyright (c) 1997-1999, 2002, 2003, 2005, 2006 @@ -83,24 +83,18 @@ manager()->_lock_iheap.lock(); for ( EvManager::info_heap_type::const_iterator i = manager()->iheap.begin(); i != manager()->iheap.end(); ++i ) { - cerr << hex << i->first << " => " << i->second << endl; if ( i->second == rq.value() ) { - if ( /* i->first & extbit */ true ) { + if ( i->first & extbit /* true */ ) { Locker lk( manager()->_lock_xheap ); EvManager::ext_uuid_heap_type::const_iterator j = manager()->_ex_heap.find( i->first ); if ( j != manager()->_ex_heap.end() ) { lst.push_back( make_pair( j->second, i->second ) ); - cerr << "Found\n"; } } else { Locker lk( manager()->_lock_heap ); EvManager::local_heap_type::const_iterator j = manager()->heap.find( i->first ); if ( j != manager()->heap.end() ) { - gaddr_type gaddr; - gaddr.hid = xmt::hostid(); - gaddr.pid = getpid(); - gaddr.addr = j->first; - lst.push_back( make_pair( gaddr, i->second ) ); + lst.push_back( make_pair( gaddr_type(xmt::hostid(), xmt::getpid(), j->first ), i->second ) ); } } } @@ -108,7 +102,6 @@ manager()->_lock_iheap.unlock(); rs.dest( rq.src() ); - cerr << "Send\n"; Send( rs ); } Modified: trunk/complement/explore/lib/stem/NetTransport.cc =================================================================== --- trunk/complement/explore/lib/stem/NetTransport.cc 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/lib/stem/NetTransport.cc 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 21:17:59 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 01:28:01 ptr> /* * @@ -234,7 +234,9 @@ manager()->SubscribeRemote( detail::transport( static_cast<NetTransport_base *>(this), detail::transport::socket_tcp, 10 ), src ); } Event ack( EV_STEM_TRANSPORT_ACK ); - push( ack, src, self_glid() ); // the source (second arg) is NetTransport + if ( !push( ack, src, self_glid() ) ) { // the source (second arg) is NetTransport + throw runtime_error( "net handshake error" ); + } } else { throw runtime_error( "net handshake error" ); } @@ -328,7 +330,9 @@ gaddr_type dst; gaddr_type src; addr_type xsrc = badaddr; - push( ev, gaddr_type(), self_glid() ); + if ( !push( ev, gaddr_type(), self_glid() ) ) { + throw runtime_error( "net error or net handshake error" ); + } if ( pop( ev, dst, src ) ) { if ( ev.code() == EV_STEM_TRANSPORT_ACK ) { src.addr = ns_addr; @@ -392,7 +396,7 @@ try { while ( me.pop( ev, dst, src ) ) { if ( superflag ) { - cerr << "NetTransportMgr::_loop\n"; + cerr << "NetTransportMgr::_loop " << xmt::getpid() << " " << getppid() << endl; manager()->dump( cerr ); cerr << "===\n"; // cerr << dst.hid << dst.pid << dst.addr << endl; Modified: trunk/complement/explore/test/libstem/unit/NameService.cc =================================================================== --- trunk/complement/explore/test/libstem/unit/NameService.cc 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/test/libstem/unit/NameService.cc 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 17:03:26 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 10:50:21 ptr> /* * Copyright (c) 2006 @@ -42,7 +42,6 @@ void Naming::names_list( const nsrecords_type& nr ) { - // std::cerr << hex << nr.addr << " " << nr.record << dec << endl; copy( nr.container.begin(), nr.container.end(), back_insert_iterator<nsrecords_type::container_type>(lst) ); cnd.set(true); @@ -50,8 +49,6 @@ void Naming::names_name( const nsrecords_type& nr ) { - std::cerr << hex << /* nr.addr */ "Naming::names_name" << dec << endl; - copy( nr.container.begin(), nr.container.end(), back_insert_iterator<nsrecords_type::container_type>(lst) ); cnd.set(true); Modified: trunk/complement/explore/test/libstem/unit/unit_test.cc =================================================================== --- trunk/complement/explore/test/libstem/unit/unit_test.cc 2006-11-29 08:05:27 UTC (rev 1421) +++ trunk/complement/explore/test/libstem/unit/unit_test.cc 2006-11-29 08:07:54 UTC (rev 1422) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/28 17:27:34 ptr> +// -*- C++ -*- Time-stamp: <06/11/29 10:40:45 ptr> /* * Copyright (c) 2002, 2003, 2006 @@ -346,6 +346,22 @@ void stem_test::peer() { cerr << "peer" << endl; + /* + * Scheme: + * / NetTransport / c1 + * Local Event Manager - NetTransportMgr - c2 + * \ echo + * Due to all objects in the same process space, + * c1, c2 and echo in different processes. + * + * The logical scheme is: + * + * / c1 + * echo + * \ c2 + * + * (c1 <-> c2, through 'echo') + */ stem::superflag = 0; @@ -420,7 +436,6 @@ cerr << "@1\n"; Naming::nsrecords_type::const_iterator i; - stem::superflag = 1; do { nm.reset(); @@ -433,11 +448,30 @@ BOOST_CHECK( i != nm.lst.end() ); BOOST_CHECK( i->second == "c2@here" ); - // c1.manager()->reflect( i->first ); + stem::addr_type pa = c1.manager()->reflect( i->first ); + if ( pa == stem::badaddr ) { // unknown yet + pa = c1.manager()->SubscribeRemote( i->first, i->second ); + } + // stem::superflag = 1; + c1.manager()->dump( cerr ); + + if ( pa != stem::badaddr ) { + stem::Event pe( NODE_EV_ECHO ); + pe.dest( pa ); + pe.value() = "peer client"; + c1.Send( pe ); + + cerr << hex << pa << dec << endl; + } + cerr << "1.1\n"; - scnd.set( true, true ); + scnd.try_wait(); + + mgr.close(); + mgr.join(); + exit( 0 ); } catch ( xmt::fork_in_parent& child ) { @@ -469,8 +503,15 @@ cerr << "2.1\n"; pcnd.set( true ); - scnd.try_wait(); + + c2.wait(); cerr << "2.2\n"; + + scnd.set( true ); + + mgr.close(); + mgr.join(); + exit( 0 ); } catch ( xmt::fork_in_parent& child ) { @@ -480,7 +521,7 @@ fcnd.set( true, true ); - scnd.try_wait(); + // scnd.try_wait(); int stat; waitpid( child.pid(), &stat, 0 ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |