#include <mono/utils/mono-tls.h>
#include <mono/utils/mono-mmap.h>
#include <mono/utils/mono-threads.h>
+#include <mono/utils/unlocked.h>
#include <mono/metadata/object.h>
#include <mono/metadata/object-internals.h>
#include <mono/metadata/domain-internals.h>
static int
jit_info_table_num_elements (MonoJitInfoTable *table)
{
- int i;
- int num_elements = 0;
-
- for (i = 0; i < table->num_chunks; ++i) {
- MonoJitInfoTableChunk *chunk = table->chunks [i];
- int chunk_num_elements = chunk->num_elements;
- int j;
-
- for (j = 0; j < chunk_num_elements; ++j) {
- if (!IS_JIT_INFO_TOMBSTONE (chunk->data [j]))
- ++num_elements;
- }
- }
-
- return num_elements;
+ return table->num_valid;
}
static MonoJitInfoTableChunk*
table->domain = domain;
table->num_chunks = 1;
table->chunks [0] = jit_info_table_new_chunk ();
+ table->num_valid = 0;
return table;
}
MonoJitInfo *ji, *module_ji;
MonoThreadHazardPointers *hp = mono_hazard_pointer_get ();
- ++mono_stats.jit_info_table_lookup_count;
+ UnlockedIncrement (&mono_stats.jit_info_table_lookup_count);
/* First we have to get the domain's jit_info_table. This is
complicated by the fact that a writer might substitute a
result = (MonoJitInfoTable *)g_malloc (MONO_SIZEOF_JIT_INFO_TABLE + sizeof (MonoJitInfoTableChunk*) * num_chunks);
result->domain = old->domain;
result->num_chunks = num_chunks;
+ result->num_valid = old->num_valid;
for (i = 0; i < num_chunks; ++i)
result->chunks [i] = jit_info_table_new_chunk ();
new_table->domain = table->domain;
new_table->num_chunks = table->num_chunks + 1;
+ new_table->num_valid = table->num_valid;
j = 0;
for (i = 0; i < table->num_chunks; ++i) {
new_table->domain = table->domain;
new_table->num_chunks = table->num_chunks;
+ new_table->num_valid = table->num_valid;
j = 0;
for (i = 0; i < table->num_chunks; ++i) {
chunk->last_code_end = (gint8*)chunk->data [chunk->num_elements - 1]->code_start
+ chunk->data [chunk->num_elements - 1]->code_size;
+ ++table->num_valid;
+
/* Debugging code, should be removed. */
//jit_info_table_check (table);
}
mono_domain_lock (domain);
- ++mono_stats.jit_info_table_insert_count;
+ UnlockedIncrement (&mono_stats.jit_info_table_insert_count);
jit_info_table_add (domain, &domain->jit_info_table, ji);
g_assert (chunk->data [pos] == ji);
chunk->data [pos] = mono_jit_info_make_tombstone (chunk, ji);
+ --table->num_valid;
/* Debugging code, should be removed. */
//jit_info_table_check (table);
mono_domain_lock (domain);
table = domain->jit_info_table;
- ++mono_stats.jit_info_table_remove_count;
+ UnlockedIncrement (&mono_stats.jit_info_table_remove_count);
jit_info_table_remove (table, ji);
size += sizeof (MonoArchEHJitInfo);
if (flags & JIT_INFO_HAS_THUNK_INFO)
size += sizeof (MonoThunkJitInfo);
+ if (flags & JIT_INFO_HAS_UNWIND_INFO)
+ size += sizeof (MonoUnwindJitInfo);
return size;
}
ji->has_arch_eh_info = 1;
if (flags & JIT_INFO_HAS_THUNK_INFO)
ji->has_thunk_info = 1;
+ if (flags & JIT_INFO_HAS_UNWIND_INFO)
+ ji->has_unwind_info = 1;
}
/**
return NULL;
}
}
+
+MonoUnwindJitInfo*
+mono_jit_info_get_unwind_info (MonoJitInfo *ji)
+{
+ if (ji->has_unwind_info) {
+ char *ptr = (char*)&ji->clauses [ji->num_clauses];
+ if (ji->has_generic_jit_info)
+ ptr += sizeof (MonoGenericJitInfo);
+ if (ji->has_try_block_holes)
+ ptr += try_block_hole_table_size (ji);
+ if (ji->has_arch_eh_info)
+ ptr += sizeof (MonoArchEHJitInfo);
+ if (ji->has_thunk_info)
+ ptr += sizeof (MonoThunkJitInfo);
+ return (MonoUnwindJitInfo*)ptr;
+ } else {
+ return NULL;
+ }
+}