X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.h;h=f5cc8e69a2b7a62faf9f614dec2489f99ccee96d;hb=4746ae29409b78e96543a3b207c91a3c510c6476;hp=da466df734c0f7b9a51ad54f3c41fbaf70fe5cb5;hpb=260cdac788ddd0ab0ff6f413bf9166a50df203b6;p=lttng-ust.git diff --git a/libringbuffer/shm.h b/libringbuffer/shm.h index da466df7..f5cc8e69 100644 --- a/libringbuffer/shm.h +++ b/libringbuffer/shm.h @@ -19,28 +19,32 @@ * both the index and offset with known boundaries. */ static inline -char *_shmp(struct shm_object_table *table, struct shm_ref *ref) +char *_shmp_offset(struct shm_object_table *table, struct shm_ref *ref, + size_t offset) { struct shm_object *obj; - size_t index, offset; + size_t index, ref_offset; index = (size_t) ref->index; if (unlikely(index >= table->allocated_len)) return NULL; obj = &table->objects[index]; - offset = (size_t) ref->offset; - if (unlikely(offset >= obj->memory_map_size)) + ref_offset = (size_t) ref->offset; + ref_offset += offset; + if (unlikely(ref_offset >= obj->memory_map_size)) return NULL; - return &obj->memory_map[offset]; + return &obj->memory_map[ref_offset]; } -#define shmp(handle, ref) \ +#define shmp_index(handle, ref, offset) \ ({ \ __typeof__((ref)._type) ____ptr_ret; \ - ____ptr_ret = (__typeof__(____ptr_ret)) _shmp((handle)->table, &(ref)._ref); \ + ____ptr_ret = (__typeof__(____ptr_ret)) _shmp_offset((handle)->table, &(ref)._ref, ((offset) * sizeof(*____ptr_ret))); \ ____ptr_ret; \ }) +#define shmp(handle, ref) shmp_index(handle, ref, 0) + static inline void _set_shmp(struct shm_ref *ref, struct shm_ref src) {