Some changes to pobj.c to support operations for non-persistent (transient)

objects. Enhancement to test-list program to work with transient objects
as well. Minor fix to header file (typo).
This commit is contained in:
Gilad Arnold 2004-12-16 23:04:21 +00:00
parent 91eb96a113
commit 58bed5beca
3 changed files with 72 additions and 59 deletions

View file

@ -98,7 +98,7 @@ int pobj_set_ref (void *, void *, void *);
int pobj_update_range (void *, void *, size_t); int pobj_update_range (void *, void *, size_t);
#define POBJ_UPDATE_FLD(obj,fld) \ #define POBJ_UPDATE_FLD(obj,fld) \
pobj_update_range((obj), &((obj)->fld), sizeof((obj)->fld)) pobj_update_range((obj), &((obj)->fld), sizeof((obj)->fld))
#define pobj_UPDATE(obj) pobj_update_range ((obj), NULL, 0) #define POBJ_UPDATE(obj) pobj_update_range ((obj), NULL, 0)
int pobj_update_recursive (void *); int pobj_update_recursive (void *);
int pobj_static_set_ref (void *, void *); int pobj_static_set_ref (void *, void *);

View file

@ -211,7 +211,7 @@ pobj_persistify (void *obj)
size_t pobj_size; size_t pobj_size;
if (! g_is_init) if (! g_is_init)
return; return -1;
if (p->rep_index >= 0) if (p->rep_index >= 0)
return 0; /* already persistent. */ return 0; /* already persistent. */
@ -669,15 +669,9 @@ pobj_ref_flag_update (void *obj, void **fld, int set)
int bit; int bit;
unsigned long *flags_ptr; unsigned long *flags_ptr;
unsigned long flags, mask; unsigned long flags, mask;
int xid; int xid = -1;
int ret; int ret;
if (p->rep_index < 0) {
debug ("error: object is non-persistent");
return -1;
}
pobj_slot = POBJ2REPSLOT (p);
/* Bound check. */ /* Bound check. */
/* TODO: is this worthwhile? */ /* TODO: is this worthwhile? */
if ((char *) obj > (char *) fld if ((char *) obj > (char *) fld
@ -691,11 +685,12 @@ pobj_ref_flag_update (void *obj, void **fld, int set)
return -1; return -1;
} }
if ((xid = pobj_start ()) < 0) { /* Open transaction context (persistent objects only). */
if (p->rep_index >= 0 && (xid = pobj_start ()) < 0) {
debug ("error: begin transaction failed, aborted"); debug ("error: begin transaction failed, aborted");
return -1; return -1;
} }
/* Update reference flags to allow reference adjustment during recovery. */ /* Update reference flags to allow reference adjustment during recovery. */
/* TODO: do we want to protect manipulation of object meta-data? Basically, /* TODO: do we want to protect manipulation of object meta-data? Basically,
* it should be protected, although changes are monotonic, but that will * it should be protected, although changes are monotonic, but that will
@ -720,11 +715,15 @@ pobj_ref_flag_update (void *obj, void **fld, int set)
*flags_ptr = flags & ~mask; *flags_ptr = flags & ~mask;
} }
/* Update corresponding record. */ /* Update corresponding record (persistent objects only). */
/* TODO: switch to set_range update. */ if (p->rep_index >= 0) {
Tset (xid, pobj_slot->rid, p); pobj_slot = POBJ2REPSLOT (p);
/* TODO: switch to set_range update. */
Tset (xid, pobj_slot->rid, p);
pobj_end (); pobj_end ();
}
return ret; return ret;
} }
@ -751,21 +750,16 @@ pobj_ref_typify (void *obj, int *reflist)
int flags_offset; int flags_offset;
int bit; int bit;
unsigned long *flags_ptr; unsigned long *flags_ptr;
int xid; int xid = -1;
int count; int count;
if (p->rep_index < 0) {
debug ("error: object is non-persistent");
return -1;
}
pobj_slot = POBJ2REPSLOT (p);
if (! reflist) { if (! reflist) {
debug ("error: null reference list provided, aborted"); debug ("error: null reference list provided, aborted");
return -1; return -1;
} }
if ((xid = pobj_start ()) < 0) { /* Open transaction context (persistent objects only). */
if (p->rep_index >= 0 && (xid = pobj_start ()) < 0) {
debug ("error: begin transaction failed, aborted"); debug ("error: begin transaction failed, aborted");
return -1; return -1;
} }
@ -803,11 +797,15 @@ pobj_ref_typify (void *obj, int *reflist)
debug ("...done (%d total)", count); debug ("...done (%d total)", count);
/* Update corresponding record. */ /* Update corresponding record (persistent objects only). */
/* TODO: switch to set_range update. */ if (p->rep_index >= 0) {
Tset (xid, pobj_slot->rid, p); pobj_slot = POBJ2REPSLOT (p);
pobj_end (); /* TODO: switch to set_range update. */
Tset (xid, pobj_slot->rid, p);
pobj_end ();
}
return 0; return 0;
} }
@ -822,13 +820,7 @@ pobj_memcpy_memset_typed (void *obj, void *fld, void *data, int c, size_t len,
#ifdef HAVE_IMPLICIT_TYPES #ifdef HAVE_IMPLICIT_TYPES
int is_changed = 0; int is_changed = 0;
#endif /* HAVE_IMPLICIT_TYPES */ #endif /* HAVE_IMPLICIT_TYPES */
int xid; int xid = -1;
if (p->rep_index < 0) {
debug ("error: object is non-persistent");
return -1;
}
pobj_slot = POBJ2REPSLOT (p);
/* Safety check. */ /* Safety check. */
/* TODO: is this worthwhile? */ /* TODO: is this worthwhile? */
@ -839,6 +831,12 @@ pobj_memcpy_memset_typed (void *obj, void *fld, void *data, int c, size_t len,
return -1; return -1;
} }
/* Open transaction context (persistent objects only). */
if (p->rep_index >= 0 && (xid = pobj_start ()) < 0) {
debug ("error: begin transaction failed, aborted");
return -1;
}
#ifdef HAVE_IMPLICIT_TYPES #ifdef HAVE_IMPLICIT_TYPES
if (is_typed) { if (is_typed) {
switch (pobj_ref_type_enforce (obj, fld, len, is_ref)) { switch (pobj_ref_type_enforce (obj, fld, len, is_ref)) {
@ -857,22 +855,21 @@ pobj_memcpy_memset_typed (void *obj, void *fld, void *data, int c, size_t len,
} }
#endif /* HAVE_IMPLICIT_TYPES */ #endif /* HAVE_IMPLICIT_TYPES */
if ((xid = pobj_start ()) < 0) {
debug ("error: begin transaction failed, aborted");
return -1;
}
/* Update memory object field. */ /* Update memory object field. */
if (is_copy) if (is_copy)
memcpy (fld, data, len); memcpy (fld, data, len);
else else
memset (fld, c, len); memset (fld, c, len);
/* Update corresponding record. */ /* Update corresponding record (persistent objects only). */
/* TODO: switch to set_range update; not the is_changed field! */ if (p->rep_index >= 0) {
Tset (xid, pobj_slot->rid, p); pobj_slot = POBJ2REPSLOT (p);
pobj_end (); /* TODO: switch to set_range update; note the is_changed field! */
Tset (xid, pobj_slot->rid, p);
pobj_end ();
}
return 0; return 0;
} }
@ -932,10 +929,9 @@ pobj_update_range (void *obj, void *fld, size_t len)
struct pobj_rep_list_item *pobj_slot; struct pobj_rep_list_item *pobj_slot;
int xid; int xid;
if (p->rep_index < 0) { if (p->rep_index < 0)
debug ("error: object is non-persistent"); return 0; /* transient mode. */
return -1;
}
pobj_slot = POBJ2REPSLOT (p); pobj_slot = POBJ2REPSLOT (p);
/* Safety check (only if len is non-zero). */ /* Safety check (only if len is non-zero). */

View file

@ -3,12 +3,18 @@
#include <pobj/pobj.h> #include <pobj/pobj.h>
struct data {
int val;
};
struct item { struct item {
int val; int val;
struct data *data;
struct item *next; struct item *next;
int dummy[45]; int dummy[45];
}; };
int item_ref_fields[] = { int item_ref_fields[] = {
member_offset(struct item, data),
member_offset(struct item, next), member_offset(struct item, next),
-1 -1
}; };
@ -17,6 +23,7 @@ int
main (int argc, char **argv) main (int argc, char **argv)
{ {
static struct item *list = NULL; static struct item *list = NULL;
struct data *data;
struct item *tmp, *next; struct item *tmp, *next;
int i; int i;
@ -27,29 +34,38 @@ main (int argc, char **argv)
next = NULL; next = NULL;
for (i = 0; i < 15000; i++) { for (i = 0; i < 15000; i++) {
pobj_start (); pobj_start ();
tmp = (struct item *) pobj_malloc (sizeof (struct item)); tmp = (struct item *) pobj_malloc (sizeof (struct item));
if (! tmp) { data = (struct data *) pobj_malloc_transient (sizeof (struct data));
if (! (tmp && data)) {
printf ("allocation error\n"); printf ("allocation error\n");
abort (); abort ();
} }
/* pobj_ref_typify (tmp, item_ref_fields); */ pobj_ref_typify (tmp, item_ref_fields);
#if 0
tmp->val = i;
tmp->next = next;
#endif
pobj_static_set_ref (&list, tmp); pobj_static_set_ref (&list, tmp);
POBJ_SET_INT (tmp, val, i);
/* Intended crash code... */ data->val = -i;
tmp->val = i;
tmp->data = data;
tmp->next = next;
#if 0 #if 0
POBJ_SET_INT (tmp, val, i);
/* Intended crash code... */
if (i == 7) if (i == 7)
abort (); abort ();
#endif
POBJ_SET_REF (tmp, next, next); POBJ_SET_REF (tmp, next, next);
#endif
POBJ_UPDATE (tmp);
pobj_end (); pobj_end ();
/* pobj_update (tmp); */
next = tmp; next = tmp;
} }
/* pobj_update_recursive (tmp); */ /* pobj_update_recursive (tmp); */
@ -73,8 +89,9 @@ main (int argc, char **argv)
/* Print list. */ /* Print list. */
printf ("printing list...\n"); printf ("printing list...\n");
for (tmp = list; tmp; tmp = tmp->next) for (tmp = list; tmp; tmp = tmp->next)
printf ("%p: val=%d next=%p\n", printf ("%p: val=%d next=%p data=%p data->val=%d\n",
(void *) tmp, tmp->val, (void *) tmp->next); (void *) tmp, tmp->val, (void *) tmp->next,
(void *) tmp->data, (tmp->data ? tmp->data->val : 0));
printf ("...done\n"); printf ("...done\n");
pobj_shutdown (); pobj_shutdown ();