X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-alloc.c;h=dcf977c06e1b736e4f46ad3ec4ea9a0d760eb2af;hb=60f85567e2d8918fed1c37dd4da3018026328980;hp=9d3f45195e115047b8e3c303c5d0ec1d21fbce6b;hpb=a341404ecdd3b5ca2ed0ab1e9a5bcb9b5ccd2566;p=mono.git diff --git a/mono/sgen/sgen-alloc.c b/mono/sgen/sgen-alloc.c index 9d3f45195e1..dcf977c06e1 100644 --- a/mono/sgen/sgen-alloc.c +++ b/mono/sgen/sgen-alloc.c @@ -10,18 +10,7 @@ * Copyright 2011 Xamarin, Inc. * Copyright (C) 2012 Xamarin Inc * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License 2.0 as published by the Free Software Foundation; - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License 2.0 along with this library; if not, write to the Free - * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ /* @@ -79,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 @@ -208,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 ()); @@ -517,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 } @@ -541,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