2 * mono-ptr-array.h: GC aware equivalente of g_ptr_array
5 * Rodrigo Kumpera <rkumpera@novell.com>
10 #ifndef __MONO_PTR_ARRAY_H__
11 #define __MONO_PTR_ARRAY_H__
16 #include "mono/metadata/gc-internal.h"
18 /* This is an implementation of a growable pointer array that avoids doing memory allocations for small sizes.
19 * It works by allocating an initial small array on stack and only going to gc tracked memory if needed.
20 * The array elements are assumed to be object references.
28 #define MONO_PTR_ARRAY_MAX_ON_STACK (16)
30 #define mono_ptr_array_init(ARRAY, INITIAL_SIZE) do {\
32 (ARRAY).capacity = MAX (INITIAL_SIZE, MONO_PTR_ARRAY_MAX_ON_STACK); \
33 (ARRAY).data = INITIAL_SIZE > MONO_PTR_ARRAY_MAX_ON_STACK ? mono_gc_alloc_fixed (sizeof (void*) * INITIAL_SIZE, mono_gc_make_root_descr_all_refs (INITIAL_SIZE)) : g_newa (void*, MONO_PTR_ARRAY_MAX_ON_STACK); \
36 #define mono_ptr_array_destroy(ARRAY) do {\
37 if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \
38 mono_gc_free_fixed ((ARRAY).data); \
41 #define mono_ptr_array_append(ARRAY, VALUE) do { \
42 if ((ARRAY).size >= (ARRAY).capacity) {\
43 void *__tmp = mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, mono_gc_make_root_descr_all_refs ((ARRAY).capacity * 2)); \
44 mono_gc_memmove_aligned (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
45 if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \
46 mono_gc_free_fixed ((ARRAY).data); \
47 (ARRAY).data = __tmp; \
48 (ARRAY).capacity *= 2;\
50 ((ARRAY).data [(ARRAY).size++] = VALUE); \
53 #define mono_ptr_array_sort(ARRAY, COMPARE_FUNC) do { \
54 qsort ((ARRAY).data, (ARRAY).size, sizeof (gpointer), (COMPARE_FUNC)); \
57 #define mono_ptr_array_set(ARRAY, IDX, VALUE) do { \
58 ((ARRAY).data [(IDX)] = VALUE); \
61 #define mono_ptr_array_get(ARRAY, IDX) ((ARRAY).data [(IDX)])
63 #define mono_ptr_array_size(ARRAY) ((ARRAY).size)
65 #define mono_ptr_array_reset(ARRAY) do { \
69 #define mono_ptr_array_clear(ARRAY) do { \
71 mono_gc_bzero_aligned ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \