int refcount;
volatile int num_elements;
volatile gint8 *last_code_end;
+ MonoJitInfo *next_tombstone;
MonoJitInfo * volatile data [MONO_JIT_INFO_TABLE_CHUNK_SIZE];
};
gpointer aot_info;
gpointer tramp_info;
} d;
- struct _MonoJitInfo *next_jit_code_hash;
+ union {
+ struct _MonoJitInfo *next_jit_code_hash;
+ struct _MonoJitInfo *next_tombstone;
+ } n;
gpointer code_start;
guint32 unwind_info;
int code_size;
for (i = 0; i < num_chunks; ++i) {
MonoJitInfoTableChunk *chunk = table->chunks [i];
- int num_elements;
- int j;
+ MonoJitInfo *tombstone;
if (--chunk->refcount > 0)
continue;
- num_elements = chunk->num_elements;
- for (j = 0; j < num_elements; ++j) {
- MonoJitInfo *ji = chunk->data [j];
-
- if (IS_JIT_INFO_TOMBSTONE (ji))
- g_free (ji);
+ for (tombstone = chunk->next_tombstone; tombstone; ) {
+ MonoJitInfo *next = tombstone->n.next_tombstone;
+ g_free (tombstone);
+ tombstone = next;
}
g_free (chunk);
}
static MonoJitInfo*
-mono_jit_info_make_tombstone (MonoJitInfo *ji)
+mono_jit_info_make_tombstone (MonoJitInfoTableChunk *chunk, MonoJitInfo *ji)
{
MonoJitInfo *tombstone = g_new0 (MonoJitInfo, 1);
tombstone->code_start = ji->code_start;
tombstone->code_size = ji->code_size;
tombstone->d.method = JIT_INFO_TOMBSTONE_MARKER;
+ tombstone->n.next_tombstone = chunk->next_tombstone;
+ chunk->next_tombstone = tombstone;
return tombstone;
}
found:
g_assert (chunk->data [pos] == ji);
- chunk->data [pos] = mono_jit_info_make_tombstone (ji);
+ chunk->data [pos] = mono_jit_info_make_tombstone (chunk, ji);
/* Debugging code, should be removed. */
//jit_info_table_check (table);
{
MonoJitInfo *info = (MonoJitInfo*)value;
- return (gpointer*)&info->next_jit_code_hash;
+ return (gpointer*)&info->n.next_jit_code_hash;
}
void