Add sequence numbers to game state

This oopses on output dependency violations, e.g. two threads doing a
read-modify-write without synchronization, or the one thread nesting
several read-modify-writes.  Such bugs are difficult to spot, and tend
to be abusable.  I figure we have quite a few of them.

New struct emptypedstr member seqno.  Make sure all members of unit
empobj_storage share it.  Initialize it in files: main() and
file_sct_init().  Set it in ef_blank() and new ef_set_uid() by calling
new get_seqno().  Use ef_set_uid() when copying objects: swaps(),
doland(), doship(), doplane(), dounit(), delete_old_news().  Step it
in ef_write() by calling new new_seqno().

Factor do_read() out of fillcache() to make it available for
get_seqno().
This commit is contained in:
Markus Armbruster 2008-05-17 22:44:00 +02:00
parent 087c0aae36
commit 536ef0b0a2
20 changed files with 134 additions and 19 deletions

View file

@ -155,6 +155,7 @@ main(int argc, char *argv[])
for (i = 1; i < MAXNOC; i++) {
nat.ef_type = EF_NATION;
nat.nat_cnum = nat.nat_uid = i;
nat.nat_seqno = 0;
putnat((&nat));
}
memset(&realm, 0, sizeof(realm));
@ -164,6 +165,7 @@ main(int argc, char *argv[])
for (j = 0; j < MAXNOR; j++) {
realm.r_realm = j;
realm.r_uid = (i * MAXNOR) + j;
realm.r_seqno = 0;
putrealm(&realm);
}
}
@ -209,6 +211,7 @@ file_sct_init(coord x, coord y, struct sctstr *ptr)
sp->ef_type = EF_SECTOR;
sp->sct_uid = XYOFFSET(x, y);
sp->sct_seqno = 0;
sp->sct_x = x;
sp->sct_y = y;
sp->sct_dist_x = x;