[complement-svn] SF.net SVN: complement: [1644] trunk/complement/explore/test/virtual_time
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-07-26 10:40:12
|
Revision: 1644 http://complement.svn.sourceforge.net/complement/?rev=1644&view=rev Author: complement Date: 2007-07-26 03:40:08 -0700 (Thu, 26 Jul 2007) Log Message: ----------- hide implementation details Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/vt_object.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/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-26 10:40:08 UTC (rev 1644) @@ -43,13 +43,13 @@ vtime chk; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess) ); // ack chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); // cerr << ob.vt[gr0] << endl; // cerr << "===========\n"; @@ -60,7 +60,7 @@ chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); ++mess.gvt[gr0][obj1]; @@ -69,19 +69,19 @@ EXAM_ERROR( "exception expected" ); } catch ( const out_of_range& ) { - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); } mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] + 1; EXAM_REQUIRE( !ob.deliver(mess_bad) ); // nac: too new (out of order) - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess) ); // ack chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; @@ -102,12 +102,12 @@ EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: obj0 don't seen mess from obj2, but obj1 seen mess from obj2 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 chk[obj2] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); ++mess2.gvt[gr0][obj2]; @@ -117,7 +117,7 @@ // cerr << "===========\n"; chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; mess.gvt[gr0][obj2] = 1; @@ -139,9 +139,9 @@ EXAM_ERROR( "exception expected" ); } catch ( const domain_error& ) { - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr2]) && (chk1 >= ob.vt[gr2]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); + EXAM_REQUIRE( (chk1 <= ob[gr2]) && (chk1 >= ob[gr2]) ); } // ---- @@ -151,8 +151,8 @@ EXAM_REQUIRE( !ob.deliver(mess_bad) ); // nac: obj1 recieve new event in group gr1 from obj2 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); // cerr << "===========\n"; // cerr << ob.vt[gr0] << endl; @@ -168,9 +168,9 @@ EXAM_REQUIRE( ob.deliver(mess3) ); // ack: see event from obj2 in group gr1 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); chk1[obj2] += 1; - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); ++mess3.gvt[gr1][obj2]; @@ -183,8 +183,8 @@ EXAM_REQUIRE( ob.deliver(mess_bad) ); // ack: now we know about event in group gr1 chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); return EXAM_RESULT; } Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 10:40:08 UTC (rev 1644) @@ -399,6 +399,12 @@ return true; } +void vtime_obj_rec::delta( gvtime& vtstamp, oid_type from, oid_type to, group_type grp ) +{ + vtstamp.gvt = vt.gvt - svt[to]; // delta + vtstamp[grp][from] = vt.gvt[grp][from]; // my counter, as is, not delta +} + } // namespace detail void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) @@ -408,14 +414,14 @@ for ( ; range.first != range.second; ++range.first ) { vt_map_type::iterator i = vtmap.find( range.first->second ); - if ( i == vtmap.end() || i->second.addr == m.src() ) { // not for nobody and not for self + if ( i == vtmap.end() || i->second.stem_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? // looks, like local source shouldn't be here? - check_and_send( i, m ); + check_and_send( i->second, m ); } catch ( const out_of_range& ) { } @@ -424,28 +430,30 @@ } } -void VTDispatcher::check_and_send( const vt_map_type::iterator& i, const stem::Event_base<VTmess>& m ) +void VTDispatcher::check_and_send( detail::vtime_obj_rec& vt, const stem::Event_base<VTmess>& m ) { typedef detail::vtime_obj_rec::dpool_t dpool_t; - if ( i->second.deliver( m.value() ) ) { + // detail::vtime_obj_rec& vt = i->second; + + if ( vt.deliver( m.value() ) ) { stem::Event ev( m.value().code ); - ev.dest(i->second.addr); + ev.dest(vt.stem_addr()); ev.src(m.src()); ev.value() = m.value().mess; Forward( ev ); bool more; do { more = false; - for ( dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { - if ( i->second.deliver_delayed( j->second->value() ) ) { + for ( dpool_t::iterator j = vt.dpool.begin(); j != vt.dpool.end(); ) { + if ( vt.deliver_delayed( j->second->value() ) ) { stem::Event evd( j->second->value().code ); - evd.dest(i->second.addr); + evd.dest(vt.stem_addr()); ev.src(m.src()); evd.value() = j->second->value().mess; Forward( evd ); delete j->second; - i->second.dpool.erase( j++ ); + vt.dpool.erase( j++ ); more = true; } else { ++j; @@ -453,7 +461,7 @@ } } while ( more ); } else { - i->second.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp + vt.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp } } @@ -464,9 +472,11 @@ 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 + if ( i != vtmap.end() && i->second.stem_addr() == e.src() ) { // for self + detail::vtime_obj_rec& vt = i->second; + const oid_type& from = o->second; stem::Event_base<VTmess> m( MESS ); - m.value().src = o->second; // oid + m.value().src = from; // oid m.value().code = e.code(); m.value().mess = e.value(); m.value().grp = grp; @@ -476,22 +486,21 @@ // This is like VTDispatch, but VT stamp in every message different, // in accordance with individual knowlage about object's VT. - ++i->second.vt.gvt[grp][o->second]; // my counter + vt.next( from, grp ); // my counter for ( gid_map_type::const_iterator g = range.first; g != range.second; ++g ) { vt_map_type::iterator k = vtmap.find( g->second ); - if ( k == vtmap.end() || k->second.addr == m.src() ) { // not for nobody and not for self + if ( k == vtmap.end() || k->second.stem_addr() == m.src() ) { // not for nobody and not for self continue; } try { - m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[g->second]; // delta - m.value().gvt[grp][o->second] = i->second.vt.gvt[grp][o->second]; // my counter, as is, not delta + vt.delta( m.value().gvt, from, g->second, grp ); // check local or remote? i->second.addr // if remote, forward it to foreign VTDispatcher? - check_and_send( k, m ); + check_and_send( k->second, m ); - i->second.svt[g->second] = i->second.vt.gvt; // store last send VT to obj + vt.base_advance(g->second); // store last send VT to obj } catch ( const out_of_range& ) { } @@ -508,10 +517,7 @@ void VTDispatcher::Subscribe( stem::addr_type addr, oid_type oid, group_type grp ) { - detail::vtime_obj_rec& r = vtmap[oid]; - r.addr = addr; - r.add_group( grp ); - + vtmap[oid].add( addr, grp ); grmap.insert( make_pair(grp,oid) ); } Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 10:40:08 UTC (rev 1644) @@ -82,9 +82,12 @@ vtime& operator +=( const vtime_type::value_type& ); vtime_type::data_type& operator[]( const vtime_type::key_type k ) - { return vt[k]; } + { return vt[k]; } + const vtime_type::data_type& operator[]( const vtime_type::key_type k ) const + { return vt[k]; } + - vtime_type vt; + mutable vtime_type vt; }; @@ -121,8 +124,10 @@ gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) { return gvt[k]; } + const gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) const + { return gvt[k]; } - gvtime_type gvt; + mutable gvtime_type gvt; }; struct VTmess : @@ -160,26 +165,37 @@ class vtime_obj_rec { public: - - typedef std::hash_set<group_type> groups_container_type; - typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; - typedef std::hash_map<oid_type, gvtime_type> snd_delta_vtime_t; - void add_group( group_type g ) { groups.insert(g); } + void add( stem::addr_type a, group_type g ) + { addr = a; groups.insert(g); } - // void add_group_member( group_type g, oid_type p ) - // { vt[g][p]; } + stem::addr_type stem_addr() const + { return addr; } bool deliver( const VTmess& ev ); bool deliver_delayed( const VTmess& ev ); + void next( oid_type from, group_type grp ) + { ++vt.gvt[grp][from]; /* increment my VT counter */ } + void delta( gvtime& vtstamp, oid_type from, oid_type to, group_type grp ); + void base_advance( oid_type to ) + { svt[to] = vt.gvt; /* store last sent VT to obj */ } +#ifdef __FIT_EXAM + const gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) const + { return vt[k]; } +#endif + + private: + typedef std::hash_set<group_type> groups_container_type; + typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; + typedef std::hash_map<oid_type, gvtime_type> snd_delta_vtime_t; + 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: @@ -221,7 +237,7 @@ // in our case we can use gid = hi bits | oid - void check_and_send( const vt_map_type::iterator&, const stem::Event_base<VTmess>& ); + void check_and_send( detail::vtime_obj_rec&, const stem::Event_base<VTmess>& ); 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. |