From e9d80f88e77fbb2c9738e6bda2ad82bdd003a434 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Tue, 12 Jan 2021 13:01:58 -0500 Subject: [PATCH 1/4] [mono] Set thread suspend default in mono.proj; default to hybrid Instead of detecting in cmake, make a decision in mono.proj --- src/mono/CMakeLists.txt | 7 +++---- src/mono/mono.proj | 11 ++++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index 0df377c2cc2708..79c8a69aab5142 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -204,7 +204,6 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Android") set(ANDROID_UNIFIED_HEADERS 1) set(ENABLE_MONODROID 1) set(DISABLE_EXECUTABLES 1) - set(GC_SUSPEND "hybrid") # Force some defines set(HAVE_SCHED_GETAFFINITY 0) set(HAVE_SCHED_SETAFFINITY 0) @@ -255,9 +254,6 @@ if(TARGET_SYSTEM_NAME STREQUAL "Darwin") set(TARGET_MACH 1) set(TARGET_OSX 1) set(TARGET_DARWIN 1) - if (GC_SUSPEND STREQUAL "default") - set(GC_SUSPEND "hybrid") - endif() elseif(TARGET_SYSTEM_NAME STREQUAL "iOS" OR TARGET_SYSTEM_NAME STREQUAL "tvOS") set(TARGET_MACH 1) set(TARGET_IOS 1) @@ -543,6 +539,9 @@ if (GC_SUSPEND STREQUAL "coop") set(ENABLE_COOP_SUSPEND 1) elseif(GC_SUSPEND STREQUAL "hybrid") set(ENABLE_HYBRID_SUSPEND 1) +elseif(GC_SUSPEND STREQUAL "preemptive") +else() + message(FATAL_ERROR "GC_SUSPEND (set to '${GC_SUSPEND}') must be one of coop, hybrid or preemptive") endif() ###################################### diff --git a/src/mono/mono.proj b/src/mono/mono.proj index c460c4515dafc2..1e53b595f0ad2c 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -9,6 +9,7 @@ - MonoAOTLLVMDir - [optional] the directory where LLVM is located, for an AOT-only Mono - MonoVerboseBuild - enable verbose build - MonoMetadataUpdate - enable experimental method body replacement code + - MonoThreadSuspend - coop,hybrid,preemptive - default thread suspend mode --> @@ -45,6 +46,10 @@ $(MonoCCompiler.TrimStart('-')) clang++ g++ + + coop + + hybrid @@ -124,6 +129,7 @@ <_MonoCMakeArgs Include="-DCMAKE_INSTALL_LIBDIR=lib"/> <_MonoCMakeArgs Include="-DCMAKE_BUILD_TYPE=$(Configuration)"/> <_MonoCMakeArgs Condition="'$(MonoEnableLLVM)' == 'true'" Include="-DLLVM_PREFIX=$(MonoLLVMDir)" /> + <_MonoCMakeArgs Include="-DGC_SUSPEND=$(MonoThreadSuspend)" /> @@ -414,7 +420,10 @@ - + + + + From c0b635c5ce27ed8c582d07d834f44dd87d4d4a43 Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Fri, 15 Jan 2021 13:02:57 -0500 Subject: [PATCH 2/4] [cmake] Pick a fallback suspend policy if GC_SUSPEND is default --- src/mono/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index 79c8a69aab5142..85ea53471d70ad 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -540,6 +540,15 @@ if (GC_SUSPEND STREQUAL "coop") elseif(GC_SUSPEND STREQUAL "hybrid") set(ENABLE_HYBRID_SUSPEND 1) elseif(GC_SUSPEND STREQUAL "preemptive") +elseif(GC_SUSPEND STREQUAL "default") + # set some kind of fallback default + if(TARGET_SYSTEM_NAME STREQUAL "watchOS") + set(ENABLE_COOP_SUSPEND 1) + elseif(TARGET_SYSTEM_NAME STREQUAL "Windows") + # use preemptive + else() + set(ENABLE_HYBRID_SUSPEND 1) + endif() else() message(FATAL_ERROR "GC_SUSPEND (set to '${GC_SUSPEND}') must be one of coop, hybrid or preemptive") endif() From fe00669b1fbfe3f386181bf0e175ca2f4c5ef7cd Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Fri, 15 Jan 2021 14:31:24 -0500 Subject: [PATCH 3/4] cleanup mono.proj --- src/mono/mono.proj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 1e53b595f0ad2c..55ac82e6ab8e5c 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -46,9 +46,12 @@ $(MonoCCompiler.TrimStart('-')) clang++ g++ - - coop - + + + + + coop + hybrid From 48f8e55cc4a3ed2ee356f5ab45cbfac68514f95f Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Fri, 15 Jan 2021 14:31:35 -0500 Subject: [PATCH 4/4] default to "preemptive" on wasm It isn't really preemptive, it just turns off safepoint code in the AOT compiler. This is fine for single threaded. --- src/mono/CMakeLists.txt | 2 ++ src/mono/mono.proj | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index 85ea53471d70ad..e0e4a64f70f38a 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -546,6 +546,8 @@ elseif(GC_SUSPEND STREQUAL "default") set(ENABLE_COOP_SUSPEND 1) elseif(TARGET_SYSTEM_NAME STREQUAL "Windows") # use preemptive + elseif(TARGET_SYSTEM_NAME STREQUAL "Emscripten") + # use preemptive else() set(ENABLE_HYBRID_SUSPEND 1) endif() diff --git a/src/mono/mono.proj b/src/mono/mono.proj index 55ac82e6ab8e5c..d629d103b53c24 100644 --- a/src/mono/mono.proj +++ b/src/mono/mono.proj @@ -51,6 +51,8 @@ coop + + preemptive hybrid