From ceac1590dfeaefe8ca59cf5088e632958862d7e9 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Wed, 24 Nov 2021 09:57:06 +0800 Subject: [PATCH 1/6] mono_runtime_delegate_invoke wrapper with MONO_ENTER_GC_UNSAFE/MONO_EXIT_GC_UNSAFE; mono_runtime_delegate_invoke wrapper with MONO_ENTER_GC_UNSAFE/MONO_EXIT_GC_UNSAFE; --- src/mono/mono/metadata/object.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/mono/mono/metadata/object.c b/src/mono/mono/metadata/object.c index 70f77b0495c495..1529e02ff92e2a 100644 --- a/src/mono/mono/metadata/object.c +++ b/src/mono/mono/metadata/object.c @@ -3714,24 +3714,25 @@ mono_get_delegate_end_invoke_checked (MonoClass *klass, MonoError *error) MonoObject* mono_runtime_delegate_invoke (MonoObject *delegate, void **params, MonoObject **exc) { - MONO_REQ_GC_UNSAFE_MODE; - ERROR_DECL (error); + MonoObject* result = NULL; + MONO_ENTER_GC_UNSAFE; if (exc) { - MonoObject *result = mono_runtime_delegate_try_invoke (delegate, params, exc, error); + result = mono_runtime_delegate_try_invoke (delegate, params, exc, error); if (*exc) { mono_error_cleanup (error); - return NULL; + result = NULL; } else { if (!is_ok (error)) *exc = (MonoObject*)mono_error_convert_to_exception (error); - return result; } } else { MonoObject *result = mono_runtime_delegate_invoke_checked (delegate, params, error); mono_error_raise_exception_deprecated (error); /* OK to throw, external only without a good alternative */ - return result; + } + MONO_EXIT_GC_UNSAFE; + return result; } /** From a56b0cf7753191b14322008216d25163e9e31ef3 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Wed, 24 Nov 2021 10:12:43 +0800 Subject: [PATCH 2/6] Update object.c --- src/mono/mono/metadata/object.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/metadata/object.c b/src/mono/mono/metadata/object.c index 1529e02ff92e2a..7def77c718f468 100644 --- a/src/mono/mono/metadata/object.c +++ b/src/mono/mono/metadata/object.c @@ -3727,7 +3727,7 @@ mono_runtime_delegate_invoke (MonoObject *delegate, void **params, MonoObject ** *exc = (MonoObject*)mono_error_convert_to_exception (error); } } else { - MonoObject *result = mono_runtime_delegate_invoke_checked (delegate, params, error); + result = mono_runtime_delegate_invoke_checked (delegate, params, error); mono_error_raise_exception_deprecated (error); /* OK to throw, external only without a good alternative */ } From 2be859e9721dc4d7ddcf29532eebf969e309f8ad Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 30 Nov 2021 11:57:31 +0800 Subject: [PATCH 3/6] set debugger thread flags to MONO_THREAD_INFO_FLAGS_NO_GC | MONO_THREAD_INFO_FLAGS_NO_SAMPLE --- src/mono/mono/component/debugger-agent.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 2cfd24d64ebc3c..8edf42e1617c12 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -10140,7 +10140,8 @@ debugger_thread (void *arg) internal->state |= ThreadState_Background; internal->flags |= MONO_THREAD_FLAG_DONT_MANAGE; - + mono_thread_info_set_flags(MONO_THREAD_INFO_FLAGS_NO_GC | MONO_THREAD_INFO_FLAGS_NO_SAMPLE); + if (agent_config.defer) { if (!wait_for_attach ()) { PRINT_DEBUG_MSG (1, "[dbg] Can't attach, aborting debugger thread.\n"); From 60b19dc2cb5b0a5c6d6396ac2341640c271b9232 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 30 Nov 2021 19:10:59 +0800 Subject: [PATCH 4/6] wait_for_attach change to gc safe mode --- src/mono/mono/component/debugger-agent.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 8edf42e1617c12..64e9e34f063c5c 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -10031,8 +10031,10 @@ wait_for_attach (void) } /* Block and wait for client connection */ + MONO_ENTER_GC_SAFE; conn_fd = socket_transport_accept (listen_fd); - + MONO_EXIT_GC_SAFE; + PRINT_DEBUG_MSG (1, "Accepted connection on %d\n", conn_fd); if (conn_fd == -1) { PRINT_DEBUG_MSG (1, "[dbg] Bad client connection\n"); @@ -10140,7 +10142,6 @@ debugger_thread (void *arg) internal->state |= ThreadState_Background; internal->flags |= MONO_THREAD_FLAG_DONT_MANAGE; - mono_thread_info_set_flags(MONO_THREAD_INFO_FLAGS_NO_GC | MONO_THREAD_INFO_FLAGS_NO_SAMPLE); if (agent_config.defer) { if (!wait_for_attach ()) { From 07117d64edde4349157b51e517e0cd47b1105333 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Tue, 30 Nov 2021 19:12:31 +0800 Subject: [PATCH 5/6] remove empty indent --- src/mono/mono/component/debugger-agent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 64e9e34f063c5c..10a7af615a71f9 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -10142,7 +10142,7 @@ debugger_thread (void *arg) internal->state |= ThreadState_Background; internal->flags |= MONO_THREAD_FLAG_DONT_MANAGE; - + if (agent_config.defer) { if (!wait_for_attach ()) { PRINT_DEBUG_MSG (1, "[dbg] Can't attach, aborting debugger thread.\n"); From b9d6083a94bfb7e65a676d45655c8201137e7e44 Mon Sep 17 00:00:00 2001 From: "D.S. Qiu" Date: Wed, 1 Dec 2021 07:28:21 +0800 Subject: [PATCH 6/6] change MONO_REQ_GC_SAFE_MODE to MONO_REQ_GC_UNSAFE_MODE --- src/mono/mono/component/debugger-agent.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mono/mono/component/debugger-agent.c b/src/mono/mono/component/debugger-agent.c index 10a7af615a71f9..98a51b33f52594 100644 --- a/src/mono/mono/component/debugger-agent.c +++ b/src/mono/mono/component/debugger-agent.c @@ -10022,7 +10022,7 @@ cmd_to_string (CommandSet set, int command) static gboolean wait_for_attach (void) { - MONO_REQ_GC_SAFE_MODE; + MONO_REQ_GC_UNSAFE_MODE; #ifndef DISABLE_SOCKET_TRANSPORT if (listen_fd == -1) {