diff --git a/mono/metadata/threads.c b/mono/metadata/threads.c index 5343fc54bf1f7be9d97df196c269e2a66d7bc52c..c6ebf5e567df71598b31ed89ec346a3d984b95d4 100644 --- a/mono/metadata/threads.c +++ b/mono/metadata/threads.c @@ -113,6 +113,7 @@ struct _StaticDataFreeList { StaticDataFreeList *next; guint32 offset; guint32 size; + gint32 align; }; typedef struct { @@ -4290,12 +4291,12 @@ alloc_context_static_data_helper (gpointer key, gpointer value, gpointer user) } static StaticDataFreeList* -search_slot_in_freelist (StaticDataInfo *static_data, guint32 size, guint32 align) +search_slot_in_freelist (StaticDataInfo *static_data, guint32 size, gint32 align) { StaticDataFreeList* prev = NULL; StaticDataFreeList* tmp = static_data->freelist; while (tmp) { - if (tmp->size == size) { + if (tmp->size == size && tmp->align == align) { if (prev) prev->next = tmp->next; else @@ -4453,7 +4454,7 @@ free_context_static_data_helper (gpointer key, gpointer value, gpointer user) } static void -do_free_special_slot (guint32 offset, guint32 size) +do_free_special_slot (guint32 offset, guint32 size, gint32 align) { guint32 static_type = ACCESS_SPECIAL_STATIC_OFFSET (offset, type); MonoBitSet **sets; @@ -4486,6 +4487,7 @@ do_free_special_slot (guint32 offset, guint32 size) item->offset = offset; item->size = size; + item->align = align; item->next = info->freelist; info->freelist = item; @@ -4500,7 +4502,7 @@ do_free_special (gpointer key, gpointer value, gpointer data) gint32 align; guint32 size; size = mono_type_size (field->type, &align); - do_free_special_slot (offset, size); + do_free_special_slot (offset, size, align); } void