complement-svn Mailing List for Complement (Page 14)
Status: Pre-Alpha
Brought to you by:
complement
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(61) |
Nov
(76) |
Dec
(39) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(33) |
Feb
(41) |
Mar
(16) |
Apr
|
May
(22) |
Jun
(14) |
Jul
(64) |
Aug
(60) |
Sep
(35) |
Oct
(34) |
Nov
(10) |
Dec
(5) |
2008 |
Jan
(4) |
Feb
(24) |
Mar
(10) |
Apr
(30) |
May
(15) |
Jun
(50) |
Jul
(20) |
Aug
(7) |
Sep
(8) |
Oct
(10) |
Nov
|
Dec
|
From: <com...@us...> - 2007-07-27 12:00:48
|
Revision: 1653 http://complement.svn.sourceforge.net/complement/?rev=1653&view=rev Author: complement Date: 2007-07-27 05:00:47 -0700 (Fri, 27 Jul 2007) Log Message: ----------- inquiry make goal Added Paths: ----------- trunk/complement/explore/inquiry/makes/goal/ trunk/complement/explore/inquiry/makes/goal/Makefile Added: trunk/complement/explore/inquiry/makes/goal/Makefile =================================================================== --- trunk/complement/explore/inquiry/makes/goal/Makefile (rev 0) +++ trunk/complement/explore/inquiry/makes/goal/Makefile 2007-07-27 12:00:47 UTC (rev 1653) @@ -0,0 +1,14 @@ + +all: release-shared debug-shared + +ifneq (,$(findstring debug,$(MAKECMDGOALS))) +CMD = debug +else +CMD = release +endif + +release-shared: + echo ${CMD} + +debug-shared: + echo ${CMD} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 12:00:08
|
Revision: 1652 http://complement.svn.sourceforge.net/complement/?rev=1652&view=rev Author: complement Date: 2007-07-27 05:00:03 -0700 (Fri, 27 Jul 2007) Log Message: ----------- dirs for makesystem unit tests Added Paths: ----------- trunk/complement/explore/Makefiles/ut/so2/ trunk/complement/explore/Makefiles/ut/static_app1/ trunk/complement/explore/Makefiles/ut/static_app2/ trunk/complement/explore/Makefiles/ut/static_lib1/ trunk/complement/explore/Makefiles/ut/static_lib2/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 11:51:41
|
Revision: 1651 http://complement.svn.sourceforge.net/complement/?rev=1651&view=rev Author: complement Date: 2007-07-27 04:51:31 -0700 (Fri, 27 Jul 2007) Log Message: ----------- juniper removed, str_interposer.c preserved in ldpreload Added Paths: ----------- trunk/complement/explore/inquiry/shades/ldpreload/str_interposer.c Removed Paths: ------------- trunk/complement/explore/inquiry/shades/juniper/ Added: trunk/complement/explore/inquiry/shades/ldpreload/str_interposer.c =================================================================== --- trunk/complement/explore/inquiry/shades/ldpreload/str_interposer.c (rev 0) +++ trunk/complement/explore/inquiry/shades/ldpreload/str_interposer.c 2007-07-27 11:51:31 UTC (rev 1651) @@ -0,0 +1,126 @@ +/* Example from: http://developers.sun.com/solaris/articles/lib_interposers_code.html + * + */ + +/* library interposer: interpose on + * str...(). + * export LD_PRELOAD=$cwd/libtest.so.0.0 + * run the app + * unset LD_PRELOAD + */ + +#include <stdio.h> +#include <dlfcn.h> +#include <sys/socket.h> +#include <netinet/in.h> + + +#if 0 +void *malloc(size_t size) +{ + static void * (*func)(); + + if(!func) + func = (void *(*)()) dlsym(RTLD_NEXT, "malloc"); + printf("malloc(%d) is called\n", size); + return(func(size)); +} +#endif + +char *strcpy( char *s1, const char *s2 ) +{ + static void * (*func)(); + + if (!func) + func = (void *(*)()) dlsym(RTLD_NEXT, "strcpy"); + + printf( "strcpy: '%s'\n", s2 ); + + return func( s1, s2 ); +} + +char *strdup(const char *s1) +{ + static void * (*func)(); + + if (!func) + func = (void *(*)()) dlsym(RTLD_NEXT, "strdup"); + + printf( "strdup: '%s'\n", s1 ); + + return func( s1 ); +} + +char *strncat(char *s1, const char *s2, size_t n) +{ + static void * (*func)(); + char *r; + + if (!func) + func = (void *(*)()) dlsym(RTLD_NEXT, "strncat"); + + r = func( s1, s2, n ); + printf( "strncat: '%s'\n", r ); + + return r; +} + +char *strtok(char *s1, const char *s2) +{ + static void * (*func)(); + + if (!func) + func = (void *(*)()) dlsym(RTLD_NEXT, "strtok"); + + printf( "strtok: '%s'\n", s1 ); + + return func( s1, s2 ); +} + +ssize_t sendto(int socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t dest_len) +{ + static ssize_t (*func)(); + int i; + + if (!func) + func = (ssize_t (*)()) dlsym(RTLD_NEXT, "sendto"); + + printf( "sendto: (%d) '", length ); + for ( i = 0; i < length; ++i ) { + printf( "%c", (const char *)message + i ); + } + printf( "'\n" ); + return func( socket, message, length, flags, dest_addr, dest_len ); +} + +ssize_t recvfrom(int socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len) +{ + static ssize_t (*func)(); + int i; + ssize_t s; + + if (!func) + func = (ssize_t (*)()) dlsym(RTLD_NEXT, "recvfrom"); + + s = func( socket, buffer, length, flags, address, address_len ); + printf( "recvfrom: (%d) '", length ); + for ( i = 0; i < length; ++i ) { + printf( "%c", (const char *)buffer + i ); + } + printf( "'\n" ); + return s; +} + +int connect(int socket, const struct sockaddr *address, socklen_t address_len) +{ + static int (*func)(); + + if (!func) + func = (int (*)()) dlsym(RTLD_NEXT, "connect"); + + printf( "connect: " ); + printf( "%x", *(((unsigned *)&((struct sockaddr_in *)address)->sin_addr)) ); + printf( ":%d\n", ntohs(((struct sockaddr_in *)address)->sin_port) ); + + return func( socket, address, address_len ); +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 11:38:17
|
Revision: 1650 http://complement.svn.sourceforge.net/complement/?rev=1650&view=rev Author: complement Date: 2007-07-27 04:38:15 -0700 (Fri, 27 Jul 2007) Log Message: ----------- add constructors with reasonable defaults for gaddr_type Modified 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 Modified: trunk/complement/explore/test/virtual_time/test/VTmess_core.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-07-27 11:37:55 UTC (rev 1649) +++ trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-07-27 11:38:15 UTC (rev 1650) @@ -97,9 +97,9 @@ int EXAM_IMPL(vtime_operations::VTMess_core) { - oid_type t0; t0.addr = 0; - oid_type t1; t1.addr = 1; - oid_type t3; t3.addr = 3; + const oid_type t0(0); + const oid_type t1(1); + const oid_type t3(3); VTM_handler h; Modified: trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-27 11:37:55 UTC (rev 1649) +++ trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-27 11:38:15 UTC (rev 1650) @@ -78,8 +78,8 @@ vt::VTDispatcher dsp; Dummy dummy1; Dummy dummy2; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; + const oid_type t1(1); + const oid_type t2(2); dsp.Subscribe( dummy1.self_id(), t1, 0 ); dsp.Subscribe( dummy2.self_id(), t2, 0 ); @@ -105,9 +105,9 @@ Dummy dummy1; Dummy dummy2; Dummy dummy3; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; - oid_type t3; t3.addr = 3; + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); dsp.Subscribe( dummy1.self_id(), t1, 0 ); dsp.Subscribe( dummy2.self_id(), t2, 0 ); Modified: trunk/complement/explore/test/virtual_time/test/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-27 11:37:55 UTC (rev 1649) +++ trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-27 11:38:15 UTC (rev 1650) @@ -17,9 +17,9 @@ const group_type gr0 = 0; const group_type gr1 = 1; const group_type gr2 = 2; - oid_type obj0; obj0.addr = 0; - oid_type obj1; obj1.addr = 1; - oid_type obj2; obj2.addr = 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 ); Modified: trunk/complement/explore/test/virtual_time/test/vt_operations.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-07-27 11:37:55 UTC (rev 1649) +++ trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-07-27 11:38:15 UTC (rev 1650) @@ -12,10 +12,10 @@ int EXAM_IMPL(vtime_operations::vt_compare) { - oid_type t0; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; - oid_type t3; t3.addr = 3; + 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; @@ -56,10 +56,9 @@ int EXAM_IMPL(vtime_operations::vt_add) { - oid_type t0; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; - oid_type t3; t3.addr = 3; + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); vtime_type vt1; vtime_type vt2; @@ -102,10 +101,9 @@ int EXAM_IMPL(vtime_operations::vt_diff) { - oid_type t0; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; - oid_type t3; t3.addr = 3; + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); vtime_type vt1; vtime_type vt2; @@ -167,10 +165,9 @@ int EXAM_IMPL(vtime_operations::vt_max) { - oid_type t0; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; - oid_type t3; t3.addr = 3; + const oid_type t1(1); + const oid_type t2(2); + const oid_type t3(3); vtime_type vt1; vtime_type vt2; @@ -245,9 +242,9 @@ int EXAM_IMPL(vtime_operations::gvt_add) { - oid_type t0; - oid_type t1; t1.addr = 1; - oid_type t2; t2.addr = 2; + const oid_type t0(0); + const oid_type t1(1); + const oid_type t2(2); { gvtime_type gvt1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 11:37:59
|
Revision: 1649 http://complement.svn.sourceforge.net/complement/?rev=1649&view=rev Author: complement Date: 2007-07-27 04:37:55 -0700 (Fri, 27 Jul 2007) Log Message: ----------- add constructors with reasonable defaults for gaddr_type Modified Paths: -------------- trunk/complement/explore/include/stem/Event.h Modified: trunk/complement/explore/include/stem/Event.h =================================================================== --- trunk/complement/explore/include/stem/Event.h 2007-07-27 10:58:07 UTC (rev 1648) +++ trunk/complement/explore/include/stem/Event.h 2007-07-27 11:37:55 UTC (rev 1649) @@ -28,6 +28,7 @@ #include <stem/EvPack.h> #include <mt/uid.h> +#include <mt/xmt.h> #ifndef STLPORT #include <bits/cpp_type_traits.h> @@ -102,12 +103,24 @@ addr( badaddr ) { } - gaddr_type( const xmt::uuid_type& _hid, pid_t _pid, stem::addr_type _addr ) : + explicit gaddr_type( const xmt::uuid_type& _hid, pid_t _pid, stem::addr_type _addr ) : hid( _hid ), pid( _pid ), addr( _addr ) { } + explicit gaddr_type( pid_t _pid, stem::addr_type _addr ) : + hid( xmt::hostid() ), + pid( _pid ), + addr( _addr ) + { } + + explicit gaddr_type( stem::addr_type _addr ) : + hid( xmt::hostid() ), + pid( xmt::getpid() ), + addr( _addr ) + { } + gaddr_type( const gaddr_type& g ) : hid( g.hid ), pid( g.pid ), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 10:58:21
|
Revision: 1648 http://complement.svn.sourceforge.net/complement/?rev=1648&view=rev Author: complement Date: 2007-07-27 03:58:07 -0700 (Fri, 27 Jul 2007) Log Message: ----------- libvts 0.1.0 Modified Paths: -------------- trunk/complement/explore/test/virtual_time/Makefile trunk/complement/explore/test/virtual_time/Makefile.inc Removed Paths: ------------- trunk/complement/explore/test/virtual_time/vtime_main.cc Modified: trunk/complement/explore/test/virtual_time/Makefile =================================================================== --- trunk/complement/explore/test/virtual_time/Makefile 2007-07-27 10:24:38 UTC (rev 1647) +++ trunk/complement/explore/test/virtual_time/Makefile 2007-07-27 10:58:07 UTC (rev 1648) @@ -6,7 +6,7 @@ include Makefile.inc include ${SRCROOT}/Makefiles/gmake/top.mak -INCLUDES += -I$(SRCROOT)/include -I$(BOOST_INCLUDE_DIR) +INCLUDES += -I$(SRCROOT)/include LIBMT_DIR = ${CoMT_DIR}/lib/mt LIBSOCK_DIR = ${CoMT_DIR}/lib/sockios @@ -15,8 +15,35 @@ 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 Modified: trunk/complement/explore/test/virtual_time/Makefile.inc =================================================================== --- trunk/complement/explore/test/virtual_time/Makefile.inc 2007-07-27 10:24:38 UTC (rev 1647) +++ trunk/complement/explore/test/virtual_time/Makefile.inc 2007-07-27 10:58:07 UTC (rev 1648) @@ -1,4 +1,7 @@ # -*- makefile -*- Time-stamp: <06/10/10 15:22:33 ptr> -PRGNAME = vtime -SRC_CC = vtime_main.cc vtime.cc +LIBNAME = vts +MAJOR = 0 +MINOR = 1 +PATCH = 0 +SRC_CC = vtime.cc Deleted: trunk/complement/explore/test/virtual_time/vtime_main.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime_main.cc 2007-07-27 10:24:38 UTC (rev 1647) +++ trunk/complement/explore/test/virtual_time/vtime_main.cc 2007-07-27 10:58:07 UTC (rev 1648) @@ -1,56 +0,0 @@ -#include <iostream> -#include <mt/xmt.h> - -#include "vtime.h" - -using namespace std; -using namespace xmt; -using namespace vt; - -int main() -{ - Condition cnd; - - cnd.set(false); - - cerr << "Hello, world!" << endl; - - Proc m1( 100 ); - Proc m2( 101 ); - Proc r1( 102 ); - Proc r2( 103 ); - - m1.add_group( 0 ); - m2.add_group( 0 ); - r1.add_group( 0 ); - - m1.add_group_member( 0, m2.self_id() ); - m1.add_group_member( 0, r1.self_id() ); - - r1.add_group_member( 0, m1.self_id() ); - r1.add_group_member( 0, m2.self_id() ); - - m2.add_group_member( 0, m1.self_id() ); - m2.add_group_member( 0, r1.self_id() ); - - m1.add_group( 1 ); - m2.add_group( 1 ); - r2.add_group( 1 ); - - m1.add_group_member( 1, m2.self_id() ); - m1.add_group_member( 1, r2.self_id() ); - - r2.add_group_member( 1, m1.self_id() ); - r2.add_group_member( 1, m2.self_id() ); - - m2.add_group_member( 1, m1.self_id() ); - m2.add_group_member( 1, r2.self_id() ); - - r1.SendVC( 0, "Hello!" ); - - m1.SendVC( 0, "How are you?" ); - - cnd.wait(); - - return 0; -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 10:24:40
|
Revision: 1647 http://complement.svn.sourceforge.net/complement/?rev=1647&view=rev Author: complement Date: 2007-07-27 03:24:38 -0700 (Fri, 27 Jul 2007) Log Message: ----------- replace oid_type from POD to stem::gaddr_type Modified 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/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/VTmess_core.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/test/VTmess_core.cc 2007-07-27 10:24:38 UTC (rev 1647) @@ -97,17 +97,21 @@ int EXAM_IMPL(vtime_operations::VTMess_core) { + oid_type t0; t0.addr = 0; + oid_type t1; t1.addr = 1; + oid_type t3; t3.addr = 3; + 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().src = t3; + ev.value().gvt[0][t0] = 1; + ev.value().gvt[0][t1] = 2; + ev.value().gvt[1][t0] = 3; + ev.value().gvt[1][t1] = 4; ev.value().grp = 7; ev.value().mess = "data"; @@ -116,11 +120,11 @@ 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.src == t3 ); + EXAM_CHECK( h.gvt[0][t0] == 1 ); + EXAM_CHECK( h.gvt[0][t1] == 2 ); + EXAM_CHECK( h.gvt[1][t0] == 3 ); + EXAM_CHECK( h.gvt[1][t1] == 4 ); EXAM_CHECK( h.grp == 7 ); EXAM_CHECK( h.mess == "data" ); @@ -132,11 +136,11 @@ 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.src == t3 ); + EXAM_CHECK( h.gvt[0][t0] == 1 ); + EXAM_CHECK( h.gvt[0][t1] == 2 ); + EXAM_CHECK( h.gvt[1][t0] == 3 ); + EXAM_CHECK( h.gvt[1][t1] == 4 ); EXAM_CHECK( h.grp == 7 ); EXAM_CHECK( h.mess == "more data" ); Modified: trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-27 10:24:38 UTC (rev 1647) @@ -78,9 +78,11 @@ vt::VTDispatcher dsp; Dummy dummy1; Dummy dummy2; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; - dsp.Subscribe( dummy1.self_id(), 1, 0 ); - dsp.Subscribe( dummy2.self_id(), 2, 0 ); + dsp.Subscribe( dummy1.self_id(), t1, 0 ); + dsp.Subscribe( dummy2.self_id(), t2, 0 ); stem::Event ev( VT_MESS2 ); ev.src( dummy1.self_id() ); @@ -103,10 +105,13 @@ Dummy dummy1; Dummy dummy2; Dummy dummy3; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + oid_type t3; t3.addr = 3; - dsp.Subscribe( dummy1.self_id(), 1, 0 ); - dsp.Subscribe( dummy2.self_id(), 2, 0 ); - dsp.Subscribe( dummy3.self_id(), 3, 0 ); + dsp.Subscribe( dummy1.self_id(), t1, 0 ); + dsp.Subscribe( dummy2.self_id(), t2, 0 ); + dsp.Subscribe( dummy3.self_id(), t3, 0 ); stem::Event ev( VT_MESS2 ); ev.src( dummy1.self_id() ); Modified: trunk/complement/explore/test/virtual_time/test/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-27 10:24:38 UTC (rev 1647) @@ -17,9 +17,9 @@ 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; + oid_type obj0; obj0.addr = 0; + oid_type obj1; obj1.addr = 1; + oid_type obj2; obj2.addr = 2; ob.add_group( gr0 ); // ob.add_group_member( gr0, obj0 ); Modified: trunk/complement/explore/test/virtual_time/test/vt_operations.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/test/vt_operations.cc 2007-07-27 10:24:38 UTC (rev 1647) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 23:34:58 ptr> +// -*- C++ -*- Time-stamp: <07/07/27 10:42:55 ptr> #include "vt_operations.h" @@ -12,21 +12,26 @@ int EXAM_IMPL(vtime_operations::vt_compare) { + oid_type t0; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + oid_type t3; t3.addr = 3; + vtime_type vt1; vtime_type vt2; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; - vt2[1] = 1; - vt2[2] = 1; + vt2[t1] = 1; + vt2[t2] = 1; EXAM_CHECK( vt1 <= vt2 ); EXAM_CHECK( vt2 <= vt1 ); EXAM_CHECK( vt1 >= vt2 ); EXAM_CHECK( vt2 >= vt1 ); - vt2[3] = 1; + vt2[t3] = 1; EXAM_CHECK( vt1 <= vt2 ); EXAM_CHECK( !(vt2 <= vt1) ); @@ -35,15 +40,15 @@ vt1.clear(); vt2.clear(); - vt1[1] = 1; + vt1[t1] = 1; - vt2[1] = 1; - vt2[3] = 1; + vt2[t1] = 1; + vt2[t3] = 1; EXAM_CHECK( vt1 <= vt2 ); EXAM_CHECK( !(vt2 <= vt1) ); - vt1[2] = 1; + vt1[t2] = 1; EXAM_CHECK( !(vt1 <= vt2) ); EXAM_CHECK( !(vt2 <= vt1) ); @@ -51,38 +56,43 @@ int EXAM_IMPL(vtime_operations::vt_add) { + oid_type t0; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + oid_type t3; t3.addr = 3; + vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; vt3 = vt1 + vt2; EXAM_CHECK( vt1 <= vt3 ); EXAM_CHECK( vt3 <= vt1 ); - vt2[2] = 1; + vt2[t2] = 1; vt3 = vt1 + vt2; - vt4[1] = 1; - vt4[2] = 2; + vt4[t1] = 1; + vt4[t2] = 2; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); vt4.clear(); - vt2[3] = 1; + vt2[t3] = 1; vt3 = vt1 + vt2; - vt4[1] = 1; - vt4[2] = 2; - vt4[3] = 1; + vt4[t1] = 1; + vt4[t2] = 2; + vt4[t3] = 1; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); @@ -92,29 +102,34 @@ int EXAM_IMPL(vtime_operations::vt_diff) { + oid_type t0; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + oid_type t3; t3.addr = 3; + vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; vt3 = vt1 - vt2; EXAM_CHECK( vt1 <= vt3 ); EXAM_CHECK( vt3 <= vt1 ); - vt2[1] = 1; + vt2[t1] = 1; vt3 = vt1 - vt2; - vt4[2] = 1; + vt4[t2] = 1; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); - vt2[2] = 1; + vt2[t2] = 1; vt4.clear(); @@ -125,7 +140,7 @@ vt2.clear(); - vt2[3] = 1; + vt2[t3] = 1; try { vt3 = vt1 - vt2; @@ -137,7 +152,7 @@ vt2.clear(); - vt2[2] = 2; + vt2[t2] = 2; try { vt3 = vt1 - vt2; @@ -152,13 +167,18 @@ int EXAM_IMPL(vtime_operations::vt_max) { + oid_type t0; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + oid_type t3; t3.addr = 3; + vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; vt3 = vt1; vt::sup( vt3, vt2 ); @@ -166,7 +186,7 @@ EXAM_CHECK( vt3 <= vt1 ); EXAM_CHECK( vt1 <= vt3 ); - vt2[1] = 1; + vt2[t1] = 1; vt3 = vt1; vt::sup( vt3, vt2 ); @@ -174,7 +194,7 @@ EXAM_CHECK( vt3 <= vt1 ); EXAM_CHECK( vt1 <= vt3 ); - vt2[2] = 1; + vt2[t2] = 1; vt3 = vt1; vt::sup( vt3, vt2 ); @@ -182,40 +202,40 @@ EXAM_CHECK( vt3 <= vt1 ); EXAM_CHECK( vt1 <= vt3 ); - vt2[3] = 1; + vt2[t3] = 1; vt3 = vt1; vt::sup( vt3, vt2 ); - vt4[1] = 1; - vt4[2] = 1; - vt4[3] = 1; + vt4[t1] = 1; + vt4[t2] = 1; + vt4[t3] = 1; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); vt2.clear(); - vt2[1] = 1; - vt2[2] = 2; + vt2[t1] = 1; + vt2[t2] = 2; vt4.clear(); vt3 = vt1; vt::sup( vt3, vt2 ); - vt4[1] = 1; - vt4[2] = 2; + vt4[t1] = 1; + vt4[t2] = 2; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); - vt2[3] = 4; + vt2[t3] = 4; vt3 = vt1; vt::sup( vt3, vt2 ); - vt4[3] = 4; + vt4[t3] = 4; EXAM_CHECK( vt3 <= vt4 ); EXAM_CHECK( vt4 <= vt3 ); @@ -225,6 +245,10 @@ int EXAM_IMPL(vtime_operations::gvt_add) { + oid_type t0; + oid_type t1; t1.addr = 1; + oid_type t2; t2.addr = 2; + { gvtime_type gvt1; gvtime_type gvt2; @@ -232,22 +256,22 @@ vtime_type vt1; vtime_type vt2; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; - vt2[1] = 1; - vt2[2] = 1; + vt2[t1] = 1; + vt2[t2] = 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 ); + 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; @@ -256,22 +280,22 @@ vtime_type vt1; vtime_type vt2; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; - vt2[1] = 1; - vt2[2] = 1; + vt2[t1] = 1; + vt2[t2] = 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 ); + 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; @@ -279,21 +303,21 @@ vtime_type vt1; vtime_type vt2; - vt1[1] = 1; - vt1[2] = 1; + vt1[t1] = 1; + vt1[t2] = 1; - vt2[1] = 1; - vt2[2] = 1; + vt2[t1] = 1; + vt2[t2] = 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 ); + 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; Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-27 10:24:38 UTC (rev 1647) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/26 10:28:55 ptr> +// -*- C++ -*- Time-stamp: <07/07/27 09:49:24 ptr> #include "vtime.h" @@ -15,7 +15,7 @@ { __pack( s, static_cast<uint8_t>(vt.size()) ); for ( vtime_type::const_iterator i = vt.begin(); i != vt.end(); ++i ) { - __pack( s, i->first ); + i->first.pack( s ); // __pack( s, i->first ); __pack( s, i->second ); } } @@ -24,7 +24,7 @@ { __net_pack( s, static_cast<uint8_t>(vt.size()) ); for ( vtime_type::const_iterator i = vt.begin(); i != vt.end(); ++i ) { - __net_pack( s, i->first ); + i->first.net_pack( s ); // __net_pack( s, i->first ); __net_pack( s, i->second ); } } @@ -38,7 +38,7 @@ oid_type oid; vtime_unit_type v; - __unpack( s, oid ); + oid.unpack( s ); // __unpack( s, oid ); __unpack( s, v ); vt[oid] = v; @@ -54,7 +54,7 @@ oid_type oid; vtime_unit_type v; - __net_unpack( s, oid ); + oid.net_unpack( s ); // __net_unpack( s, oid ); __net_unpack( s, v ); vt[oid] = v; @@ -106,7 +106,7 @@ void VTmess::pack( std::ostream& s ) const { __pack( s, code ); - __pack( s, src ); + src.pack( s ); // __pack( s, src ); gvt.pack( s ); __pack( s, grp ); __pack( s, mess ); @@ -115,7 +115,7 @@ void VTmess::net_pack( std::ostream& s ) const { __net_pack( s, code ); - __net_pack( s, src ); + src.net_pack( s ); // __net_pack( s, src ); gvt.net_pack( s ); __net_pack( s, grp ); __net_pack( s, mess ); @@ -124,7 +124,7 @@ void VTmess::unpack( std::istream& s ) { __unpack( s, code ); - __unpack( s, src ); + src.unpack( s ); // __unpack( s, src ); gvt.unpack( s ); __unpack( s, grp ); __unpack( s, mess ); @@ -133,7 +133,7 @@ void VTmess::net_unpack( std::istream& s ) { __net_unpack( s, code ); - __net_unpack( s, src ); + src.net_unpack( s ); // __net_unpack( s, src ); gvt.net_unpack( s ); __net_unpack( s, grp ); __net_unpack( s, mess ); Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-27 10:10:55 UTC (rev 1646) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-27 10:24:38 UTC (rev 1647) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/26 09:34:53 ptr> +// -*- C++ -*- Time-stamp: <07/07/27 09:53:24 ptr> #ifndef __vtime_h #define __vtime_h @@ -19,8 +19,25 @@ namespace vt { -typedef stem::addr_type oid_type; -typedef unsigned vtime_unit_type; +// 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 uint32_t group_type; typedef std::hash_map<oid_type, vtime_unit_type> vtime_type; @@ -81,9 +98,9 @@ vtime& operator +=( const vtime_type::value_type& ); - vtime_type::data_type& operator[]( const vtime_type::key_type k ) + 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 + const vtime_type::data_type& operator[]( const vtime_type::key_type& k ) const { return vt[k]; } @@ -140,7 +157,7 @@ VTmess() : code(0), - src(0), + src(), gvt(), grp(0), mess() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 10:11:00
|
Revision: 1646 http://complement.svn.sourceforge.net/complement/?rev=1646&view=rev Author: complement Date: 2007-07-27 03:10:55 -0700 (Fri, 27 Jul 2007) Log Message: ----------- operator of format output of gaddr_type is public now and situated in the EvPack.cc, declared in the Event.h in namespace std; libstem vertion bumped to 4.6.1 Modified Paths: -------------- trunk/complement/explore/include/stem/Event.h trunk/complement/explore/lib/stem/ChangeLog trunk/complement/explore/lib/stem/EvManager.cc trunk/complement/explore/lib/stem/EvPack.cc trunk/complement/explore/lib/stem/Makefile.inc Modified: trunk/complement/explore/include/stem/Event.h =================================================================== --- trunk/complement/explore/include/stem/Event.h 2007-07-27 04:04:28 UTC (rev 1645) +++ trunk/complement/explore/include/stem/Event.h 2007-07-27 10:10:55 UTC (rev 1646) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <06/11/30 20:11:30 ptr> +// -*- C++ -*- Time-stamp: <07/07/27 09:41:46 ptr> /* * @@ -652,6 +652,12 @@ } // namespace stem +namespace std { + +ostream& operator <<( ostream& o, const stem::gaddr_type& g ); + +} // namespace std + namespace EDS = stem; #endif Modified: trunk/complement/explore/lib/stem/ChangeLog =================================================================== --- trunk/complement/explore/lib/stem/ChangeLog 2007-07-27 04:04:28 UTC (rev 1645) +++ trunk/complement/explore/lib/stem/ChangeLog 2007-07-27 10:10:55 UTC (rev 1646) @@ -1,3 +1,11 @@ +2007-07-27 Petr Ovtchenkov <pt...@is...> + + * Event.h, EvManager.cc, EvPack.cc: operator of format output + of gaddr_type is public now and situated in the EvPack.cc, + declared in the Event.h in namespace std. + + * libstem: library version 4.6.1 + 2007-07-18 Petr Ovtchenkov <pt...@is...> * test/stem: boost unit test framework replaced by exam. Modified: trunk/complement/explore/lib/stem/EvManager.cc =================================================================== --- trunk/complement/explore/lib/stem/EvManager.cc 2007-07-27 04:04:28 UTC (rev 1645) +++ trunk/complement/explore/lib/stem/EvManager.cc 2007-07-27 10:10:55 UTC (rev 1646) @@ -42,8 +42,6 @@ std::string EvManager::inv_key_str( "invalid key" ); -std::ostream& operator <<( std::ostream& s, const gaddr_type& ga ); - __FIT_DECLSPEC EvManager::EvManager() : _low( beglocaddr ), _high( endlocaddr ), @@ -653,6 +651,7 @@ } +#if 0 std::ostream& operator <<( ostream& s, const gaddr_type& ga ) { ios_base::fmtflags f = s.flags( 0 ); @@ -682,6 +681,7 @@ return s; } +#endif __FIT_DECLSPEC std::ostream& EvManager::dump( std::ostream& s ) const { Modified: trunk/complement/explore/lib/stem/EvPack.cc =================================================================== --- trunk/complement/explore/lib/stem/EvPack.cc 2007-07-27 04:04:28 UTC (rev 1645) +++ trunk/complement/explore/lib/stem/EvPack.cc 2007-07-27 10:10:55 UTC (rev 1646) @@ -15,10 +15,30 @@ #include "stem/Event.h" #include <iterator> #include <iostream> +#include <iomanip> #include <string> #include <algorithm> #include <stdint.h> +namespace std { + +ostream& operator <<( ostream& o, const stem::gaddr_type& g ) +{ + ios_base::fmtflags f = o.flags( 0 ); + + o << hex << setfill( '0' ) + << setw(8) << g.hid.u.l[0] + << setw(8) << g.hid.u.l[1] + << '-' << dec << g.pid << '-' + << hex << setfill( '0' ) << setw(8) << g.addr; + + o.flags( f ); + + return o; +} + +} // namespace std + namespace stem { using namespace std; Modified: trunk/complement/explore/lib/stem/Makefile.inc =================================================================== --- trunk/complement/explore/lib/stem/Makefile.inc 2007-07-27 04:04:28 UTC (rev 1645) +++ trunk/complement/explore/lib/stem/Makefile.inc 2007-07-27 10:10:55 UTC (rev 1646) @@ -3,7 +3,7 @@ LIBNAME = stem MAJOR = 4 MINOR = 6 -PATCH = 0 +PATCH = 1 SRC_CC = _EventHandler.cc NetTransport.cc EvManager.cc EvPack.cc crc.cc \ Names.cc Cron.cc This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-27 04:05:11
|
Revision: 1645 http://complement.svn.sourceforge.net/complement/?rev=1645&view=rev Author: complement Date: 2007-07-26 21:04:28 -0700 (Thu, 26 Jul 2007) Log Message: ----------- add lock to VTSend in VTDispatcher Modified Paths: -------------- trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 10:40:08 UTC (rev 1644) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-27 04:04:28 UTC (rev 1645) @@ -467,6 +467,10 @@ void VTDispatcher::VTSend( const stem::Event& e, group_type grp ) { + // This method not called from Dispatch, but work on the same level and in the same + // scope, so this lock (from stem::EventHandler) required here: + xmt::recursive_scoped_lock lk( this->_theHistory_lock ); + const pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); @@ -535,10 +539,11 @@ void VTHandler::Init::__at_fork_child() { - if ( *_rcount != 0 ) { - VTHandler::_vtdsp->~VTDispatcher(); - VTHandler::_vtdsp = new( VTHandler::_vtdsp ) VTDispatcher(); - } + // VTDispatcher not start threads (at least yet), so following not required: + // if ( *_rcount != 0 ) { + // VTHandler::_vtdsp->~VTDispatcher(); + // VTHandler::_vtdsp = new( VTHandler::_vtdsp ) VTDispatcher(); + // } } void VTHandler::Init::__at_fork_parent() @@ -548,6 +553,8 @@ void VTHandler::Init::_guard( int direction ) { static xmt::recursive_mutex _init_lock; + + xmt::recursive_scoped_lock lk(_init_lock); static int _count = 0; if ( direction ) { @@ -556,7 +563,7 @@ _rcount = &_count; pthread_atfork( __at_fork_prepare, __at_fork_parent, __at_fork_child ); #endif - VTHandler::_vtdsp = new VTDispatcher(); + VTHandler::_vtdsp = new VTDispatcher( 2, "vtd" ); } } else { --_count; @@ -575,12 +582,16 @@ void VTHandler::VTSend( const stem::Event& ev ) { + ev.src( self_id() ); + // _vtdsp->VTSend( ev, grp ); } VTHandler::VTHandler() : EventHandler() { new( Init_buf ) Init(); + + // _vtdsp->Subscribe( self_id(), ... , ... ); } VTHandler::VTHandler( const char *info ) : Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 10:40:08 UTC (rev 1644) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-27 04:04:28 UTC (rev 1645) @@ -219,24 +219,27 @@ VTDispatcher() { } + VTDispatcher( const char *info ) : + stem::EventHandler( info ) + { } + VTDispatcher( stem::addr_type id ) : stem::EventHandler( id ) { } + VTDispatcher( stem::addr_type id, const char *info ) : + stem::EventHandler( id, info ) + { } + void VTDispatch( const stem::Event_base<VTmess>& ); void VTSend( const stem::Event& e, group_type ); void Subscribe( stem::addr_type, oid_type, group_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, ...) - // in our case we can use gid = hi bits | oid - void check_and_send( detail::vtime_obj_rec&, const stem::Event_base<VTmess>& ); vt_map_type vtmap; @@ -248,7 +251,7 @@ class VTHandler : public stem::EventHandler { - public: + private: class Init { public: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-26 10:40:12
|
Revision: 1644 http://complement.svn.sourceforge.net/complement/?rev=1644&view=rev Author: complement Date: 2007-07-26 03:40:08 -0700 (Thu, 26 Jul 2007) Log Message: ----------- hide implementation details Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/vt_object.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/vt_object.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/test/vt_object.cc 2007-07-26 10:40:08 UTC (rev 1644) @@ -43,13 +43,13 @@ vtime chk; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess) ); // ack chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); // cerr << ob.vt[gr0] << endl; // cerr << "===========\n"; @@ -60,7 +60,7 @@ chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); ++mess.gvt[gr0][obj1]; @@ -69,19 +69,19 @@ EXAM_ERROR( "exception expected" ); } catch ( const out_of_range& ) { - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); } mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] + 1; EXAM_REQUIRE( !ob.deliver(mess_bad) ); // nac: too new (out of order) - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess) ); // ack chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; @@ -102,12 +102,12 @@ EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: obj0 don't seen mess from obj2, but obj1 seen mess from obj2 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); EXAM_REQUIRE( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 chk[obj2] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); ++mess2.gvt[gr0][obj2]; @@ -117,7 +117,7 @@ // cerr << "===========\n"; chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; mess.gvt[gr0][obj2] = 1; @@ -139,9 +139,9 @@ EXAM_ERROR( "exception expected" ); } catch ( const domain_error& ) { - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr2]) && (chk1 >= ob.vt[gr2]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); + EXAM_REQUIRE( (chk1 <= ob[gr2]) && (chk1 >= ob[gr2]) ); } // ---- @@ -151,8 +151,8 @@ EXAM_REQUIRE( !ob.deliver(mess_bad) ); // nac: obj1 recieve new event in group gr1 from obj2 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); // cerr << "===========\n"; // cerr << ob.vt[gr0] << endl; @@ -168,9 +168,9 @@ EXAM_REQUIRE( ob.deliver(mess3) ); // ack: see event from obj2 in group gr1 - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); chk1[obj2] += 1; - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); ++mess3.gvt[gr1][obj2]; @@ -183,8 +183,8 @@ EXAM_REQUIRE( ob.deliver(mess_bad) ); // ack: now we know about event in group gr1 chk[obj1] += 1; - EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); - EXAM_REQUIRE( (chk1 <= ob.vt[gr1]) && (chk1 >= ob.vt[gr1]) ); + EXAM_REQUIRE( (chk <= ob[gr0]) && (chk >= ob[gr0]) ); + EXAM_REQUIRE( (chk1 <= ob[gr1]) && (chk1 >= ob[gr1]) ); return EXAM_RESULT; } Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 10:40:08 UTC (rev 1644) @@ -399,6 +399,12 @@ return true; } +void vtime_obj_rec::delta( gvtime& vtstamp, oid_type from, oid_type to, group_type grp ) +{ + vtstamp.gvt = vt.gvt - svt[to]; // delta + vtstamp[grp][from] = vt.gvt[grp][from]; // my counter, as is, not delta +} + } // namespace detail void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) @@ -408,14 +414,14 @@ for ( ; range.first != range.second; ++range.first ) { vt_map_type::iterator i = vtmap.find( range.first->second ); - if ( i == vtmap.end() || i->second.addr == m.src() ) { // not for nobody and not for self + if ( i == vtmap.end() || i->second.stem_addr() == m.src() ) { // not for nobody and not for self continue; } try { // check local or remote? i->second.addr // if remote, forward it to foreign VTDispatcher? // looks, like local source shouldn't be here? - check_and_send( i, m ); + check_and_send( i->second, m ); } catch ( const out_of_range& ) { } @@ -424,28 +430,30 @@ } } -void VTDispatcher::check_and_send( const vt_map_type::iterator& i, const stem::Event_base<VTmess>& m ) +void VTDispatcher::check_and_send( detail::vtime_obj_rec& vt, const stem::Event_base<VTmess>& m ) { typedef detail::vtime_obj_rec::dpool_t dpool_t; - if ( i->second.deliver( m.value() ) ) { + // detail::vtime_obj_rec& vt = i->second; + + if ( vt.deliver( m.value() ) ) { stem::Event ev( m.value().code ); - ev.dest(i->second.addr); + ev.dest(vt.stem_addr()); ev.src(m.src()); ev.value() = m.value().mess; Forward( ev ); bool more; do { more = false; - for ( dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { - if ( i->second.deliver_delayed( j->second->value() ) ) { + for ( dpool_t::iterator j = vt.dpool.begin(); j != vt.dpool.end(); ) { + if ( vt.deliver_delayed( j->second->value() ) ) { stem::Event evd( j->second->value().code ); - evd.dest(i->second.addr); + evd.dest(vt.stem_addr()); ev.src(m.src()); evd.value() = j->second->value().mess; Forward( evd ); delete j->second; - i->second.dpool.erase( j++ ); + vt.dpool.erase( j++ ); more = true; } else { ++j; @@ -453,7 +461,7 @@ } } while ( more ); } else { - i->second.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp + vt.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp } } @@ -464,9 +472,11 @@ for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { vt_map_type::iterator i = vtmap.find( o->second ); - if ( i != vtmap.end() && i->second.addr == e.src() ) { // for self + if ( i != vtmap.end() && i->second.stem_addr() == e.src() ) { // for self + detail::vtime_obj_rec& vt = i->second; + const oid_type& from = o->second; stem::Event_base<VTmess> m( MESS ); - m.value().src = o->second; // oid + m.value().src = from; // oid m.value().code = e.code(); m.value().mess = e.value(); m.value().grp = grp; @@ -476,22 +486,21 @@ // This is like VTDispatch, but VT stamp in every message different, // in accordance with individual knowlage about object's VT. - ++i->second.vt.gvt[grp][o->second]; // my counter + vt.next( from, grp ); // my counter for ( gid_map_type::const_iterator g = range.first; g != range.second; ++g ) { vt_map_type::iterator k = vtmap.find( g->second ); - if ( k == vtmap.end() || k->second.addr == m.src() ) { // not for nobody and not for self + if ( k == vtmap.end() || k->second.stem_addr() == m.src() ) { // not for nobody and not for self continue; } try { - m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[g->second]; // delta - m.value().gvt[grp][o->second] = i->second.vt.gvt[grp][o->second]; // my counter, as is, not delta + vt.delta( m.value().gvt, from, g->second, grp ); // check local or remote? i->second.addr // if remote, forward it to foreign VTDispatcher? - check_and_send( k, m ); + check_and_send( k->second, m ); - i->second.svt[g->second] = i->second.vt.gvt; // store last send VT to obj + vt.base_advance(g->second); // store last send VT to obj } catch ( const out_of_range& ) { } @@ -508,10 +517,7 @@ void VTDispatcher::Subscribe( stem::addr_type addr, oid_type oid, group_type grp ) { - detail::vtime_obj_rec& r = vtmap[oid]; - r.addr = addr; - r.add_group( grp ); - + vtmap[oid].add( addr, grp ); grmap.insert( make_pair(grp,oid) ); } Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 06:34:02 UTC (rev 1643) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 10:40:08 UTC (rev 1644) @@ -82,9 +82,12 @@ vtime& operator +=( const vtime_type::value_type& ); vtime_type::data_type& operator[]( const vtime_type::key_type k ) - { return vt[k]; } + { return vt[k]; } + const vtime_type::data_type& operator[]( const vtime_type::key_type k ) const + { return vt[k]; } + - vtime_type vt; + mutable vtime_type vt; }; @@ -121,8 +124,10 @@ gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) { return gvt[k]; } + const gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) const + { return gvt[k]; } - gvtime_type gvt; + mutable gvtime_type gvt; }; struct VTmess : @@ -160,26 +165,37 @@ class vtime_obj_rec { public: - - typedef std::hash_set<group_type> groups_container_type; - typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; - typedef std::hash_map<oid_type, gvtime_type> snd_delta_vtime_t; - void add_group( group_type g ) { groups.insert(g); } + void add( stem::addr_type a, group_type g ) + { addr = a; groups.insert(g); } - // void add_group_member( group_type g, oid_type p ) - // { vt[g][p]; } + stem::addr_type stem_addr() const + { return addr; } bool deliver( const VTmess& ev ); bool deliver_delayed( const VTmess& ev ); + void next( oid_type from, group_type grp ) + { ++vt.gvt[grp][from]; /* increment my VT counter */ } + void delta( gvtime& vtstamp, oid_type from, oid_type to, group_type grp ); + void base_advance( oid_type to ) + { svt[to] = vt.gvt; /* store last sent VT to obj */ } +#ifdef __FIT_EXAM + const gvtime_type::data_type& operator[]( const gvtime_type::key_type k ) const + { return vt[k]; } +#endif + + private: + typedef std::hash_set<group_type> groups_container_type; + typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; + typedef std::hash_map<oid_type, gvtime_type> snd_delta_vtime_t; + stem::addr_type addr; // stem address of object delta_vtime_type lvt; // last recieve VT from neighbours snd_delta_vtime_t svt; // last send VT to neighbours gvtime vt; // VT of object - private: groups_container_type groups; // member of groups public: @@ -221,7 +237,7 @@ // in our case we can use gid = hi bits | oid - void check_and_send( const vt_map_type::iterator&, const stem::Event_base<VTmess>& ); + void check_and_send( detail::vtime_obj_rec&, const stem::Event_base<VTmess>& ); vt_map_type vtmap; gid_map_type grmap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-26 06:34:29
|
Revision: 1643 http://complement.svn.sourceforge.net/complement/?rev=1643&view=rev Author: complement Date: 2007-07-25 23:34:02 -0700 (Wed, 25 Jul 2007) Log Message: ----------- check dispatch in group of two first, then in group of three: this has difference from algo point of view Modified Paths: -------------- 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_operations.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-26 06:32:14 UTC (rev 1642) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-26 06:34:02 UTC (rev 1643) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 22:14:50 ptr> +// -*- C++ -*- Time-stamp: <07/07/26 09:41:24 ptr> #include "vt_operations.h" @@ -20,8 +20,9 @@ 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::VTDispatch, vt_oper, "VTDispatch", - t.add( &vtime_operations::vt_object, vt_oper, "VT order", tc[2] ) ); + 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(); } Modified: trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-26 06:32:14 UTC (rev 1642) +++ trunk/complement/explore/test/virtual_time/test/vt_dispatch.cc 2007-07-26 06:34:02 UTC (rev 1643) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 23:12:24 ptr> +// -*- C++ -*- Time-stamp: <07/07/26 09:53:24 ptr> #include "vt_operations.h" @@ -73,11 +73,35 @@ EV_EDS( ST_NULL, VT_MESS2, handler ) END_RESPONSE_TABLE -int EXAM_IMPL(vtime_operations::VTDispatch) +int EXAM_IMPL(vtime_operations::VTDispatch1) { 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_IMPL(vtime_operations::VTDispatch2) +{ + vt::VTDispatcher dsp; + Dummy dummy1; + Dummy dummy2; Dummy dummy3; dsp.Subscribe( dummy1.self_id(), 1, 0 ); Modified: trunk/complement/explore/test/virtual_time/test/vt_operations.h =================================================================== --- trunk/complement/explore/test/virtual_time/test/vt_operations.h 2007-07-26 06:32:14 UTC (rev 1642) +++ trunk/complement/explore/test/virtual_time/test/vt_operations.h 2007-07-26 06:34:02 UTC (rev 1643) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 22:01:43 ptr> +// -*- C++ -*- Time-stamp: <07/07/26 09:40:39 ptr> #ifndef __vt_operations_h #define __vt_operations_h @@ -18,7 +18,8 @@ int EXAM_DECL(vt_object); - int EXAM_DECL(VTDispatch); + int EXAM_DECL(VTDispatch1); + int EXAM_DECL(VTDispatch2); }; #endif // __vt_operations_h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-26 06:32:17
|
Revision: 1642 http://complement.svn.sourceforge.net/complement/?rev=1642&view=rev Author: complement Date: 2007-07-25 23:32:14 -0700 (Wed, 25 Jul 2007) Log Message: ----------- store VT stamp for sended events per-object, not per-group (to allow individual repeats, restore and gossip in the future) Modified Paths: -------------- trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 04:44:44 UTC (rev 1641) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-26 06:32:14 UTC (rev 1642) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 23:38:25 ptr> +// -*- C++ -*- Time-stamp: <07/07/26 10:28:55 ptr> #include "vtime.h" @@ -403,48 +403,19 @@ void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) { - VTDispatch_( m, grmap.equal_range( m.value().grp ) ); -} + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = + grmap.equal_range( m.value().grp ); -void VTDispatcher::VTDispatch_( const stem::Event_base<VTmess>& m, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& range ) -{ - 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 ); + for ( ; range.first != range.second; ++range.first ) { + vt_map_type::iterator i = vtmap.find( range.first->second ); if ( i == vtmap.end() || i->second.addr == m.src() ) { // not for nobody and not for self continue; } try { // check local or remote? i->second.addr // if remote, forward it to foreign VTDispatcher? - if ( i->second.deliver( m.value() ) ) { - stem::Event ev( m.value().code ); - ev.dest(i->second.addr); - ev.src(m.src()); - ev.value() = m.value().mess; - Forward( ev ); - bool more; - do { - more = false; - for ( dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { - if ( i->second.deliver_delayed( j->second->value() ) ) { - stem::Event evd( j->second->value().code ); - evd.dest(i->second.addr); - ev.src(m.src()); - evd.value() = j->second->value().mess; - Forward( evd ); - delete j->second; - i->second.dpool.erase( j++ ); - more = true; - } else { - ++j; - } - } - } while ( more ); - } else { - i->second.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp - } + // looks, like local source shouldn't be here? + check_and_send( i, m ); } catch ( const out_of_range& ) { } @@ -453,9 +424,43 @@ } } +void VTDispatcher::check_and_send( const vt_map_type::iterator& i, const stem::Event_base<VTmess>& m ) +{ + typedef detail::vtime_obj_rec::dpool_t dpool_t; + + if ( i->second.deliver( m.value() ) ) { + stem::Event ev( m.value().code ); + ev.dest(i->second.addr); + ev.src(m.src()); + ev.value() = m.value().mess; + Forward( ev ); + bool more; + do { + more = false; + for ( dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { + if ( i->second.deliver_delayed( j->second->value() ) ) { + stem::Event evd( j->second->value().code ); + evd.dest(i->second.addr); + ev.src(m.src()); + evd.value() = j->second->value().mess; + Forward( evd ); + delete j->second; + i->second.dpool.erase( j++ ); + more = true; + } else { + ++j; + } + } + } while ( more ); + } else { + i->second.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp + } +} + void VTDispatcher::VTSend( const stem::Event& e, group_type grp ) { - pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + const pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = + grmap.equal_range( grp ); for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { vt_map_type::iterator i = vtmap.find( o->second ); @@ -465,12 +470,35 @@ m.value().code = e.code(); m.value().mess = e.value(); m.value().grp = grp; - m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[grp]; // delta - m.value().gvt[grp][o->second] = ++i->second.vt.gvt[grp][o->second]; // my counter - i->second.svt[grp] = i->second.vt.gvt; // store last send VT to group // m.dest( ??? ); // local VT dispatcher? m.src( e.src() ); - VTDispatch_( m, range ); + + // This is like VTDispatch, but VT stamp in every message different, + // in accordance with individual knowlage about object's VT. + + ++i->second.vt.gvt[grp][o->second]; // my counter + + for ( gid_map_type::const_iterator g = range.first; g != range.second; ++g ) { + vt_map_type::iterator k = vtmap.find( g->second ); + if ( k == vtmap.end() || k->second.addr == m.src() ) { // not for nobody and not for self + continue; + } + try { + m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[g->second]; // delta + m.value().gvt[grp][o->second] = i->second.vt.gvt[grp][o->second]; // my counter, as is, not delta + + // check local or remote? i->second.addr + // if remote, forward it to foreign VTDispatcher? + check_and_send( k, m ); + + i->second.svt[g->second] = i->second.vt.gvt; // store last send VT to obj + } + catch ( const out_of_range& ) { + } + catch ( const domain_error& ) { + } + } + return; } } Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 04:44:44 UTC (rev 1641) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-26 06:32:14 UTC (rev 1642) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/25 23:30:52 ptr> +// -*- C++ -*- Time-stamp: <07/07/26 09:34:53 ptr> #ifndef __vtime_h #define __vtime_h @@ -163,7 +163,7 @@ typedef std::hash_set<group_type> groups_container_type; typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; - typedef std::hash_map<group_type, gvtime_type> snd_delta_vtime_t; + typedef std::hash_map<oid_type, gvtime_type> snd_delta_vtime_t; void add_group( group_type g ) { groups.insert(g); } @@ -221,7 +221,7 @@ // in our case we can use gid = hi bits | oid - void VTDispatch_( const stem::Event_base<VTmess>&, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& ); + void check_and_send( const vt_map_type::iterator&, const stem::Event_base<VTmess>& ); vt_map_type vtmap; gid_map_type grmap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <com...@us...> - 2007-07-25 17:43:06
|
Revision: 1640 http://complement.svn.sourceforge.net/complement/?rev=1640&view=rev Author: complement Date: 2007-07-25 10:42:59 -0700 (Wed, 25 Jul 2007) Log Message: ----------- VTDispatcher development Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 17:42:59 UTC (rev 1640) @@ -24,6 +24,8 @@ int EXAM_DECL(VTMess_core); int EXAM_DECL(vt_object); + + int EXAM_DECL(VTDispatch); }; int EXAM_IMPL(vtime_operations::vt_compare) @@ -623,6 +625,95 @@ return EXAM_RESULT; } + +class Dummy : + public stem::EventHandler +{ + public: + Dummy(); + Dummy( stem::addr_type id ); + Dummy( stem::addr_type id, const char *info ); + ~Dummy(); + + void handler( const stem::Event& ); + + void wait(); + std::string msg; + + private: + xmt::condition cnd; + + DECLARE_RESPONSE_TABLE( Dummy, stem::EventHandler ); +}; + +#define VT_MESS2 0x1202 + +Dummy::Dummy() : + EventHandler() +{ + cnd.set( false ); +} + +Dummy::Dummy( stem::addr_type id ) : + EventHandler( id ) +{ + cnd.set( false ); +} + +Dummy::Dummy( stem::addr_type id, const char *info ) : + EventHandler( id, info ) +{ + cnd.set( false ); +} + +Dummy::~Dummy() +{ + // cnd.wait(); +} + +void Dummy::handler( const stem::Event& ev ) +{ + msg = ev.value(); + + cnd.set( true ); +} + +void Dummy::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +DEFINE_RESPONSE_TABLE( Dummy ) + EV_EDS( ST_NULL, VT_MESS2, handler ) +END_RESPONSE_TABLE + +int EXAM_IMPL(vtime_operations::VTDispatch) +{ + vt::VTDispatcher dsp; + Dummy dummy1; + Dummy dummy2; + + dsp.Subscribe( dummy1.self_id(), 1, 0 ); + dsp.Subscribe( dummy2.self_id(), 2, 0 ); + + stem::Event ev( VT_MESS2 ); + ev.src( dummy1.self_id() ); + + ev.value() = "hello"; + + dsp.VTSend( ev, 0 ); + + dummy2.wait(); + + EXAM_CHECK( dummy2.msg == "hello" ); + EXAM_CHECK( dummy1.msg == "" ); + + return EXAM_RESULT; +} + + int EXAM_DECL(vtime_test_suite); int EXAM_IMPL(vtime_test_suite) Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 17:42:59 UTC (rev 1640) @@ -403,17 +403,22 @@ void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) { - pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( m.value().grp ); + VTDispatch_( m, grmap.equal_range( m.value().grp ) ); +} +void VTDispatcher::VTDispatch_( const stem::Event_base<VTmess>& m, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& range ) +{ for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { vt_map_type::iterator i = vtmap.find( o->second ); - if ( i != vtmap.end() || i->first == m.src() ) { // not for nobody and not for self + if ( i == vtmap.end() || i->second.addr == m.src() ) { // not for nobody and not for self continue; } try { + // check local or remote? i->second.addr + // if remote, forward it to foreign VTDispatcher? if ( i->second.deliver( m.value() ) ) { stem::Event ev( m.value().code ); - ev.dest(i->first); + ev.dest(i->second.addr); ev.src(m.src()); ev.value() = m.value().mess; Forward( ev ); @@ -423,7 +428,7 @@ for ( vtime_obj_rec::dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { if ( i->second.deliver_delayed( j->second->value() ) ) { stem::Event evd( j->second->value().code ); - evd.dest(i->first); + evd.dest(i->second.addr); ev.src(m.src()); evd.value() = j->second->value().mess; Forward( evd ); @@ -446,10 +451,40 @@ } } -void VTDispatcher::VTSend( const stem::Event& e ) +void VTDispatcher::VTSend( const stem::Event& e, group_type grp ) { + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( grp ); + + for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { + vt_map_type::iterator i = vtmap.find( o->second ); + if ( i != vtmap.end() && i->second.addr == e.src() ) { // for self + stem::Event_base<VTmess> m( MESS ); + m.value().src = o->second; // oid + m.value().code = e.code(); + m.value().mess = e.value(); + m.value().grp = grp; + m.value().gvt.gvt = i->second.vt.gvt - i->second.svt[grp]; // delta + m.value().gvt[grp][o->second] = ++i->second.vt.gvt[grp][o->second]; // my counter + i->second.svt[grp] = i->second.vt.gvt; // store last send VT to group + // m.dest( ??? ); // local VT dispatcher? + m.src( e.src() ); + VTDispatch_( m, range ); + return; + } + } + + // Error: not group member? } +void VTDispatcher::Subscribe( stem::addr_type addr, oid_type oid, group_type grp ) +{ + vtime_obj_rec& r = vtmap[oid]; + r.addr = addr; + r.add_group( grp ); + + grmap.insert( make_pair(grp,oid) ); +} + DEFINE_RESPONSE_TABLE( VTDispatcher ) // EV_T_( ST_NULL, MESS, VTDispatch, VTmess ) EV_Event_base_T_( ST_NULL, MESS, VTDispatch, VTmess ) Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 06:55:38 UTC (rev 1639) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 17:42:59 UTC (rev 1640) @@ -164,6 +164,7 @@ typedef std::hash_set<group_type> groups_container_type; typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; + typedef std::hash_map<group_type, gvtime_type> snd_delta_vtime_t; void add_group( group_type g ) { groups.insert(g); } @@ -174,10 +175,15 @@ bool deliver( const VTmess& ev ); bool deliver_delayed( const VTmess& ev ); - stem::addr_type addr; // stem address of object - delta_vtime_type lvt; // last seen VT of neighbours - gvtime vt; // VT of object + stem::addr_type addr; // stem address of object + delta_vtime_type lvt; // last recieve VT from neighbours + snd_delta_vtime_t svt; // last send VT to neighbours + gvtime vt; // VT of object + + private: groups_container_type groups; // member of groups + + public: // delay pool should be here typedef std::pair<int,stem::Event_base<VTmess>*> delay_item_t; typedef std::list<delay_item_t> dpool_t; @@ -202,7 +208,8 @@ void VTDispatch( const stem::Event_base<VTmess>& ); - void VTSend( const stem::Event& e ); + void VTSend( const stem::Event& e, group_type ); + void Subscribe( stem::addr_type, oid_type, group_type ); private: typedef std::hash_map<oid_type, vtime_obj_rec> vt_map_type; @@ -211,6 +218,8 @@ // gid_type -> (oid_type, oid_type, ...) // in our case we can use gid = hi bits | oid + + void VTDispatch_( const stem::Event_base<VTmess>&, const std::pair<gid_map_type::const_iterator,gid_map_type::const_iterator>& ); vt_map_type vtmap; gid_map_type grmap; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-25 06:55:40
|
Revision: 1639 http://complement.svn.sourceforge.net/complement/?rev=1639&view=rev Author: complement Date: 2007-07-24 23:55:38 -0700 (Tue, 24 Jul 2007) Log Message: ----------- more information checked within unit test; evolution of VTDispatch Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-24 07:49:03 UTC (rev 1638) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-25 06:55:38 UTC (rev 1639) @@ -449,15 +449,16 @@ vtime_obj_rec ob; const group_type gr0 = 0; - const group_type gr1 = 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 ); + // ob.add_group_member( gr0, obj0 ); + // ob.add_group_member( gr0, obj1 ); + // ob.add_group_member( gr0, obj2 ); // gvtime gvt; // gvt[gr0][obj1] = 1; @@ -471,12 +472,30 @@ mess_bad.grp = mess.grp = gr0; mess_bad.mess = mess.mess = "data"; - EXAM_CHECK( ob.deliver(mess) ); // ack + // 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_CHECK( ob.deliver(mess) ); // ack + EXAM_REQUIRE( ob.deliver(mess) ); // ack + chk[obj1] += 1; + + EXAM_REQUIRE( (chk <= ob.vt[gr0]) && (chk >= ob.vt[gr0]) ); + ++mess.gvt[gr0][obj1]; try { @@ -484,16 +503,25 @@ 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_CHECK( !ob.deliver(mess_bad) ); // nac: too new (out of order) + EXAM_REQUIRE( !ob.deliver(mess_bad) ); // nac: too new (out of order) - EXAM_CHECK( ob.deliver(mess) ); // ack + 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; @@ -508,22 +536,90 @@ EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: obj0 don't seen mess from obj2, but obj1 seen mess from obj2 - EXAM_CHECK( ob.deliver(mess2) ); // ack: obj0 see first 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_CHECK( ob.deliver(mess_bad) ); // ack: now obj0 and obj1 sync dependency from 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( gr0 ); - ob.add_group_member( gr1, obj0 ); - ob.add_group_member( gr1, obj1 ); - ob.add_group_member( gr1, obj2 ); + 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; } Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-24 07:49:03 UTC (rev 1638) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-25 06:55:38 UTC (rev 1639) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/23 20:32:22 ptr> +// -*- C++ -*- Time-stamp: <07/07/25 10:22:27 ptr> #include "vtime.h" @@ -319,6 +319,23 @@ return false; } +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; + sup( vt.gvt[m.grp], lvt[m.src][m.grp] ); + // cout << vt.gvt << endl; + return true; + } + + return false; +} + bool vtime_obj_rec::order_correct( const VTmess& m ) { if ( groups.find( m.grp ) == groups.end() ) { @@ -327,62 +344,115 @@ gvtime gvt( m.gvt ); - if ( vt.gvt[m.grp][m.src] + 1 != gvt[m.grp][m.src] ) { + if ( (vt.gvt[m.grp][m.src] + 1) != gvt[m.grp][m.src] ) { // cerr << "1" << endl; // cerr << vt.gvt[m.grp][m.src] << "\n" // << gvt[m.grp][m.src] // << endl; - if ( vt.gvt[m.grp][m.src] + 1 > gvt[m.grp][m.src] ) { + if ( (vt.gvt[m.grp][m.src] + 1) > gvt[m.grp][m.src] ) { throw out_of_range( "duplicate or wrong VT message" ); } return false; } vtime xvt = lvt[m.src][m.grp] + gvt[m.grp]; - xvt[m.src] = 0; + xvt[m.src] = 0; // force exclude message originator, it checked above if ( !(xvt <= vt[m.grp]) ) { - cerr << "2" << endl; - cerr << xvt << "\n\n" - << vt[m.grp] << endl; + // cerr << "2" << endl; + // cerr << xvt << "\n\n" << vt[m.grp] << endl; return false; } + // check side casuality (via groups other then message's group) for ( groups_container_type::const_iterator l = groups.begin(); l != groups.end(); ++l ) { - if ( *l != m.grp ) { - xvt = lvt[m.src][*l] + gvt[*l]; - if ( !(xvt <= vt[*l]) ) { - cerr << "3" << endl; - cerr << "group " << *l << xvt << "\n\n" - << vt[*l] << endl; - return false; - } + if ( (*l != m.grp) && !((lvt[m.src][*l] + gvt[*l]) <= vt[*l]) ) { + // cerr << "3" << endl; + // cerr << "group " << *l << xvt << "\n\n" << vt[*l] << endl; + return false; } } return true; } -void VTDispatcher::VTDispatch( const VTmess& m ) +bool vtime_obj_rec::order_correct_delayed( const VTmess& m ) { - gid_map_type::const_iterator g = grmap.find( m.grp ); - if ( g != grmap.end() ) { - for ( std::list<oid_type>::const_iterator o = g->second.begin(); o != g->second.end(); ++o ) { - vt_map_type::iterator i = vtmap.find( *o ); - if ( i != vtmap.end() ) { - if ( i->second.deliver( m ) ) { - stem::Event ev( m.code ); - ev.dest(i->first); - ev.value() = m.mess; - Send( ev ); - } + gvtime gvt( m.gvt ); + + if ( (vt.gvt[m.grp][m.src] + 1) != gvt[m.grp][m.src] ) { + return false; + } + + vtime xvt = lvt[m.src][m.grp] + gvt[m.grp]; + xvt[m.src] = 0; // force exclude message originator, it checked above + + if ( !(xvt <= vt[m.grp]) ) { + return false; + } + + // check side casuality (via groups other then message's group) + for ( groups_container_type::const_iterator l = groups.begin(); l != groups.end(); ++l ) { + if ( (*l != m.grp) && !((lvt[m.src][*l] + gvt[*l]) <= vt[*l]) ) { + return false; + } + } + + return true; +} + +void VTDispatcher::VTDispatch( const stem::Event_base<VTmess>& m ) +{ + pair<gid_map_type::const_iterator,gid_map_type::const_iterator> range = grmap.equal_range( m.value().grp ); + + for ( gid_map_type::const_iterator o = range.first; o != range.second; ++o ) { + vt_map_type::iterator i = vtmap.find( o->second ); + if ( i != vtmap.end() || i->first == m.src() ) { // not for nobody and not for self + continue; + } + try { + if ( i->second.deliver( m.value() ) ) { + stem::Event ev( m.value().code ); + ev.dest(i->first); + ev.src(m.src()); + ev.value() = m.value().mess; + Forward( ev ); + bool more; + do { + more = false; + for ( vtime_obj_rec::dpool_t::iterator j = i->second.dpool.begin(); j != i->second.dpool.end(); ) { + if ( i->second.deliver_delayed( j->second->value() ) ) { + stem::Event evd( j->second->value().code ); + evd.dest(i->first); + ev.src(m.src()); + evd.value() = j->second->value().mess; + Forward( evd ); + delete j->second; + i->second.dpool.erase( j++ ); + more = true; + } else { + ++j; + } + } + } while ( more ); + } else { + i->second.dpool.push_back( make_pair( 0, new Event_base<VTmess>(m) ) ); // 0 should be timestamp } } + catch ( const out_of_range& ) { + } + catch ( const domain_error& ) { + } } } +void VTDispatcher::VTSend( const stem::Event& e ) +{ +} + DEFINE_RESPONSE_TABLE( VTDispatcher ) - EV_T_( ST_NULL, MESS, VTDispatch, VTmess ) + // EV_T_( ST_NULL, MESS, VTDispatch, VTmess ) + EV_Event_base_T_( ST_NULL, MESS, VTDispatch, VTmess ) END_RESPONSE_TABLE char *Init_buf[128]; Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-24 07:49:03 UTC (rev 1638) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-25 06:55:38 UTC (rev 1639) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/23 21:33:09 ptr> +// -*- C++ -*- Time-stamp: <07/07/25 09:07:25 ptr> #ifndef __vtime_h #define __vtime_h @@ -168,19 +168,25 @@ void add_group( group_type g ) { groups.insert(g); } - void add_group_member( group_type g, oid_type p ) - { vt[g][p]; } + // void add_group_member( group_type g, oid_type p ) + // { vt[g][p]; } bool deliver( const VTmess& ev ); + bool deliver_delayed( const VTmess& ev ); stem::addr_type addr; // stem address of object delta_vtime_type lvt; // last seen VT of neighbours gvtime vt; // VT of object groups_container_type groups; // member of groups // delay pool should be here + typedef std::pair<int,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& ); }; class VTDispatcher : @@ -194,13 +200,13 @@ stem::EventHandler( id ) { } - void VTDispatch( const VTmess& ); + void VTDispatch( const stem::Event_base<VTmess>& ); void VTSend( const stem::Event& e ); private: typedef std::hash_map<oid_type, vtime_obj_rec> vt_map_type; - typedef std::hash_map<group_type, std::list<oid_type> > gid_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, ...) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-24 07:49:07
|
Revision: 1638 http://svn.sourceforge.net/complement/?rev=1638&view=rev Author: complement Date: 2007-07-24 00:49:03 -0700 (Tue, 24 Jul 2007) Log Message: ----------- test for delivery VT message established; throw exception, if message has no chance to be delivered Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/20 09:26:15 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 23:46:02 ptr> #include <exam/suite.h> @@ -22,6 +22,8 @@ int EXAM_DECL(gvt_add); int EXAM_DECL(VTMess_core); + + int EXAM_DECL(vt_object); }; int EXAM_IMPL(vtime_operations::vt_compare) @@ -303,6 +305,8 @@ EXAM_CHECK( gvt1[1][1] == 1 ); EXAM_CHECK( gvt1[1][2] == 1 ); } + + return EXAM_RESULT; } class VTM_handler : @@ -440,12 +444,94 @@ return EXAM_RESULT; } +int EXAM_IMPL(vtime_operations::vt_object) +{ + vtime_obj_rec ob; + const group_type gr0 = 0; + const group_type gr1 = 0; + 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"; + + EXAM_CHECK( ob.deliver(mess) ); // ack + + ++mess.gvt[gr0][obj1]; + + EXAM_CHECK( ob.deliver(mess) ); // ack + + ++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& ) { + } + + mess_bad.gvt[gr0][obj1] = mess.gvt[gr0][obj1] + 1; + + EXAM_CHECK( !ob.deliver(mess_bad) ); // nac: too new (out of order) + + EXAM_CHECK( ob.deliver(mess) ); // ack + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + + // ---- + + 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_CHECK( ob.deliver(mess2) ); // ack: obj0 see first mess from obj2 + + ++mess2.gvt[gr0][obj2]; + + EXAM_CHECK( ob.deliver(mess_bad) ); // ack: now obj0 and obj1 sync dependency from obj2 + + mess_bad.gvt[gr0][obj1] = ++mess.gvt[gr0][obj1]; + mess.gvt[gr0][obj2] = 1; + + // ---- + + ob.add_group( gr0 ); + ob.add_group_member( gr1, obj0 ); + ob.add_group_member( gr1, obj1 ); + ob.add_group_member( gr1, obj2 ); + + return EXAM_RESULT; +} + int EXAM_DECL(vtime_test_suite); int EXAM_IMPL(vtime_test_suite) { - exam::test_suite::test_case_type tc[2]; + exam::test_suite::test_case_type tc[3]; exam::test_suite t( "virtual time operations" ); @@ -457,8 +543,10 @@ t.add( &vtime_operations::vt_diff, vt_oper, "Differences", tc[0] ); t.add( &vtime_operations::VTMess_core, vt_oper, "VTmess core transfer", - t.add( &vtime_operations::gvt_add, vt_oper, "Group VT add", tc[1] ) ); + 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] ); + return t.girdle(); } Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/19 23:11:01 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 20:32:22 ptr> #include "vtime.h" @@ -212,6 +212,15 @@ return tmp; } +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; +} + + // template <> vtime max( const vtime& l, const vtime& r ) { @@ -223,6 +232,14 @@ return tmp; } +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; @@ -292,27 +309,32 @@ // cout << ev.value().gvt.gvt << endl; if ( order_correct( m ) ) { - cout << "Order correct" << endl; lvt[m.src] += m.gvt.gvt; lvt[m.src][m.grp][m.src] = vt.gvt[m.grp][m.src] + 1; - vt.gvt[m.grp] = vt::max( vt.gvt[m.grp], lvt[m.src][m.grp] ); - cout << vt.gvt << endl; + sup( vt.gvt[m.grp], lvt[m.src][m.grp] ); + // cout << vt.gvt << endl; return true; } - cout << "Order not correct" << endl; return false; } bool vtime_obj_rec::order_correct( const VTmess& m ) { + if ( groups.find( m.grp ) == groups.end() ) { + throw domain_error( "VT object not member of group" ); + } + gvtime gvt( m.gvt ); if ( vt.gvt[m.grp][m.src] + 1 != gvt[m.grp][m.src] ) { - cerr << "1" << endl; - cerr << vt.gvt[m.grp][m.src] << "\n" - << gvt[m.grp][m.src] - << endl; + // cerr << "1" << endl; + // cerr << vt.gvt[m.grp][m.src] << "\n" + // << gvt[m.grp][m.src] + // << endl; + if ( vt.gvt[m.grp][m.src] + 1 > gvt[m.grp][m.src] ) { + throw out_of_range( "duplicate or wrong VT message" ); + } return false; } Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-23 12:17:18 UTC (rev 1637) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-24 07:49:03 UTC (rev 1638) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/20 09:29:00 ptr> +// -*- C++ -*- Time-stamp: <07/07/23 21:33:09 ptr> #ifndef __vtime_h #define __vtime_h @@ -7,6 +7,7 @@ #include <list> #include <vector> #include <hash_map> +#include <hash_set> #include <iterator> #include <istream> @@ -34,6 +35,7 @@ vtime_type& operator +=( vtime_type& l, const vtime_type& r ); vtime_type max( const vtime_type& l, const vtime_type& r ); +vtime_type& sup( vtime_type& l, const vtime_type& r ); struct vtime : public stem::__pack_base @@ -90,6 +92,7 @@ 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; @@ -159,11 +162,11 @@ { public: - typedef std::list<group_type> groups_container_type; + typedef std::hash_set<group_type> groups_container_type; typedef std::hash_map<oid_type, gvtime_type> delta_vtime_type; void add_group( group_type g ) - { groups.push_back( g ); } + { groups.insert(g); } void add_group_member( group_type g, oid_type p ) { vt[g][p]; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-23 12:17:24
|
Revision: 1637 http://svn.sourceforge.net/complement/?rev=1637&view=rev Author: complement Date: 2007-07-23 05:17:18 -0700 (Mon, 23 Jul 2007) Log Message: ----------- fix test, due to check fail on STLP_DEBUG on Athlon64x2 Modified Paths: -------------- trunk/complement/explore/test/mt/mt_test.cc Modified: trunk/complement/explore/test/mt/mt_test.cc =================================================================== --- trunk/complement/explore/test/mt/mt_test.cc 2007-07-23 11:55:46 UTC (rev 1636) +++ trunk/complement/explore/test/mt/mt_test.cc 2007-07-23 12:17:18 UTC (rev 1637) @@ -89,7 +89,8 @@ xmt::Thread t1( thread2_entry_call, &b ); xmt::Thread t2( thread2_entry_call, &b ); - EXAM_CHECK( (t2.join().iword + t1.join().iword) == 2 ); + EXAM_CHECK( t2.join().iword == 1 ); + EXAM_CHECK( t1.join().iword == 1 ); return EXAM_RESULT; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-23 11:55:48
|
Revision: 1636 http://svn.sourceforge.net/complement/?rev=1636&view=rev Author: complement Date: 2007-07-23 04:55:46 -0700 (Mon, 23 Jul 2007) Log Message: ----------- add exam Modified Paths: -------------- trunk/complement/explore/lib/Makefile Modified: trunk/complement/explore/lib/Makefile =================================================================== --- trunk/complement/explore/lib/Makefile 2007-07-23 11:54:36 UTC (rev 1635) +++ trunk/complement/explore/lib/Makefile 2007-07-23 11:55:46 UTC (rev 1636) @@ -7,7 +7,7 @@ # SRCROOT := .. -SUBDIRS := mt sockios stem +SUBDIRS := exam mt sockios stem include ${SRCROOT}/Makefiles/gmake/subdirs.mak This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-23 11:54:40
|
Revision: 1635 http://svn.sourceforge.net/complement/?rev=1635&view=rev Author: complement Date: 2007-07-23 04:54:36 -0700 (Mon, 23 Jul 2007) Log Message: ----------- remove namespace boost Modified Paths: -------------- trunk/complement/explore/lib/exam/suite.cc Modified: trunk/complement/explore/lib/exam/suite.cc =================================================================== --- trunk/complement/explore/lib/exam/suite.cc 2007-07-21 05:47:37 UTC (rev 1634) +++ trunk/complement/explore/lib/exam/suite.cc 2007-07-23 11:54:36 UTC (rev 1635) @@ -11,7 +11,6 @@ namespace exam { using namespace std; -using namespace boost; using namespace detail; using namespace xmt; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-21 05:47:40
|
Revision: 1634 http://svn.sourceforge.net/complement/?rev=1634&view=rev Author: complement Date: 2007-07-20 22:47:37 -0700 (Fri, 20 Jul 2007) Log Message: ----------- boost graph removed; libexam: version 0.2.0 Modified Paths: -------------- trunk/complement/explore/include/exam/suite.h trunk/complement/explore/lib/exam/ChangeLog trunk/complement/explore/lib/exam/Makefile.inc trunk/complement/explore/lib/exam/suite.cc trunk/complement/explore/lib/exam/ut/Makefile trunk/complement/explore/lib/exam/ut/exam_test_suite.cc Modified: trunk/complement/explore/include/exam/suite.h =================================================================== --- trunk/complement/explore/include/exam/suite.h 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/include/exam/suite.h 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/17 09:47:24 ptr> +// -*- C++ -*- Time-stamp: <07/07/21 09:06:00 ptr> #ifndef __suite_h #define __suite_h @@ -7,19 +7,16 @@ #include <sstream> #include <map> #include <stack> -#include <boost/graph/adjacency_list.hpp> #include <string> #include <exception> +#include <stdexcept> +#include <list> +#include <vector> +#include <algorithm> #include <mt/xmt.h> #include <exam/logger.h> -enum vertex_testcase_t { vertex_testcase }; - -namespace boost { - BOOST_INSTALL_PROPERTY( vertex, testcase ); -} // namespace boost - namespace exam { class test_suite; @@ -159,16 +156,8 @@ class test_suite { private: - typedef boost::property<vertex_testcase_t,int> TestCaseProperty; - typedef boost::property<boost::vertex_color_t, boost::default_color_type, TestCaseProperty> VColorProperty; + typedef unsigned vertex_t; - typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VColorProperty > graph_t; - typedef boost::graph_traits<graph_t>::vertex_iterator vertex_iterator_t; - - typedef boost::graph_traits<graph_t>::vertex_descriptor vertex_t; - typedef boost::property_map<graph_t,boost::vertex_color_t>::type vertex_color_map_t; - typedef boost::property_map<graph_t,vertex_testcase_t>::type vertex_testcase_map_t; - public: typedef int (*func_type)( test_suite *, int ); typedef vertex_t test_case_type; @@ -194,13 +183,9 @@ int girdle( test_case_type start ); int girdle() - { return girdle( root ); } + { return girdle( 0 ); } int run( test_suite *, int count = 0 ); - void run_test_case( vertex_t v ); - void check_test_case( vertex_t u, vertex_t v ); - void clean_test_case_state( vertex_t v ); - int flags(); int flags( int ); bool is_trace(); @@ -216,9 +201,6 @@ skip = 2 }; - graph_t g; - vertex_t root; - vertex_testcase_map_t testcase; base_logger *local_logger; xmt::mutex _lock_ll; @@ -229,12 +211,20 @@ std::string name; }; + typedef std::pair<vertex_t,vertex_t> edge_t; + typedef std::pair<vertex_t,unsigned> weight_t; typedef std::map<vertex_t,test_case_collect> test_case_map_type; + vertex_t _count; + std::list<edge_t> _edges; + std::vector<weight_t> _vertices; int _last_state; test_case_map_type _test; base_logger::stat _stat; std::string _suite_name; + void run_test_case( vertex_t v ); + static bool vertices_compare( weight_t, weight_t ); + static int _root_func( test_suite *, int = 0 ); static base_logger *logger; @@ -247,8 +237,9 @@ template <class TC> test_suite::test_case_type test_suite::add( int (TC::*f)( test_suite *, int ), TC& instance, const std::string& name ) { - vertex_t v = boost::add_vertex( boost::white_color, g); - boost::add_edge( root, v, g ); + vertex_t v = ++_count; + _edges.push_back( std::make_pair( 0, v ) ); + _vertices.push_back( std::make_pair( v, 1 ) ); _test[v].tc = detail::make_test_case( f, instance ); _test[v].state = 0; _test[v].name = name; @@ -260,10 +251,16 @@ template <class InputIter> test_suite::test_case_type test_suite::add( test_suite::func_type f, const std::string& name, InputIter first, InputIter last ) { - vertex_t v = boost::add_vertex( boost::white_color, g); + vertex_t v = ++_count; + unsigned weight = 1; while ( first != last ) { - boost::add_edge( *first++, v, g ); + if ( *first >= _count ) { + throw std::logic_error( "bad test dependency" ); + } + weight += _vertices[*first].second; + _edges.push_back( std::make_pair( *first++, v ) ); } + _vertices.push_back( std::make_pair( v, weight ) ); _test[v].tc = detail::make_test_case( detail::call( f ) ); _test[v].state = 0; _test[v].name = name; @@ -275,8 +272,12 @@ template <class TC> test_suite::test_case_type test_suite::add( int (TC::*f)( test_suite *, int ), TC& instance, const std::string& name, test_suite::test_case_type depends ) { - vertex_t v = boost::add_vertex( boost::white_color, g); - boost::add_edge( depends, v, g ); + vertex_t v = ++_count; + if ( depends >= _count ) { + throw std::logic_error( "bad test dependency" ); + } + _edges.push_back( std::make_pair( depends, v ) ); + _vertices.push_back( std::make_pair( v, _vertices[depends].second + 1 ) ); _test[v].tc = detail::make_test_case( f, instance ); _test[v].state = 0; _test[v].name = name; @@ -288,10 +289,16 @@ template <class TC, class InputIter> test_suite::test_case_type test_suite::add( int (TC::*f)( test_suite *, int ), TC& instance, const std::string& name, InputIter first, InputIter last ) { - vertex_t v = boost::add_vertex( boost::white_color, g); + vertex_t v = ++_count; + unsigned weight = 1; while ( first != last ) { - boost::add_edge( *first++, v, g ); + if ( *first >= _count ) { + throw std::logic_error( "bad test dependency" ); + } + weight += _vertices[*first].second; + _edges.push_back( std::make_pair( *first++, v ) ); } + _vertices.push_back( std::make_pair( v, weight ) ); _test[v].tc = detail::make_test_case( f, instance ); _test[v].state = 0; _test[v].name = name; Modified: trunk/complement/explore/lib/exam/ChangeLog =================================================================== --- trunk/complement/explore/lib/exam/ChangeLog 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/lib/exam/ChangeLog 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,3 +1,11 @@ +2007-07-21 Petr Ovtchenkov <pt...@is...> + + * suite.h, suite.cc: boost graph removed; + + * ut/exam_test_suite.cc: problem with multiple dependencies resolved. + + * libexam: version 0.2.0 + 2007-07-17 Petr Ovtchenkov <pt...@is...> * suite.h, suite.cc: was introduced stack of test suites, functions Modified: trunk/complement/explore/lib/exam/Makefile.inc =================================================================== --- trunk/complement/explore/lib/exam/Makefile.inc 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/lib/exam/Makefile.inc 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,7 +1,7 @@ -# -*- Makefile -*- Time-stamp: <07/07/16 00:51:47 ptr> +# -*- Makefile -*- Time-stamp: <07/07/21 09:21:58 ptr> LIBNAME = exam MAJOR = 0 -MINOR = 1 +MINOR = 2 PATCH = 0 SRC_CC = logger.cc suite.cc Modified: trunk/complement/explore/lib/exam/suite.cc =================================================================== --- trunk/complement/explore/lib/exam/suite.cc 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/lib/exam/suite.cc 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,11 +1,12 @@ -// -*- C++ -*- Time-stamp: <07/07/17 10:03:02 ptr> +// -*- C++ -*- Time-stamp: <07/07/21 09:13:17 ptr> #include <exam/suite.h> -#include <boost/graph/breadth_first_search.hpp> #include <stack> #include <cstdio> #include <iostream> +#include <algorithm> +#include <functional> namespace exam { @@ -14,85 +15,7 @@ using namespace detail; using namespace xmt; -namespace detail { -template <class Tag> -struct vertex_recorder : - public base_visitor<vertex_recorder<Tag> > -{ - typedef Tag event_filter; - - vertex_recorder(test_suite& ts) : - _suite(ts) - { } - - template <class Vertex, class Graph> - void operator()(Vertex v, const Graph& g) - { _suite.run_test_case( v ); } - - test_suite& _suite; -}; - -template <class Tag> -vertex_recorder<Tag> record_vertexes(test_suite& ts, Tag) -{ return vertex_recorder<Tag>(ts); } - -template <class Tag> -struct skip_recorder : - public base_visitor<skip_recorder<Tag> > -{ - typedef Tag event_filter; - - skip_recorder(test_suite& ts) : - _suite(ts) - { } - - template <class Edge, class Graph> - void operator()(Edge e, const Graph& g) - { - // typename graph_traits<Graph>::vertex_descriptor u = boost::source( e, g ); - // typename graph_traits<Graph>::vertex_descriptor v = boost::target( e, g ); - // boost::out_edges( v, g ); - // for () { - _suite.check_test_case( boost::source( e, g ), boost::target( e, g ) ); - // } - } - - test_suite& _suite; -}; - -template <class Tag> -skip_recorder<Tag> record_skip(test_suite& ts, Tag) -{ return skip_recorder<Tag>(ts); } - -template <class Tag> -struct white_recorder : - public base_visitor<white_recorder<Tag> > -{ - typedef Tag event_filter; - - white_recorder(test_suite& ts) : - _suite(ts) - { } - - template <class Vertex, class Graph> - void operator()(Vertex v, const Graph& g) - { - // std::cerr << "On vertex " << v << std::endl; - // boost::put( boost::vertex_color, g, v, white_color ); - _suite.clean_test_case_state( v ); - } - - test_suite& _suite; -}; - -template <class Tag> -white_recorder<Tag> record_white(test_suite& ts, Tag) -{ return white_recorder<Tag>(ts); } - - -} // namespace detail - int EXAM_IMPL(test_suite::_root_func) { throw init_exception(); @@ -101,28 +24,28 @@ } test_suite::test_suite( const string& name ) : - root( add_vertex( white_color, g ) ), - _last_state( 0 ), - _suite_name( name ), - local_logger( logger ) + _count(0), + _last_state( 0 ), + _suite_name( name ), + local_logger( logger ) { - testcase = get( vertex_testcase, g ); - _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); - _test[root].state = 0; + _vertices.push_back( std::make_pair( 0, 0 ) ); + _test[0].tc = detail::make_test_case( detail::call( _root_func ) ); + _test[0].state = 0; scoped_lock lk( _lock_stack ); _stack.push( this ); } test_suite::test_suite( const char *name ) : - root( add_vertex( white_color, g ) ), - _last_state( 0 ), - _suite_name( name ), - local_logger( logger ) + _count(0), + _last_state( 0 ), + _suite_name( name ), + local_logger( logger ) { - testcase = get( vertex_testcase, g ); - _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); - _test[root].state = 0; + _vertices.push_back( std::make_pair( 0, 0 ) ); + _test[0].tc = detail::make_test_case( detail::call( _root_func ) ); + _test[0].state = 0; scoped_lock lk( _lock_stack ); _stack.push( this ); @@ -139,28 +62,38 @@ } } +bool test_suite::vertices_compare( test_suite::weight_t l, test_suite::weight_t r ) +{ + return l.second < r.second; +} + int test_suite::girdle( test_suite::test_case_type start ) { - stack<vertex_t> buffer; - vertex_color_map_t color = get( vertex_color, g ); + if ( start > _count ) { + throw std::logic_error( "bad start point" ); + } - // detail::white_recorder<on_initialize_vertex> vis( *this ); - // - // vertex_iterator_t i, i_end; + sort( _vertices.begin(), _vertices.end(), vertices_compare ); - // for ( tie(i, i_end) = vertices(g); i != i_end; ++i ) { - // // vis.initialize_vertex( *i, g ); - // put( color, *i, white_color ); - // } + vector<weight_t>::iterator from; _stat = base_logger::stat(); + for( vector<weight_t>::iterator i = _vertices.begin(); i != _vertices.end(); ++i ) { + if ( i->first == start ) { + from = i; + } + _test[i->first].state = 0; + } local_logger->begin_ts(); - breadth_first_search( g, start, buffer, - make_bfs_visitor( - make_pair( record_white(*this,on_initialize_vertex()), - make_pair( record_vertexes(*this,on_discover_vertex()), - record_skip(*this,on_examine_edge()) ) ) ), - color ); + for( vector<weight_t>::iterator i = from; i != _vertices.end(); ++i ) { + for( std::list<edge_t>::const_iterator j = _edges.begin(); j != _edges.end(); ++j ) { + if ( j->second == i->first && _test[j->first].state != 0 ) { + _test[j->second].state = skip; + } + } + run_test_case( i->first ); + } + local_logger->end_ts(); local_logger->result( _stat, _suite_name ); @@ -169,8 +102,9 @@ test_suite::test_case_type test_suite::add( test_suite::func_type f, const string& name ) { - vertex_t v = add_vertex( white_color, g); - add_edge( root, v, g ); + vertex_t v = ++_count; + _edges.push_back( std::make_pair( 0, v ) ); + _vertices.push_back( std::make_pair( v, 1 ) ); _test[v].tc = detail::make_test_case( detail::call( f ) ); _test[v].state = 0; _test[v].name = name; @@ -181,8 +115,12 @@ test_suite::test_case_type test_suite::add( test_suite::func_type f, const string& name, test_suite::test_case_type depends ) { - vertex_t v = add_vertex( white_color, g); - add_edge( depends, v, g ); + vertex_t v = ++_count; + if ( depends >= _count ) { + throw std::logic_error( "bad test dependency" ); + } + _edges.push_back( std::make_pair( depends, v ) ); + _vertices.push_back( std::make_pair( v, _vertices[depends].second + 1 ) ); _test[v].tc = detail::make_test_case( detail::call( f ) ); _test[v].state = 0; _test[v].name = name; @@ -300,21 +238,9 @@ } } -void test_suite::check_test_case( test_suite::vertex_t u, test_suite::vertex_t v ) -{ - if ( _test[u].state != 0 ) { - _test[v].state = skip; - } -} - -void test_suite::clean_test_case_state( vertex_t v ) -{ - _test[v].state = 0; -} - int test_suite::run( test_suite *, int ) { - return girdle( root ); + return girdle( 0 ); } Modified: trunk/complement/explore/lib/exam/ut/Makefile =================================================================== --- trunk/complement/explore/lib/exam/ut/Makefile 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/lib/exam/ut/Makefile 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,11 +1,10 @@ -# -*- Makefile -*- Time-stamp: <07/07/05 09:31:15 ptr> +# -*- Makefile -*- Time-stamp: <07/07/21 09:01:38 ptr> SRCROOT := ../../.. include Makefile.inc include ${SRCROOT}/Makefiles/gmake/top.mak -# INCLUDES += -I${BOOST_DIR} INCLUDES += -I${CoMT_INCLUDE_DIR} DEFS += -D__FIT_EXAM Modified: trunk/complement/explore/lib/exam/ut/exam_test_suite.cc =================================================================== --- trunk/complement/explore/lib/exam/ut/exam_test_suite.cc 2007-07-20 06:10:55 UTC (rev 1633) +++ trunk/complement/explore/lib/exam/ut/exam_test_suite.cc 2007-07-21 05:47:37 UTC (rev 1634) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/17 00:38:11 ptr> +// -*- C++ -*- Time-stamp: <07/07/21 09:01:26 ptr> #include "exam_test_suite.h" @@ -220,15 +220,15 @@ tcx[1] = t.add( func_good2, "function 2 good", tc, tc + 2 ); t.add( func_good3, "function 3 good", tcx, tcx + 2 ); // <-- problem - logger.flags( exam::base_logger::verbose ); + // logger.flags( exam::base_logger::verbose ); t.girdle(); - logger.flags( 0 ); + // logger.flags( 0 ); - // EXAM_REQUIRE( buff.str() == r9 ); + EXAM_REQUIRE( buff.str() == r9 ); - std::cerr << "%%%\n"; - std::cerr << buff.str() << std::endl; - std::cerr << "%%%\n"; + // std::cerr << "%%%\n"; + // std::cerr << buff.str() << std::endl; + // std::cerr << "%%%\n"; return EXAM_RESULT; } @@ -266,16 +266,16 @@ dummy_test.cc:16: fail: false\n\ dummy_test.cc:17: pass: true\n\ FAIL member function fail\n\ +dummy_test.cc:33: pass: true\n\ SKIP function fail\n\ -dummy_test.cc:33: pass: true\n\ *** FAIL exam self test, fail function (+2-1~1/4) ***\n"; const std::string exam_basic_test::r6 = "\ PASS member function good\n\ dummy_test.cc:16: fail: false\n\ FAIL member function fail\n\ + PASS function good\n\ SKIP function fail\n\ - PASS function good\n\ *** FAIL exam self test, fail function (+2-1~1/4) ***\n"; const std::string exam_basic_test::r7 = "\ @@ -299,6 +299,7 @@ FAIL function fail\n\ dummy_test.cc:16: fail: false\n\ FAIL member function fail\n\ + SKIP function 3 good\n\ *** FAIL exam self test, fail function (+3-2~1/6) ***\n"; int EXAM_IMPL(exam_self_test) @@ -312,7 +313,7 @@ t.add( &exam_basic_test::trace, exam_basic, "trace flags test", d ); t.add( &exam_basic_test::dep_test_suite, exam_basic, "test suites grouping", d ); exam::test_suite::test_case_type d2 = t.add( &exam_basic_test::multiple_dep, exam_basic, "multiple dependencies", d ); - // t.add( &exam_basic_test::multiple_dep_complex, exam_basic, "complex multiple dependencies", d2 ); + t.add( &exam_basic_test::multiple_dep_complex, exam_basic, "complex multiple dependencies", d2 ); return t.girdle(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-20 06:10:56
|
Revision: 1633 http://svn.sourceforge.net/complement/?rev=1633&view=rev Author: complement Date: 2007-07-19 23:10:55 -0700 (Thu, 19 Jul 2007) Log Message: ----------- unit test based on exam; fix VTmess copy constructor; add operation >= Modified Paths: -------------- trunk/complement/explore/test/virtual_time/test/Makefile trunk/complement/explore/test/virtual_time/test/unit_test.cc trunk/complement/explore/test/virtual_time/vtime.cc trunk/complement/explore/test/virtual_time/vtime.h Modified: trunk/complement/explore/test/virtual_time/test/Makefile =================================================================== --- trunk/complement/explore/test/virtual_time/test/Makefile 2007-07-19 20:25:18 UTC (rev 1632) +++ trunk/complement/explore/test/virtual_time/test/Makefile 2007-07-20 06:10:55 UTC (rev 1633) @@ -10,12 +10,13 @@ # 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} +LDFLAGS += -L${INSTALL_LIB_DIR} -Wl,-rpath=${INSTALL_LIB_DIR}:${STLPORT_LIB_DIR} -release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lboost_regex -lboost_test_utf -lboost_fs -dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lboost_regexg -lboost_test_utfg -lboost_fsg -stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lboost_regexstlg -lboost_test_utfstlg -lboost_fsstlg +release-shared: PROJECT_LIBS = -lxmt -lsockios -lstem -lboost_regex -lexam -lboost_fs +dbg-shared: PROJECT_LIBS = -lxmtg -lsockiosg -lstemg -lboost_regexg -lexamg -lboost_fsg +stldbg-shared: PROJECT_LIBS = -lxmtstlg -lsockiosstlg -lstemstlg -lboost_regexstlg -lexamstlg -lboost_fsstlg LDLIBS = ${PROJECT_LIBS} Modified: trunk/complement/explore/test/virtual_time/test/unit_test.cc =================================================================== --- trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-19 20:25:18 UTC (rev 1632) +++ trunk/complement/explore/test/virtual_time/test/unit_test.cc 2007-07-20 06:10:55 UTC (rev 1633) @@ -1,6 +1,6 @@ -// -*- C++ -*- Time-stamp: <07/03/07 16:38:24 ptr> +// -*- C++ -*- Time-stamp: <07/07/20 09:26:15 ptr> -#include <boost/test/unit_test.hpp> +#include <exam/suite.h> #include <boost/lexical_cast.hpp> @@ -9,236 +9,461 @@ #include <vtime.h> -using namespace boost::unit_test_framework; using namespace vt; using namespace std; struct vtime_operations { - void vt_compare(); - void vt_add(); - void vt_diff(); - void vt_max(); + 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); }; -void vtime_operations::vt_compare() +int EXAM_IMPL(vtime_operations::vt_compare) { vtime_type vt1; vtime_type vt2; - vt1.push_back( make_pair( 1, 1 ) ); - vt1.push_back( make_pair( 2, 1 ) ); + vt1[1] = 1; + vt1[2] = 1; - vt2.push_back( make_pair( 1, 1 ) ); - vt2.push_back( make_pair( 2, 1 ) ); + vt2[1] = 1; + vt2[2] = 1; - BOOST_CHECK( vt1 == vt2 ); - BOOST_CHECK( vt1 <= vt2 ); - BOOST_CHECK( vt2 <= vt1 ); + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( vt2 <= vt1 ); + EXAM_CHECK( vt1 >= vt2 ); + EXAM_CHECK( vt2 >= vt1 ); - vt2.push_back( make_pair( 3, 1 ) ); + vt2[3] = 1; - BOOST_CHECK( !(vt1 == vt2) ); - BOOST_CHECK( vt1 <= vt2 ); - BOOST_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( vt2 >= vt1 ); vt1.clear(); vt2.clear(); - vt1.push_back( make_pair( 1, 1 ) ); + vt1[1] = 1; - vt2.push_back( make_pair( 1, 1 ) ); - vt2.push_back( make_pair( 3, 1 ) ); + vt2[1] = 1; + vt2[3] = 1; - BOOST_CHECK( !(vt1 == vt2) ); - BOOST_CHECK( vt1 <= vt2 ); - BOOST_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( vt1 <= vt2 ); + EXAM_CHECK( !(vt2 <= vt1) ); - vt1.push_back( make_pair( 2, 1 ) ); + vt1[2] = 1; - BOOST_CHECK( !(vt1 <= vt2) ); - BOOST_CHECK( !(vt2 <= vt1) ); + EXAM_CHECK( !(vt1 <= vt2) ); + EXAM_CHECK( !(vt2 <= vt1) ); } -void vtime_operations::vt_add() +int EXAM_IMPL(vtime_operations::vt_add) { vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1.push_back( make_pair( 1, 1 ) ); - vt1.push_back( make_pair( 2, 1 ) ); + vt1[1] = 1; + vt1[2] = 1; vt3 = vt1 + vt2; - BOOST_CHECK( vt1 == vt3 ); + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); - vt2.push_back( make_pair( 2, 1 ) ); + vt2[2] = 1; vt3 = vt1 + vt2; - vt4.push_back( make_pair( 1, 1 ) ); - vt4.push_back( make_pair( 2, 2 ) ); + vt4[1] = 1; + vt4[2] = 2; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); vt4.clear(); - vt2.push_back( make_pair( 3, 1 ) ); + vt2[3] = 1; vt3 = vt1 + vt2; - vt4.push_back( make_pair( 1, 1 ) ); - vt4.push_back( make_pair( 2, 2 ) ); - vt4.push_back( make_pair( 3, 1 ) ); + vt4[1] = 1; + vt4[2] = 2; + vt4[3] = 1; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; } -void vtime_operations::vt_diff() +int EXAM_IMPL(vtime_operations::vt_diff) { vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1.push_back( make_pair( 1, 1 ) ); - vt1.push_back( make_pair( 2, 1 ) ); + vt1[1] = 1; + vt1[2] = 1; vt3 = vt1 - vt2; - BOOST_CHECK( vt1 == vt3 ); + EXAM_CHECK( vt1 <= vt3 ); + EXAM_CHECK( vt3 <= vt1 ); - vt2.push_back( make_pair( 1, 1 ) ); + vt2[1] = 1; vt3 = vt1 - vt2; - vt4.push_back( make_pair( 2, 1 ) ); + vt4[2] = 1; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); - vt2.push_back( make_pair( 2, 1 ) ); + vt2[2] = 1; vt4.clear(); vt3 = vt1 - vt2; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); vt2.clear(); - vt2.push_back( make_pair( 3, 1 ) ); + vt2[3] = 1; try { vt3 = vt1 - vt2; - BOOST_CHECK( false ); + EXAM_ERROR( "Virtual Times are incomparable" ); } catch ( const std::range_error& err ) { - BOOST_CHECK( true ); + EXAM_CHECK( true ); } vt2.clear(); - vt2.push_back( make_pair( 2, 2 ) ); + vt2[2] = 2; try { vt3 = vt1 - vt2; - BOOST_CHECK( false ); + EXAM_ERROR( "Virtual Times are incomparable" ); } catch ( const std::range_error& err ) { - BOOST_CHECK( true ); - } + EXAM_CHECK( true ); + } + + return EXAM_RESULT; } -void vtime_operations::vt_max() +int EXAM_IMPL(vtime_operations::vt_max) { vtime_type vt1; vtime_type vt2; vtime_type vt3; vtime_type vt4; - vt1.push_back( make_pair( 1, 1 ) ); - vt1.push_back( make_pair( 2, 1 ) ); + vt1[1] = 1; + vt1[2] = 1; vt3 = vt::max( vt1, vt2 ); - BOOST_CHECK( vt3 == vt1 ); + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); - vt2.push_back( make_pair( 1, 1 ) ); + vt2[1] = 1; vt3 = vt::max( vt1, vt2 ); - BOOST_CHECK( vt3 == vt1 ); + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); - vt2.push_back( make_pair( 2, 1 ) ); + vt2[2] = 1; vt3 = vt::max( vt1, vt2 ); - BOOST_CHECK( vt3 == vt1 ); + EXAM_CHECK( vt3 <= vt1 ); + EXAM_CHECK( vt1 <= vt3 ); - vt2.push_back( make_pair( 3, 1 ) ); + vt2[3] = 1; vt3 = vt::max( vt1, vt2 ); - vt4.push_back( make_pair( 1, 1 ) ); - vt4.push_back( make_pair( 2, 1 ) ); - vt4.push_back( make_pair( 3, 1 ) ); + vt4[1] = 1; + vt4[2] = 1; + vt4[3] = 1; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); vt2.clear(); - vt2.push_back( make_pair( 1, 1 ) ); - vt2.push_back( make_pair( 2, 2 ) ); + vt2[1] = 1; + vt2[2] = 2; vt4.clear(); vt3 = vt::max( vt1, vt2 ); - vt4.push_back( make_pair( 1, 1 ) ); - vt4.push_back( make_pair( 2, 2 ) ); + vt4[1] = 1; + vt4[2] = 2; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); - vt2.push_back( make_pair( 3, 4 ) ); + vt2[3] = 4; vt3 = vt::max( vt1, vt2 ); - vt4.push_back( make_pair( 3, 4 ) ); + vt4[3] = 4; - BOOST_CHECK( vt3 == vt4 ); + EXAM_CHECK( vt3 <= vt4 ); + EXAM_CHECK( vt4 <= vt3 ); + + return EXAM_RESULT; } -struct vtime_test_suite : - public boost::unit_test_framework::test_suite +int EXAM_IMPL(vtime_operations::gvt_add) { - vtime_test_suite(); + { + 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 ); + } +} + +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 ); }; -vtime_test_suite::vtime_test_suite() : - test_suite( "vtime test suite" ) +#define VT_MESS 0x1201 + +VTM_handler::VTM_handler() : + EventHandler() { - boost::shared_ptr<vtime_operations> vt_op_instance( new vtime_operations() ); + cnd.set( false ); +} - test_case *vt_compare_tc = BOOST_CLASS_TEST_CASE( &vtime_operations::vt_compare, vt_op_instance ); - test_case *vt_add_tc = BOOST_CLASS_TEST_CASE( &vtime_operations::vt_add, vt_op_instance ); - test_case *vt_diff_tc = BOOST_CLASS_TEST_CASE( &vtime_operations::vt_diff, vt_op_instance ); - test_case *vt_max_tc = BOOST_CLASS_TEST_CASE( &vtime_operations::vt_max, vt_op_instance ); +VTM_handler::VTM_handler( stem::addr_type id ) : + EventHandler( id ) +{ + cnd.set( false ); +} - // long_msg_tc->depends_on( init_tc ); +VTM_handler::VTM_handler( stem::addr_type id, const char *info ) : + EventHandler( id, info ) +{ + cnd.set( false ); +} - add( vt_compare_tc ); - add( vt_add_tc ); - add( vt_diff_tc ); - add( vt_max_tc ); - // add( service_tc ); +VTM_handler::~VTM_handler() +{ + // cnd.wait(); } -test_suite *init_unit_test_suite( int argc, char **argv ) +void VTM_handler::handlerE( const stem::Event_base<VTmess>& ev ) { - test_suite *ts = BOOST_TEST_SUITE( "vtime test" ); - ts->add( new vtime_test_suite() ); + code = ev.value().code; + src = ev.value().src; + gvt = ev.value().gvt; + grp = ev.value().grp; + mess = ev.value().mess; - return ts; + 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_DECL(vtime_test_suite); + +int EXAM_IMPL(vtime_test_suite) +{ + exam::test_suite::test_case_type tc[2]; + + 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", + t.add( &vtime_operations::gvt_add, vt_oper, "Group VT add", tc[1] ) ); + + return t.girdle(); +} + +int main( int, char ** ) +{ + + return vtime_test_suite(0); +} Modified: trunk/complement/explore/test/virtual_time/vtime.cc =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-19 20:25:18 UTC (rev 1632) +++ trunk/complement/explore/test/virtual_time/vtime.cc 2007-07-20 06:10:55 UTC (rev 1633) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/06/27 01:04:38 ptr> +// -*- C++ -*- Time-stamp: <07/07/19 23:11:01 ptr> #include "vtime.h" @@ -230,7 +230,7 @@ return *this; } -gvtime_type& operator +=( gvtime_type& gvt, gvtime_type::value_type& t ) +gvtime_type& operator +=( gvtime_type& gvt, const gvtime_type::value_type& t ) { gvt[t.first] += t.second; @@ -364,7 +364,7 @@ END_RESPONSE_TABLE char *Init_buf[128]; -VTDispatch *VTHandler::_vtdsp = 0; +VTDispatcher *VTHandler::_vtdsp = 0; static int *_rcount = 0; void VTHandler::Init::__at_fork_prepare() @@ -374,7 +374,7 @@ void VTHandler::Init::__at_fork_child() { if ( *_rcount != 0 ) { - VTHandler::_vtdsp->~VTDispatch(); + VTHandler::_vtdsp->~VTDispatcher(); VTHandler::_vtdsp = new( VTHandler::_vtdsp ) VTDispatcher(); } } @@ -385,7 +385,7 @@ void VTHandler::Init::_guard( int direction ) { - static xmt::MutexRS _init_lock; + static xmt::recursive_mutex _init_lock; static int _count = 0; if ( direction ) { Modified: trunk/complement/explore/test/virtual_time/vtime.h =================================================================== --- trunk/complement/explore/test/virtual_time/vtime.h 2007-07-19 20:25:18 UTC (rev 1632) +++ trunk/complement/explore/test/virtual_time/vtime.h 2007-07-20 06:10:55 UTC (rev 1633) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/06/27 00:59:45 ptr> +// -*- C++ -*- Time-stamp: <07/07/20 09:29:00 ptr> #ifndef __vtime_h #define __vtime_h @@ -27,6 +27,8 @@ // 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; } 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 ); @@ -58,6 +60,8 @@ 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 ); } @@ -129,10 +133,18 @@ void unpack( std::istream& s ); void net_unpack( std::istream& s ); - VTmess() + VTmess() : + code(0), + src(0), + gvt(), + grp(0), + mess() { } VTmess( const VTmess& _gvt ) : + code( _gvt.code ), + src( _gvt.src ), gvt( _gvt.gvt ), + grp( _gvt.grp ), mess( _gvt.mess ) { } @@ -181,7 +193,7 @@ void VTDispatch( const VTmess& ); - void VTSend( const Event& e ); + void VTSend( const stem::Event& e ); private: typedef std::hash_map<oid_type, vtime_obj_rec> vt_map_type; @@ -219,7 +231,7 @@ explicit VTHandler( stem::addr_type id, const char *info = 0 ); virtual ~VTHandler(); - void VTSend( const Event& e ); + void VTSend( const stem::Event& e ); template <class D> void VTSend( const stem::Event_base<D>& e ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-19 21:39:58
|
Revision: 1632 http://svn.sourceforge.net/complement/?rev=1632&view=rev Author: complement Date: 2007-07-19 13:25:18 -0700 (Thu, 19 Jul 2007) Log Message: ----------- test for message convertion Modified Paths: -------------- trunk/complement/explore/test/stem/Makefile.inc trunk/complement/explore/test/stem/unit_test.cc Added Paths: ----------- trunk/complement/explore/test/stem/Convert.cc trunk/complement/explore/test/stem/Convert.h Added: trunk/complement/explore/test/stem/Convert.cc =================================================================== --- trunk/complement/explore/test/stem/Convert.cc (rev 0) +++ trunk/complement/explore/test/stem/Convert.cc 2007-07-19 20:25:18 UTC (rev 1632) @@ -0,0 +1,104 @@ +// -*- C++ -*- Time-stamp: <07/07/20 00:05:52 ptr> + +/* + * + * Copyright (c) 2007 + * Petr Ovtchenkov + * + * Licensed under the Academic Free License version 3.0 + * + */ + +#include "Convert.h" + +void mess::pack( std::ostream& s ) const +{ + __pack( s, super_id ); + __pack( s, message ); +} + +void mess::net_pack( std::ostream& s ) const +{ + __net_pack( s, super_id ); + __net_pack( s, message ); +} + +void mess::unpack( std::istream& s ) +{ + __unpack( s, super_id ); + __unpack( s, message ); +} + +void mess::net_unpack( std::istream& s ) +{ + __net_unpack( s, super_id ); + __net_unpack( s, message ); +} + +Convert::Convert() : + EventHandler(), + v( 0 ) +{ + cnd.set( false ); +} + +Convert::Convert( stem::addr_type id ) : + EventHandler( id ), + v( 0 ) +{ + cnd.set( false ); +} + +Convert::Convert( stem::addr_type id, const char *info ) : + EventHandler( id, info ), + v( 0 ) +{ + cnd.set( false ); +} + +Convert::~Convert() +{ + // cnd.wait(); +} + +void Convert::handler0() +{ + v = -1; + cnd.set(true); +} + +void Convert::handler1( const stem::Event& ) +{ + v = 1; + cnd.set(true); +} + +void Convert::handler2( const stem::Event_base<mess>& ev ) +{ + v = ev.value().super_id; + m2 = ev.value().message; + + cnd.set(true); +} + +void Convert::handler3( const mess& m ) +{ + v = m.super_id; + m3 = m.message; + + cnd.set(true); +} + +void Convert::wait() +{ + cnd.try_wait(); + + cnd.set( false ); +} + +DEFINE_RESPONSE_TABLE( Convert ) + EV_VOID( ST_NULL, CONV_EV0, handler0 ) + EV_EDS( ST_NULL, CONV_EV1, handler1 ) + EV_Event_base_T_( ST_NULL, CONV_EV2, handler2, mess ) + EV_T_( ST_NULL, CONV_EV3, handler3, mess ) +END_RESPONSE_TABLE Added: trunk/complement/explore/test/stem/Convert.h =================================================================== --- trunk/complement/explore/test/stem/Convert.h (rev 0) +++ trunk/complement/explore/test/stem/Convert.h 2007-07-19 20:25:18 UTC (rev 1632) @@ -0,0 +1,74 @@ +// -*- C++ -*- Time-stamp: <07/07/20 00:03:52 ptr> + +/* + * + * Copyright (c) 2007 + * Petr Ovtchenkov + * + * Licensed under the Academic Free License version 3.0 + * + */ + +#ifndef __Convert_h +#define __Convert_h + +#include <mt/xmt.h> + +#include <stem/Event.h> +#include <stem/EventHandler.h> + +#include <stdint.h> +#include <string> + +struct mess : + 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 ); + + mess() + { } + mess( const mess& m ) : + super_id( m.super_id ), + message( m.message ) + { } + + int32_t super_id; + std::string message; +}; + +class Convert : + public stem::EventHandler +{ + public: + Convert(); + Convert( stem::addr_type id ); + Convert( stem::addr_type id, const char *info ); + ~Convert(); + + void handler0(); + void handler1( const stem::Event& ); + void handler2( const stem::Event_base<mess>& ); + void handler3( const mess& ); + + void wait(); + + int v; + + std::string m2; + std::string m3; + + private: + xmt::condition cnd; + + DECLARE_RESPONSE_TABLE( Convert, stem::EventHandler ); +}; + +#define CONV_EV0 0x909 +#define CONV_EV1 0x90a +#define CONV_EV2 0x90b +#define CONV_EV3 0x90c + +#endif // __Convert_h Modified: trunk/complement/explore/test/stem/Makefile.inc =================================================================== --- trunk/complement/explore/test/stem/Makefile.inc 2007-07-18 20:32:22 UTC (rev 1631) +++ trunk/complement/explore/test/stem/Makefile.inc 2007-07-19 20:25:18 UTC (rev 1632) @@ -1,7 +1,8 @@ -# -*- makefile -*- Time-stamp: <06/10/10 15:22:33 ptr> +# -*- makefile -*- Time-stamp: <07/07/20 00:14:24 ptr> PRGNAME = stem_ut SRC_CC = unit_test.cc \ Node.cc \ NameService.cc \ - Echo.cc + Echo.cc \ + Convert.cc Modified: trunk/complement/explore/test/stem/unit_test.cc =================================================================== --- trunk/complement/explore/test/stem/unit_test.cc 2007-07-18 20:32:22 UTC (rev 1631) +++ trunk/complement/explore/test/stem/unit_test.cc 2007-07-19 20:25:18 UTC (rev 1632) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/12 00:48:50 ptr> +// -*- C++ -*- Time-stamp: <07/07/20 00:21:37 ptr> /* * Copyright (c) 2002, 2003, 2006, 2007 @@ -25,6 +25,8 @@ #include <dlfcn.h> #include "Echo.h" +#include "Convert.h" + #include <stem/NetTransport.h> #include <stem/EvManager.h> #include <sockios/sockmgr.h> @@ -46,9 +48,6 @@ stem_test(); ~stem_test(); - void shm_init(); - void shm_finit(); - int EXAM_DECL(basic1); int EXAM_DECL(basic2); int EXAM_DECL(basic1new); @@ -61,6 +60,7 @@ int EXAM_DECL(net_echo); int EXAM_DECL(peer); int EXAM_DECL(boring_manager); + int EXAM_DECL(convert); static xmt::Thread::ret_code thr1( void * ); static xmt::Thread::ret_code thr1new( void * ); @@ -737,6 +737,64 @@ return EXAM_RESULT; } +int EXAM_IMPL(stem_test::convert) +{ + Convert conv; + mess m; + + m.super_id = 2; + m.message = "hello"; + + stem::Event_base<mess> ev( CONV_EV0 ); + + ev.dest( conv.self_id() ); + ev.value() = m; + + conv.Send( ev ); + + conv.wait(); + + EXAM_CHECK( conv.v == -1 ); + + stem::Event_base<mess> ev1( CONV_EV1 ); + + ev1.dest( conv.self_id() ); + ev1.value() = m; + + conv.Send( ev1 ); + + conv.wait(); + + EXAM_CHECK( conv.v == 1 ); + + stem::Event_base<mess> ev2( CONV_EV2 ); + + ev2.dest( conv.self_id() ); + ev2.value() = m; + + conv.Send( ev2 ); + + conv.wait(); + + EXAM_CHECK( conv.v == 2 ); + EXAM_CHECK( conv.m2 == "hello" ); + + stem::Event_base<mess> ev3( CONV_EV3 ); + + ev3.dest( conv.self_id() ); + ev3.value().super_id = 3; + ev3.value().message = ", wold!"; + + conv.Send( ev3 ); + + conv.wait(); + + EXAM_CHECK( conv.v == 3 ); + EXAM_CHECK( conv.m3 == ", wold!" ); + + return EXAM_RESULT; +} + // ----------------- // ----------------- @@ -766,6 +824,8 @@ t.add( &stem_test::boring_manager, test, "boring_manager", t.add( &stem_test::peer, test, "peer", tc[3] ) ); + t.add( &stem_test::convert, test, "convert", tc[0] ); + return t.girdle(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-18 20:32:36
|
Revision: 1631 http://svn.sourceforge.net/complement/?rev=1631&view=rev Author: complement Date: 2007-07-18 13:32:22 -0700 (Wed, 18 Jul 2007) Log Message: ----------- refine tests Modified Paths: -------------- trunk/complement/explore/test/sockios/ConnectionProcessor.cc trunk/complement/explore/test/sockios/ConnectionProcessor.h trunk/complement/explore/test/sockios/Makefile.inc trunk/complement/explore/test/sockios/sockios_test_suite.cc Removed Paths: ------------- trunk/complement/explore/test/sockios/client-wc.cc trunk/complement/explore/test/sockios/client-wc.h trunk/complement/explore/test/sockios/close_socket.cc Modified: trunk/complement/explore/test/sockios/ConnectionProcessor.cc =================================================================== --- trunk/complement/explore/test/sockios/ConnectionProcessor.cc 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/ConnectionProcessor.cc 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/18 10:17:29 ptr> +// -*- C++ -*- Time-stamp: <07/07/18 23:10:22 ptr> /* * @@ -17,7 +17,10 @@ #include <sockios/sockmgr.h> +#include <mt/xmt.h> + using namespace std; +using namespace xmt; ConnectionProcessor::ConnectionProcessor( std::sockstream& s ) { @@ -334,3 +337,237 @@ return EXAM_RESULT; } +/* ****************** + * + * Check correct processing of case when server close connection. + * Suspicious processing with FreeBSD and OpenBSD servers. + * + */ +static condition cnd_close; + +class Srv // +{ + public: + Srv( std::sockstream& ); + + void connect( std::sockstream& ); + void close(); +}; + +Srv::Srv( std::sockstream& s ) +{ + s << "hello" << endl; + + // xmt::delay( xmt::timespec( 1, 0 ) ); + + s.close(); + // ::shutdown( s.rdbuf()->fd(), 2 ); + cnd_close.set( true ); +} + +void Srv::connect( std::sockstream& ) +{ +} + +void Srv::close() +{ +} + +#ifndef __FIT_NO_POLL +typedef sockmgr_stream_MP<Srv> srv_type; +#elif defined(__FIT_NO_SELECT) +typedef sockmgr_stream_MP_SELECT<Srv> srv_type; +#else +# error Either poll or select should be present! +#endif + +static srv_type *srv_p; +condition cnd; + +Thread::ret_code server_proc( void * ) +{ + Thread::ret_code rt; + rt.iword = 0; + + cnd.set( false ); + srv_type srv( port ); // start server + + ::srv_p = &srv; + + if ( !srv.is_open() || !srv.good() ) { + ++rt.iword; + } + + cnd.set( true ); + + srv.wait(); + + return rt; +} + +Thread::ret_code client_proc( void * ) +{ + Thread::ret_code rt; + rt.iword = 0; + + cnd.try_wait(); + + EXAM_MESSAGE_ASYNC( "Client start" ); + std::sockstream sock( "localhost", ::port ); + + string buf; + + getline( sock, buf ); + + if ( !sock.is_open() || !sock.good() ) { + ++rt.iword; + } + + EXAM_CHECK_ASYNC( buf == "hello" ); + + // xmt::delay( xmt::timespec( 5, 0 ) ); + + // sock << 'a' << endl; + + /* + read required here, due to we can see FIN packet only on read, + and no other solution! (another solution is nonblock sockets or + aio, but this is another story) + */ + cnd_close.try_wait(); + + char a; + sock.read( &a, 1 ); + + EXAM_CHECK_ASYNC( !sock.good() ); + + srv_p->close(); + + EXAM_MESSAGE_ASYNC( "Client end" ); + + return rt; +} + +int EXAM_IMPL(trivial_sockios_test::srv_close_connection) +{ + Thread srv( server_proc ); + cnd_close.set( false ); + Thread client( client_proc ); + + EXAM_CHECK( client.join().iword == 0 ); + EXAM_CHECK( srv.join().iword == 0 ); + + return EXAM_RESULT; +} + +/* + * Server listen tcp socket; client connect to server and try to read + * what server write to socket; server don't write anything, but we + * try to close connection (close socket on client's side, but from + * differrent thread from reading socket). + * I suspect that closing socket on client side don't lead to break down + * through read call. + */ + +class ConnectionProcessor3 // dummy variant +{ + public: + ConnectionProcessor3( std::sockstream& ); + + void connect( std::sockstream& ); + void close(); +}; + +ConnectionProcessor3::ConnectionProcessor3( std::sockstream& s ) +{ + EXAM_MESSAGE_ASYNC( "Server seen connection" ); + + EXAM_CHECK_ASYNC( s.good() ); + connect( s ); + // cerr << "Server see connection\n"; // Be silent, avoid interference + // with Input line prompt +} + +void ConnectionProcessor3::connect( std::sockstream& s ) +{ + EXAM_MESSAGE_ASYNC( "Server start connection processing" ); + + EXAM_CHECK_ASYNC( s.good() ); + + // string msg; + + // getline( s, msg ); + char c = '1'; + s.write( &c, 1 ); + s.flush(); + // cnd2.set( true ); + // EXAM_CHECK_EQUAL( msg, ::message ); + EXAM_CHECK_ASYNC( s.good() ); + + // s << ::message_rsp << endl; // server's response + + // BOOST_REQUIRE( s.good() ); + EXAM_MESSAGE_ASYNC( "Server stop connection processing" ); + + return; +} + +void ConnectionProcessor3::close() +{ + EXAM_MESSAGE_ASYNC( "Server: client close connection" ); +} + +std::sockstream *psock = 0; + +Thread::ret_code thread_entry_call( void * ) +{ + Thread::ret_code rt; + rt.iword = 0; + + cnd.set( true ); + + EXAM_MESSAGE_ASYNC( "Client start" ); + + EXAM_CHECK_ASYNC( psock->good() ); + + char c = '0'; + psock->read( &c, 1 ); + EXAM_CHECK_ASYNC( c == '1' ); + cnd_close.set( true ); + psock->read( &c, 1 ); + + return rt; +} + +int EXAM_IMPL(trivial_sockios_test::client_close_socket) +{ +#ifndef __FIT_NO_POLL + sockmgr_stream_MP<ConnectionProcessor3> srv( port ); // start server + + cnd.set( false ); + cnd_close.set( false ); + + // open client's socket _before_ thread launch to demonstrate problem with + // socket close (close socket's descriptor in one thread don't lead to real + // shutdown events if socket in use in another thread) + psock = new std::sockstream( "localhost", ::port ); + xmt::Thread thr( thread_entry_call ); + cnd.try_wait(); + // close socket; you may expect that sock.read break down, but this + // will not happens: this thread has one copy of (psock) file descriptor, + // thread_entry_call has another; we close only one + cnd_close.try_wait(); + // but call shutdown is what you want here: + psock->rdbuf()->shutdown( sock_base::stop_in | sock_base::stop_out ); + psock->close(); + thr.join(); + delete psock; + + srv.close(); // close server, so we don't wait server termination on next line + srv.wait(); // Wait for server stop to serve clients connections +#else + EXAM_ERROR( "select-based sockmgr not implemented on this platform" ); +#endif + + return EXAM_RESULT; +} Modified: trunk/complement/explore/test/sockios/ConnectionProcessor.h =================================================================== --- trunk/complement/explore/test/sockios/ConnectionProcessor.h 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/ConnectionProcessor.h 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/18 10:08:07 ptr> +// -*- C++ -*- Time-stamp: <07/07/19 00:16:00 ptr> /* * @@ -42,6 +42,9 @@ int EXAM_DECL(listen_iface); int EXAM_DECL(shared_socket); + int EXAM_DECL(srv_close_connection); + int EXAM_DECL(client_close_socket); + private: in_addr hostaddr; // sockaddr hostaddr; Modified: trunk/complement/explore/test/sockios/Makefile.inc =================================================================== --- trunk/complement/explore/test/sockios/Makefile.inc 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/Makefile.inc 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,6 +1,6 @@ -# -*- makefile -*- Time-stamp: <07/07/18 08:37:31 ptr> +# -*- makefile -*- Time-stamp: <07/07/19 00:16:55 ptr> PRGNAME = sockios_ut SRC_CC = ConnectionProcessor.cc message.cc \ - client-wc.cc close_socket.cc bytes_in_socket.cc bytes_in_socket2.cc \ + bytes_in_socket.cc bytes_in_socket2.cc \ names.cc sockios_test.cc sockios_test_suite.cc unit_test.cc Deleted: trunk/complement/explore/test/sockios/client-wc.cc =================================================================== --- trunk/complement/explore/test/sockios/client-wc.cc 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/client-wc.cc 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,146 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/18 08:46:23 ptr> - -/* - * Copyright (c) 2004, 2006, 2007 - * Petr Ovtchenkov - * - * Licensed under the Academic Free License Version 3.0 - * - */ - -#include <exam/suite.h> - -#include <string> -#include <sockios/sockstream> -#include <sockios/sockmgr.h> -#include <iostream> -#include <iomanip> -#include <mt/xmt.h> - -#include "client-wc.h" -#include "message.h" - -using namespace std; -using namespace xmt; - -/* - Check correct processing of case when server close connection. - Suspicious processing with FreeBSD and OpenBSD servers. - - */ -static condition cnd_close; - -class Srv // -{ - public: - Srv( std::sockstream& ); - - void connect( std::sockstream& ); - void close(); -}; - -Srv::Srv( std::sockstream& s ) -{ - s << "hello" << endl; - - // xmt::delay( xmt::timespec( 1, 0 ) ); - - s.close(); - // ::shutdown( s.rdbuf()->fd(), 2 ); - cnd_close.set( true ); -} - -void Srv::connect( std::sockstream& ) -{ -} - -void Srv::close() -{ -} - -#ifndef __FIT_NO_POLL -typedef sockmgr_stream_MP<Srv> srv_type; -#elif defined(__FIT_NO_SELECT) -typedef sockmgr_stream_MP_SELECT<Srv> srv_type; -#else -# error Either poll or select should be present! -#endif - -static srv_type *srv_p; -condition cnd; - -Thread::ret_code server_proc( void * ) -{ - Thread::ret_code rt; - rt.iword = 0; - - cnd.set( false ); - srv_type srv( port ); // start server - - ::srv_p = &srv; - - if ( !srv.is_open() || !srv.good() ) { - ++rt.iword; - } - - cnd.set( true ); - - srv.wait(); - - return rt; -} - -Thread::ret_code client_proc( void * ) -{ - Thread::ret_code rt; - rt.iword = 0; - - cnd.try_wait(); - - EXAM_MESSAGE_ASYNC( "Client start" ); - std::sockstream sock( "localhost", ::port ); - - string buf; - - getline( sock, buf ); - - if ( !sock.is_open() || !sock.good() ) { - ++rt.iword; - } - - EXAM_CHECK_ASYNC( buf == "hello" ); - - // xmt::delay( xmt::timespec( 5, 0 ) ); - - // sock << 'a' << endl; - - /* - read required here, due to we can see FIN packet only on read, - and no other solution! (another solution is nonblock sockets or - aio, but this is another story) - */ - cnd_close.try_wait(); - - char a; - sock.read( &a, 1 ); - - EXAM_CHECK_ASYNC( !sock.good() ); - - srv_p->close(); - - EXAM_MESSAGE_ASYNC( "Client end" ); - - return rt; -} - -int EXAM_IMPL(srv_close_connection_test) -{ - Thread srv( server_proc ); - cnd_close.set( false ); - Thread client( client_proc ); - - EXAM_CHECK( client.join().iword == 0 ); - EXAM_CHECK( srv.join().iword == 0 ); - - return EXAM_RESULT; -} Deleted: trunk/complement/explore/test/sockios/client-wc.h =================================================================== --- trunk/complement/explore/test/sockios/client-wc.h 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/client-wc.h 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,19 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/18 09:20:14 ptr> - -/* - * - * Copyright (c) 2004, 2007 - * Petr Ovtchenkov - * - * Licensed under the Academic Free License version 3.0 - * - */ - -#ifndef __client_wc_h -#define __client_wc_h - -#include <exam/suite.h> - -int EXAM_DECL(srv_close_connection_test); - -#endif // __client_wc_h Deleted: trunk/complement/explore/test/sockios/close_socket.cc =================================================================== --- trunk/complement/explore/test/sockios/close_socket.cc 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/close_socket.cc 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,148 +0,0 @@ -// -*- C++ -*- Time-stamp: <07/07/11 21:34:53 ptr> - -/* - * - * Copyright (c) 2006 - * Petr Ovtchenkov - * - * Licensed under the Academic Free License Version 2.1 - * - * This material is provided "as is", with absolutely no warranty expressed - * or implied. Any use is at your own risk. - * - * Permission to use, copy, modify, distribute and sell this software - * and its documentation for any purpose is hereby granted without fee, - * provided that the above copyright notice appear in all copies and - * that both that copyright notice and this permission notice appear - * in supporting documentation. - */ - -#include <exam/suite.h> - -#include <iostream> -#include <list> -#include <mt/xmt.h> - -#include <sockios/sockstream> -#include <sockios/sockmgr.h> - -using namespace std; -using namespace xmt; - -/* - * Server listen tcp socket; client connect to server and try to read - * what server write to socket; server don't write anything, but we - * try to close connection (close socket on client's side, but from - * differrent thread from reading socket). - * I suspect that closing socket on client side don't lead to break down - * through read call. - */ - -extern int port; - -class ConnectionProcessor3 // dummy variant -{ - public: - ConnectionProcessor3( std::sockstream& ); - - void connect( std::sockstream& ); - void close(); -}; - -ConnectionProcessor3::ConnectionProcessor3( std::sockstream& s ) -{ - EXAM_MESSAGE_ASYNC( "Server seen connection" ); - - EXAM_CHECK_ASYNC( s.good() ); - connect( s ); - // cerr << "Server see connection\n"; // Be silent, avoid interference - // with Input line prompt -} - -condition cnd2; - -void ConnectionProcessor3::connect( std::sockstream& s ) -{ - EXAM_MESSAGE_ASYNC( "Server start connection processing" ); - - EXAM_CHECK_ASYNC( s.good() ); - - // string msg; - - // getline( s, msg ); - char c = '1'; - s.write( &c, 1 ); - s.flush(); - // cnd2.set( true ); - // EXAM_CHECK_EQUAL( msg, ::message ); - EXAM_CHECK_ASYNC( s.good() ); - - // s << ::message_rsp << endl; // server's response - - // BOOST_REQUIRE( s.good() ); - EXAM_MESSAGE_ASYNC( "Server stop connection processing" ); - - return; -} - -void ConnectionProcessor3::close() -{ - EXAM_MESSAGE_ASYNC( "Server: client close connection" ); -} - -condition cnd1; -// Condition cnd2; -std::sockstream *psock = 0; - -Thread::ret_code thread_entry_call( void * ) -{ - Thread::ret_code rt; - rt.iword = 0; - - cnd1.set( true ); - - EXAM_MESSAGE_ASYNC( "Client start" ); - - EXAM_CHECK_ASYNC( psock->good() ); - - char c = '0'; - psock->read( &c, 1 ); - EXAM_CHECK_ASYNC( c == '1' ); - cnd2.set( true ); - psock->read( &c, 1 ); - - return rt; -} - -int EXAM_IMPL(test_client_close_socket) -{ -#ifndef __FIT_NO_POLL - sockmgr_stream_MP<ConnectionProcessor3> srv( port ); // start server - - cnd1.set( false ); - cnd2.set( false ); - - // open client's socket _before_ thread launch to demonstrate problem with - // socket close (close socket's descriptor in one thread don't lead to real - // shutdown events if socket in use in another thread) - psock = new std::sockstream( "localhost", ::port ); - xmt::Thread thr( thread_entry_call ); - cnd1.try_wait(); - // close socket; you may expect that sock.read break down, but this - // will not happens: this thread has one copy of (psock) file descriptor, - // thread_entry_call has another; we close only one - cnd2.try_wait(); - // but call shutdown is what you want here: - psock->rdbuf()->shutdown( sock_base::stop_in | sock_base::stop_out ); - psock->close(); - thr.join(); - delete psock; - - srv.close(); // close server, so we don't wait server termination on next line - srv.wait(); // Wait for server stop to serve clients connections -#else - EXAM_ERROR( "select-based sockmgr not implemented on this platform" ); -#endif - - return EXAM_RESULT; -} Modified: trunk/complement/explore/test/sockios/sockios_test_suite.cc =================================================================== --- trunk/complement/explore/test/sockios/sockios_test_suite.cc 2007-07-18 16:31:53 UTC (rev 1630) +++ trunk/complement/explore/test/sockios/sockios_test_suite.cc 2007-07-18 20:32:22 UTC (rev 1631) @@ -1,4 +1,4 @@ -// -*- C++ -*- Time-stamp: <07/07/18 10:23:40 ptr> +// -*- C++ -*- Time-stamp: <07/07/19 00:19:19 ptr> /* * @@ -25,11 +25,8 @@ #include "ConnectionProcessor.h" -#include "client-wc.h" - using namespace std; -int EXAM_DECL(test_client_close_socket); int EXAM_DECL(test_more_bytes_in_socket); int EXAM_DECL(test_more_bytes_in_socket2); @@ -65,9 +62,9 @@ t.add( &trivial_sockios_test::listen_iface, trivial_test, "trivial_sockios_test::listen_iface", tc[0] ); - t.add( srv_close_connection_test, "srv_close_connection_test" ); + t.add( &trivial_sockios_test::srv_close_connection, trivial_test, "trivial_sockios_test::srv_close_connection", tc[0] ); t.add( &trivial_sockios_test::shared_socket, trivial_test, "trivial_sockios_test::shared_socket", tc[0] ); - t.add( test_client_close_socket, "test_client_close_socket" ); + t.add( &trivial_sockios_test::client_close_socket, trivial_test, "trivial_sockios_test::client_close_socket", tc[0] ); t.add( test_more_bytes_in_socket, "test_more_bytes_in_socket" ); // timeout 5 t.add( test_more_bytes_in_socket2, "test_more_bytes_in_socket2" ); // timeout 5 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-18 16:31:57
|
Revision: 1630 http://svn.sourceforge.net/complement/?rev=1630&view=rev Author: complement Date: 2007-07-18 09:31:53 -0700 (Wed, 18 Jul 2007) Log Message: ----------- FIT_EXAM -> __FIT_EXAM Modified Paths: -------------- trunk/complement/explore/test/mt/Makefile trunk/complement/explore/test/stem/Echo.cc trunk/complement/explore/test/stem/Makefile Modified: trunk/complement/explore/test/mt/Makefile =================================================================== --- trunk/complement/explore/test/mt/Makefile 2007-07-18 16:30:49 UTC (rev 1629) +++ trunk/complement/explore/test/mt/Makefile 2007-07-18 16:31:53 UTC (rev 1630) @@ -8,6 +8,7 @@ INCLUDES += -I$(SRCROOT)/include -I$(BOOST_INCLUDE_DIR) +DEFS += -D__FIT_EXAM # temporary, before dums fix strings: # DEFS += -D_STLP_DONT_USE_TEMPLATE_EXPRESSION Modified: trunk/complement/explore/test/stem/Echo.cc =================================================================== --- trunk/complement/explore/test/stem/Echo.cc 2007-07-18 16:30:49 UTC (rev 1629) +++ trunk/complement/explore/test/stem/Echo.cc 2007-07-18 16:31:53 UTC (rev 1630) @@ -129,7 +129,7 @@ void PeerClient::handler1( const stem::Event& ev ) { - EXAM_CHECK( ev.value() == mess ); + EXAM_CHECK_ASYNC( ev.value() == mess ); cnd.set(true); } Modified: trunk/complement/explore/test/stem/Makefile =================================================================== --- trunk/complement/explore/test/stem/Makefile 2007-07-18 16:30:49 UTC (rev 1629) +++ trunk/complement/explore/test/stem/Makefile 2007-07-18 16:31:53 UTC (rev 1630) @@ -11,6 +11,7 @@ include ${SRCROOT}/Makefiles/gmake/top.mak INCLUDES += -I$(SRCROOT)/include +DEFS += -D__FIT_EXAM LIBMT_DIR = ${CoMT_DIR}/lib/mt LIBSOCK_DIR = ${CoMT_DIR}/lib/sockios This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <com...@us...> - 2007-07-18 16:30:52
|
Revision: 1629 http://svn.sourceforge.net/complement/?rev=1629&view=rev Author: complement Date: 2007-07-18 09:30:49 -0700 (Wed, 18 Jul 2007) Log Message: ----------- add guards, hide dangerous objects exposition; FIT_EXAM -> __FIT_EXAM Modified Paths: -------------- trunk/complement/explore/include/exam/suite.h trunk/complement/explore/lib/exam/suite.cc trunk/complement/explore/lib/exam/ut/Makefile trunk/complement/explore/lib/exam/ut/exam_test_suite.h Modified: trunk/complement/explore/include/exam/suite.h =================================================================== --- trunk/complement/explore/include/exam/suite.h 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/include/exam/suite.h 2007-07-18 16:30:49 UTC (rev 1629) @@ -11,7 +11,8 @@ #include <string> #include <exception> -#include "logger.h" +#include <mt/xmt.h> +#include <exam/logger.h> enum vertex_testcase_t { vertex_testcase }; @@ -204,12 +205,10 @@ int flags( int ); bool is_trace(); void report( const char *, int, bool, const char * ); + static void report_async( const char *, int, bool, const char * ); base_logger *set_global_logger( base_logger * ); base_logger *set_logger( base_logger * ); - void set_fail(); - static test_suite& top(); - private: enum { pass = 0, @@ -221,6 +220,7 @@ vertex_t root; vertex_testcase_map_t testcase; base_logger *local_logger; + xmt::mutex _lock_ll; struct test_case_collect { @@ -238,8 +238,10 @@ static int _root_func( test_suite *, int = 0 ); static base_logger *logger; + static xmt::mutex _lock_gl; static std::stack<test_suite *> _stack; + static xmt::mutex _lock_stack; }; template <class TC> @@ -302,27 +304,27 @@ } // namespace exam -#ifdef FIT_EXAM +#ifdef __FIT_EXAM # define EXAM_IMPL(F) F( exam::test_suite *__exam_ts, int __exam_counter ) # define EXAM_DECL(F) F( exam::test_suite *, int = 0 ) # define EXAM_RESULT __exam_counter # define EXAM_CHECK(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); __exam_counter |= 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) -# define EXAM_CHECK_ASYNC(C) if ( !(C) ) { exam::test_suite::top().report( __FILE__, __LINE__, false, #C ); exam::test_suite::top().set_fail(); } else exam::test_suite::top().report( __FILE__, __LINE__, true, #C ) +# define EXAM_CHECK_ASYNC(C) if ( !(C) ) { exam::test_suite::report_async( __FILE__, __LINE__, false, #C ); } else exam::test_suite::report_async( __FILE__, __LINE__, true, #C ) # define EXAM_MESSAGE(M) __exam_ts->report( __FILE__, __LINE__, true, M ) -# define EXAM_MESSAGE_ASYNC(M) exam::test_suite::top().report( __FILE__, __LINE__, true, M ) +# define EXAM_MESSAGE_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, true, M ) # define EXAM_REQUIRE(C) if ( !(C) ) { __exam_ts->report( __FILE__, __LINE__, false, #C ); return 1; } else __exam_ts->report( __FILE__, __LINE__, true, #C ) # define EXAM_FAIL(M) __exam_ts->report( __FILE__, __LINE__, false, M ); return 1 # define EXAM_ERROR(M) __exam_ts->report( __FILE__, __LINE__, false, M ); __exam_counter |= 1 -# define EXAM_ERROR_ASYNC(M) exam::test_suite::top().report( __FILE__, __LINE__, false, M ); exam::test_suite::top().set_fail() +# define EXAM_ERROR_ASYNC(M) exam::test_suite::report_async( __FILE__, __LINE__, false, M ) #else # define EXAM_IMPL(F) F( exam::test_suite *, int ) # define EXAM_DECL(F) F( exam::test_suite *, int = 0 ) # define EXAM_RESULT 0 -# define EXAM_CHECK(C) -# define EXAM_CHECK_ASYNC(C) +# define EXAM_CHECK(C) (C) +# define EXAM_CHECK_ASYNC(C) (C) # define EXAM_MESSAGE(M) # define EXAM_MESSAGE_ASYNC(M) -# define EXAM_REQUIRE(C) +# define EXAM_REQUIRE(C) (C) # define EXAM_FAIL(M) # define EXAM_ERROR(M) # define EXAM_ERROR_ASYNC(M) Modified: trunk/complement/explore/lib/exam/suite.cc =================================================================== --- trunk/complement/explore/lib/exam/suite.cc 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/suite.cc 2007-07-18 16:30:49 UTC (rev 1629) @@ -12,6 +12,7 @@ using namespace std; using namespace boost; using namespace detail; +using namespace xmt; namespace detail { @@ -109,6 +110,7 @@ _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); _test[root].state = 0; + scoped_lock lk( _lock_stack ); _stack.push( this ); } @@ -122,12 +124,16 @@ _test[root].tc = detail::make_test_case( detail::call( _root_func ) ); _test[root].state = 0; + scoped_lock lk( _lock_stack ); _stack.push( this ); } test_suite::~test_suite() { + scoped_lock lk( _lock_stack ); _stack.pop(); + lk.unlock(); + for ( test_case_map_type::iterator i = _test.begin(); i != _test.end(); ++i ) { delete i->second.tc; } @@ -187,42 +193,38 @@ int test_suite::flags() { - return local_logger->flags(); + scoped_lock lk( _lock_ll ); + int tmp = local_logger->flags(); + return tmp; } bool test_suite::is_trace() { - return local_logger->is_trace(); + scoped_lock lk( _lock_ll ); + bool tmp = local_logger->is_trace(); + return tmp; } int test_suite::flags( int f ) { - return local_logger->flags( f ); + scoped_lock lk( _lock_ll ); + int tmp = local_logger->flags( f ); + return tmp; } -void test_suite::set_fail() -{ - _last_state = fail; -} - trivial_logger __trivial_logger_inst( cerr ); base_logger *test_suite::logger = &__trivial_logger_inst; stack<test_suite *> test_suite::_stack; +mutex test_suite::_lock_stack; +mutex test_suite::_lock_gl; -test_suite& test_suite::top() -{ - if ( _stack.empty() ) { - throw runtime_error( "stack of test suites empty" ); - } - - return *_stack.top(); -} - base_logger *test_suite::set_global_logger( base_logger *new_logger ) { + scoped_lock glk( _lock_gl ); base_logger *tmp = logger; logger = new_logger; + scoped_lock lk( _lock_ll ); if ( tmp == local_logger ) { // if local_logger was identical to logger, switch it too local_logger = logger; } @@ -231,6 +233,7 @@ base_logger *test_suite::set_logger( base_logger *new_logger ) { + scoped_lock lk( _lock_ll ); base_logger *tmp = local_logger; local_logger = new_logger; return tmp; @@ -238,9 +241,24 @@ void test_suite::report( const char *file, int line, bool cnd, const char *expr ) { + if ( !cnd ) { + _last_state = fail; + } + scoped_lock lk( _lock_ll ); local_logger->report( file, line, cnd, expr ); } +void test_suite::report_async( const char *file, int line, bool cnd, const char *expr ) +{ + scoped_lock lk( _lock_stack ); + + if ( _stack.empty() ) { + throw runtime_error( "stack of test suites empty" ); + } + + _stack.top()->report( file, line, cnd, expr ); +} + void test_suite::run_test_case( test_suite::vertex_t v ) { try { @@ -249,20 +267,25 @@ if ( (*_test[v].tc)( this, 0 ) == 0 ) { if ( _last_state == 0 ) { ++_stat.passed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::pass, _test[v].name ); } else { _test[v].state = fail; ++_stat.failed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); _last_state = 0; } } else { _test[v].state = fail; ++_stat.failed; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); + _last_state = 0; } } else { ++_stat.skipped; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::skip, _test[v].name ); } } @@ -272,6 +295,7 @@ catch ( ... ) { ++_stat.failed; _test[v].state = fail; + scoped_lock lk( _lock_ll ); local_logger->tc( base_logger::fail, _test[v].name ); } } Modified: trunk/complement/explore/lib/exam/ut/Makefile =================================================================== --- trunk/complement/explore/lib/exam/ut/Makefile 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/ut/Makefile 2007-07-18 16:30:49 UTC (rev 1629) @@ -7,5 +7,6 @@ # INCLUDES += -I${BOOST_DIR} INCLUDES += -I${CoMT_INCLUDE_DIR} +DEFS += -D__FIT_EXAM LDFLAGS += -Wl,-rpath=${STLPORT_LIB_DIR} Modified: trunk/complement/explore/lib/exam/ut/exam_test_suite.h =================================================================== --- trunk/complement/explore/lib/exam/ut/exam_test_suite.h 2007-07-18 12:17:22 UTC (rev 1628) +++ trunk/complement/explore/lib/exam/ut/exam_test_suite.h 2007-07-18 16:30:49 UTC (rev 1629) @@ -3,8 +3,6 @@ #ifndef __exam_test_suite_h #define __exam_test_suite_h -#define FIT_EXAM - #include <exam/suite.h> #include <string> #include <sstream> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |