[complement-svn] SF.net SVN: complement: [1641] trunk/complement/explore/test/virtual_time
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-07-26 04:44:47
|
Revision: 1641 http://complement.svn.sourceforge.net/complement/?rev=1641&view=rev Author: complement Date: 2007-07-25 21:44:44 -0700 (Wed, 25 Jul 2007) Log Message: ----------- split unit tests; looks like VTDispatcher work; Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/Makefile.inc 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 Added Paths: ----------- trunk/complement/explore/test/virtual_time/test/VTmess_core.cc trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc trunk/complement/explore/test/virtual_time/test/vt_object.cc trunk/complement/explore/test/virtual_time/test/vt_operations.cc trunk/complement/explore/test/virtual_time/test/vt_operations.h Modified: trunk/complement/explore/test/virtual_time/test/Makefile.inc =================================================================== --- trunk/complement/explore/test/virtual_time/test/Makefile.inc 2007-07-25 17:42:59 UTC (rev 1640) +++ trunk/complement/explore/test/virtual_time/test/Makefile.inc 2007-07-26 04:44:44 UTC (rev 1641) @@ -3,6 +3,10 @@ PRGNAME = ut_vtime SRC_CC = ../vtime.cc \ - unit_test.cc + unit_test.cc \ + vt_operations.cc \ + VTmess_core.cc \ + vt_object.cc \ + vt_dispatch.cc Added: trunk/complement/explore/test/virtual_time/test/VTmess_core.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/VTmess_core.cc (rev 0) +++ trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -0,0 +1,144 @@ +// -*- C++ -*- Time-stamp: <07/07/25 22:06:40 ptr> + +#include "vt_operations.h" + +#include <iostream> +#include <vtime.h> + +using namespace vt; +using namespace std; + +class VTM_handler : + public stem::EventHandler +{ + public: + VTM_handler(); + VTM_handler( stem::addr_type id ); + VTM_handler( stem::addr_type id, const char *info ); + ~VTM_handler(); + + void handlerE( const stem::Event_base<VTmess>& ); + void handlerV( const VTmess& ); + + void wait(); + + stem::code_type code; + oid_type src; + gvtime gvt; + group_type grp; + std::string mess; + + private: + xmt::condition cnd; + + DECLARE_RESPONSE_TABLE( VTM_handler, stem::EventHandler ); +}; + +#define VT_MESS 0x1201 + +VTM_handler::VTM_handler() : + EventHandler() +{ + cnd.set( false ); +} + +VTM_handler::VTM_handler( stem::addr_type id ) : + EventHandler( id ) +{ + cnd.set( false ); +} + +VTM_handler::VTM_handler( stem::addr_type id, const char *info ) : + EventHandler( id, info ) +{ + cnd.set( false ); +} + +VTM_handler::~VTM_handler() +{ + // cnd.wait(); +} + +void VTM_handler::handlerE( const stem::Event_base<VTmess>& ev ) +{ + code = ev.value().code; + src = ev.value().src; + gvt = ev.value().gvt; + grp = ev.value().grp; + mess = ev.value().mess; + + PushState( 1 ); + cnd.set( true ); +} + +void VTM_handler::handlerV( const VTmess& m ) +{ + code = m.code; + src = m.src; + gvt = m.gvt; + grp = m.grp; + mess = m.mess; + + PopState(); + cnd.set( true ); +} + +void VTM_handler::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +DEFINE_RESPONSE_TABLE( VTM_handler ) + EV_Event_base_T_( ST_NULL, VT_MESS, handlerE, VTmess ) + EV_T_( 1, VT_MESS, handlerV, VTmess ) +END_RESPONSE_TABLE + +int EXAM_IMPL(vtime_operations::VTMess_core) +{ + VTM_handler h; + + stem::Event_base<VTmess> ev( VT_MESS ); + + ev.dest( h.self_id() ); + ev.value().code = 2; + ev.value().src = 3; + ev.value().gvt[0][0] = 1; + ev.value().gvt[0][1] = 2; + ev.value().gvt[1][0] = 3; + ev.value().gvt[1][1] = 4; + ev.value().grp = 7; + ev.value().mess = "data"; + + h.Send( ev ); + + h.wait(); + + EXAM_CHECK( h.code == 2 ); + EXAM_CHECK( h.src == 3 ); + EXAM_CHECK( h.gvt[0][0] == 1 ); + EXAM_CHECK( h.gvt[0][1] == 2 ); + EXAM_CHECK( h.gvt[1][0] == 3 ); + EXAM_CHECK( h.gvt[1][1] == 4 ); + EXAM_CHECK( h.grp == 7 ); + EXAM_CHECK( h.mess == "data" ); + + ev.value().code = 3; + ev.value().mess = "more data"; + + h.Send( ev ); + + h.wait(); + + EXAM_CHECK( h.code == 3 ); + EXAM_CHECK( h.src == 3 ); + EXAM_CHECK( h.gvt[0][0] == 1 ); + EXAM_CHECK( h.gvt[0][1] == 2 ); + EXAM_CHECK( h.gvt[1][0] == 3 ); + EXAM_CHECK( h.gvt[1][1] == 4 ); + EXAM_CHECK( h.grp == 7 ); + EXAM_CHECK( h.mess == "more data" ); + + return EXAM_RESULT; +} Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 17:42:59 UTC (rev 1640) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -1,719 +1,7 @@ -// -*- C++ -*- Time-stamp: <07/07/23 23:46:02 ptr> +// -*- C++ -*- Time-stamp: <07/07/25 22:14:50 ptr> -#include <exam/suite.h> +#include "vt_operations.h" -#include <boost/lexical_cast.hpp> - -#include <string> -#include <iostream> - -#include <vtime.h> - -using namespace vt; -using namespace std; - -struct vtime_operations -{ - int EXAM_DECL(vt_compare); - int EXAM_DECL(vt_add); - int EXAM_DECL(vt_diff); - int EXAM_DECL(vt_max); - - int EXAM_DECL(gvt_add); - - int EXAM_DECL(VTMess_core); - - int EXAM_DECL(vt_object); - - int EXAM_DECL(VTDispatch); -}; - -int EXAM_IMPL(vtime_operations::vt_compare) -{ - vtime_type vt1; - vtime_type vt2; - - vt1[1] = 1; - vt1[2] = 1; - - vt2[1] = 1; - vt2[2] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( vt2 <= vt1 ); - EXAM_CHECK( vt1 >= vt2 ); - EXAM_CHECK( vt2 >= vt1 ); - - vt2[3] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( !(vt2 <= vt1) ); - EXAM_CHECK( vt2 >= vt1 ); - - vt1.clear(); - vt2.clear(); - - vt1[1] = 1; - - vt2[1] = 1; - vt2[3] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( !(vt2 <= vt1) ); - - vt1[2] = 1; - - EXAM_CHECK( !(vt1 <= vt2) ); - EXAM_CHECK( !(vt2 <= vt1) ); -} - -int EXAM_IMPL(vtime_operations::vt_add) -{ - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[1] = 1; - vt1[2] = 1; - - vt3 = vt1 + vt2; - - EXAM_CHECK( vt1 <= vt3 ); - EXAM_CHECK( vt3 <= vt1 ); - - vt2[2] = 1; - - vt3 = vt1 + vt2; - - vt4[1] = 1; - vt4[2] = 2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt4.clear(); - - vt2[3] = 1; - - vt3 = vt1 + vt2; - - vt4[1] = 1; - vt4[2] = 2; - vt4[3] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::vt_diff) -{ - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[1] = 1; - vt1[2] = 1; - - vt3 = vt1 - vt2; - - EXAM_CHECK( vt1 <= vt3 ); - EXAM_CHECK( vt3 <= vt1 ); - - vt2[1] = 1; - - vt3 = vt1 - vt2; - - vt4[2] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2[2] = 1; - - vt4.clear(); - - vt3 = vt1 - vt2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2.clear(); - - vt2[3] = 1; - - try { - vt3 = vt1 - vt2; - EXAM_ERROR( "Virtual Times are incomparable" ); - } - catch ( const std::range_error& err ) { - EXAM_CHECK( true ); - } - - vt2.clear(); - - vt2[2] = 2; - - try { - vt3 = vt1 - vt2; - EXAM_ERROR( "Virtual Times are incomparable" ); - } - catch ( const std::range_error& err ) { - EXAM_CHECK( true ); - } - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::vt_max) -{ - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[1] = 1; - vt1[2] = 1; - - vt3 = vt::max( vt1, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[1] = 1; - - vt3 = vt::max( vt1, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[2] = 1; - - vt3 = vt::max( vt1, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[3] = 1; - - vt3 = vt::max( vt1, vt2 ); - - vt4[1] = 1; - vt4[2] = 1; - vt4[3] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2.clear(); - - vt2[1] = 1; - vt2[2] = 2; - - vt4.clear(); - - vt3 = vt::max( vt1, vt2 ); - - vt4[1] = 1; - vt4[2] = 2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2[3] = 4; - - vt3 = vt::max( vt1, vt2 ); - - vt4[3] = 4; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::gvt_add) -{ - { - gvtime_type gvt1; - gvtime_type gvt2; - - vtime_type vt1; - vtime_type vt2; - - vt1[1] = 1; - vt1[2] = 1; - - vt2[1] = 1; - vt2[2] = 1; - - gvt1[0] = vt1; - gvt2[0] = vt2; - - gvt1 += gvt2; - - EXAM_CHECK( gvt1[0][1] == 2 ); - EXAM_CHECK( gvt1[0][2] == 2 ); - EXAM_CHECK( gvt1[0][0] == 0 ); - EXAM_CHECK( gvt1[1][1] == 0 ); - EXAM_CHECK( gvt1[1][2] == 0 ); - } - { - gvtime_type gvt1; - gvtime_type gvt2; - - vtime_type vt1; - vtime_type vt2; - - vt1[1] = 1; - vt1[2] = 1; - - vt2[1] = 1; - vt2[2] = 1; - - gvt1[0] = vt1; - gvt2[1] = vt2; - - gvt1 += gvt2; - - EXAM_CHECK( gvt1[0][1] == 1 ); - EXAM_CHECK( gvt1[0][2] == 1 ); - EXAM_CHECK( gvt1[0][0] == 0 ); - EXAM_CHECK( gvt1[1][1] == 1 ); - EXAM_CHECK( gvt1[1][2] == 1 ); - } - { - gvtime_type gvt1; - - vtime_type vt1; - vtime_type vt2; - - vt1[1] = 1; - vt1[2] = 1; - - vt2[1] = 1; - vt2[2] = 1; - - gvt1[0] = vt1; - - gvt1 += make_pair( 1, vt2 ); - - EXAM_CHECK( gvt1[0][1] == 1 ); - EXAM_CHECK( gvt1[0][2] == 1 ); - EXAM_CHECK( gvt1[0][0] == 0 ); - EXAM_CHECK( gvt1[1][1] == 1 ); - EXAM_CHECK( gvt1[1][2] == 1 ); - } - - return EXAM_RESULT; -} - -class VTM_handler : - public stem::EventHandler -{ - public: - VTM_handler(); - VTM_handler( stem::addr_type id ); - VTM_handler( stem::addr_type id, const char *info ); - ~VTM_handler(); - - void handlerE( const stem::Event_base<VTmess>& ); - void handlerV( const VTmess& ); - - void wait(); - - stem::code_type code; - oid_type src; - gvtime gvt; - group_type grp; - std::string mess; - - private: - xmt::condition cnd; - - DECLARE_RESPONSE_TABLE( VTM_handler, stem::EventHandler ); -}; - -#define VT_MESS 0x1201 - -VTM_handler::VTM_handler() : - EventHandler() -{ - cnd.set( false ); -} - -VTM_handler::VTM_handler( stem::addr_type id ) : - EventHandler( id ) -{ - cnd.set( false ); -} - -VTM_handler::VTM_handler( stem::addr_type id, const char *info ) : - EventHandler( id, info ) -{ - cnd.set( false ); -} - -VTM_handler::~VTM_handler() -{ - // cnd.wait(); -} - -void VTM_handler::handlerE( const stem::Event_base<VTmess>& ev ) -{ - code = ev.value().code; - src = ev.value().src; - gvt = ev.value().gvt; - grp = ev.value().grp; - mess = ev.value().mess; - - PushState( 1 ); - cnd.set( true ); -} - -void VTM_handler::handlerV( const VTmess& m ) -{ - code = m.code; - src = m.src; - gvt = m.gvt; - grp = m.grp; - mess = m.mess; - - PopState(); - cnd.set( true ); -} - -void VTM_handler::wait() -{ - cnd.try_wait(); - - cnd.set( false ); -} - -DEFINE_RESPONSE_TABLE( VTM_handler ) - EV_Event_base_T_( ST_NULL, VT_MESS, handlerE, VTmess ) - EV_T_( 1, VT_MESS, handlerV, VTmess ) -END_RESPONSE_TABLE - -int EXAM_IMPL(vtime_operations::VTMess_core) -{ - VTM_handler h; - - stem::Event_base<VTmess> ev( VT_MESS ); - - ev.dest( h.self_id() ); - ev.value().code = 2; - ev.value().src = 3; - ev.value().gvt[0][0] = 1; - ev.value().gvt[0][1] = 2; - ev.value().gvt[1][0] = 3; - ev.value().gvt[1][1] = 4; - ev.value().grp = 7; - ev.value().mess = "data"; - - h.Send( ev ); - - h.wait(); - - EXAM_CHECK( h.code == 2 ); - EXAM_CHECK( h.src == 3 ); - EXAM_CHECK( h.gvt[0][0] == 1 ); - EXAM_CHECK( h.gvt[0][1] == 2 ); - EXAM_CHECK( h.gvt[1][0] == 3 ); - EXAM_CHECK( h.gvt[1][1] == 4 ); - EXAM_CHECK( h.grp == 7 ); - EXAM_CHECK( h.mess == "data" ); - - ev.value().code = 3; - ev.value().mess = "more data"; - - h.Send( ev ); - - h.wait(); - - EXAM_CHECK( h.code == 3 ); - EXAM_CHECK( h.src == 3 ); - EXAM_CHECK( h.gvt[0][0] == 1 ); - EXAM_CHECK( h.gvt[0][1] == 2 ); - EXAM_CHECK( h.gvt[1][0] == 3 ); - EXAM_CHECK( h.gvt[1][1] == 4 ); - EXAM_CHECK( h.grp == 7 ); - EXAM_CHECK( h.mess == "more data" ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::vt_object) -{ - vtime_obj_rec ob; - - const group_type gr0 = 0; - const group_type gr1 = 1; - const group_type gr2 = 2; - const oid_type obj0 = 0; - const oid_type obj1 = 1; - const oid_type obj2 = 2; - - ob.add_group( gr0 ); - // ob.add_group_member( gr0, obj0 ); - // ob.add_group_member( gr0, obj1 ); - // ob.add_group_member( gr0, obj2 ); - - // gvtime gvt; - // gvt[gr0][obj1] = 1; - - VTmess mess; - VTmess mess_bad; - - mess_bad.code = mess.code = 1; - mess_bad.src = mess.src = obj1; - mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] = 1; - mess_bad.grp = mess.grp = gr0; - mess_bad.mess = mess.mess = "data"; - - // cerr << ob.vt[gr0] << endl; - // cerr << "===========\n"; - - vtime chk; - - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - EXAM_REQUIRE( ob.deliver(mess) ); // ack - - chk[obj1] += 1; - - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - // cerr << ob.vt[gr0] << endl; - // cerr << "===========\n"; - - ++mess.gvt[gr0][obj1]; - - EXAM_REQUIRE( ob.deliver(mess) ); // ack - - chk[obj1] += 1; - - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - ++mess.gvt[gr0][obj1]; - - try { - EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: too old (out of order) - EXAM_ERROR( "exception expected" ); - } - catch ( const out_of_range& ) { - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[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( ob.deliver(mess) ); // ack - - chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; - - // cerr << ob.vt[gr0] << endl; - // cerr << "===========\n"; - - // ---- - - VTmess mess2; - - mess2.code = 1; - mess2.src = obj2; - mess2.gvt[gr0][obj2] = 1; - mess2.grp = gr0; - mess2.mess = "data"; - - mess_bad.gvt[gr0][obj2] = 1; - - 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( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 - - chk[obj2] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - ++mess2.gvt[gr0][obj2]; - - EXAM_REQUIRE( ob.deliver(mess_bad) ); // ack: now obj0 and obj1 sync dependency from obj2 - - // cerr << ob.vt[gr0] << endl; - // cerr << "===========\n"; - - chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - - mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; - mess.gvt[gr0][obj2] = 1; - mess_bad.gvt[gr0][obj2] = 0; - - // ---- - - ob.add_group( gr1 ); - // ob.add_group_member( gr1, obj0 ); - // ob.add_group_member( gr1, obj1 ); - // ob.add_group_member( gr1, obj2 ); - - mess_bad.grp = gr2; - - vtime chk1; - - try { - EXAM_CHECK( ob.deliver(mess_bad) ); // nac: ob not member of group gr2 - 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]) ); - } - - // ---- - - mess_bad.grp = gr0; - mess_bad.gvt[gr1][obj2] = 1; - - 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]) ); - - // cerr << "===========\n"; - // cerr << ob.vt[gr0] << endl; - // cerr << "===========\n"; - - VTmess mess3; - - mess3.code = 1; - mess3.src = obj2; - mess3.gvt[gr1][obj2] = 1; - mess3.grp = gr1; - mess3.mess = "data"; - - EXAM_REQUIRE( ob.deliver(mess3) ); // ack: see event from obj2 in group gr1 - - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - chk1[obj2] += 1; - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); - - ++mess3.gvt[gr1][obj2]; - - // cerr << "===========\n"; - // cerr << /* ob.vt[gr0] */ mess_bad.gvt[gr0] << endl; - // cerr << /* ob.vt[gr0] */ mess_bad.gvt[gr1] << endl; - // cerr << "===========\n"; - - // cerr << "2 ==========\n"; - 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]) ); - - 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) @@ -732,7 +20,8 @@ t.add( &vtime_operations::VTMess_core, vt_oper, "VTmess core transfer", tc[2] = t.add( &vtime_operations::gvt_add, vt_oper, "Group VT add", tc[1] ) ); - t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] ); + t.add( &vtime_operations::VTDispatch, vt_oper, "VTDispatch", + t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] ) ); return t.girdle(); } Added: trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc (rev 0) +++ trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -0,0 +1,102 @@ +// -*- C++ -*- Time-stamp: <07/07/25 23:12:24 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <vtime.h> + +using namespace vt; +using namespace std; + +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; + Dummy dummy3; + + dsp.Subscribe( dummy1.self_id(), 1, 0 ); + dsp.Subscribe( dummy2.self_id(), 2, 0 ); + dsp.Subscribe( dummy3.self_id(), 3, 0 ); + + stem::Event ev( VT_MESS2 ); + ev.src( dummy1.self_id() ); + + ev.value() = "hello"; + + dsp.VTSend( ev, 0 ); + + dummy2.wait(); + dummy3.wait(); + + EXAM_CHECK( dummy3.msg == "hello" ); + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.msg == "" ); + + return EXAM_RESULT; +} Added: trunk/complement/explore/test/virtual_time/test/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc (rev 0) +++ trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -0,0 +1,190 @@ +// -*- C++ -*- Time-stamp: <07/07/25 22:09:32 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <vtime.h> + +using namespace vt; +using namespace std; + +int EXAM_IMPL(vtime_operations::vt_object) +{ + detail::vtime_obj_rec ob; + + const group_type gr0 = 0; + const group_type gr1 = 1; + const group_type gr2 = 2; + const oid_type obj0 = 0; + const oid_type obj1 = 1; + const oid_type obj2 = 2; + + ob.add_group( gr0 ); + // ob.add_group_member( gr0, obj0 ); + // ob.add_group_member( gr0, obj1 ); + // ob.add_group_member( gr0, obj2 ); + + // gvtime gvt; + // gvt[gr0][obj1] = 1; + + VTmess mess; + VTmess mess_bad; + + mess_bad.code = mess.code = 1; + mess_bad.src = mess.src = obj1; + mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] = 1; + mess_bad.grp = mess.grp = gr0; + mess_bad.mess = mess.mess = "data"; + + // cerr << ob.vt[gr0] << endl; + // cerr << "===========\n"; + + vtime chk; + + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + EXAM_REQUIRE( ob.deliver(mess) ); // ack + + chk[obj1] += 1; + + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + // cerr << ob.vt[gr0] << endl; + // cerr << "===========\n"; + + ++mess.gvt[gr0][obj1]; + + EXAM_REQUIRE( ob.deliver(mess) ); // ack + + chk[obj1] += 1; + + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + ++mess.gvt[gr0][obj1]; + + try { + EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: too old (out of order) + EXAM_ERROR( "exception expected" ); + } + catch ( const out_of_range& ) { + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[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( ob.deliver(mess) ); // ack + + chk[obj1] += 1; + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + + // cerr << ob.vt[gr0] << endl; + // cerr << "===========\n"; + + // ---- + + VTmess mess2; + + mess2.code = 1; + mess2.src = obj2; + mess2.gvt[gr0][obj2] = 1; + mess2.grp = gr0; + mess2.mess = "data"; + + mess_bad.gvt[gr0][obj2] = 1; + + 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( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 + + chk[obj2] += 1; + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + ++mess2.gvt[gr0][obj2]; + + EXAM_REQUIRE( ob.deliver(mess_bad) ); // ack: now obj0 and obj1 sync dependency from obj2 + + // cerr << ob.vt[gr0] << endl; + // cerr << "===========\n"; + + chk[obj1] += 1; + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + mess.gvt[gr0][obj2] = 1; + mess_bad.gvt[gr0][obj2] = 0; + + // ---- + + ob.add_group( gr1 ); + // ob.add_group_member( gr1, obj0 ); + // ob.add_group_member( gr1, obj1 ); + // ob.add_group_member( gr1, obj2 ); + + mess_bad.grp = gr2; + + vtime chk1; + + try { + EXAM_CHECK( ob.deliver(mess_bad) ); // nac: ob not member of group gr2 + 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]) ); + } + + // ---- + + mess_bad.grp = gr0; + mess_bad.gvt[gr1][obj2] = 1; + + 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]) ); + + // cerr << "===========\n"; + // cerr << ob.vt[gr0] << endl; + // cerr << "===========\n"; + + VTmess mess3; + + mess3.code = 1; + mess3.src = obj2; + mess3.gvt[gr1][obj2] = 1; + mess3.grp = gr1; + mess3.mess = "data"; + + EXAM_REQUIRE( ob.deliver(mess3) ); // ack: see event from obj2 in group gr1 + + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + chk1[obj2] += 1; + EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + + ++mess3.gvt[gr1][obj2]; + + // cerr << "===========\n"; + // cerr << /* ob.vt[gr0] */ mess_bad.gvt[gr0] << endl; + // cerr << /* ob.vt[gr0] */ mess_bad.gvt[gr1] << endl; + // cerr << "===========\n"; + + // cerr << "2 ==========\n"; + 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]) ); + + return EXAM_RESULT; +} Added: trunk/complement/explore/test/virtual_time/test/vt_operations.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.cc (rev 0) +++ trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -0,0 +1,300 @@ +// -*- C++ -*- Time-stamp: <07/07/25 23:34:58 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <vtime.h> + +using namespace vt; +using namespace std; + +int EXAM_IMPL(vtime_operations::vt_compare) +{ + vtime_type vt1; + vtime_type vt2; + + vt1[1] = 1; + vt1[2] = 1; + + vt2[1] = 1; + vt2[2] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( vt2 <= vt1 ); + EXAM_CHECK( vt1 >= vt2 ); + EXAM_CHECK( vt2 >= vt1 ); + + vt2[3] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( vt2 >= vt1 ); + + vt1.clear(); + vt2.clear(); + + vt1[1] = 1; + + vt2[1] = 1; + vt2[3] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); + + vt1[2] = 1; + + EXAM_CHECK( !(vt1 <= vt2) ); + EXAM_CHECK( !(vt2 <= vt1) ); +} + +int EXAM_IMPL(vtime_operations::vt_add) +{ + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[1] = 1; + vt1[2] = 1; + + vt3 = vt1 + vt2; + + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); + + vt2[2] = 1; + + vt3 = vt1 + vt2; + + vt4[1] = 1; + vt4[2] = 2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt4.clear(); + + vt2[3] = 1; + + vt3 = vt1 + vt2; + + vt4[1] = 1; + vt4[2] = 2; + vt4[3] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::vt_diff) +{ + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[1] = 1; + vt1[2] = 1; + + vt3 = vt1 - vt2; + + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); + + vt2[1] = 1; + + vt3 = vt1 - vt2; + + vt4[2] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2[2] = 1; + + vt4.clear(); + + vt3 = vt1 - vt2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2.clear(); + + vt2[3] = 1; + + try { + vt3 = vt1 - vt2; + EXAM_ERROR( "Virtual Times are incomparable" ); + } + catch ( const std::range_error& err ) { + EXAM_CHECK( true ); + } + + vt2.clear(); + + vt2[2] = 2; + + try { + vt3 = vt1 - vt2; + EXAM_ERROR( "Virtual Times are incomparable" ); + } + catch ( const std::range_error& err ) { + EXAM_CHECK( true ); + } + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::vt_max) +{ + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[1] = 1; + vt1[2] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[1] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[2] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[3] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[1] = 1; + vt4[2] = 1; + vt4[3] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2.clear(); + + vt2[1] = 1; + vt2[2] = 2; + + vt4.clear(); + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[1] = 1; + vt4[2] = 2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2[3] = 4; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[3] = 4; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::gvt_add) +{ + { + gvtime_type gvt1; + gvtime_type gvt2; + + vtime_type vt1; + vtime_type vt2; + + vt1[1] = 1; + vt1[2] = 1; + + vt2[1] = 1; + vt2[2] = 1; + + gvt1[0] = vt1; + gvt2[0] = vt2; + + gvt1 += gvt2; + + EXAM_CHECK( gvt1[0][1] == 2 ); + EXAM_CHECK( gvt1[0][2] == 2 ); + EXAM_CHECK( gvt1[0][0] == 0 ); + EXAM_CHECK( gvt1[1][1] == 0 ); + EXAM_CHECK( gvt1[1][2] == 0 ); + } + { + gvtime_type gvt1; + gvtime_type gvt2; + + vtime_type vt1; + vtime_type vt2; + + vt1[1] = 1; + vt1[2] = 1; + + vt2[1] = 1; + vt2[2] = 1; + + gvt1[0] = vt1; + gvt2[1] = vt2; + + gvt1 += gvt2; + + EXAM_CHECK( gvt1[0][1] == 1 ); + EXAM_CHECK( gvt1[0][2] == 1 ); + EXAM_CHECK( gvt1[0][0] == 0 ); + EXAM_CHECK( gvt1[1][1] == 1 ); + EXAM_CHECK( gvt1[1][2] == 1 ); + } + { + gvtime_type gvt1; + + vtime_type vt1; + vtime_type vt2; + + vt1[1] = 1; + vt1[2] = 1; + + vt2[1] = 1; + vt2[2] = 1; + + gvt1[0] = vt1; + + gvt1 += make_pair( 1, vt2 ); + + EXAM_CHECK( gvt1[0][1] == 1 ); + EXAM_CHECK( gvt1[0][2] == 1 ); + EXAM_CHECK( gvt1[0][0] == 0 ); + EXAM_CHECK( gvt1[1][1] == 1 ); + EXAM_CHECK( gvt1[1][2] == 1 ); + } + + return EXAM_RESULT; +} Added: trunk/complement/explore/test/virtual_time/test/vt_operations.h =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.h (rev 0) +++ trunk/complement/explore/test/virtual_time/test/vt_operations.h 2007-07-26 04:44:44 UTC (rev 1641) @@ -0,0 +1,24 @@ +// -*- C++ -*- Time-stamp: <07/07/25 22:01:43 ptr> + +#ifndef __vt_operations_h +#define __vt_operations_h + +#include <exam/suite.h> + +struct vtime_operations +{ + int EXAM_DECL(vt_compare); + int EXAM_DECL(vt_add); + int EXAM_DECL(vt_diff); + int EXAM_DECL(vt_max); + + int EXAM_DECL(gvt_add); + + int EXAM_DECL(VTMess_core); + + int EXAM_DECL(vt_object); + + int EXAM_DECL(VTDispatch); +}; + +#endif // __vt_operations_h Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 17:42:59 UTC (rev 1640) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 04:44:44 UTC (rev 1641) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 10:22:27 ptr> +// -*- C++ -*- Time-stamp: <07/07/25 23:38:25 ptr> #include "vtime.h" @@ -201,6 +201,7 @@ return l; } +#if 0 // template <> vtime_type max( const vtime_type& l, const vtime_type& r ) { @@ -211,6 +212,7 @@ } return tmp; } +#endif vtime_type& sup( vtime_type& l, const vtime_type& r ) { @@ -221,6 +223,7 @@ } +#if 0 // template <> vtime max( const vtime& l, const vtime& r ) { @@ -231,6 +234,7 @@ } return tmp; } +#endif vtime& sup( vtime& l, const vtime& r ) { @@ -302,12 +306,10 @@ return *this; } +namespace detail { + bool vtime_obj_rec::deliver( const VTmess& m ) { - // cout << self_id() << " " << ev.value().mess << endl; - - // cout << ev.value().gvt.gvt << endl; - if ( order_correct( m ) ) { lvt[m.src] += m.gvt.gvt; lvt[m.src][m.grp][m.src] = vt.gvt[m.grp][m.src] + 1; @@ -321,10 +323,6 @@ bool vtime_obj_rec::deliver_delayed( const VTmess& m ) { - // cout << self_id() << " " << ev.value().mess << endl; - - // cout << ev.value().gvt.gvt << endl; - if ( order_correct_delayed( m ) ) { lvt[m.src] += m.gvt.gvt; lvt[m.src][m.grp][m.src] = vt.gvt[m.grp][m.src] + 1; @@ -401,6 +399,8 @@ return true; } +} // namespace detail + void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) { VTDispatch_( m, grmap.equal_range( m.value().grp ) ); @@ -408,6 +408,8 @@ void VTDispatcher::VTDispatch_( const stem::Event_base<VTmess>& m, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& range ) { + typedef detail::vtime_obj_rec::dpool_t dpool_t; + 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 == m.src() ) { // not for nobody and not for self @@ -425,7 +427,7 @@ bool more; do { more = false; - for ( vtime_obj_rec::dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { + for ( 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->second.addr); @@ -473,12 +475,12 @@ } } - // Error: not group member? + throw domain_error( "VT object not member of group" ); // Error: not group member } void VTDispatcher::Subscribe( stem::addr_type addr, oid_type oid, group_type grp ) { - vtime_obj_rec& r = vtmap[oid]; + detail::vtime_obj_rec& r = vtmap[oid]; r.addr = addr; r.add_group( grp ); @@ -486,7 +488,6 @@ } DEFINE_RESPONSE_TABLE( VTDispatcher ) - // EV_T_( ST_NULL, MESS, VTDispatch, VTmess ) EV_Event_base_T_( ST_NULL, MESS, VTDispatch, VTmess ) END_RESPONSE_TABLE @@ -565,93 +566,6 @@ ((Init *)Init_buf)->~Init(); } -void Proc::mess( const stem::Event_base<VTmess>& ev ) -{ - cout << self_id() << " " << ev.value().mess << endl; - - // cout << ev.value().gvt.gvt << endl; - - if ( order_correct( ev ) ) { - cout << "Order correct" << endl; - lvt[ev.src()] += ev.value().gvt.gvt; - lvt[ev.src()][ev.value().grp][ev.src()] = vt.gvt[ev.value().grp][ev.src()] + 1; - vt.gvt[ev.value().grp] = vt::max( vt.gvt[ev.value().grp], lvt[ev.src()][ev.value().grp] ); - cout << vt.gvt << endl; - } else { - cout << "Order not correct" << endl; - } -} - -bool Proc::order_correct( const stem::Event_base<VTmess>& ev ) -{ - gvtime gvt( ev.value().gvt ); - - if ( vt.gvt[ev.value().grp][ev.src()] + 1 != gvt[ev.value().grp][ev.src()] ) { - cerr << "1" << endl; - cerr << vt.gvt[ev.value().grp][ev.src()] << "\n" - << gvt[ev.value().grp][ev.src()] - << endl; - return false; - } - - vtime xvt = lvt[ev.src()][ev.value().grp] + gvt[ev.value().grp]; - xvt[ev.src()] = 0; - - if ( !(xvt <= vt[ev.value().grp]) ) { - cerr << "2" << endl; - cerr << xvt << "\n\n" - << vt[ev.value().grp] << endl; - return false; - } - - for ( groups_container_type::const_iterator l = groups.begin(); l != groups.end(); ++l ) { - if ( *l != ev.value().grp ) { - xvt = lvt[ev.src()][*l] + gvt[*l]; - if ( !(xvt <= vt[*l]) ) { - cerr << "3" << endl; - cerr << "group " << *l << xvt << "\n\n" - << vt[*l] << endl; - return false; - } - } - } - - return true; -} - -void Proc::SendVC( group_type g, const std::string& mess ) -{ - try { - stem::Event_base<VTmess> m( MESS ); - m.value().mess = mess; - m.value().grp = g; - - vtime_type& gr = vt[g].vt; - - gr[self_id()] += 1; - - for ( vtime_type::const_iterator p = gr.begin(); p != gr.end(); ++p ) { - if ( p->first != self_id() ) { - m.dest( p->first ); - - m.value().gvt.gvt = vt.gvt - lvt[p->first]; - m.value().gvt.gvt[g][self_id()] = gr[self_id()]; - - lvt[p->first] = vt.gvt; - - Send(m); - } - } - } - catch ( const range_error& err ) { - cerr << err.what() << endl; - } -} - -DEFINE_RESPONSE_TABLE( Proc ) - EV_Event_base_T_( ST_NULL, MESS, mess, VTmess ) -END_RESPONSE_TABLE - } // namespace vt namespace std { Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 17:42:59 UTC (rev 1640) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 04:44:44 UTC (rev 1641) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 09:07:25 ptr> +// -*- C++ -*- Time-stamp: <07/07/25 23:30:52 ptr> #ifndef __vtime_h #define __vtime_h @@ -24,9 +24,6 @@ typedef uint32_t group_type; typedef std::hash_map<oid_type, vtime_unit_type> vtime_type; -// typedef std::pair<oid_type, vtime_unit_type> vtime_proc_type; -// typedef std::list<vtime_proc_type> vtime_type; - bool operator <=( const vtime_type& l, const vtime_type& r ); inline bool operator >=( const vtime_type& l, const vtime_type& r ) { return r <= l; } @@ -34,7 +31,7 @@ vtime_type operator +( const vtime_type& l, const vtime_type& r ); vtime_type& operator +=( vtime_type& l, const vtime_type& r ); -vtime_type max( const vtime_type& l, const vtime_type& r ); +// vt::vtime_type max( const vt::vtime_type& l, const vt::vtime_type& r ); vtime_type& sup( vtime_type& l, const vtime_type& r ); struct vtime : @@ -91,7 +88,7 @@ }; -vtime max( const vtime& l, const vtime& r ); +// vtime max( const vtime& l, const vtime& r ); vtime& sup( vtime& l, const vtime& r ); // typedef std::pair<group_type, vtime> vtime_group_type; @@ -158,6 +155,8 @@ std::string mess; }; +namespace detail { + class vtime_obj_rec { public: @@ -195,6 +194,8 @@ bool order_correct_delayed( const VTmess& ); }; +} // namespace detail + class VTDispatcher : public stem::EventHandler { @@ -211,8 +212,9 @@ 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; + private: + + typedef std::hash_map<oid_type, detail::vtime_obj_rec> vt_map_type; typedef std::hash_multimap<group_type, oid_type> gid_map_type; // oid_type map_gid( group_type ); // gid_type -> (oid_type, oid_type, ...) @@ -260,43 +262,6 @@ static class VTDispatcher *_vtdsp; }; - -class Proc : - public stem::EventHandler -{ - public: - Proc() - { } - Proc( stem::addr_type id ) : - stem::EventHandler( id ) - { } - - void add_group( group_type g ) - { groups.push_back( g ); } - - void add_group_member( group_type g, oid_type p ) - { vt[g][p]; } - - void SendVC( group_type, const std::string& mess ); - - void mess( const stem::Event_base<VTmess>& ); - - typedef std::list<group_type> groups_container_type; - - private: - - bool order_correct( const stem::Event_base<VTmess>& ); - - typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; - - delta_vtime_type lvt; - gvtime vt; - groups_container_type groups; - - - DECLARE_RESPONSE_TABLE( Proc, stem::EventHandler ); -}; - #define MESS 0x300 } // namespace vt This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |