[complement-svn] SF.net SVN: complement: [1640] trunk/complement/explore/test/virtual_time
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-07-25 17:43:06
|
Revision: 1640 http://complement.svn.sourceforge.net/complement/?rev=1640&view=rev Author: complement Date: 2007-07-25 10:42:59 -0700 (Wed, 25 Jul 2007) Log Message: ----------- VTDispatcher development Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 17:42:59 UTC (rev 1640) @@ -24,6 +24,8 @@ int EXAM_DECL(VTMess_core); int EXAM_DECL(vt_object); + + int EXAM_DECL(VTDispatch); }; int EXAM_IMPL(vtime_operations::vt_compare) @@ -623,6 +625,95 @@ return EXAM_RESULT; } + +class Dummy : + public stem::EventHandler +{ + public: + Dummy(); + Dummy( stem::addr_type id ); + Dummy( stem::addr_type id, const char *info ); + ~Dummy(); + + void handler( const stem::Event& ); + + void wait(); + std::string msg; + + private: + xmt::condition cnd; + + DECLARE_RESPONSE_TABLE( Dummy, stem::EventHandler ); +}; + +#define VT_MESS2 0x1202 + +Dummy::Dummy() : + EventHandler() +{ + cnd.set( false ); +} + +Dummy::Dummy( stem::addr_type id ) : + EventHandler( id ) +{ + cnd.set( false ); +} + +Dummy::Dummy( stem::addr_type id, const char *info ) : + EventHandler( id, info ) +{ + cnd.set( false ); +} + +Dummy::~Dummy() +{ + // cnd.wait(); +} + +void Dummy::handler( const stem::Event& ev ) +{ + msg = ev.value(); + + cnd.set( true ); +} + +void Dummy::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +DEFINE_RESPONSE_TABLE( Dummy ) + EV_EDS( ST_NULL, VT_MESS2, handler ) +END_RESPONSE_TABLE + +int EXAM_IMPL(vtime_operations::VTDispatch) +{ + vt::VTDispatcher dsp; + Dummy dummy1; + Dummy dummy2; + + dsp.Subscribe( dummy1.self_id(), 1, 0 ); + dsp.Subscribe( dummy2.self_id(), 2, 0 ); + + stem::Event ev( VT_MESS2 ); + ev.src( dummy1.self_id() ); + + ev.value() = "hello"; + + dsp.VTSend( ev, 0 ); + + dummy2.wait(); + + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.msg == "" ); + + return EXAM_RESULT; +} + + int EXAM_DECL(vtime_test_suite); int EXAM_IMPL(vtime_test_suite) Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 17:42:59 UTC (rev 1640) @@ -403,17 +403,22 @@ void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) { - pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( m.value().grp ); + VTDispatch_( m, grmap.equal_range( m.value().grp ) ); +} +void VTDispatcher::VTDispatch_( const stem::Event_base<VTmess>& m, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& range ) +{ for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { vt_map_type::iterator i = vtmap.find( o->second ); - if ( i != vtmap.end() || i->first == m.src() ) { // not for nobody and not for self + if ( i == vtmap.end() || i->second.addr == m.src() ) { // not for nobody and not for self continue; } try { + // check local or remote? i->second.addr + // if remote, forward it to foreign VTDispatcher? if ( i->second.deliver( m.value() ) ) { stem::Event ev( m.value().code ); - ev.dest(i->first); + ev.dest(i->second.addr); ev.src(m.src()); ev.value() = m.value().mess; Forward( ev ); @@ -423,7 +428,7 @@ for ( vtime_obj_rec::dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { if ( i->second.deliver_delayed( j->second->value() ) ) { stem::Event evd( j->second->value().code ); - evd.dest(i->first); + evd.dest(i->second.addr); ev.src(m.src()); evd.value() = j->second->value().mess; Forward( evd ); @@ -446,10 +451,40 @@ } } -void VTDispatcher::VTSend( const stem::Event& e ) +void VTDispatcher::VTSend( const stem::Event& e, group_type grp ) { + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + + for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { + vt_map_type::iterator i = vtmap.find( o->second ); + if ( i != vtmap.end() && i->second.addr == e.src() ) { // for self + stem::Event_base<VTmess> m( MESS ); + m.value().src = o->second; // oid + m.value().code = e.code(); + m.value().mess = e.value(); + m.value().grp = grp; + m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[grp]; // delta + m.value().gvt[grp][o->second] = ++i->second.vt.gvt[grp][o->second]; // my counter + i->second.svt[grp] = i->second.vt.gvt; // store last send VT to group + // m.dest( ??? ); // local VT dispatcher? + m.src( e.src() ); + VTDispatch_( m, range ); + return; + } + } + + // Error: not group member? } +void VTDispatcher::Subscribe( stem::addr_type addr, oid_type oid, group_type grp ) +{ + vtime_obj_rec& r = vtmap[oid]; + r.addr = addr; + r.add_group( grp ); + + grmap.insert( make_pair(grp,oid) ); +} + DEFINE_RESPONSE_TABLE( VTDispatcher ) // EV_T_( ST_NULL, MESS, VTDispatch, VTmess ) EV_Event_base_T_( ST_NULL, MESS, VTDispatch, VTmess ) Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 17:42:59 UTC (rev 1640) @@ -164,6 +164,7 @@ typedef std::hash_set<group_type> groups_container_type; typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; + typedef std::hash_map<group_type, gvtime_type> snd_delta_vtime_t; void add_group( group_type g ) { groups.insert(g); } @@ -174,10 +175,15 @@ bool deliver( const VTmess& ev ); bool deliver_delayed( const VTmess& ev ); - stem::addr_type addr; // stem address of object - delta_vtime_type lvt; // last seen VT of neighbours - gvtime vt; // VT of object + stem::addr_type addr; // stem address of object + delta_vtime_type lvt; // last recieve VT from neighbours + snd_delta_vtime_t svt; // last send VT to neighbours + gvtime vt; // VT of object + + private: groups_container_type groups; // member of groups + + public: // delay pool should be here typedef std::pair<int,stem::Event_base<VTmess>*> delay_item_t; typedef std::list<delay_item_t> dpool_t; @@ -202,7 +208,8 @@ void VTDispatch( const stem::Event_base<VTmess>& ); - void VTSend( const stem::Event& e ); + void VTSend( const stem::Event& e, group_type ); + void Subscribe( stem::addr_type, oid_type, group_type ); private: typedef std::hash_map<oid_type, vtime_obj_rec> vt_map_type; @@ -211,6 +218,8 @@ // gid_type -> (oid_type, oid_type, ...) // in our case we can use gid = hi bits | oid + + void VTDispatch_( const stem::Event_base<VTmess>&, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& ); vt_map_type vtmap; gid_map_type grmap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |