[complement-svn] SF.net SVN: complement: [1682] trunk/complement/explore
Status: Pre-Alpha
Brought to you by:
complement
From: <com...@us...> - 2007-08-16 19:18:54
|
Revision: 1682 http://complement.svn.sourceforge.net/complement/?rev=1682&view=rev Author: complement Date: 2007-08-16 12:18:49 -0700 (Thu, 16 Aug 2007) Log Message: ----------- experiments with virtual synchrony ready for library (janus subproject) Modified Paths: -------------- trunk/complement/explore/lib/janus/ut/VTmess_core.cc trunk/complement/explore/lib/janus/ut/vt_dispatch.cc trunk/complement/explore/lib/janus/ut/vt_object.cc Added Paths: ----------- trunk/complement/explore/include/janus/ trunk/complement/explore/include/janus/vtime.h trunk/complement/explore/lib/janus/ trunk/complement/explore/lib/janus/Makefile trunk/complement/explore/lib/janus/Makefile.inc trunk/complement/explore/lib/janus/ut/ trunk/complement/explore/lib/janus/ut/Makefile trunk/complement/explore/lib/janus/ut/Makefile.inc trunk/complement/explore/lib/janus/ut/unit_test.cc trunk/complement/explore/lib/janus/ut/vt_handler.cc trunk/complement/explore/lib/janus/ut/vt_operations.cc trunk/complement/explore/lib/janus/ut/vt_operations.h trunk/complement/explore/lib/janus/ut/vt_remote.cc trunk/complement/explore/lib/janus/vtime.cc Removed Paths: ------------- trunk/complement/explore/lib/janus/ut/Makefile trunk/complement/explore/lib/janus/ut/Makefile.inc trunk/complement/explore/lib/janus/ut/unit_test.cc trunk/complement/explore/lib/janus/ut/vt_handler.cc trunk/complement/explore/lib/janus/ut/vt_operations.cc trunk/complement/explore/lib/janus/ut/vt_operations.h trunk/complement/explore/test/virtual_time/Makefile trunk/complement/explore/test/virtual_time/Makefile.inc trunk/complement/explore/test/virtual_time/test/Makefile trunk/complement/explore/test/virtual_time/test/Makefile.inc trunk/complement/explore/test/virtual_time/test/VTmess_core.cc trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc trunk/complement/explore/test/virtual_time/test/vt_handler.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 trunk/complement/explore/test/virtual_time/test/vt_remote.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Copied: trunk/complement/explore/include/janus/vtime.h (from rev 1680, trunk/complement/explore/test/virtual_time/vtime.h) =================================================================== --- trunk/complement/explore/include/janus/vtime.h (rev 0) +++ trunk/complement/explore/include/janus/vtime.h 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,413 @@ +// -*- C++ -*- Time-stamp: <07/08/11 01:05:47 ptr> + +#ifndef __vtime_h +#define __vtime_h + +#include <algorithm> +#include <list> +#include <vector> +#include <hash_map> +#include <hash_set> +#include <iterator> + +#include <istream> +#include <ostream> +#include <stdexcept> + +#include <stem/Event.h> +#include <stem/EventHandler.h> + +#include <mt/time.h> + +namespace vt { + +// typedef stem::addr_type oid_type; +typedef stem::gaddr_type oid_type; + +} // namespace vt + +namespace std { + +template <> +struct hash<vt::oid_type> +{ + size_t operator()(const vt::oid_type& __x) const + { return __x.addr; } +}; + +} // namespace std + +namespace vt { + +typedef uint32_t vtime_unit_type; +typedef stem::addr_type group_type; // required, used in VTSend +typedef std::hash_map<oid_type, vtime_unit_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; } +vtime_type operator -( const vtime_type& l, const vtime_type& r ); +vtime_type operator +( const vtime_type& l, const vtime_type& r ); +vtime_type& operator +=( 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 : + public stem::__pack_base +{ + void pack( std::ostream& s ) const; + void net_pack( std::ostream& s ) const; + void unpack( std::istream& s ); + void net_unpack( std::istream& s ); + + vtime() + { } + vtime( const vtime& _vt ) : + vt( _vt.vt.begin(), _vt.vt.end() ) + { } + vtime( const vtime_type& _vt ) : + vt( _vt.begin(), _vt.end() ) + { } + + vtime& operator =( const vtime& _vt ) + { vt = _vt.vt; } + + // bool operator ==( const vtime& r ) const + // { return vt == r.vt; } + + bool operator <=( const vtime& r ) const + { return vt <= r.vt; } + bool operator >=( const vtime& r ) const + { return vt >= r.vt; } + + vtime operator -( const vtime& r ) const + { return vtime( vt - r.vt ); } + + vtime operator +( const vtime& r ) const + { return vtime( vt + r.vt ); } + + vtime& operator +=( const vtime_type& t ) + { + vt += t; + return *this; + } + vtime& operator +=( const vtime& t ) + { + vt += t.vt; + return *this; + } + + vtime& operator +=( const vtime_type::value_type& ); + + vtime_type::data_type& operator[]( const vtime_type::key_type& k ) + { return vt[k]; } + const vtime_type::data_type& operator[]( const vtime_type::key_type& k ) const + { return vt[k]; } + + + mutable vtime_type vt; +}; + + +// vtime max( const vtime& l, const vtime& r ); +vtime& sup( vtime& l, const vtime& r ); + +// typedef std::pair<group_type, vtime> vtime_group_type; +// typedef std::list<vtime_group_type> gvtime_type; +typedef std::hash_map<group_type, vtime> gvtime_type; + +gvtime_type& operator +=( gvtime_type&, const gvtime_type::value_type& ); +gvtime_type& operator +=( gvtime_type&, const gvtime_type& ); +gvtime_type operator -( const gvtime_type& l, const gvtime_type& r ); + +struct gvtime : + public stem::__pack_base +{ + void pack( std::ostream& s ) const; + void net_pack( std::ostream& s ) const; + void unpack( std::istream& s ); + void net_unpack( std::istream& s ); + + gvtime() + { } + gvtime( const gvtime& _gvt ) : + gvt( _gvt.gvt.begin(), _gvt.gvt.end() ) + { } + + gvtime& operator =( const gvtime& _gvt ) + { gvt = _gvt.gvt; } + + gvtime& operator +=( const gvtime_type::value_type& ); + gvtime& operator +=( const gvtime& ); + + 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]; } + + mutable gvtime_type gvt; +}; + +struct VSsync_rq : + public stem::__pack_base +{ + void pack( std::ostream& s ) const; + void net_pack( std::ostream& s ) const; + void unpack( std::istream& s ); + void net_unpack( std::istream& s ); + + VSsync_rq() : + grp(0), + mess() + { } + VSsync_rq( const VSsync_rq& _gvt ) : + grp( _gvt.grp ), + mess( _gvt.mess ) + { } + + group_type grp; + std::string mess; +}; + +struct VSsync : + public VSsync_rq +{ + void pack( std::ostream& s ) const; + void net_pack( std::ostream& s ) const; + void unpack( std::istream& s ); + void net_unpack( std::istream& s ); + + VSsync() + { } + VSsync( const VSsync& _gvt ) : + VSsync_rq( _gvt ), + gvt( _gvt.gvt ) + { } + + gvtime gvt; +}; + +struct VTmess : + public VSsync +{ + void pack( std::ostream& s ) const; + void net_pack( std::ostream& s ) const; + void unpack( std::istream& s ); + void net_unpack( std::istream& s ); + + VTmess() : + code(0), + src() + { } + VTmess( const VTmess& _gvt ) : + VSsync( _gvt ), + code( _gvt.code ), + src( _gvt.src ) + { } + + stem::code_type code; + oid_type src; +}; + +namespace detail { + +class vtime_obj_rec +{ + public: + void add_group( group_type g ) + { groups.insert(g); } + void add( stem::addr_type a, group_type g ) + { addr = a; groups.insert(g); } + bool rm_group( group_type ); + void rm_member( const oid_type& ); + + template <typename BackInsertIterator> + void groups_list( BackInsertIterator bi ) const + { std::copy( groups.begin(), groups.end(), bi ); } + + stem::addr_type stem_addr() const + { return addr; } + + bool deliver( const VTmess& ev ); + bool deliver_delayed( const VTmess& ev ); + std::ostream& trace_deliver( const VTmess& m, std::ostream& o ); + void next( const oid_type& from, group_type grp ) + { ++vt.gvt[grp][from]; /* increment my VT counter */ } + void delta( gvtime& vtstamp, const oid_type& from, const oid_type& to, group_type grp ); + void base_advance( const oid_type& to ) + { svt[to] = vt.gvt; /* store last sent VT to obj */ } + void get_gvt( gvtime_type& gvt ) const + { gvt = vt.gvt; } + void sync( group_type, const oid_type&, const gvtime_type& ); + +#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 + + groups_container_type groups; // member of groups + + public: + // delay pool should be here + typedef std::pair<xmt::timespec,stem::Event_base<VTmess>*> delay_item_t; + typedef std::list<delay_item_t> dpool_t; + + dpool_t dpool; + + private: + bool order_correct( const VTmess& ); + bool order_correct_delayed( const VTmess& ); +}; + +} // namespace detail + +class VTDispatcher : + public stem::EventHandler +{ + public: + enum traceflags { + notrace = 0, + tracenet = 1, + tracedispatch = 2, + tracefault = 4, + tracedelayed = 8, + tracegroup = 0x10 + }; + + VTDispatcher() : + _trflags( notrace ), + _trs( 0 ) + { } + + VTDispatcher( const char *info ) : + stem::EventHandler( info ), + _trflags( notrace ), + _trs( 0 ) + { } + + VTDispatcher( stem::addr_type id ) : + stem::EventHandler( id ), + _trflags( notrace ), + _trs( 0 ) + { } + + VTDispatcher( stem::addr_type id, const char *info ) : + stem::EventHandler( id, info ), + _trflags( notrace ), + _trs( 0 ) + { } + + void VTDispatch( const stem::Event_base<VTmess>& ); + + void VTSend( const stem::Event& e, group_type ); + void Subscribe( stem::addr_type, oid_type, group_type ); + void Unsubscribe( oid_type, group_type ); + void Unsubscribe( oid_type ); + void get_gvtime( group_type, stem::addr_type, gvtime_type& ); + void set_gvtime( group_type, stem::addr_type, const gvtime_type& ); + + void settrf( unsigned f ); + void unsettrf( unsigned f ); + void resettrf( unsigned f ); + void cleantrf(); + unsigned trflags() const; + void settrs( std::ostream * ); + + 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; + + void check_and_send( detail::vtime_obj_rec&, const stem::Event_base<VTmess>& ); + void check_and_send_delayed( detail::vtime_obj_rec& ); + + vt_map_type vtmap; + gid_map_type grmap; + + xmt::mutex _lock_tr; + unsigned _trflags; + std::ostream *_trs; + + DECLARE_RESPONSE_TABLE( VTDispatcher, stem::EventHandler ); +}; + +class VTHandler : + public stem::EventHandler +{ + private: + class Init + { + public: + Init(); + ~Init(); + private: + static void _guard( int ); + static void __at_fork_prepare(); + static void __at_fork_child(); + static void __at_fork_parent(); + }; + + public: + VTHandler(); + explicit VTHandler( const char *info ); + explicit VTHandler( stem::addr_type id, const char *info = 0 ); + virtual ~VTHandler(); + + void VTSend( const stem::Event& e ); + void JoinGroup( group_type grp ) + { _vtdsp->Subscribe( self_id(), oid_type( self_id() ), grp ); } + virtual void VSNewMember( const stem::Event_base<VSsync_rq>& e ); + virtual void VSOutMember( const stem::Event_base<VSsync_rq>& e ); + virtual void VSsync_time( const stem::Event_base<VSsync>& ); + + + template <class D> + void VTSend( const stem::Event_base<D>& e ) + { VTHandler::VTSend( stem::Event_convert<D>()( e ) ); } + + static VTDispatcher *vtdispatcher() + { return _vtdsp; } + + protected: + void VSNewMember_data( const stem::Event_base<VSsync_rq>&, const std::string& data ); + + void get_gvtime( group_type g, gvtime_type& gvt ) + { _vtdsp->get_gvtime( g, self_id(), gvt ); } + + private: + static class VTDispatcher *_vtdsp; + + DECLARE_RESPONSE_TABLE( VTHandler, stem::EventHandler ); +}; + +#define VS_MESS 0x300 +#define VS_NEW_MEMBER 0x301 +#define VS_OUT_MEMBER 0x302 +#define VS_SYNC_TIME 0x303 + +} // namespace vt + +namespace std { + +ostream& operator <<( ostream&, const vt::vtime_type::value_type& ); +ostream& operator <<( ostream&, const vt::vtime_type& ); +ostream& operator <<( ostream&, const vt::vtime& ); +ostream& operator <<( ostream&, const vt::gvtime_type::value_type& ); +ostream& operator <<( ostream&, const vt::gvtime_type& ); +ostream& operator <<( ostream&, const vt::gvtime& ); +ostream& operator <<( ostream& o, const vt::VSsync& ); +ostream& operator <<( ostream& o, const vt::VTmess& ); + +} // namespace std + +#endif // __vtime_h Property changes on: trunk/complement/explore/lib/janus ___________________________________________________________________ Name: svn:ignore + obj Copied: trunk/complement/explore/lib/janus/Makefile (from rev 1672, trunk/complement/explore/test/virtual_time/Makefile) =================================================================== --- trunk/complement/explore/lib/janus/Makefile (rev 0) +++ trunk/complement/explore/lib/janus/Makefile 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,49 @@ +# -*- Makefile -*- Time-stamp: <07/02/07 12:28:46 ptr> + +SRCROOT := ../.. +COMPILER_NAME := gcc + +include Makefile.inc +include ${SRCROOT}/Makefiles/gmake/top.mak + +INCLUDES += -I$(SRCROOT)/include + +LIBMT_DIR = ${CoMT_DIR}/lib/mt +LIBSOCK_DIR = ${CoMT_DIR}/lib/sockios +LIBSTEM_DIR = ${CoMT_DIR}/lib/stem + +LDSEARCH += -L${CoMT_LIB_DIR} -Wl,--rpath=${CoMT_LIB_DIR} + +release-shared : LDLIBS = -lxmt -lsockios -lstem +ifndef WITHOUT_STLPORT +stldbg-shared : LDLIBS = -lxmtstlg -lsockiosstlg -lstemstlg +endif +dbg-shared : LDLIBS = -lxmtg -lsockiosg -lstemg + +check: all-shared + $(MAKE) -C test + (cd test; ${OUTPUT_DIR}/ut_vtime) || exit 1 + (cd test; ${OUTPUT_DIR_DBG}/ut_vtime) || exit 1 +ifndef WITHOUT_STLPORT + (cd test; ${OUTPUT_DIR_STLDBG}/ut_vt) || exit 1 +endif + +check-release-shared: release-shared + $(MAKE) -C test release-shared + (cd test; ${OUTPUT_DIR}/ut_vtime) || exit 1 + +check-dbg-shared: dbg-shared + $(MAKE) -C test dbg-shared + (cd test; ${OUTPUT_DIR_DBG}/ut_vtime) || exit 1 + +ifndef WITHOUT_STLPORT +check-stldbg-shared: stldbg-shared + $(MAKE) -C test stldbg-shared + (cd test; ${OUTPUT_DIR_STLDBG}/ut_vtime) || exit 1 +endif + +depend:: + $(MAKE) -C test depend + +# dbg-shared: DEFS += -DDEBUG + Copied: trunk/complement/explore/lib/janus/Makefile.inc (from rev 1672, trunk/complement/explore/test/virtual_time/Makefile.inc) =================================================================== --- trunk/complement/explore/lib/janus/Makefile.inc (rev 0) +++ trunk/complement/explore/lib/janus/Makefile.inc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,7 @@ +# -*- makefile -*- Time-stamp: <06/10/10 15:22:33 ptr> + +LIBNAME = janus +MAJOR = 0 +MINOR = 2 +PATCH = 0 +SRC_CC = vtime.cc Copied: trunk/complement/explore/lib/janus/ut (from rev 1672, trunk/complement/explore/test/virtual_time/test) Deleted: trunk/complement/explore/lib/janus/ut/Makefile =================================================================== --- trunk/complement/explore/test/virtual_time/test/Makefile 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/Makefile 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,39 +0,0 @@ -# -*- Makefile -*- Time-stamp: <07/02/21 15:30:59 ptr> - -SRCROOT := ../../.. -COMPILER_NAME := gcc -# ALL_TAGS := install-release-shared install-dbg-shared -# CoMT_DIR := ../../external/complement/explore - -include Makefile.inc -include ${SRCROOT}/Makefiles/gmake/top.mak - -# DEFS += -DUNIT_TEST -INCLUDES += -I${CoMT_INCLUDE_DIR} -I${BOOST_INCLUDE_DIR} -I.. -DEFS += -D__FIT_EXAM - -LDFLAGS += -L${INSTALL_LIB_DIR} -Wl,-rpath=${INSTALL_LIB_DIR}:${STLPORT_LIB_DIR} - -release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lexam -dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lexamg -stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lexamstlg - -LDLIBS = ${PROJECT_LIBS} - -check: all-shared - ${OUTPUT_DIR}/${PRGNAME} || exit 1 - ${OUTPUT_DIR_DBG}/${PRGNAME} || exit 1 -ifndef WITHOUT_STLPORT - ${OUTPUT_DIR_STLDBG}/${PRGNAME} || exit 1; -endif - -check-release-shared: release-shared - ${OUTPUT_DIR}/${PRGNAME} || exit 1 - -check-dbg-shared: dbg-shared - ${OUTPUT_DIR_DBG}/${PRGNAME} || exit 1 - -ifndef WITHOUT_STLPORT -check-stldbg-shared: stldbg-shared - ${OUTPUT_DIR_STLDBG}/${PRGNAME} || exit 1 -endif Copied: trunk/complement/explore/lib/janus/ut/Makefile (from rev 1678, trunk/complement/explore/test/virtual_time/test/Makefile) =================================================================== --- trunk/complement/explore/lib/janus/ut/Makefile (rev 0) +++ trunk/complement/explore/lib/janus/ut/Makefile 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,46 @@ +# -*- Makefile -*- Time-stamp: <07/08/08 22:18:48 ptr> + +SRCROOT := ../../.. +COMPILER_NAME := gcc +# ALL_TAGS := install-release-shared install-dbg-shared +# CoMT_DIR := ../../external/complement/explore + +include Makefile.inc +include ${SRCROOT}/Makefiles/gmake/top.mak + +# DEFS += -DUNIT_TEST +INCLUDES += -I${CoMT_INCLUDE_DIR} -I${BOOST_INCLUDE_DIR} -I.. +DEFS += -D__FIT_EXAM + +LDFLAGS += -L${INSTALL_LIB_DIR} -Wl,-rpath=${INSTALL_LIB_DIR}:${STLPORT_LIB_DIR} + +release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lexam +dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lexamg +ifndef WITHOUT_STLPORT +stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lexamstlg +endif + +dbg-shared: DEFS += -D__FIT_VS_TRACE +ifndef WITHOUT_STLPORT +stldbg-shared: DEFS += -D__FIT_VS_TRACE +endif + +LDLIBS = ${PROJECT_LIBS} + +check: all-shared + ${OUTPUT_DIR}/${PRGNAME} || exit 1 + ${OUTPUT_DIR_DBG}/${PRGNAME} || exit 1 +ifndef WITHOUT_STLPORT + ${OUTPUT_DIR_STLDBG}/${PRGNAME} || exit 1; +endif + +check-release-shared: release-shared + ${OUTPUT_DIR}/${PRGNAME} || exit 1 + +check-dbg-shared: dbg-shared + ${OUTPUT_DIR_DBG}/${PRGNAME} || exit 1 + +ifndef WITHOUT_STLPORT +check-stldbg-shared: stldbg-shared + ${OUTPUT_DIR_STLDBG}/${PRGNAME} || exit 1 +endif Deleted: trunk/complement/explore/lib/janus/ut/Makefile.inc =================================================================== --- trunk/complement/explore/test/virtual_time/test/Makefile.inc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/Makefile.inc 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,11 +0,0 @@ -# -*- Makefile -*- - -PRGNAME = ut_vtime - -SRC_CC = ../vtime.cc \ - unit_test.cc \ - vt_operations.cc \ - VTmess_core.cc \ - vt_object.cc \ - vt_dispatch.cc \ - vt_handler.cc Copied: trunk/complement/explore/lib/janus/ut/Makefile.inc (from rev 1680, trunk/complement/explore/test/virtual_time/test/Makefile.inc) =================================================================== --- trunk/complement/explore/lib/janus/ut/Makefile.inc (rev 0) +++ trunk/complement/explore/lib/janus/ut/Makefile.inc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,12 @@ +# -*- Makefile -*- + +PRGNAME = ut_vtime + +SRC_CC = ../vtime.cc \ + unit_test.cc \ + vt_operations.cc \ + VTmess_core.cc \ + vt_object.cc \ + vt_dispatch.cc \ + vt_handler.cc \ + vt_remote Modified: trunk/complement/explore/lib/janus/ut/VTmess_core.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/VTmess_core.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -3,7 +3,7 @@ #include "vt_operations.h" #include <iostream> -#include <vtime.h> +#include <janus/vtime.h> using namespace vt; using namespace std; Deleted: trunk/complement/explore/lib/janus/ut/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/unit_test.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,37 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/26 09:41:24 ptr> - -#include "vt_operations.h" - -int EXAM_DECL(vtime_test_suite); - -int EXAM_IMPL(vtime_test_suite) -{ - exam::test_suite::test_case_type tc[3]; - - exam::test_suite t( "virtual time operations" ); - - vtime_operations vt_oper; - - t.add( &vtime_operations::vt_max, vt_oper, "Max", - tc[1] = t.add( &vtime_operations::vt_add, vt_oper, "Additions", - tc[0] = t.add( &vtime_operations::vt_compare, vt_oper, "Compare" ) ) ); - t.add( &vtime_operations::vt_diff, vt_oper, "Differences", tc[0] ); - - 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::VTSubscription, vt_oper, "VTSubscription", - t.add( &vtime_operations::VTDispatch2, vt_oper, "VTHandler2", - t.add( &vtime_operations::VTDispatch2, vt_oper, "VTHandler1", - t.add( &vtime_operations::VTDispatch2, vt_oper, "VTDispatch2", - t.add( &vtime_operations::VTDispatch1, vt_oper, "VTDispatch1", - t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] ) ) ) ) ) ); - - return t.girdle(); -} - -int main( int, char ** ) -{ - - return vtime_test_suite(0); -} Copied: trunk/complement/explore/lib/janus/ut/unit_test.cc (from rev 1680, trunk/complement/explore/test/virtual_time/test/unit_test.cc) =================================================================== --- trunk/complement/explore/lib/janus/ut/unit_test.cc (rev 0) +++ trunk/complement/explore/lib/janus/ut/unit_test.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,41 @@ +// -*- C++ -*- Time-stamp: <07/08/16 09:04:40 ptr> + +#include "vt_operations.h" + +int EXAM_DECL(vtime_test_suite); + +int EXAM_IMPL(vtime_test_suite) +{ + exam::test_suite::test_case_type tc[3]; + + exam::test_suite t( "virtual time operations" ); + + vtime_operations vt_oper; + + t.add( &vtime_operations::vt_max, vt_oper, "Max", + tc[1] = t.add( &vtime_operations::vt_add, vt_oper, "Additions", + tc[0] = t.add( &vtime_operations::vt_compare, vt_oper, "Compare" ) ) ); + t.add( &vtime_operations::vt_diff, vt_oper, "Differences", tc[0] ); + + 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::remote, vt_oper, "remote", + t.add( &vtime_operations::VTEntryIntoGroup3, vt_oper, "VTEntryIntoGroup3", + t.add( &vtime_operations::VTEntryIntoGroup2, vt_oper, "VTEntryIntoGroup2", + t.add( &vtime_operations::VTEntryIntoGroup, vt_oper, "VTEntryIntoGroup", + t.add( &vtime_operations::VTSubscription, vt_oper, "VTSubscription", + t.add( &vtime_operations::VTDispatch2, vt_oper, "VTHandler2", + t.add( &vtime_operations::VTDispatch2, vt_oper, "VTHandler1", + t.add( &vtime_operations::VTDispatch2, vt_oper, "VTDispatch2", + t.add( &vtime_operations::VTDispatch1, vt_oper, "VTDispatch1", + t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] )))))))))); + + return t.girdle(); +} + +int main( int, char ** ) +{ + + return vtime_test_suite(0); +} Modified: trunk/complement/explore/lib/janus/ut/vt_dispatch.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/vt_dispatch.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -5,7 +5,7 @@ // #include <boost/lexical_cast.hpp> #include <iostream> -#include <vtime.h> +#include <janus/vtime.h> using namespace vt; using namespace std; Deleted: trunk/complement/explore/lib/janus/ut/vt_handler.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_handler.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/vt_handler.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,191 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/26 09:53:24 ptr> - -#include "vt_operations.h" - -// #include <boost/lexical_cast.hpp> - -#include <iostream> -#include <vtime.h> - -using namespace vt; -using namespace std; - -class VTDummy : - public vt::VTHandler -{ - public: - VTDummy(); - VTDummy( stem::addr_type id ); - VTDummy( stem::addr_type id, const char *info ); - ~VTDummy(); - - void handler( const stem::Event& ); - void VTNewMember( const stem::Event& ); - void VTOutMember( const stem::Event& ); - - void wait(); - std::string msg; - int count; - int ocount; - - private: - xmt::condition cnd; - - DECLARE_RESPONSE_TABLE( VTDummy, vt::VTHandler ); -}; - -#define VT_MESS3 0x1203 - -VTDummy::VTDummy() : - VTHandler(), - count(0), - ocount(0) -{ - cnd.set( false ); -} - -VTDummy::VTDummy( stem::addr_type id ) : - VTHandler( id ), - count(0), - ocount(0) -{ - cnd.set( false ); -} - -VTDummy::VTDummy( stem::addr_type id, const char *info ) : - VTHandler( id, info ), - count(0), - ocount(0) -{ - cnd.set( false ); -} - -VTDummy::~VTDummy() -{ - // cnd.wait(); -} - -void VTDummy::handler( const stem::Event& ev ) -{ - msg = ev.value(); - - cnd.set( true ); -} - -void VTDummy::VTNewMember( const stem::Event& ev ) -{ - // cerr << "Hello" << endl; - ++count; -} - -void VTDummy::VTOutMember( const stem::Event& ev ) -{ - // cerr << "Hello" << endl; - ++ocount; -} - -void VTDummy::wait() -{ - cnd.try_wait(); - - cnd.set( false ); -} - -DEFINE_RESPONSE_TABLE( VTDummy ) - EV_EDS( ST_NULL, VT_MESS3, handler ) -END_RESPONSE_TABLE - -int EXAM_IMPL(vtime_operations::VTHandler1) -{ - VTDummy dummy1; - VTDummy dummy2; - - stem::Event ev( VT_MESS3 ); - ev.dest( 0 ); // group - ev.value() = "hello"; - - dummy1.VTSend( ev ); - - dummy2.wait(); - - EXAM_CHECK( dummy2.msg == "hello" ); - EXAM_CHECK( dummy1.msg == "" ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::VTHandler2) -{ - VTDummy dummy1; - VTDummy dummy2; - VTDummy dummy3; - - stem::Event ev( VT_MESS3 ); - ev.dest( 0 ); // group - ev.value() = "hello"; - - dummy1.VTSend( ev ); - - dummy2.wait(); - dummy3.wait(); - - EXAM_CHECK( dummy3.count == 0 ); - EXAM_CHECK( dummy3.msg == "hello" ); - EXAM_CHECK( dummy2.count == 1 ); - EXAM_CHECK( dummy2.msg == "hello" ); - EXAM_CHECK( dummy1.count == 2 ); - EXAM_CHECK( dummy1.msg == "" ); - - ev.dest( 100 ); // not this group member - try { - dummy1.VTSend( ev ); - EXAM_ERROR( "exception expected" ); - } - catch ( std::domain_error& ) { - } - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::VTSubscription) -{ - VTDummy dummy1; - VTDummy dummy2; - - stem::Event ev( VT_MESS3 ); - ev.dest( 0 ); // group - ev.value() = "hello"; - - dummy1.VTSend( ev ); - - dummy2.wait(); - EXAM_CHECK( dummy2.msg == "hello" ); - - { - VTDummy dummy3; - - ev.value() = "hi"; - dummy1.VTSend( ev ); - - dummy2.wait(); - // dummy3.wait(); - - // EXAM_CHECK( dummy3.msg == "hi" ); - EXAM_CHECK( dummy3.msg == "" ); // dummy3 don't see, due to VTS - EXAM_CHECK( dummy2.msg == "hi" ); - EXAM_CHECK( dummy1.msg == "" ); - } - - ev.value() = "yet more"; - dummy1.VTSend( ev ); - - dummy2.wait(); - EXAM_CHECK( dummy2.msg == "yet more" ); - EXAM_CHECK( dummy1.msg == "" ); - - EXAM_CHECK( dummy1.ocount == 1 ); - EXAM_CHECK( dummy2.ocount == 1 ); - - return EXAM_RESULT; -} - Copied: trunk/complement/explore/lib/janus/ut/vt_handler.cc (from rev 1679, trunk/complement/explore/test/virtual_time/test/vt_handler.cc) =================================================================== --- trunk/complement/explore/lib/janus/ut/vt_handler.cc (rev 0) +++ trunk/complement/explore/lib/janus/ut/vt_handler.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,357 @@ +// -*- C++ -*- Time-stamp: <07/08/11 23:21:59 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <janus/vtime.h> + +#include <stem/EvManager.h> + +using namespace vt; +using namespace std; + +class VTDummy : + public vt::VTHandler +{ + public: + VTDummy(); + VTDummy( stem::addr_type id ); + VTDummy( stem::addr_type id, const char *info ); + ~VTDummy(); + + void handler( const stem::Event& ); + void VSNewMember( const stem::Event_base<VSsync_rq>& ); + void VSOutMember( const stem::Event_base<VSsync_rq>& ); + + void greeting(); + + void wait(); + std::string msg; + int count; + int ocount; + + void wait_greeting() + { + gr.try_wait(); + gr.set( false ); + } + + private: + xmt::condition cnd; + xmt::condition gr; + + DECLARE_RESPONSE_TABLE( VTDummy, vt::VTHandler ); +}; + +#define VS_DUMMY_MESS 0x1203 +#define VS_DUMMY_GREETING 0x1204 + +VTDummy::VTDummy() : + VTHandler(), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +VTDummy::VTDummy( stem::addr_type id ) : + VTHandler( id ), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +VTDummy::VTDummy( stem::addr_type id, const char *info ) : + VTHandler( id, info ), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +VTDummy::~VTDummy() +{ + // cnd.wait(); +} + +void VTDummy::handler( const stem::Event& ev ) +{ + msg = ev.value(); + + cnd.set( true ); +} + +void VTDummy::VSNewMember( const stem::Event_base<VSsync_rq>& ev ) +{ + // cerr << "Hello " << ev.src() << endl; + ++count; + + // VTNewMember_data( ev, "" ); + VTHandler::VSNewMember( ev ); + + stem::EventVoid gr_ev( VS_DUMMY_GREETING ); + gr_ev.dest( ev.src() ); + Send( gr_ev ); +} + +void VTDummy::VSOutMember( const stem::Event_base<VSsync_rq>& ev ) +{ + // cerr << "Hello" << endl; + ++ocount; +} + +void VTDummy::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +void VTDummy::greeting() +{ + gr.set( true ); +} + +DEFINE_RESPONSE_TABLE( VTDummy ) + EV_EDS( ST_NULL, VS_DUMMY_MESS, handler ) + EV_VOID( ST_NULL, VS_DUMMY_GREETING, greeting ) +END_RESPONSE_TABLE + +int EXAM_IMPL(vtime_operations::VTHandler1) +{ + VTDummy dummy1; + VTDummy dummy2; + + stem::Event ev( VS_DUMMY_MESS ); + ev.dest( 0 ); // group + ev.value() = "hello"; + + dummy1.VTSend( ev ); + + dummy2.wait(); + + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.msg == "" ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::VTHandler2) +{ + VTDummy dummy1; + VTDummy dummy2; + VTDummy dummy3; + + stem::Event ev( VS_DUMMY_MESS ); + ev.dest( 0 ); // group + ev.value() = "hello"; + + dummy1.VTSend( ev ); + + dummy2.wait(); + dummy3.wait(); + + EXAM_CHECK( dummy3.count == 0 ); + EXAM_CHECK( dummy3.msg == "hello" ); + EXAM_CHECK( dummy2.count == 1 ); + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.count == 2 ); + EXAM_CHECK( dummy1.msg == "" ); + + ev.dest( 100 ); // not this group member + try { + dummy1.VTSend( ev ); + EXAM_ERROR( "exception expected" ); + } + catch ( std::domain_error& ) { + } + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::VTSubscription) +{ + VTDummy dummy1; + VTDummy dummy2; + + stem::Event ev( VS_DUMMY_MESS ); + ev.dest( 0 ); // group + ev.value() = "hello"; + + dummy1.VTSend( ev ); + + dummy2.wait(); + EXAM_CHECK( dummy2.msg == "hello" ); + + { + VTDummy dummy3; + + ev.value() = "hi"; + dummy1.VTSend( ev ); + + dummy2.wait(); + // dummy3.wait(); + + // EXAM_CHECK( dummy3.msg == "hi" ); + // EXAM_CHECK( dummy3.msg == "" ); // dummy3 don't see, due to VTS + EXAM_CHECK( dummy2.msg == "hi" ); + EXAM_CHECK( dummy1.msg == "" ); + } + + ev.value() = "yet more"; + dummy1.VTSend( ev ); + + dummy2.wait(); + EXAM_CHECK( dummy2.msg == "yet more" ); + EXAM_CHECK( dummy1.msg == "" ); + + EXAM_CHECK( dummy1.ocount == 1 ); + EXAM_CHECK( dummy2.ocount == 1 ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::VTEntryIntoGroup) +{ + VTDummy dummy1; + + stem::Event ev( VS_DUMMY_MESS ); + ev.dest( 0 ); // group + ev.value() = "hello"; + + { + // dummy1.manager()->settrf( /* stem::EvManager::tracenet | */ stem::EvManager::tracedispatch ); + // dummy1.manager()->settrs( &std::cerr ); + + VTDummy dummy3; + + dummy3.wait_greeting(); + + ev.value() = "hi"; + dummy1.VTSend( ev ); + + dummy3.wait(); + + EXAM_CHECK( dummy3.msg == "hi" ); + EXAM_CHECK( dummy1.msg == "" ); + } + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::VTEntryIntoGroup2) +{ + VTDummy dummy1; + VTDummy dummy2; + + stem::Event ev( VS_DUMMY_MESS ); + ev.dest( 0 ); // group + ev.value() = "hello"; + + dummy1.VTSend( ev ); + + dummy2.wait(); + EXAM_CHECK( dummy2.msg == "hello" ); + + { + // cerr << (void *)&dummy1 << " dummy1\n" + // << (void *)&dummy2 << " dummy2\n"; + // dummy1.manager()->settrf( /* stem::EvManager::tracenet | */ stem::EvManager::tracedispatch | stem::EvManager::tracefault ); + // dummy1.manager()->settrs( &std::cerr ); + + // dummy1.vtdispatcher()->settrf( VTDispatcher::tracedispatch | VTDispatcher::tracefault | VTDispatcher::tracedelayed | VTDispatcher::tracegroup ); + // dummy1.vtdispatcher()->settrs( &std::cerr ); + + VTDummy dummy3; + + dummy3.wait_greeting(); + + ev.value() = "hi"; + ev.dest( 0 ); // group + dummy1.VTSend( ev ); + + dummy2.wait(); + dummy3.wait(); + + EXAM_CHECK( dummy2.msg == "hi" ); + EXAM_CHECK( dummy3.msg == "hi" ); + EXAM_CHECK( dummy1.msg == "" ); + } + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::VTEntryIntoGroup3) +{ + VTDummy dummy1; + + stem::Event ev( VS_DUMMY_MESS ); + + { + VTDummy dummy2; + + dummy2.wait_greeting(); + + ev.value() = "hello"; + ev.dest( 0 ); // group + dummy1.VTSend( ev ); + + dummy2.wait(); + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.msg == "" ); + } + + { + VTDummy dummy3; + + dummy3.wait_greeting(); + + ev.value() = "hi"; + ev.dest( 0 ); // group + dummy1.VTSend( ev ); + + dummy3.wait(); + + EXAM_CHECK( dummy3.msg == "hi" ); + EXAM_CHECK( dummy1.msg == "" ); + } + + { + VTDummy dummy2; + VTDummy dummy3; + + dummy2.wait_greeting(); + dummy3.wait_greeting(); + + ev.value() = "more"; + ev.dest( 0 ); // group + dummy1.VTSend( ev ); + + dummy2.wait(); + dummy3.wait(); + + EXAM_CHECK( dummy2.msg == "more" ); + EXAM_CHECK( dummy3.msg == "more" ); + EXAM_CHECK( dummy1.msg == "" ); + + dummy2.VTSend( ev ); + + dummy1.wait(); + } + + EXAM_CHECK( dummy1.msg == "more" ); + + return EXAM_RESULT; +} Modified: trunk/complement/explore/lib/janus/ut/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/vt_object.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -5,7 +5,7 @@ // #include <boost/lexical_cast.hpp> #include <iostream> -#include <vtime.h> +#include <janus/vtime.h> using namespace vt; using namespace std; Deleted: trunk/complement/explore/lib/janus/ut/vt_operations.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/vt_operations.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,321 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/27 10:42:55 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) -{ - const oid_type t0(0); - const oid_type t1(1); - const oid_type t2(2); - const oid_type t3(3); - - vtime_type vt1; - vtime_type vt2; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt2[t1] = 1; - vt2[t2] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( vt2 <= vt1 ); - EXAM_CHECK( vt1 >= vt2 ); - EXAM_CHECK( vt2 >= vt1 ); - - vt2[t3] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( !(vt2 <= vt1) ); - EXAM_CHECK( vt2 >= vt1 ); - - vt1.clear(); - vt2.clear(); - - vt1[t1] = 1; - - vt2[t1] = 1; - vt2[t3] = 1; - - EXAM_CHECK( vt1 <= vt2 ); - EXAM_CHECK( !(vt2 <= vt1) ); - - vt1[t2] = 1; - - EXAM_CHECK( !(vt1 <= vt2) ); - EXAM_CHECK( !(vt2 <= vt1) ); -} - -int EXAM_IMPL(vtime_operations::vt_add) -{ - const oid_type t1(1); - const oid_type t2(2); - const oid_type t3(3); - - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt3 = vt1 + vt2; - - EXAM_CHECK( vt1 <= vt3 ); - EXAM_CHECK( vt3 <= vt1 ); - - vt2[t2] = 1; - - vt3 = vt1 + vt2; - - vt4[t1] = 1; - vt4[t2] = 2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt4.clear(); - - vt2[t3] = 1; - - vt3 = vt1 + vt2; - - vt4[t1] = 1; - vt4[t2] = 2; - vt4[t3] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::vt_diff) -{ - const oid_type t1(1); - const oid_type t2(2); - const oid_type t3(3); - - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt3 = vt1 - vt2; - - EXAM_CHECK( vt1 <= vt3 ); - EXAM_CHECK( vt3 <= vt1 ); - - vt2[t1] = 1; - - vt3 = vt1 - vt2; - - vt4[t2] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2[t2] = 1; - - vt4.clear(); - - vt3 = vt1 - vt2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2.clear(); - - vt2[t3] = 1; - - try { - vt3 = vt1 - vt2; - EXAM_ERROR( "Virtual Times are incomparable" ); - } - catch ( const std::range_error& err ) { - EXAM_CHECK( true ); - } - - vt2.clear(); - - vt2[t2] = 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) -{ - const oid_type t1(1); - const oid_type t2(2); - const oid_type t3(3); - - vtime_type vt1; - vtime_type vt2; - vtime_type vt3; - vtime_type vt4; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[t1] = 1; - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[t2] = 1; - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - EXAM_CHECK( vt3 <= vt1 ); - EXAM_CHECK( vt1 <= vt3 ); - - vt2[t3] = 1; - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - vt4[t1] = 1; - vt4[t2] = 1; - vt4[t3] = 1; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2.clear(); - - vt2[t1] = 1; - vt2[t2] = 2; - - vt4.clear(); - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - vt4[t1] = 1; - vt4[t2] = 2; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - vt2[t3] = 4; - - vt3 = vt1; - vt::sup( vt3, vt2 ); - - vt4[t3] = 4; - - EXAM_CHECK( vt3 <= vt4 ); - EXAM_CHECK( vt4 <= vt3 ); - - return EXAM_RESULT; -} - -int EXAM_IMPL(vtime_operations::gvt_add) -{ - const oid_type t0(0); - const oid_type t1(1); - const oid_type t2(2); - - { - gvtime_type gvt1; - gvtime_type gvt2; - - vtime_type vt1; - vtime_type vt2; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt2[t1] = 1; - vt2[t2] = 1; - - gvt1[0] = vt1; - gvt2[0] = vt2; - - gvt1 += gvt2; - - EXAM_CHECK( gvt1[0][t1] == 2 ); - EXAM_CHECK( gvt1[0][t2] == 2 ); - EXAM_CHECK( gvt1[0][t0] == 0 ); - EXAM_CHECK( gvt1[1][t1] == 0 ); - EXAM_CHECK( gvt1[1][t2] == 0 ); - } - { - gvtime_type gvt1; - gvtime_type gvt2; - - vtime_type vt1; - vtime_type vt2; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt2[t1] = 1; - vt2[t2] = 1; - - gvt1[0] = vt1; - gvt2[1] = vt2; - - gvt1 += gvt2; - - EXAM_CHECK( gvt1[0][t1] == 1 ); - EXAM_CHECK( gvt1[0][t2] == 1 ); - EXAM_CHECK( gvt1[0][t0] == 0 ); - EXAM_CHECK( gvt1[1][t1] == 1 ); - EXAM_CHECK( gvt1[1][t2] == 1 ); - } - { - gvtime_type gvt1; - - vtime_type vt1; - vtime_type vt2; - - vt1[t1] = 1; - vt1[t2] = 1; - - vt2[t1] = 1; - vt2[t2] = 1; - - gvt1[0] = vt1; - - gvt1 += make_pair( 1, vt2 ); - - EXAM_CHECK( gvt1[0][t1] == 1 ); - EXAM_CHECK( gvt1[0][t2] == 1 ); - EXAM_CHECK( gvt1[0][t0] == 0 ); - EXAM_CHECK( gvt1[1][t1] == 1 ); - EXAM_CHECK( gvt1[1][t2] == 1 ); - } - - return EXAM_RESULT; -} Copied: trunk/complement/explore/lib/janus/ut/vt_operations.cc (from rev 1678, trunk/complement/explore/test/virtual_time/test/vt_operations.cc) =================================================================== --- trunk/complement/explore/lib/janus/ut/vt_operations.cc (rev 0) +++ trunk/complement/explore/lib/janus/ut/vt_operations.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,323 @@ +// -*- C++ -*- Time-stamp: <07/07/27 10:42:55 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <janus/vtime.h> + +using namespace vt; +using namespace std; + +int EXAM_IMPL(vtime_operations::vt_compare) +{ + const oid_type t0(0); + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); + + vtime_type vt1; + vtime_type vt2; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt2[t1] = 1; + vt2[t2] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( vt2 <= vt1 ); + EXAM_CHECK( vt1 >= vt2 ); + EXAM_CHECK( vt2 >= vt1 ); + + vt2[t3] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( vt2 >= vt1 ); + + vt1.clear(); + vt2.clear(); + + vt1[t1] = 1; + + vt2[t1] = 1; + vt2[t3] = 1; + + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); + + vt1[t2] = 1; + + EXAM_CHECK( !(vt1 <= vt2) ); + EXAM_CHECK( !(vt2 <= vt1) ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::vt_add) +{ + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); + + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt3 = vt1 + vt2; + + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); + + vt2[t2] = 1; + + vt3 = vt1 + vt2; + + vt4[t1] = 1; + vt4[t2] = 2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt4.clear(); + + vt2[t3] = 1; + + vt3 = vt1 + vt2; + + vt4[t1] = 1; + vt4[t2] = 2; + vt4[t3] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::vt_diff) +{ + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); + + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt3 = vt1 - vt2; + + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); + + vt2[t1] = 1; + + vt3 = vt1 - vt2; + + vt4[t2] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2[t2] = 1; + + vt4.clear(); + + vt3 = vt1 - vt2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2.clear(); + + vt2[t3] = 1; + + try { + vt3 = vt1 - vt2; + EXAM_ERROR( "Virtual Times are incomparable" ); + } + catch ( const std::range_error& err ) { + EXAM_CHECK( true ); + } + + vt2.clear(); + + vt2[t2] = 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) +{ + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); + + vtime_type vt1; + vtime_type vt2; + vtime_type vt3; + vtime_type vt4; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[t1] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[t2] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); + + vt2[t3] = 1; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[t1] = 1; + vt4[t2] = 1; + vt4[t3] = 1; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2.clear(); + + vt2[t1] = 1; + vt2[t2] = 2; + + vt4.clear(); + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[t1] = 1; + vt4[t2] = 2; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + vt2[t3] = 4; + + vt3 = vt1; + vt::sup( vt3, vt2 ); + + vt4[t3] = 4; + + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; +} + +int EXAM_IMPL(vtime_operations::gvt_add) +{ + const oid_type t0(0); + const oid_type t1(1); + const oid_type t2(2); + + { + gvtime_type gvt1; + gvtime_type gvt2; + + vtime_type vt1; + vtime_type vt2; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt2[t1] = 1; + vt2[t2] = 1; + + gvt1[0] = vt1; + gvt2[0] = vt2; + + gvt1 += gvt2; + + EXAM_CHECK( gvt1[0][t1] == 2 ); + EXAM_CHECK( gvt1[0][t2] == 2 ); + EXAM_CHECK( gvt1[0][t0] == 0 ); + EXAM_CHECK( gvt1[1][t1] == 0 ); + EXAM_CHECK( gvt1[1][t2] == 0 ); + } + { + gvtime_type gvt1; + gvtime_type gvt2; + + vtime_type vt1; + vtime_type vt2; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt2[t1] = 1; + vt2[t2] = 1; + + gvt1[0] = vt1; + gvt2[1] = vt2; + + gvt1 += gvt2; + + EXAM_CHECK( gvt1[0][t1] == 1 ); + EXAM_CHECK( gvt1[0][t2] == 1 ); + EXAM_CHECK( gvt1[0][t0] == 0 ); + EXAM_CHECK( gvt1[1][t1] == 1 ); + EXAM_CHECK( gvt1[1][t2] == 1 ); + } + { + gvtime_type gvt1; + + vtime_type vt1; + vtime_type vt2; + + vt1[t1] = 1; + vt1[t2] = 1; + + vt2[t1] = 1; + vt2[t2] = 1; + + gvt1[0] = vt1; + + gvt1 += make_pair( 1, vt2 ); + + EXAM_CHECK( gvt1[0][t1] == 1 ); + EXAM_CHECK( gvt1[0][t2] == 1 ); + EXAM_CHECK( gvt1[0][t0] == 0 ); + EXAM_CHECK( gvt1[1][t1] == 1 ); + EXAM_CHECK( gvt1[1][t2] == 1 ); + } + + return EXAM_RESULT; +} Deleted: trunk/complement/explore/lib/janus/ut/vt_operations.h =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.h 2007-08-03 20:13:53 UTC (rev 1672) +++ trunk/complement/explore/lib/janus/ut/vt_operations.h 2007-08-16 19:18:49 UTC (rev 1682) @@ -1,30 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/26 09:40:39 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(VTDispatch1); - int EXAM_DECL(VTDispatch2); - - int EXAM_DECL(VTHandler1); - int EXAM_DECL(VTHandler2); - - int EXAM_DECL(VTSubscription); -}; - -#endif // __vt_operations_h Copied: trunk/complement/explore/lib/janus/ut/vt_operations.h (from rev 1680, trunk/complement/explore/test/virtual_time/test/vt_operations.h) =================================================================== --- trunk/complement/explore/lib/janus/ut/vt_operations.h (rev 0) +++ trunk/complement/explore/lib/janus/ut/vt_operations.h 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,35 @@ +// -*- C++ -*- Time-stamp: <07/08/16 09:02:08 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(VTDispatch1); + int EXAM_DECL(VTDispatch2); + + int EXAM_DECL(VTHandler1); + int EXAM_DECL(VTHandler2); + + int EXAM_DECL(VTSubscription); + int EXAM_DECL(VTEntryIntoGroup); + int EXAM_DECL(VTEntryIntoGroup2); + int EXAM_DECL(VTEntryIntoGroup3); + + int EXAM_DECL(remote); +}; + +#endif // __vt_operations_h Copied: trunk/complement/explore/lib/janus/ut/vt_remote.cc (from rev 1680, trunk/complement/explore/test/virtual_time/test/vt_remote.cc) =================================================================== --- trunk/complement/explore/lib/janus/ut/vt_remote.cc (rev 0) +++ trunk/complement/explore/lib/janus/ut/vt_remote.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,194 @@ +// -*- C++ -*- Time-stamp: <07/08/16 10:45:48 ptr> + +#include "vt_operations.h" + +// #include <boost/lexical_cast.hpp> + +#include <iostream> +#include <janus/vtime.h> + +#include <stem/EvManager.h> +#include <stem/NetTransport.h> +#include <sockios/sockmgr.h> +#include <sys/wait.h> + +#include <mt/xmt.h> +#include <mt/shm.h> + +using namespace std; +using namespace stem; +using namespace xmt; +using namespace vt; + +class YaRemote : + public vt::VTHandler +{ + public: + YaRemote(); + YaRemote( stem::addr_type id ); + YaRemote( stem::addr_type id, const char *info ); + ~YaRemote(); + + void handler( const stem::Event& ); + void VSNewMember( const stem::Event_base<VSsync_rq>& ); + void VSOutMember( const stem::Event_base<VSsync_rq>& ); + + void greeting(); + + void wait(); + std::string msg; + int count; + int ocount; + + void wait_greeting() + { + gr.try_wait(); + gr.set( false ); + } + + private: + xmt::condition cnd; + xmt::condition gr; + + DECLARE_RESPONSE_TABLE( YaRemote, vt::VTHandler ); +}; + +#define VS_DUMMY_MESS 0x1203 +#define VS_DUMMY_GREETING 0x1204 + +YaRemote::YaRemote() : + VTHandler(), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +YaRemote::YaRemote( stem::addr_type id ) : + VTHandler( id ), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +YaRemote::YaRemote( stem::addr_type id, const char *info ) : + VTHandler( id, info ), + count(0), + ocount(0) +{ + cnd.set( false ); + gr.set( false ); + + JoinGroup( 0 ); +} + +YaRemote::~YaRemote() +{ + // cnd.wait(); +} + +void YaRemote::handler( const stem::Event& ev ) +{ + msg = ev.value(); + + cnd.set( true ); +} + +void YaRemote::VSNewMember( const stem::Event_base<VSsync_rq>& ev ) +{ + // cerr << "Hello " << ev.src() << endl; + ++count; + + // VTNewMember_data( ev, "" ); + VTHandler::VSNewMember( ev ); + + stem::EventVoid gr_ev( VS_DUMMY_GREETING ); + gr_ev.dest( ev.src() ); + Send( gr_ev ); +} + +void YaRemote::VSOutMember( const stem::Event_base<VSsync_rq>& ev ) +{ + // cerr << "Hello" << endl; + ++ocount; +} + +void YaRemote::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +void YaRemote::greeting() +{ + gr.set( true ); +} + +DEFINE_RESPONSE_TABLE( YaRemote ) + EV_EDS( ST_NULL, VS_DUMMY_MESS, handler ) + EV_VOID( ST_NULL, VS_DUMMY_GREETING, greeting ) +END_RESPONSE_TABLE + +int EXAM_IMPL(vtime_operations::remote) +{ + const char fname[] = "/tmp/yanus_test.shm"; + xmt::shm_alloc<0> seg; + xmt::allocator_shm<xmt::__condition<true>,0> shm_cnd; + xmt::allocator_shm<xmt::__barrier<true>,0> shm_b; + + try { + seg.allocate( fname, 4*4096, xmt::shm_base::create | xmt::shm_base::exclusive, 0600 ); + xmt::__barrier<true>& b = *new ( shm_b.allocate( 1 ) ) xmt::__barrier<true>(); + + try { + xmt::fork(); + + b.wait(); + + NetTransportMgr mgr; + + addr_type zero = mgr.open( "localhost", 6980 ); + + EXAM_CHECK_ASYNC( mgr.good() ); + + YaRemote obj2; + + exit(0); + } + catch ( xmt::fork_in_parent& child ) { + sockmgr_stream_MP<NetTransport> srv( 6980 ); + + EXAM_REQUIRE( srv.good() ); + + b.wait(); + + YaRemote obj1; + + int stat; + EXAM_CHECK( waitpid( child.pid(), &stat, 0 ) == child.pid() ); + + srv.close(); + srv.wait(); + } + + (&b)->~__barrier<true>(); + shm_b.deallocate( &b, 1 ); + } + catch ( const xmt::shm_bad_alloc& err ) { + EXAM_ERROR( err.what() ); + } + + seg.deallocate(); + unlink( fname ); + + return EXAM_RESULT; +} + Copied: trunk/complement/explore/lib/janus/vtime.cc (from rev 1680, trunk/complement/explore/test/virtual_time/vtime.cc) =================================================================== --- trunk/complement/explore/lib/janus/vtime.cc (rev 0) +++ trunk/complement/explore/lib/janus/vtime.cc 2007-08-16 19:18:49 UTC (rev 1682) @@ -0,0 +1,1170 @@ +// -*- C++ -*- Time-stamp: <07/08/11 01:10:59 ptr> + +#include <janus/vtime.h> + +#include <iostream> +#include <stdint.h> +#include <stem/EvManager.h> + +namespace vt { + +using namespace std; +using namespace xmt; +using namespace stem; + +void vtime::pack( std::ostream& s ) const +{ + __pack( s, static_cast<uint8_t>(vt.size()) ); + for ( vtime_type::const_iterator i = vt.begin(); i != vt.end(); ++i ) { + i->first.pack( s ); // __pack( s, i->first ); + __pack( s, i->second ); + } +} + +void vtime::net_pack( std::ostream& s ) const +{ + __net_pack( s, static_cast<uint8_t>(vt.size()) ); + for ( vtime_type::const_iterator i = vt.begin(); i != vt.end(); ++i ) { + i->first.net_pack( s ); // __net_pack( s, i->first ); + __net_pack( s, i->second ); + } +} + +void vtime::unpack( std::istream& s ) +{ + vt.clear(); + uint8_t n; + __unpack( s, n ); + while ( n-- > 0 ) { + oid_type oid; + vtime_unit_type v; + + oid.unpack( s ); // __unpack( s, oid ); + __unpack( s, v ); + + vt[oid] = v; + } +} + +void vtime::net_unpack( std::istream& s ) +{ + vt.clear(); + uint8_t n; + __net_unpack( s, n ); + while ( n-- > 0 ) { + oid_type oid; + vtime_unit_type v; + + oid.net_unpack( s ); // __net_unpack( s, oid ); + __net_unpack( s, v ); + + vt[oid] = v; + } +} + +void gvtime::pack( std::ostream& s ) const +{ + __pack( s, static_cast<uint8_t>(gvt.size()) ); + for ( gvtime_type::const_iterator i = gvt.begin(); i != gvt.end(); ++i ) { + __pack( s, i->first ); + i->second.pack( s ); + } +} + +void gvtime::net_pack( std::ostream& s ) const +{ + __net_pack( s, static_cast<uint8_t>(gvt.size()) ); + for ( gvtime_type::const_iterator i = gvt.begin(); i != gvt.end(); ++i ) { + __net_pack( s, i->first ); + i->second.net_pack( s ); + } +} + +void gvtime::unpack( std::istream& s ) +{ + gvt.clear(); + uint8_t n; + __unpack( s, n ); + while ( n-- > 0 ) { + group_type gid; + __unpack( s, gid ); + gvt[gid].unpack( s ); + } +} + +void gvtime::net_unpack( std::istream& s ) +{ + gvt.clear(); + uint8_t n; + __net_unpack( s, n ); + while ( n-- > 0 ) { + group_type gid; + __net_unpack( s, gid ); + gvt[gid].net_unpack( s ); + } +} + +void VSsync_rq::pack( std::ostream& s ) const +{ + __pack( s, grp ); + __pack( s, mess ); +} + +void VSsync_rq::net_pack( std::ostream& s ) const +{ + __net_pack( s, grp ); + __net_pack( s, mess ); +} + +void VSsync_rq::unpack( std::istream& s ) +{ + __unpack( s, grp ); + __unpack( s, mess ); +} + +void VSsync_rq::net_unpack( std::istream& s ) +{ + __net_unpack( s, grp ); + __net_unpack( s, mess ); +} + +void VSsync::pack( std::ostream& s ) const +{ + gvt.pack( s ); + VSsync_rq::pack( s ); +} + +void VSsync::net_pack( std::ostream& s ) const +{ + gvt.net_pack( s ); + VSsync_rq::net_pack( s ); +} + +void VSsync::unpack( std::istream& s ) +{ + gvt.unpack( s ); + VSsync_rq::unpack( s ); +} + +void VSsync::net_unpack( std::istream& s ) +{ + gvt.net_unpack( s ); + VSsync_rq::net_unpack( s ); +} + +void VTmess::pack( std::ostream& s ) const +{ + __pack( s, code ); + src.pack( s ); // __pack( s, src ); + VSsync::pack( s ); +} + +void VTmess::net_pack( std::ostream& s ) const +{ + __net_pack( s, code ); + src.net_pack( s ); // __net_pack( s, src ); + VSsync::net_pack( s ); +} + +void VTmess::unpack( std::istream& s ) +{ + __unpack( s, code ); + src.unpack( s ); // __unpack( s, src ); + VSsync::unpack( s ); +} + +void VTmess::net_unpack( std::istream& s ) +{ + __net_unpack( s, code ); + src.net_unpack( s ); // __net_unpack( s, src ); + VSsync::net_unpack( s ); +} + +bool operator <=( const vtime_type& l, const vtime_type& r ) +{ + if ( l.empty() ) { + return true; + } + + for ( vtime_type::const_iterator i = l.begin(); i != l.end(); ++i ) { + if ( i->second > 0 ) { + vtime_type::const_iterator j = r.find( i->first ); + if ( j == r.end() || i->second > j->second ) { + return false; + } + } + } + + return true; +} + +vtime_type operator -( const vtime_type& l, const vtime_type& r ) +{ + vtime_type tmp( r.begin(), r.end() ); + + for ( vtime_type::iterator i = tmp.begin(); i != tmp.end(); ++i ) { + if ( i->second > 0 ) { + vtime_type::const_iterator p = l.find(i->first); + if ( p == l.end() || p->second < i->second ) { + throw range_error( "vtime different: right value grater then left" ); + } + i->second = p->second - i->second; + } + } + + for ( vtime_type::const_iterator i = l.begin(); i != l.end(); ++i ) { + vtime_type::iterator p = tmp.find(i->first); + if ( p == tmp.end() ) { + tmp[i->first] = i->second; + } + } + + return tmp; +} + +vtime_type operator +( const vtime_type& l, const vtime_type& r ) +{ + vtime_type tmp( l.begin(), l.end() ); + + for ( vtime_type::const_iterator i = r.begin(); i != r.end(); ++i ) { + tmp[i->first] += i->second; + } + + return tmp; +} + +vtime_type& operator +=( vtime_type& l, const vtime_type& r ) +{ + for ( vtime_type::const_iterator i = r.begin(); i != r.end(); ++i ) { + l[i->first] += i->second; + } + + return l; +} + +#if 0 +// template <> +vtime_type max( const vtime_type& l, const vtime_type& r ) +{ + vtime_type tmp( l.begin(), l.end() ); + + for ( vtime_type::const_iterator i = r.begin(); i != r.end(); ++i ) { + tmp[i->first] = std::max( tmp[i->first], i->second ); + } + return tmp; +} +#endif + +vtime_type& sup( vtime_type& l, const vtime_type& r ) +{ + for ( vtime_type::const_iterator i = r.begin(); i != r.end(); ++i ) { + l[i->first] = std::max( l[i->first], i->second ); + } + return l; +} + + +#if 0 +// template <> +vtime max( const vtime& l, const vtime& r ) +{ + vtime tmp( l ); + + for ( vtime_type::const_iterator i = r.vt.begin(); i != r.vt.end(); ++i ) { + tmp[i->first] = std::max( tmp[i->first], i->second ); + } + return tmp; +} +#endif + +vtime& sup( vtime& l, const vtime& r ) +{ + for ( vtime_type::const_iterator i = r.vt.begin(); i != r.vt.end(); ++i ) { + l[i->first] = std::max( l[i->first], i->second ); + } + return l; +} + +vtime& vtime::operator +=( const vtime_type::value_type& t ) +{ + vt[t.first] += t.second; + + return *this; +} + +gvtime_type& operator +=( gvtime_type& gvt, const gvtime_type::value_type& t ) +{ + gvt[t.first] += t.seco... [truncated message content] |