summaryrefslogtreecommitdiff
path: root/mono/metadata/sgen-gc.h
diff options
context:
space:
mode:
Diffstat (limited to 'mono/metadata/sgen-gc.h')
-rw-r--r--mono/metadata/sgen-gc.h72
1 files changed, 25 insertions, 47 deletions
diff --git a/mono/metadata/sgen-gc.h b/mono/metadata/sgen-gc.h
index 7d442497a9..15afdbcd03 100644
--- a/mono/metadata/sgen-gc.h
+++ b/mono/metadata/sgen-gc.h
@@ -66,6 +66,10 @@ NurseryClearPolicy sgen_get_nursery_clear_policy (void) MONO_INTERNAL;
#define SGEN_TV_ELAPSED(start,end) (int)((end-start) / 10)
#define SGEN_TV_ELAPSED_MS(start,end) ((SGEN_TV_ELAPSED((start),(end)) + 500) / 1000)
+#if !defined(__MACH__) && !MONO_MACH_ARCH_SUPPORTED && defined(HAVE_PTHREAD_KILL)
+#define SGEN_POSIX_STW 1
+#endif
+
/* eventually share with MonoThread? */
/*
* This structure extends the MonoThreadInfo structure.
@@ -80,32 +84,6 @@ struct _SgenThreadInfo {
volatile int in_critical_region;
/*
- Since threads can be created concurrently during STW, it's possible to reach a stable
- state where we find that the world is stopped but there are registered threads that have
- not been suspended.
-
- Our hope is that those threads are harmlesly blocked in the GC lock trying to finish registration.
-
- To handle this scenario we set this field on each thread that have joined the current STW phase.
- The GC should ignore unjoined threads.
- */
- gboolean joined_stw;
-
- /*
- This is set to TRUE by STW when it initiates suspension of a thread.
- It's used so async suspend can catch the case where a thread is in the middle of unregistering
- and need to cooperatively suspend itself.
- */
- gboolean doing_handshake;
-
- /*
- This is set to TRUE when a thread start to dettach.
- This gives STW the oportunity to ignore a thread that started to
- unregister.
- */
- gboolean thread_is_dying;
-
- /*
This is set the argument of mono_gc_set_skip_thread.
A thread that knowingly holds no managed state can call this
@@ -122,11 +100,12 @@ struct _SgenThreadInfo {
char **tlab_real_end_addr;
gpointer runtime_data;
- /* Only used on POSIX platforms */
+#ifdef SGEN_POSIX_STW
+ /* This is -1 until the first suspend. */
int signal;
- /* Ditto */
/* FIXME: kill this, we only use signals on systems that have rt-posix, which doesn't have issues with duplicates. */
unsigned int stop_count; /* to catch duplicate signals. */
+#endif
gpointer stopped_ip; /* only valid if the thread is stopped */
MonoDomain *stopped_domain; /* dsto */
@@ -164,7 +143,7 @@ struct _GCMemSection {
/* in major collections indexes in the pin_queue for objects that pin this section */
void **pin_queue_start;
int pin_queue_num_entries;
- unsigned short num_scan_start;
+ unsigned int num_scan_start;
};
/*
@@ -179,10 +158,7 @@ struct _GCMemSection {
MONO_GC_LOCKED (); \
} while (0)
#define TRYLOCK_GC (mono_mutex_trylock (&gc_mutex) == 0)
-#define UNLOCK_GC do { \
- mono_mutex_unlock (&gc_mutex); \
- MONO_GC_UNLOCKED (); \
- } while (0)
+#define UNLOCK_GC do { sgen_gc_unlock (); } while (0)
extern LOCK_DECLARE (sgen_interruption_mutex);
@@ -300,19 +276,19 @@ extern int sgen_nursery_bits MONO_INTERNAL;
extern char *sgen_nursery_start MONO_INTERNAL;
extern char *sgen_nursery_end MONO_INTERNAL;
-static inline gboolean
+static inline MONO_ALWAYS_INLINE gboolean
sgen_ptr_in_nursery (void *p)
{
return SGEN_PTR_IN_NURSERY ((p), DEFAULT_NURSERY_BITS, sgen_nursery_start, sgen_nursery_end);
}
-static inline char*
+static inline MONO_ALWAYS_INLINE char*
sgen_get_nursery_start (void)
{
return sgen_nursery_start;
}
-static inline char*
+static inline MONO_ALWAYS_INLINE char*
sgen_get_nursery_end (void)
{
return sgen_nursery_end;
@@ -413,7 +389,6 @@ int sgen_thread_handshake (BOOL suspend) MONO_INTERNAL;
gboolean sgen_suspend_thread (SgenThreadInfo *info) MONO_INTERNAL;
gboolean sgen_resume_thread (SgenThreadInfo *info) MONO_INTERNAL;
void sgen_wait_for_suspend_ack (int count) MONO_INTERNAL;
-gboolean sgen_park_current_thread_if_doing_handshake (SgenThreadInfo *p) MONO_INTERNAL;
void sgen_os_init (void) MONO_INTERNAL;
gboolean sgen_is_worker_thread (MonoNativeThreadId thread) MONO_INTERNAL;
@@ -454,6 +429,7 @@ enum {
INTERNAL_MEM_JOB_QUEUE_ENTRY,
INTERNAL_MEM_TOGGLEREF_DATA,
INTERNAL_MEM_CARDTABLE_MOD_UNION,
+ INTERNAL_MEM_BINARY_PROTOCOL,
INTERNAL_MEM_MAX
};
@@ -697,7 +673,7 @@ struct _SgenMajorCollector {
void (*init_worker_thread) (void *data);
void (*reset_worker_data) (void *data);
gboolean (*is_valid_object) (char *object);
- gboolean (*describe_pointer) (char *pointer);
+ MonoVTable* (*describe_pointer) (char *pointer);
guint8* (*get_cardtable_mod_union_for_object) (char *object);
long long (*get_and_reset_num_major_objects_marked) (void);
};
@@ -816,6 +792,7 @@ gboolean sgen_is_bridge_object (MonoObject *obj) MONO_INTERNAL;
gboolean sgen_is_bridge_class (MonoClass *class) MONO_INTERNAL;
void sgen_mark_bridge_object (MonoObject *obj) MONO_INTERNAL;
void sgen_bridge_register_finalized_object (MonoObject *object) MONO_INTERNAL;
+void sgen_bridge_describe_pointer (MonoObject *object) MONO_INTERNAL;
void sgen_scan_togglerefs (char *start, char *end, ScanCopyContext ctx) MONO_INTERNAL;
void sgen_process_togglerefs (void) MONO_INTERNAL;
@@ -966,28 +943,24 @@ extern __thread char *stack_end;
#endif
#ifdef HAVE_KW_THREAD
-#define EMIT_TLS_ACCESS(mb,dummy,offset) do { \
+#define EMIT_TLS_ACCESS(mb,member,key) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
- mono_mb_emit_i4 ((mb), (offset)); \
+ mono_mb_emit_i4 ((mb), (key)); \
} while (0)
#else
-/*
- * CEE_MONO_TLS requires the tls offset, not the key, so the code below only works on darwin,
- * where the two are the same.
- */
#if defined(__APPLE__) || defined (HOST_WIN32)
-#define EMIT_TLS_ACCESS(mb,member,dummy) do { \
+#define EMIT_TLS_ACCESS(mb,member,key) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
- mono_mb_emit_i4 ((mb), thread_info_key); \
+ mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_THREAD_INFO); \
mono_mb_emit_icon ((mb), G_STRUCT_OFFSET (SgenThreadInfo, member)); \
mono_mb_emit_byte ((mb), CEE_ADD); \
mono_mb_emit_byte ((mb), CEE_LDIND_I); \
} while (0)
#else
-#define EMIT_TLS_ACCESS(mb,member,dummy) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
+#define EMIT_TLS_ACCESS(mb,member,key) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
#endif
#endif
@@ -1003,6 +976,7 @@ extern int degraded_mode;
extern int default_nursery_size;
extern guint32 tlab_size;
extern NurseryClearPolicy nursery_clear_policy;
+extern gboolean sgen_try_free_some_memory;
extern LOCK_DECLARE (gc_mutex);
@@ -1074,6 +1048,10 @@ sgen_dummy_use (gpointer v) {
gboolean sgen_parse_environment_string_extract_number (const char *str, glong *out) MONO_INTERNAL;
void sgen_env_var_error (const char *env_var, const char *fallback, const char *description_format, ...) MONO_INTERNAL;
+/* Utilities */
+
+void sgen_qsort (void *base, size_t nel, size_t width, int (*compar) (const void*, const void*)) MONO_INTERNAL;
+
#endif /* HAVE_SGEN_GC */
#endif /* __MONO_SGENGC_H__ */