[Spread-cvs] cvs commit: spread/daemon Readme.txt groups.c
jonathan at spread.org
jonathan at spread.org
Sun Jan 25 18:03:17 EST 2004
jonathan 04/01/25 18:03:17
Modified: daemon Readme.txt groups.c
Log:
Fix bus errors on Sparc and Alpha where non-word aligned int pointer was
assigned to. Instead use a correctly aligned integer and memcpy to the
pointer when needed. Reported by Greb Shebert and Mikhail Terekhov.
Revision Changes Path
1.41 +2 -0 spread/daemon/Readme.txt
Index: Readme.txt
===================================================================
RCS file: /storage/cvsroot/spread/daemon/Readme.txt,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -r1.40 -r1.41
--- Readme.txt 25 Jan 2004 20:27:52 -0000 1.40
+++ Readme.txt 25 Jan 2004 23:03:17 -0000 1.41
@@ -62,6 +62,8 @@
*) Alarm() changes to support priority levels on each Alarm() call.
*) Fix crash by improving packet accounting when a client connected to a
singleton daemon sends a large broadcast. Reported by David Shaw.
+*) Fix bus errors on Sparc & Alpha for message buffer integer assignment.
+ Reported by Greg Shebert and Mikhail Terekhov.
June 20, 2003 Ver 3.17.1
----------------------------
1.12 +29 -15 spread/daemon/groups.c
Index: groups.c
===================================================================
RCS file: /storage/cvsroot/spread/daemon/groups.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- groups.c 24 Oct 2003 21:47:37 -0000 1.11
+++ groups.c 25 Jan 2004 23:03:17 -0000 1.12
@@ -826,7 +826,8 @@
/* notify all local members */
num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
num_bytes += sizeof( int32 );
- *num_vs_ptr = 1;
+ temp = 1;
+ memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
vs_ptr = (char *)&Mess_buf[ num_bytes ];
memcpy( vs_ptr, new_mbr->private_name, MAX_GROUP_NAME );
@@ -893,7 +894,8 @@
/* build a self vs set */
num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
num_bytes += sizeof( int32 );
- *num_vs_ptr = 1;
+ temp = 1;
+ memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
vs_ptr = (char *)&Mess_buf[ num_bytes ];
memcpy( vs_ptr, new_mbr->private_name, MAX_GROUP_NAME );
num_bytes += MAX_GROUP_NAME;
@@ -1147,7 +1149,8 @@
/* notify all local members */
num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
num_bytes += sizeof( int32 );
- *num_vs_ptr = 1;
+ temp = 1;
+ memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
vs_ptr = (char *)&Mess_buf[ num_bytes ];
memcpy( vs_ptr, departing_private_group_name, MAX_GROUP_NAME );
@@ -1340,7 +1343,8 @@
num_vs_ptr = (int32 *)&Mess_buf[ num_bytes ];
num_bytes += sizeof( int32 );
- *num_vs_ptr = 1;
+ temp = 1;
+ memcpy( num_vs_ptr, &temp, sizeof( int32 ) ); /* *num_vs_ptr = 1; */
vs_ptr = (char *)&Mess_buf[ num_bytes ];
memcpy( vs_ptr, departing_private_group_name, MAX_GROUP_NAME );
@@ -1481,6 +1485,7 @@
int ret;
int vs_bytes;
int32 *num_vs_ptr; /* num members in virtual-synchrony/failure-atomicity set */
+ int32 num_vs;
int num_exist;
struct worklist *indices[MAX_PROCS_RING];
int num_bytes;
@@ -1541,7 +1546,7 @@
vs_bytes = 0;
num_vs_ptr = (int32 *)&Temp_buf[0];
vs_bytes+= sizeof( int32 );
- *num_vs_ptr = 0;
+ num_vs = 0;
changed = 0;
orig_grp = NULL;
@@ -1592,7 +1597,7 @@
/* add this non-new member to vs */
memcpy( &Temp_buf[vs_bytes], mbr->private_name, MAX_GROUP_NAME );
vs_bytes += MAX_GROUP_NAME;
- (*num_vs_ptr)++;
+ num_vs++;
}
}else{
/* not the same grp_id */
@@ -1609,6 +1614,8 @@
sl_remove(indices[i]->groups, currentgroup, dispose);
}
+ memcpy( num_vs_ptr, &num_vs, sizeof( int32 ) ); /* *num_vs_ptr = current count; */
+
/* now our orig_grp is almost updated */
grp = orig_grp;
@@ -1856,6 +1863,7 @@
struct skiplistnode *iter;
member *mbr;
char *membs_ptr;
+ int32 num_vs;
num_bytes = G_build_memb_buf( grp, msg, buf);
head_ptr = Message_get_message_header(msg);
@@ -1865,7 +1873,7 @@
num_vs_ptr = (int32 *)&buf[num_bytes];
num_bytes += sizeof( int32 );
head_ptr->data_len += sizeof( int32 );
- *num_vs_ptr = 0;
+ num_vs = 0;
iter = sl_getlist( &grp->MembersList );
mbr = (iter)?(member *)iter->data:NULL;
@@ -1875,11 +1883,12 @@
{
membs_ptr = (char *)&buf[num_bytes];
memcpy( membs_ptr, mbr->private_name, MAX_GROUP_NAME );
- (*num_vs_ptr)++ ;
+ num_vs++ ;
num_bytes += MAX_GROUP_NAME;
head_ptr->data_len += MAX_GROUP_NAME;
}
}
+ memcpy( num_vs_ptr, &num_vs, sizeof( int32 ) ); /* *num_vs_ptr = total count; */
return( num_bytes );
}
@@ -1917,6 +1926,7 @@
member *mbr;
struct skiplistnode *giter, *iter;
int16 *num_memb_ptr;
+ int16 num_memb;
char *memb_ptr;
int size_for_this_group;
@@ -1947,7 +1957,7 @@
num_memb_ptr = (int16 *)&buf[num_bytes];
num_bytes += sizeof( int16 );
- *num_memb_ptr = 0;
+ num_memb = 0;
iter = sl_getlist( &grp->MembersList );
mbr = (iter)?(member *)iter->data:NULL;
@@ -1958,13 +1968,14 @@
memb_ptr = (char *)&buf[num_bytes];
num_bytes += MAX_GROUP_NAME;
memcpy( memb_ptr, mbr->private_name, MAX_GROUP_NAME );
- (*num_memb_ptr)++;
+ num_memb++;
}
- if( (*num_memb_ptr) != grp->num_local )
+ if( num_memb != grp->num_local )
Alarm( EXIT, "G_build_groups_buf: group %s has %d %d members\n",
- grp->name, (*num_memb_ptr), grp->num_local );
+ grp->name, num_memb, grp->num_local );
}
+ memcpy(num_memb_ptr, &num_memb, sizeof( int16 ) );
*iter_ptr = giter;
return( num_bytes );
}
@@ -1982,6 +1993,7 @@
char *gid_ptr;
member *mbr;
int16 *num_memb_ptr;
+ int16 num_memb;
int i;
total_bytes = 0;
@@ -2031,6 +2043,7 @@
num_memb_ptr = (int16 *)&Temp_buf[num_bytes];
num_bytes += sizeof( int16 );
+ memcpy( &num_memb, num_memb_ptr, sizeof( int16 ) );
if( !Same_endian( head_ptr->type ) )
{
@@ -2040,10 +2053,10 @@
grp->grp_id.index = Flip_int32( grp->grp_id.index );
/* flip other parts of the message */
- *num_memb_ptr = Flip_int16( *num_memb_ptr );
+ num_memb = Flip_int16( num_memb );
}
/* creating members */
- for( i=0; i < *num_memb_ptr; i++ )
+ for( i=0; i < num_memb; i++ )
{
mbr = new( MEMBER );
@@ -2055,7 +2068,8 @@
sl_append( &grp->MembersList, mbr );
}
- grp->num_members = *num_memb_ptr;
+ grp->num_members = num_memb;
+ memcpy( num_memb_ptr, &num_memb, sizeof( int16 ) );
}
return( 0 );
}
More information about the Spread-cvs
mailing list