Skip to content

Commit

Permalink
Merge pull request #2853 from alexrp/thread-name-improvements
Browse files Browse the repository at this point in the history
More thread name improvements
  • Loading branch information
alexrp committed May 12, 2016
2 parents da3cc8d + 828e645 commit ce38129
Show file tree
Hide file tree
Showing 13 changed files with 24 additions and 62 deletions.
31 changes: 0 additions & 31 deletions mcs/class/corlib/Test/System.Threading/ThreadTest.cs
Expand Up @@ -574,37 +574,6 @@ public void Rename ()
t.Name = "b";
}

bool rename_finished;
bool rename_failed;

[Test]
public void RenameTpThread ()
{
object monitor = new object ();
ThreadPool.QueueUserWorkItem (new WaitCallback (Rename_callback), monitor);
lock (monitor) {
if (!rename_finished)
Monitor.Wait (monitor);
}
Assert.IsTrue (!rename_failed);
}

void Rename_callback (object o) {
Thread.CurrentThread.Name = "a";
try {
Thread.CurrentThread.Name = "b";
//Console.WriteLine ("Thread name is: {0}", Thread.CurrentThread.Name);
} catch (Exception e) {
//Console.Error.WriteLine (e);
rename_failed = true;
}
object monitor = o;
lock (monitor) {
rename_finished = true;
Monitor.Pulse (monitor);
}
}

[Test]
public void TestNestedThreads1()
{
Expand Down
4 changes: 0 additions & 4 deletions mono/metadata/appdomain.c
Expand Up @@ -2573,7 +2573,6 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
unload_data *thread_data;
MonoNativeThreadId tid;
MonoDomain *caller_domain = mono_domain_get ();
char *name;

/* printf ("UNLOAD STARTING FOR %s (%p) IN THREAD 0x%x.\n", domain->friendly_name, domain, mono_native_thread_id_get ()); */

Expand Down Expand Up @@ -2633,10 +2632,7 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
thread_handle = mono_threads_create_thread ((LPTHREAD_START_ROUTINE)unload_thread_main, thread_data, 0, CREATE_SUSPENDED, &tid);
if (thread_handle == NULL)
return;
name = g_strdup_printf ("Unload thread for domain %x", domain);
mono_thread_info_set_name (tid, name);
mono_thread_info_resume (tid);
g_free (name);

/* Wait for the thread */
while (!thread_data->done && guarded_wait (thread_handle, INFINITE, TRUE) == WAIT_IO_COMPLETION) {
Expand Down
2 changes: 1 addition & 1 deletion mono/metadata/attach.c
Expand Up @@ -493,7 +493,7 @@ receiver_thread (void *arg)
guint8 *p, *p_end;
MonoObject *exc;

mono_thread_info_set_name (mono_native_thread_id_get (), "Attach receiver");
mono_native_thread_set_name (mono_native_thread_id_get (), "Attach receiver");

printf ("attach: Listening on '%s'...\n", server_uri);

Expand Down
2 changes: 1 addition & 1 deletion mono/metadata/sgen-mono.c
Expand Up @@ -2284,7 +2284,7 @@ void
sgen_client_thread_register_worker (void)
{
mono_thread_info_register_small_id ();
mono_thread_info_set_name (mono_native_thread_id_get (), "SGen worker");
mono_native_thread_set_name (mono_native_thread_id_get (), "SGen worker");
}

/* Variables holding start/end nursery so it won't have to be passed at every call */
Expand Down
2 changes: 1 addition & 1 deletion mono/metadata/threads-types.h
Expand Up @@ -216,7 +216,7 @@ gunichar2* mono_thread_get_name (MonoInternalThread *this_obj, guint32 *name_len

MONO_API MonoException* mono_thread_get_undeniable_exception (void);

void mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean managed, MonoError *error);
void mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean permanent, MonoError *error);

void mono_runtime_set_has_tls_get (gboolean val);
gboolean mono_runtime_has_tls_get (void);
Expand Down
18 changes: 11 additions & 7 deletions mono/metadata/threads.c
Expand Up @@ -458,6 +458,8 @@ static void thread_cleanup (MonoInternalThread *thread)
if (!mono_thread_info_lookup (MONO_UINT_TO_NATIVE_THREAD_ID (thread->tid))->tools_thread)
mono_profiler_thread_end (thread->tid);

mono_hazard_pointer_clear (mono_hazard_pointer_get (), 1);

if (thread == mono_thread_internal_current ()) {
/*
* This will signal async signal handlers that the thread has exited.
Expand Down Expand Up @@ -727,12 +729,13 @@ static guint32 WINAPI start_wrapper_internal(void *data)
mono_profiler_thread_start (tid);

/* if the name was set before starting, we didn't invoke the profiler callback */
if (internal->name && (internal->flags & MONO_THREAD_FLAG_NAME_SET)) {
if (internal->name) {
char *tname = g_utf16_to_utf8 (internal->name, internal->name_len, NULL, NULL, NULL);
mono_profiler_thread_name (internal->tid, tname);
mono_thread_info_set_name (MONO_UINT_TO_NATIVE_THREAD_ID (internal->tid), tname);
mono_native_thread_set_name (MONO_UINT_TO_NATIVE_THREAD_ID (internal->tid), tname);
g_free (tname);
}

/* start_func is set only for unmanaged start functions */
if (start_func) {
start_func (start_arg);
Expand Down Expand Up @@ -1364,13 +1367,13 @@ ves_icall_System_Threading_Thread_GetName_internal (MonoInternalThread *this_obj
}

void
mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean managed, MonoError *error)
mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, gboolean permanent, MonoError *error)
{
LOCK_THREAD (this_obj);

mono_error_init (error);

if ((this_obj->flags & MONO_THREAD_FLAG_NAME_SET) && !this_obj->threadpool_thread) {
if ((this_obj->flags & MONO_THREAD_FLAG_NAME_SET)) {
UNLOCK_THREAD (this_obj);

mono_error_set_invalid_operation (error, "Thread.Name can only be set once.");
Expand All @@ -1384,19 +1387,20 @@ mono_thread_set_name_internal (MonoInternalThread *this_obj, MonoString *name, g
this_obj->name = g_new (gunichar2, mono_string_length (name));
memcpy (this_obj->name, mono_string_chars (name), mono_string_length (name) * 2);
this_obj->name_len = mono_string_length (name);

if (permanent)
this_obj->flags |= MONO_THREAD_FLAG_NAME_SET;
}
else
this_obj->name = NULL;

if (managed)
this_obj->flags |= MONO_THREAD_FLAG_NAME_SET;

UNLOCK_THREAD (this_obj);

if (this_obj->name && this_obj->tid) {
char *tname = mono_string_to_utf8 (name);
mono_profiler_thread_name (this_obj->tid, tname);
mono_thread_info_set_name (thread_get_tid (this_obj), tname);
mono_native_thread_set_name (thread_get_tid (this_obj), tname);
mono_free (tname);
}
}
Expand Down
2 changes: 1 addition & 1 deletion mono/mini/driver.c
Expand Up @@ -1990,7 +1990,7 @@ mono_main (int argc, char* argv[])
* We only set the native name of the thread since MS.NET leaves the
* managed thread name for the main thread as null.
*/
mono_thread_info_set_name (mono_native_thread_id_get (), "Main");
mono_native_thread_set_name (mono_native_thread_id_get (), "Main");

if (enable_profile) {
mono_profiler_load (profile_options);
Expand Down
2 changes: 1 addition & 1 deletion mono/mini/mini-posix.c
Expand Up @@ -704,7 +704,7 @@ static mono_native_thread_return_t
sampling_thread_func (void *data)
{
mono_threads_attach_tools_thread ();
mono_thread_info_set_name (mono_native_thread_id_get (), "Profiler sampler");
mono_native_thread_set_name (mono_native_thread_id_get (), "Profiler sampler");

gint64 rate = 1000000000 / mono_profiler_get_sampling_rate ();

Expand Down
6 changes: 3 additions & 3 deletions mono/profiler/proflog.c
Expand Up @@ -4020,7 +4020,7 @@ helper_thread (void* arg)
MonoThread *thread = NULL;

mono_threads_attach_tools_thread ();
mono_thread_info_set_name (mono_native_thread_id_get (), "Profiler helper");
mono_native_thread_set_name (mono_native_thread_id_get (), "Profiler helper");

//fprintf (stderr, "Server listening\n");
command_socket = -1;
Expand Down Expand Up @@ -4275,7 +4275,7 @@ writer_thread (void *arg)
MonoProfiler *prof = (MonoProfiler *)arg;

mono_threads_attach_tools_thread ();
mono_thread_info_set_name (mono_native_thread_id_get (), "Profiler writer");
mono_native_thread_set_name (mono_native_thread_id_get (), "Profiler writer");

dump_header (prof);

Expand Down Expand Up @@ -4386,7 +4386,7 @@ dumper_thread (void *arg)
MonoProfiler *prof = (MonoProfiler *)arg;

mono_threads_attach_tools_thread ();
mono_thread_info_set_name (mono_native_thread_id_get (), "Profiler dumper");
mono_native_thread_set_name (mono_native_thread_id_get (), "Profiler dumper");

while (InterlockedRead (&prof->run_dumper_thread)) {
mono_os_sem_wait (&prof->dumper_queue_sem, MONO_SEM_FLAGS_NONE);
Expand Down
2 changes: 1 addition & 1 deletion mono/utils/mono-threads-posix.c
Expand Up @@ -277,7 +277,7 @@ mono_native_thread_create (MonoNativeThreadId *tid, gpointer func, gpointer arg)
}

void
mono_threads_core_set_name (MonoNativeThreadId tid, const char *name)
mono_native_thread_set_name (MonoNativeThreadId tid, const char *name)
{
#ifdef __MACH__
/*
Expand Down
2 changes: 1 addition & 1 deletion mono/utils/mono-threads-windows.c
Expand Up @@ -344,7 +344,7 @@ typedef struct tagTHREADNAME_INFO
#endif

void
mono_threads_core_set_name (MonoNativeThreadId tid, const char *name)
mono_native_thread_set_name (MonoNativeThreadId tid, const char *name)
{
#if defined(_MSC_VER)
/* http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx */
Expand Down
6 changes: 0 additions & 6 deletions mono/utils/mono-threads.c
Expand Up @@ -1310,12 +1310,6 @@ mono_threads_open_thread_handle (HANDLE handle, MonoNativeThreadId tid)
return mono_threads_core_open_thread_handle (handle, tid);
}

void
mono_thread_info_set_name (MonoNativeThreadId tid, const char *name)
{
mono_threads_core_set_name (tid, name);
}

#define INTERRUPT_STATE ((MonoThreadInfoInterruptToken*) (size_t) -1)

struct _MonoThreadInfoInterruptToken {
Expand Down
7 changes: 3 additions & 4 deletions mono/utils/mono-threads.h
Expand Up @@ -358,9 +358,6 @@ mono_thread_info_lookup (MonoNativeThreadId id);
gboolean
mono_thread_info_resume (MonoNativeThreadId tid);

MONO_API void
mono_thread_info_set_name (MonoNativeThreadId tid, const char *name);

void
mono_thread_info_safe_suspend_and_run (MonoNativeThreadId id, gboolean interrupt_kernel, MonoSuspendThreadCallback callback, gpointer user_data);

Expand Down Expand Up @@ -519,7 +516,6 @@ void mono_threads_core_exit (int exit_code);
void mono_threads_core_unregister (THREAD_INFO_TYPE *info);
HANDLE mono_threads_core_open_handle (void);
HANDLE mono_threads_core_open_thread_handle (HANDLE handle, MonoNativeThreadId tid);
void mono_threads_core_set_name (MonoNativeThreadId tid, const char *name);

void mono_threads_coop_begin_global_suspend (void);
void mono_threads_coop_end_global_suspend (void);
Expand All @@ -533,6 +529,9 @@ mono_native_thread_id_equals (MonoNativeThreadId id1, MonoNativeThreadId id2);
gboolean
mono_native_thread_create (MonoNativeThreadId *tid, gpointer func, gpointer arg);

MONO_API void
mono_native_thread_set_name (MonoNativeThreadId tid, const char *name);

/*Mach specific internals */
void mono_threads_init_dead_letter (void);
void mono_threads_install_dead_letter (void);
Expand Down

0 comments on commit ce38129

Please sign in to comment.