file: New ef_typedstr_eq(), factored out of obj_changed()

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
Markus Armbruster 2014-02-09 17:26:44 +01:00
parent e70d8f07f9
commit 7d3a3df283
3 changed files with 19 additions and 14 deletions

View file

@ -223,6 +223,7 @@ extern int ef_flush(int);
extern void ef_blank(int, int, void *);
extern int ef_write(int, int, void *);
extern void ef_set_uid(int, void *, int);
extern int ef_typedstr_eq(struct ef_typedstr *, struct ef_typedstr *);
extern int ef_extend(int, int);
extern int ef_ensure_space(int, int, int);
extern int ef_id_limit(int);

View file

@ -29,7 +29,7 @@
* Known contributors to this file:
* Dave Pare, 1989
* Steve McClure, 2000
* Markus Armbruster, 2005-2013
* Markus Armbruster, 2005-2014
*/
#include <config.h>
@ -600,6 +600,19 @@ ef_set_uid(int type, void *buf, int uid)
elt->seqno = get_seqno(ep, uid);
}
/*
* Are *A and *B equal, except for timestamps and such?
*/
int
ef_typedstr_eq(struct ef_typedstr *a, struct ef_typedstr *b)
{
return a->ef_type == b->ef_type
&& a->seqno == b->seqno
&& a->uid == b->uid
&& !memcmp((char *)a + sizeof(*a), (char *)b + sizeof(*a),
empfile[a->ef_type].size - sizeof(*a));
}
/*
* Return sequence number of element ID in table EP.
* Return zero if table is not EFF_TYPED (it has no sequence number

View file

@ -28,7 +28,7 @@
*
* Known contributors to this file:
* Steve McClure, 1998
* Markus Armbruster, 2004-2012
* Markus Armbruster, 2004-2014
*/
#include <config.h>
@ -41,24 +41,15 @@
#include "prototypes.h"
#include "xy.h"
/* Note that timestamps make things tricky. And, we don't
* really care about the timestamp, we just care about the rest
* of the structure. So, we make a copy, and zero the timestamps
* in both copies, and then compare. */
static int
obj_changed(struct empobj *obj)
{
union empobj_storage old, tobj;
size_t sz;
union empobj_storage old;
if (!get_empobj(obj->ef_type, obj->uid, &old))
return 0;
sz = empfile[obj->ef_type].size;
memcpy(&tobj, obj, sz);
old.gen.timestamp = tobj.gen.timestamp = 0;
old.gen.generation = tobj.gen.generation = 0;
if (memcmp(&tobj, &old, sz))
if (!ef_typedstr_eq((struct ef_typedstr *)&old,
(struct ef_typedstr *)obj))
return 1;
ef_mark_fresh(obj->ef_type, obj);
return 0;