http-bench

http-bench.git
git clone git://git.lenczewski.org/http-bench.git
Log | Files | Refs | README | LICENSE

arena.h (1047B)


      1 #ifndef ARENA_H
      2 #define ARENA_H
      3 
      4 #include <stdalign.h>
      5 #include <stddef.h>
      6 #include <stdint.h>
      7 
      8 #define IS_POWER_OF_2(v) (((v) & ((v) - 1)) == 0)
      9 
     10 #define IS_ALIGNED(v, align) (((v) & ((align) - 1)) == 0)
     11 #define ALIGN_PREV(v, align) ((v) & ~((align) - 1))
     12 #define ALIGN_NEXT(v, align) ALIGN_PREV(((v) + ((align) - 1)), (align))
     13 
     14 struct arena {
     15 	void *ptr;
     16 	size_t cap, len;
     17 };
     18 
     19 static inline void
     20 arena_reset(struct arena *arena)
     21 {
     22 	arena->len = 0;
     23 }
     24 
     25 static inline void *
     26 arena_alloc(struct arena *arena, size_t size, size_t alignment)
     27 {
     28 	uintptr_t cur_ptr = (uintptr_t) arena->ptr + arena->len;
     29 	uintptr_t end_ptr = (uintptr_t) arena->ptr + arena->cap;
     30 
     31 	uintptr_t aligned_ptr = ALIGN_NEXT(cur_ptr, alignment);
     32 	if (end_ptr < aligned_ptr + size)
     33 		return NULL;
     34 
     35 	arena->len = (aligned_ptr + size) - (uintptr_t) arena->ptr;
     36 
     37 	return (void *) aligned_ptr;
     38 }
     39 
     40 #define ARENA_ALLOC_ARRAY(arena, T, n) \
     41 	arena_alloc((arena), sizeof(T) * (n), alignof(T))
     42 
     43 #define ARENA_ALLOC_SIZED(arena, T) \
     44 	ARENA_ALLOC_ARRAY((arena), T, 1)
     45 
     46 #endif /* ARENA_H */