diff options
-rw-r--r-- | tests/src/Exceptions/ForeignThread/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/src/Exceptions/ForeignThread/ForeignThreadExceptionsNative.cpp | 41 |
2 files changed, 42 insertions, 3 deletions
diff --git a/tests/src/Exceptions/ForeignThread/CMakeLists.txt b/tests/src/Exceptions/ForeignThread/CMakeLists.txt index 66d249c739..a8ab5a12a6 100644 --- a/tests/src/Exceptions/ForeignThread/CMakeLists.txt +++ b/tests/src/Exceptions/ForeignThread/CMakeLists.txt @@ -11,6 +11,10 @@ endif(CLR_CMAKE_PLATFORM_DARWIN) set(SOURCES ForeignThreadExceptionsNative.cpp) +if(NOT WIN32) +add_compile_options(-pthread) +endif() + # add the executable add_library (ForeignThreadExceptionsNative SHARED ${SOURCES}) diff --git a/tests/src/Exceptions/ForeignThread/ForeignThreadExceptionsNative.cpp b/tests/src/Exceptions/ForeignThread/ForeignThreadExceptionsNative.cpp index 67a92e30e9..546935b6d6 100644 --- a/tests/src/Exceptions/ForeignThread/ForeignThreadExceptionsNative.cpp +++ b/tests/src/Exceptions/ForeignThread/ForeignThreadExceptionsNative.cpp @@ -3,11 +3,16 @@ // See the LICENSE file in the project root for more information. #include "stdio.h" +#include <stdlib.h> +#ifdef _WIN32 #pragma warning(push) #pragma warning(disable:4265 4577) - #include <thread> +#include <thread> #pragma warning(pop) +#else // _WIN32 +#include <pthread.h> +#endif // _WIN32 // Work around typedef redefinition: platformdefines.h defines error_t // as unsigned while it's defined as int in errno.h. @@ -16,14 +21,44 @@ #undef error_t typedef void (*PFNACTION1)(); - extern "C" DLL_EXPORT void InvokeCallback(PFNACTION1 callback) { callback(); } +#ifndef _WIN32 +void* InvokeCallbackUnix(void* callback) +{ + InvokeCallback((PFNACTION1)callback); + return NULL; +} + +#define AbortIfFail(st) if (st != 0) abort() + +#endif // !_WIN32 + extern "C" DLL_EXPORT void InvokeCallbackOnNewThread(PFNACTION1 callback) { +#ifdef _WIN32 std::thread t1(InvokeCallback, callback); t1.join(); -}
\ No newline at end of file +#else // _WIN32 + // For Unix, we need to use pthreads to create the thread so that we can set its stack size. + // We need to set the stack size due to the very small (80kB) default stack size on MUSL + // based Linux distros. + pthread_attr_t attr; + int st = pthread_attr_init(&attr); + AbortIfFail(st); + + // set stack size to 1.5MB + st = pthread_attr_setstacksize(&attr, 0x180000); + AbortIfFail(st); + + pthread_t t; + st = pthread_create(&t, &attr, InvokeCallbackUnix, (void*)callback); + AbortIfFail(st); + + st = pthread_join(t, NULL); + AbortIfFail(st); +#endif // _WIN32 +} |