[Spread-cvs] commit: r254 - in trunk: daemon flush include
jschultz at spread.org
jschultz at spread.org
Fri Aug 5 19:18:38 EDT 2005
Author: jschultz
Date: 2005-08-05 19:18:38 -0400 (Fri, 05 Aug 2005)
New Revision: 254
Modified:
trunk/daemon/groups.c
trunk/daemon/sp.c
trunk/flush/fl.c
trunk/flush/fl_time_memb.c
trunk/flush/user.c
trunk/include/sp_func.h
Log:
Added final code to flush to handle Spread's new vs_set semantics. Added FL_lib_init calls to user and fl_time_memb as needed. I still need to add documentation about FL_lib_init, this will probably break most deployed FL apps. Exported an additional offset fcn in sp_func.h; probably need another one for scat structs. Updated sp.c to have matching fcn prototypes. Possible bug still in the SP_get_local_vs_offset fcn.
Modified: trunk/daemon/groups.c
===================================================================
--- trunk/daemon/groups.c 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/daemon/groups.c 2005-08-05 23:18:38 UTC (rev 254)
@@ -1136,15 +1136,14 @@
vs_set_offset_ptr = &Mess_buf[num_bytes];
num_bytes += sizeof( int32u );
+ temp = 0;
+ memcpy( vs_set_offset_ptr, &temp, sizeof(int32u) ); /* offset is zero, always */
num_vs_ptr = &Mess_buf[ num_bytes ];
num_bytes += sizeof( int32u );
temp = 1;
memcpy( num_vs_ptr, &temp, sizeof( int32u ) ); /* with 1 member */
- temp = 0;
- memcpy( vs_set_offset_ptr, &temp, sizeof(int32u) ); /* offset is zero, always */
-
vs_ptr = (char *)&Mess_buf[ num_bytes ]; /* vs_set has joiner/leaver/disconnecter */
memcpy( vs_ptr, private_group_name, MAX_GROUP_NAME );
num_bytes += MAX_GROUP_NAME;
Modified: trunk/daemon/sp.c
===================================================================
--- trunk/daemon/sp.c 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/daemon/sp.c 2005-08-05 23:18:38 UTC (rev 254)
@@ -1603,32 +1603,32 @@
else return( 0 );
}
-int SP_get_gid_offset_memb_mess()
+int SP_get_gid_offset_memb_mess(void)
{
return 0;
}
-int SP_get_num_vs_sets_offset_memb_mess()
+int SP_get_num_vs_sets_offset_memb_mess(void)
{
return sizeof(group_id);
}
-static int SP_get_offset_to_local_vs_set_offset()
+int SP_get_offset_to_local_vs_set_offset(void)
{
return sizeof(group_id) + sizeof(int32u);
}
-int SP_get_first_vs_set_offset_memb_mess()
+int SP_get_first_vs_set_offset_memb_mess(void)
{
return sizeof(group_id) + 2*sizeof(int32u);
}
-int SP_get_vs_set_size_offset_vs_set()
+int SP_get_vs_set_size_offset_vs_set(void)
{
return 0;
}
-int SP_get_vs_set_members_offset_vs_set()
+int SP_get_vs_set_members_offset_vs_set(void)
{
return sizeof(int32u);
}
Modified: trunk/flush/fl.c
===================================================================
--- trunk/flush/fl.c 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/flush/fl.c 2005-08-05 23:18:38 UTC (rev 254)
@@ -631,7 +631,7 @@
}
static void fill_view(view *v, service memb_type, int num_membs,
- char (*membs)[MAX_GROUP_NAME], int16 index) {
+ char (*membs)[MAX_GROUP_NAME], int16 index) {
size_t byte_size = num_membs * MAX_GROUP_NAME;
DEBUG(std_stkfprintf(stderr, 1, "fill_view: view %p, serv 0x%X, num_membs %d, index %d\n",
@@ -1364,6 +1364,8 @@
assert(m->ret >= sizeof(group_id) + sizeof(int) + MAX_GROUP_NAME); /* ensure received */
err = scatp_begin(&pos, scat);
assert(err == 0);
+ err = scatp_jforward(&pos, SP_get_gid_offset_memb_mess());
+ assert(err == SP_get_gid_offset_memb_mess());
err = scatp_cpy1((char*) &m->dst_gid, &pos, sizeof(group_id)); /* copy out new gid */
assert(err == sizeof(group_id)); /* already endian corrected */
DEBUG(std_stkfprintf(stderr, 0, "Recvd a SP reg memb mess: New SP gid is %d %d %d\n",
@@ -1904,11 +1906,13 @@
static char*
determine_leavers(stdhash *leavers, view *last_sp_view, gc_recv_mess *m) {
- char delta[MAX_GROUP_NAME], *delta_ptr = delta, *ret = 0;
- int num_vs, i, *num_vs_ptr = &num_vs;
+ char delta[MAX_GROUP_NAME], *delta_ptr = delta, *ret = 0;
+ int i;
scatter *scat;
- scatp pos;
- long err;
+ scatp pos;
+ long err;
+ stduint32 offset;
+ stduint32 num_membs;
DEBUG(std_stkfprintf(stderr, 1, "determine_leavers: old gid %d %d %d -> new gid %d %d %d\n",
last_sp_view->gid.id[0], last_sp_view->gid.id[1],
@@ -1916,13 +1920,32 @@
m->dst_gid.id[2]));
get_scat_info(m, &i, &scat); /* i is a dummy variable here */
+
+ err = scatp_set(&pos, scat, SP_get_offset_to_local_vs_set_offset(), SEEK_SET);
+ assert(err == 0);
+
+ err = scatp_cpy1((char*) &offset, &pos, sizeof(stduint32));
+ assert(err == sizeof(stduint32));
+
+ offset += SP_get_first_vs_set_offset_memb_mess(); /* get local VS offset */
+
+ err = scatp_set(&pos, scat, offset, SEEK_SET);
+ assert(err == offset);
+
+ err = scatp_cpy1((char*) &num_membs, &pos, sizeof(stduint32)); /* read out num membs */
+ assert(err == sizeof(stduint32));
+
+ err = scatp_jforward(&pos, sizeof(stduint32)); /* advance to vs_set */
+ assert(err == sizeof(stduint32));
+
if (!Is_caused_network_mess(*m->serv_type)) { /* join, leave, or disconnection */
+ assert(num_membs == 1);
+
DEBUG(std_stkfprintf(stderr, 0, "Not caused by network! "));
+
stdhash_construct(leavers, sizeof(char*), 0,
group_name_ptr_cmp, group_name_ptr_hashcode, 0);
-
- err = scatp_set(&pos, scat, sizeof(group_id) + sizeof(int), SEEK_SET);
- assert(err == 0);
+
err = scatp_cpy1(delta, &pos, MAX_GROUP_NAME); /* read out joiner/leaver/disconnector */
assert(err == MAX_GROUP_NAME);
delta[MAX_GROUP_NAME - 1] = 0; /* ensure null termination */
@@ -1936,19 +1959,16 @@
DEBUG(std_stkfprintf(stderr, 0, "Wasn't a JOIN: adding delta to leavers\n"));
stdhash_insert(leavers, 0, &ret, 0);
}
+
} else {
DEBUG(std_stkfprintf(stderr, 0, "Caused by network! "));
stdhash_copy_construct(leavers, &last_sp_view->orig_membs); /* copy last SP membership */
- err = scatp_set(&pos, scat, sizeof(group_id), SEEK_SET);
- assert(err == 0);
- err = scatp_adv_cpy1((char**) &num_vs_ptr, &pos, sizeof(int), 0, 1); /* read out num_vs */
- assert(err == sizeof(int));
-
- DEBUG(std_stkfprintf(stderr, 0, "Num_vs %d\n", num_vs));
- for (i = 0; i < num_vs; ++i) { /* remove members that came with me: leaves who left */
+ DEBUG(std_stkfprintf(stderr, 0, "Num_membs %u\n", num_membs));
+ for (i = 0; i < num_membs; ++i) { /* remove members that came with me: leaves who left */
err = scatp_adv_cpy1(&delta_ptr, &pos, MAX_GROUP_NAME, 0, 1);
assert(err == MAX_GROUP_NAME);
+
delta[MAX_GROUP_NAME - 1] = 0; /* ensure null termination */
err = stdhash_size(leavers);
stdhash_erase_key(leavers, &delta_ptr);
Modified: trunk/flush/fl_time_memb.c
===================================================================
--- trunk/flush/fl_time_memb.c 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/flush/fl_time_memb.c 2005-08-05 23:18:38 UTC (rev 254)
@@ -96,6 +96,8 @@
exe = *argv;
usage(argc, argv);
+ FL_lib_init();
+
if ((err = FL_connect(daemon_name, user_name, 0, &mbox, priv_name)) != ACCEPT_SESSION) {
fprintf(stderr, "FL_connect failure: ");
FL_error(err);
Modified: trunk/flush/user.c
===================================================================
--- trunk/flush/user.c 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/flush/user.c 2005-08-05 23:18:38 UTC (rev 254)
@@ -53,6 +53,8 @@
FL_version(&major, &minor, &patch);
printf("Flush library version is %d.%d.%d\n", major, minor, patch);
+ FL_lib_init();
+
ret = FL_connect( Spread_name, User, LOW_PRIORITY, &Mbox, Private_group );
if( ret < 0 ) {
FL_error( ret );
Modified: trunk/include/sp_func.h
===================================================================
--- trunk/include/sp_func.h 2005-07-31 10:51:40 UTC (rev 253)
+++ trunk/include/sp_func.h 2005-08-05 23:18:38 UTC (rev 254)
@@ -100,7 +100,8 @@
int SP_get_vs_set_size_offset_vs_set(void);
int SP_get_vs_set_members_offset_vs_set(void);
/* returns value from regular membership message */
-int SP_get_local_vs_set_offset_memb_mess( char *reg_memb_mess );
+int SP_get_offset_to_local_vs_set_offset(void);
+int SP_get_local_vs_set_offset_memb_mess( char *reg_memb_mess ); /* TODO: jonathan we need one for scat's too! */
int SP_poll( mailbox mbox );
More information about the Spread-cvs
mailing list