X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-alloc.c;h=dcf977c06e1b736e4f46ad3ec4ea9a0d760eb2af;hb=60f85567e2d8918fed1c37dd4da3018026328980;hp=2bc3214f143745d39b577525eea5a6bbc257bd66;hpb=32f2f7c898abd259b447eb318e9664e518ea6807;p=mono.git diff --git a/mono/sgen/sgen-alloc.c b/mono/sgen/sgen-alloc.c index 2bc3214f143..dcf977c06e1 100644 --- a/mono/sgen/sgen-alloc.c +++ b/mono/sgen/sgen-alloc.c @@ -68,6 +68,9 @@ static __thread char *tlab_temp_end; static __thread char *tlab_real_end; /* Used by the managed allocator/wbarrier */ static __thread char **tlab_next_addr MONO_ATTR_USED; +#ifndef SGEN_WITHOUT_MONO +static __thread volatile int *in_critical_region_addr MONO_ATTR_USED; +#endif #endif #ifdef HAVE_KW_THREAD @@ -197,11 +200,6 @@ sgen_alloc_obj_nolock (GCVTable vtable, size_t size) if (G_LIKELY (new_next < TLAB_TEMP_END)) { /* Fast path */ - /* - * FIXME: We might need a memory barrier here so the change to tlab_next is - * visible before the vtable store. - */ - CANARIFY_ALLOC(p,real_size); SGEN_LOG (6, "Allocated object %p, vtable: %p (%s), size: %zd", p, vtable, sgen_client_vtable_get_name (vtable), size); binary_protocol_alloc (p , vtable, size, sgen_client_get_provenance ()); @@ -506,6 +504,9 @@ sgen_init_tlab_info (SgenThreadInfo* info) #ifdef HAVE_KW_THREAD tlab_next_addr = &tlab_next; +#ifndef SGEN_WITHOUT_MONO + in_critical_region_addr = &info->client_info.in_critical_region; +#endif #endif } @@ -530,13 +531,15 @@ sgen_init_allocator (void) #if defined(HAVE_KW_THREAD) && !defined(SGEN_WITHOUT_MONO) int tlab_next_addr_offset = -1; int tlab_temp_end_offset = -1; - + int in_critical_region_addr_offset = -1; MONO_THREAD_VAR_OFFSET (tlab_next_addr, tlab_next_addr_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); + MONO_THREAD_VAR_OFFSET (in_critical_region_addr, in_critical_region_addr_offset); mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_NEXT_ADDR, tlab_next_addr_offset); mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_TEMP_END, tlab_temp_end_offset); + mono_tls_key_set_offset (TLS_KEY_SGEN_IN_CRITICAL_REGION_ADDR, in_critical_region_addr_offset); #endif #ifdef HEAVY_STATISTICS