X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=libringbuffer%2Fshm.h;h=9f72a5a248657f73c3176877d2e6357930dd10db;hb=cba4b7a3bf98faff4c905f71064f7d66b9869e79;hp=008c5c415f3d8d9c383fdcaa3620cb36a06bc46d;hpb=5d61a504c6d395914d78f97e82f6fd0fdf0f98a0;p=lttng-ust.git diff --git a/libringbuffer/shm.h b/libringbuffer/shm.h index 008c5c41..9f72a5a2 100644 --- a/libringbuffer/shm.h +++ b/libringbuffer/shm.h @@ -14,37 +14,38 @@ #include "ust/core.h" #include "shm_types.h" -#define SHM_MAGIC 0x54335433 -#define SHM_MAJOR 0 -#define SHM_MINOR 1 - /* * Pointer dereferencing. We don't trust the shm_ref, so we validate * 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 idx, size_t elem_size) { struct shm_object *obj; - size_t index, offset; + size_t objindex, ref_offset; - index = (size_t) ref->index; - if (unlikely(index >= table->allocated_len)) + objindex = (size_t) ref->index; + if (unlikely(objindex >= table->allocated_len)) return NULL; - obj = &table->objects[index]; - offset = (size_t) ref->offset; - if (unlikely(offset >= obj->memory_map_size)) + obj = &table->objects[objindex]; + ref_offset = (size_t) ref->offset; + ref_offset += idx * elem_size; + /* Check if part of the element returned would exceed the limits. */ + if (unlikely(ref_offset + elem_size > 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, index) \ ({ \ __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, index, 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) {