diff options
author | Neal H. Walfield <neal@gnu.org> | 2009-03-17 20:31:22 +0100 |
---|---|---|
committer | Neal H. Walfield <neal@gnu.org> | 2009-03-17 20:31:22 +0100 |
commit | b8ed270b55f50f25379f2c236fff41afe41ab12d (patch) | |
tree | 4ff4a9fe2b14296de02c2953e888b1cb9b7cdb3c | |
parent | 979756b27981ecd8983716e022b408512ababf48 (diff) |
Replace some macros with inline functions.
-rw-r--r-- | viengoos/object.h | 87 |
1 files changed, 52 insertions, 35 deletions
diff --git a/viengoos/object.h b/viengoos/object.h index 9452add..52b4c4c 100644 --- a/viengoos/object.h +++ b/viengoos/object.h @@ -225,6 +225,58 @@ struct object_desc is cheap but problematic if there are large holes in the physical memory map. */ extern struct object_desc *object_descs; + +static inline void +object_desc_p (struct object_desc *desc) +{ + struct object_desc *first = object_descs; + struct object_desc *last = &object_descs[(last_frame - first_frame) + / PAGESIZE]; + + assertx ((uintptr_t) first <= (uintptr_t) desc + && (uintptr_t) desc <= (uintptr_t) last, + "Invalid object desc: %"PRIxPTR" <= %"PRIxPTR" <= %"PRIxPTR, + (uintptr_t) first, (uintptr_t) desc, (uintptr_t) last); +} + +static inline int +object_desc_index(struct object_desc *desc) +{ + object_desc_p (desc); + return ((uintptr_t) desc - (uintptr_t) object_descs) + / sizeof (struct object_desc); +} + +/* Return the object corresponding to the object descriptor DESC. */ +static struct vg_object * +object_desc_to_object(struct object_desc *desc) +{ + return (struct vg_object *) + (first_frame + object_desc_index (desc) * PAGESIZE); +} + +/* Return the object descriptor corresponding to the object + OBJECT. */ +static struct object_desc * +object_to_object_desc (struct vg_object *object) +{ + /* Objects better be on a page boundary. */ + assert (((uintptr_t) object & (PAGESIZE - 1)) == 0); + /* And they better be in memory. */ + assertx (first_frame <= (uintptr_t) object, + "%"PRIxPTR" <= %p <= %"PRIxPTR, + first_frame, object, last_frame); + assertx ((uintptr_t) object <= last_frame, + "%"PRIxPTR" <= %p <= %"PRIxPTR, + first_frame, object, last_frame); + + struct object_desc *desc = &object_descs[((uintptr_t) object - first_frame) + / PAGESIZE]; + object_desc_p (desc); + + return desc; +} + /* This does not really belong here but there isn't really a better place. The first reason is that it relies on the definition of @@ -303,41 +355,6 @@ extern struct vg_object *memory_object_alloc (struct activity *activity, extern void memory_object_destroy (struct activity *activity, struct vg_object *object); -/* Return the object corresponding to the object descriptor DESC. */ -#define object_desc_to_object(desc_) \ - ({ \ - struct object_desc *desc__ = (desc_); \ - /* There is only one legal area for descriptors. */ \ - assertx ((uintptr_t) object_descs <= (uintptr_t) (desc__), \ - "%"PRIxPTR" > %"PRIxPTR, \ - (uintptr_t) object_descs, (uintptr_t) (desc__)); \ - assert ((uintptr_t) (desc__) \ - <= (uintptr_t) &object_descs[(last_frame - first_frame) \ - / PAGESIZE]); \ - \ - (struct vg_object *) (first_frame \ - + (((uintptr_t) (desc__) - (uintptr_t) object_descs) \ - / sizeof (struct object_desc)) * PAGESIZE); \ - }) - -/* Return the object descriptor corresponding to the object - OBJECT. */ -#define object_to_object_desc(object_) \ - ({ \ - struct vg_object *object__ = (object_); \ - /* Objects better be on a page boundary. */ \ - assert (((uintptr_t) (object__) & (PAGESIZE - 1)) == 0); \ - /* And they better be in memory. */ \ - assertx (first_frame <= (uintptr_t) (object__), \ - "%"PRIxPTR" <= %p <= %"PRIxPTR, \ - first_frame, object__, last_frame); \ - assertx ((uintptr_t) (object__) <= last_frame, \ - "%"PRIxPTR" <= %p <= %"PRIxPTR, \ - first_frame, object__, last_frame); \ - \ - &object_descs[((uintptr_t) (object__) - first_frame) / PAGESIZE]; \ - }) - /* Return a vg_cap referencing the object designated by OBJECT_DESC. */ static inline struct vg_cap object_desc_to_cap (struct object_desc *desc) |