X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsgen-gc.h;h=1a0922716080255c6689ee9a55e0120837e5f4d0;hb=c2022b34b7820821406d4e46df7868db89144f2c;hp=b184d25d59d545126561aa7bc26ab810d5c0e49d;hpb=f2a6fb719db0ab54dfde60464a73c6d695245c10;p=mono.git diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h index b184d25d59d..1a092271608 100644 --- a/mono/metadata/sgen-gc.h +++ b/mono/metadata/sgen-gc.h @@ -58,7 +58,8 @@ typedef struct _SgenThreadInfo SgenThreadInfo; */ typedef enum { CLEAR_AT_GC, - CLEAR_AT_TLAB_CREATION + CLEAR_AT_TLAB_CREATION, + CLEAR_AT_TLAB_CREATION_DEBUG } NurseryClearPolicy; NurseryClearPolicy sgen_get_nursery_clear_policy (void) MONO_INTERNAL; @@ -350,12 +351,14 @@ typedef struct { static inline MONO_ALWAYS_INLINE void GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, char* obj) { -#if defined(SGEN_GRAY_OBJECT_ENQUEUE) || SGEN_MAX_DEBUG_LEVEL >= 9 +#if SGEN_MAX_DEBUG_LEVEL >= 9 sgen_gray_object_enqueue (queue, obj); #else if (G_UNLIKELY (!queue->first || queue->cursor == GRAY_LAST_CURSOR_POSITION (queue->first))) { sgen_gray_object_enqueue (queue, obj); } else { + HEAVY_STAT (gc_stats.gray_queue_enqueue_fast_path ++); + *++queue->cursor = obj; #ifdef SGEN_HEAVY_BINARY_PROTOCOL binary_protocol_gray_enqueue (queue, queue->cursor, obj); @@ -369,10 +372,12 @@ GRAY_OBJECT_ENQUEUE (SgenGrayQueue *queue, char* obj) static inline MONO_ALWAYS_INLINE void GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj) { -#if defined(SGEN_GRAY_OBJECT_ENQUEUE) || SGEN_MAX_DEBUG_LEVEL >= 9 +#if SGEN_MAX_DEBUG_LEVEL >= 9 *obj = sgen_gray_object_enqueue (queue); #else if (!queue->first) { + HEAVY_STAT (gc_stats.gray_queue_dequeue_fast_path ++); + *obj = NULL; #ifdef SGEN_HEAVY_BINARY_PROTOCOL binary_protocol_gray_dequeue (queue, queue->cursor, *obj); @@ -380,6 +385,8 @@ GRAY_OBJECT_DEQUEUE (SgenGrayQueue *queue, char** obj) } else if (G_UNLIKELY (queue->cursor == GRAY_FIRST_CURSOR_POSITION (queue->first))) { *obj = sgen_gray_object_dequeue (queue); } else { + HEAVY_STAT (gc_stats.gray_queue_dequeue_fast_path ++); + *obj = *queue->cursor--; #ifdef SGEN_HEAVY_BINARY_PROTOCOL binary_protocol_gray_dequeue (queue, queue->cursor + 1, *obj); @@ -530,7 +537,6 @@ void sgen_sort_addresses (void **array, size_t size) MONO_INTERNAL; void sgen_add_to_global_remset (gpointer ptr, gpointer obj) MONO_INTERNAL; int sgen_get_current_collection_generation (void) MONO_INTERNAL; -gboolean sgen_collection_is_parallel (void) MONO_INTERNAL; gboolean sgen_collection_is_concurrent (void) MONO_INTERNAL; gboolean sgen_concurrent_collection_in_progress (void) MONO_INTERNAL; @@ -627,10 +633,8 @@ typedef struct { gboolean is_split; char* (*alloc_for_promotion) (MonoVTable *vtable, char *obj, size_t objsize, gboolean has_references); - char* (*par_alloc_for_promotion) (MonoVTable *vtable, char *obj, size_t objsize, gboolean has_references); SgenObjectOperations serial_ops; - SgenObjectOperations parallel_ops; void (*prepare_to_space) (char *to_space_bitmap, size_t space_bitmap_size); void (*clear_fragments) (void); @@ -664,7 +668,6 @@ typedef enum { typedef struct _SgenMajorCollector SgenMajorCollector; struct _SgenMajorCollector { size_t section_size; - gboolean is_parallel; gboolean is_concurrent; gboolean supports_cardtable; gboolean sweeps_lazily; @@ -690,7 +693,6 @@ struct _SgenMajorCollector { SgenObjectOperations major_concurrent_ops; void* (*alloc_object) (MonoVTable *vtable, size_t size, gboolean has_references); - void* (*par_alloc_object) (MonoVTable *vtable, size_t size, gboolean has_references); void (*free_pinned_object) (char *obj, size_t size); void (*iterate_objects) (IterateObjectsFlags flags, IterateObjectCallbackFunc callback, void *data); void (*free_non_pinned_object) (char *obj, size_t size); @@ -951,8 +953,6 @@ struct _LOSObject { char data [MONO_ZERO_LEN_ARRAY]; }; -#define ARRAY_OBJ_INDEX(ptr,array,elem_size) (((char*)(ptr) - ((char*)(array) + G_STRUCT_OFFSET (MonoArray, vector))) / (elem_size)) - extern LOSObject *los_object_list; extern mword los_memory_usage; @@ -995,7 +995,6 @@ void sgen_nursery_alloc_prepare_for_minor (void) MONO_INTERNAL; void sgen_nursery_alloc_prepare_for_major (void) MONO_INTERNAL; char* sgen_alloc_for_promotion (char *obj, size_t objsize, gboolean has_references) MONO_INTERNAL; -char* sgen_par_alloc_for_promotion (char *obj, size_t objsize, gboolean has_references) MONO_INTERNAL; /* TLS Data */ @@ -1033,24 +1032,43 @@ extern __thread char *stack_end; #endif #ifdef HAVE_KW_THREAD -#define EMIT_TLS_ACCESS(mb,member,key) do { \ + +#define EMIT_TLS_ACCESS_NEXT_ADDR(mb) do { \ + mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ + mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ + mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_NEXT_ADDR); \ + } while (0) + +#define EMIT_TLS_ACCESS_TEMP_END(mb) do { \ mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ - mono_mb_emit_i4 ((mb), (key)); \ + mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_TEMP_END); \ } while (0) + #else #if defined(__APPLE__) || defined (HOST_WIN32) -#define EMIT_TLS_ACCESS(mb,member,key) do { \ +#define EMIT_TLS_ACCESS_NEXT_ADDR(mb) do { \ mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO); \ - mono_mb_emit_icon ((mb), G_STRUCT_OFFSET (SgenThreadInfo, member)); \ + mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_next_addr)); \ mono_mb_emit_byte ((mb), CEE_ADD); \ mono_mb_emit_byte ((mb), CEE_LDIND_I); \ } while (0) + +#define EMIT_TLS_ACCESS_TEMP_END(mb) do { \ + mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \ + mono_mb_emit_byte ((mb), CEE_MONO_TLS); \ + mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO); \ + mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_temp_end)); \ + mono_mb_emit_byte ((mb), CEE_ADD); \ + mono_mb_emit_byte ((mb), CEE_LDIND_I); \ + } while (0) + #else -#define EMIT_TLS_ACCESS(mb,member,key) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0) +#define EMIT_TLS_ACCESS_NEXT_ADDR(mb) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0) +#define EMIT_TLS_ACCESS_TEMP_END(mb) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0) #endif #endif @@ -1058,7 +1076,6 @@ extern __thread char *stack_end; /* Other globals */ extern GCMemSection *nursery_section; -extern int stat_major_gcs; extern guint32 collect_before_allocs; extern guint32 verify_before_allocs; extern gboolean has_per_allocation_action;