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:
parent
91eb96a113
commit
58bed5beca
3 changed files with 72 additions and 59 deletions
|
@ -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 *);
|
||||||
|
|
|
@ -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,7 +685,8 @@ 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;
|
||||||
}
|
}
|
||||||
|
@ -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). */
|
||||||
|
if (p->rep_index >= 0) {
|
||||||
|
pobj_slot = POBJ2REPSLOT (p);
|
||||||
|
|
||||||
/* TODO: switch to set_range update. */
|
/* TODO: switch to set_range update. */
|
||||||
Tset (xid, pobj_slot->rid, p);
|
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). */
|
||||||
|
if (p->rep_index >= 0) {
|
||||||
|
pobj_slot = POBJ2REPSLOT (p);
|
||||||
|
|
||||||
/* TODO: switch to set_range update. */
|
/* TODO: switch to set_range update. */
|
||||||
Tset (xid, pobj_slot->rid, p);
|
Tset (xid, pobj_slot->rid, p);
|
||||||
|
|
||||||
pobj_end ();
|
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) {
|
||||||
|
pobj_slot = POBJ2REPSLOT (p);
|
||||||
|
|
||||||
|
/* TODO: switch to set_range update; note the is_changed field! */
|
||||||
Tset (xid, pobj_slot->rid, p);
|
Tset (xid, pobj_slot->rid, p);
|
||||||
|
|
||||||
pobj_end ();
|
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). */
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
pobj_static_set_ref (&list, tmp);
|
||||||
|
|
||||||
|
data->val = -i;
|
||||||
|
|
||||||
|
tmp->val = i;
|
||||||
|
tmp->data = data;
|
||||||
|
tmp->next = next;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
tmp->val = i;
|
|
||||||
tmp->next = next;
|
|
||||||
#endif
|
|
||||||
pobj_static_set_ref (&list, tmp);
|
|
||||||
POBJ_SET_INT (tmp, val, i);
|
POBJ_SET_INT (tmp, val, i);
|
||||||
|
|
||||||
/* Intended crash code... */
|
/* Intended crash code... */
|
||||||
#if 0
|
|
||||||
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 ();
|
||||||
|
|
Loading…
Reference in a new issue