[Mono.Runtime.Tests] Exclude simd tests
[mono-project.git] / mono / metadata / mono-ptr-array.h
blob70694eff8f223a11fa2e9d3395716adbfb8de26f
1 /**
2 * \file
3 * GC aware equivalente of g_ptr_array
5 * Author:
6 * Rodrigo Kumpera <rkumpera@novell.com>
8 * (C) 2010 Novell, Inc
9 */
11 #ifndef __MONO_PTR_ARRAY_H__
12 #define __MONO_PTR_ARRAY_H__
15 #include <glib.h>
17 #include "mono/metadata/gc-internals.h"
19 /* This is an implementation of a growable pointer array that avoids doing memory allocations for small sizes.
20 * It works by allocating an initial small array on stack and only going to gc tracked memory if needed.
21 * The array elements are assumed to be object references.
23 typedef struct {
24 void **data;
25 int size;
26 int capacity;
27 MonoGCRootSource source;
28 void *key;
29 const char *msg;
30 } MonoPtrArray;
32 #define MONO_PTR_ARRAY_MAX_ON_STACK (16)
34 #define mono_ptr_array_init(ARRAY, INITIAL_SIZE, SOURCE, KEY, MSG) do {\
35 (ARRAY).size = 0; \
36 (ARRAY).capacity = MAX (INITIAL_SIZE, MONO_PTR_ARRAY_MAX_ON_STACK); \
37 (ARRAY).source = SOURCE; \
38 (ARRAY).key = KEY; \
39 (ARRAY).msg = MSG; \
40 (ARRAY).data = INITIAL_SIZE > MONO_PTR_ARRAY_MAX_ON_STACK \
41 ? (void **)mono_gc_alloc_fixed (sizeof (void*) * INITIAL_SIZE, mono_gc_make_root_descr_all_refs (INITIAL_SIZE), SOURCE, NULL, MSG) \
42 : g_newa (void*, MONO_PTR_ARRAY_MAX_ON_STACK); \
43 } while (0)
45 #define mono_ptr_array_destroy(ARRAY) do {\
46 if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \
47 mono_gc_free_fixed ((ARRAY).data); \
48 } while (0)
50 #define mono_ptr_array_append(ARRAY, VALUE) do { \
51 if ((ARRAY).size >= (ARRAY).capacity) {\
52 void **__tmp = (void **)mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, mono_gc_make_root_descr_all_refs ((ARRAY).capacity * 2), (ARRAY).source, (ARRAY).key, (ARRAY).msg); \
53 mono_gc_memmove_aligned ((void *)__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
54 if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \
55 mono_gc_free_fixed ((ARRAY).data); \
56 (ARRAY).data = __tmp; \
57 (ARRAY).capacity *= 2;\
59 ((ARRAY).data [(ARRAY).size++] = VALUE); \
60 } while (0)
62 #define mono_ptr_array_sort(ARRAY, COMPARE_FUNC) do { \
63 qsort ((ARRAY).data, (ARRAY).size, sizeof (gpointer), (COMPARE_FUNC)); \
64 } while (0)
66 #define mono_ptr_array_set(ARRAY, IDX, VALUE) do { \
67 ((ARRAY).data [(IDX)] = VALUE); \
68 } while (0)
70 #define mono_ptr_array_get(ARRAY, IDX) ((ARRAY).data [(IDX)])
72 #define mono_ptr_array_size(ARRAY) ((ARRAY).size)
74 #define mono_ptr_array_reset(ARRAY) do { \
75 (ARRAY).size = 0; \
76 } while (0)
78 #define mono_ptr_array_clear(ARRAY) do { \
79 (ARRAY).size = 0; \
80 mono_gc_bzero_aligned ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \
81 } while (0)
83 #endif