X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmono-ptr-array.h;h=61589f3bbbdec2d9a1fd7520c884efa399b9d919;hb=3b9f8e8d77e139118bc54e08185bdb8322570ab0;hp=a828f4e9f4db396d02d12dde27384493aae46a81;hpb=5a35198e2fdb794d48af81d80e783644a29d7291;p=mono.git diff --git a/mono/metadata/mono-ptr-array.h b/mono/metadata/mono-ptr-array.h index a828f4e9f4d..61589f3bbbd 100644 --- a/mono/metadata/mono-ptr-array.h +++ b/mono/metadata/mono-ptr-array.h @@ -1,5 +1,6 @@ -/* - * mono-ptr-array.h: GC aware equivalente of g_ptr_array +/** + * \file + * GC aware equivalente of g_ptr_array * * Author: * Rodrigo Kumpera @@ -13,7 +14,7 @@ #include -#include "mono/metadata/gc-internal.h" +#include "mono/metadata/gc-internals.h" /* This is an implementation of a growable pointer array that avoids doing memory allocations for small sizes. * It works by allocating an initial small array on stack and only going to gc tracked memory if needed. @@ -23,14 +24,20 @@ typedef struct { void **data; int size; int capacity; + MonoGCRootSource source; + const char *msg; } MonoPtrArray; #define MONO_PTR_ARRAY_MAX_ON_STACK (16) -#define mono_ptr_array_init(ARRAY, INITIAL_SIZE) do {\ +#define mono_ptr_array_init(ARRAY, INITIAL_SIZE, SOURCE, MSG) do {\ (ARRAY).size = 0; \ (ARRAY).capacity = MAX (INITIAL_SIZE, MONO_PTR_ARRAY_MAX_ON_STACK); \ - (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); \ + (ARRAY).source = SOURCE; \ + (ARRAY).msg = MSG; \ + (ARRAY).data = INITIAL_SIZE > MONO_PTR_ARRAY_MAX_ON_STACK \ + ? (void **)mono_gc_alloc_fixed (sizeof (void*) * INITIAL_SIZE, mono_gc_make_root_descr_all_refs (INITIAL_SIZE), SOURCE, MSG) \ + : g_newa (void*, MONO_PTR_ARRAY_MAX_ON_STACK); \ } while (0) #define mono_ptr_array_destroy(ARRAY) do {\ @@ -40,8 +47,8 @@ typedef struct { #define mono_ptr_array_append(ARRAY, VALUE) do { \ if ((ARRAY).size >= (ARRAY).capacity) {\ - void *__tmp = mono_gc_alloc_fixed (sizeof (void*) * (ARRAY).capacity * 2, mono_gc_make_root_descr_all_refs ((ARRAY).capacity * 2)); \ - mono_gc_memmove (__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \ + 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).msg); \ + mono_gc_memmove_aligned ((void *)__tmp, (ARRAY).data, (ARRAY).capacity * sizeof (void*)); \ if ((ARRAY).capacity > MONO_PTR_ARRAY_MAX_ON_STACK) \ mono_gc_free_fixed ((ARRAY).data); \ (ARRAY).data = __tmp; \ @@ -68,7 +75,7 @@ typedef struct { #define mono_ptr_array_clear(ARRAY) do { \ (ARRAY).size = 0; \ - mono_gc_bzero ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \ + mono_gc_bzero_aligned ((ARRAY).data, (ARRAY).capacity * sizeof (void*)); \ } while (0) #endif