#include <errno.h>
-#if defined(PLATFORM_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64)
+#if defined(HOST_ANDROID) && !defined(TARGET_ARM64) && !defined(TARGET_AMD64)
#define USE_TKILL_ON_ANDROID 1
#endif
extern int tkill (pid_t tid, int signal);
#endif
-#if defined(_POSIX_VERSION) || defined(__native_client__)
+#if defined(_POSIX_VERSION) && !defined (TARGET_WASM)
#include <pthread.h>
mono_threads_pthread_kill (MonoThreadInfo *info, int signum)
{
THREADS_SUSPEND_DEBUG ("sending signal %d to %p[%p]\n", signum, info, mono_thread_info_get_tid (info));
+
+ int result;
+
#ifdef USE_TKILL_ON_ANDROID
- int result, old_errno = errno;
+ int old_errno = errno;
+
result = tkill (info->native_handle, signum);
+
if (result < 0) {
result = errno;
errno = old_errno;
}
- return result;
-#elif defined(__native_client__)
- /* Workaround pthread_kill abort() in NaCl glibc. */
- return 0;
-#elif !defined(HAVE_PTHREAD_KILL)
- g_error ("pthread_kill() is not supported by this platform");
+#elif defined (HAVE_PTHREAD_KILL)
+ result = pthread_kill (mono_thread_info_get_tid (info), signum);
#else
- return pthread_kill (mono_thread_info_get_tid (info), signum);
+ result = -1;
+ g_error ("pthread_kill () is not supported by this platform");
#endif
+
+ if (result && result != ESRCH)
+ g_error ("%s: pthread_kill failed with error %d - potential kernel OOM or signal queue overflow", __func__, result);
+
+ return result;
}
MonoNativeThreadId
} else {
char n [63];
- memcpy (n, name, sizeof (n) - 1);
+ strncpy (n, name, sizeof (n) - 1);
n [sizeof (n) - 1] = '\0';
pthread_setname_np (n);
}
} else {
char n [PTHREAD_MAX_NAMELEN_NP];
- memcpy (n, name, sizeof (n) - 1);
+ strncpy (n, name, sizeof (n) - 1);
n [sizeof (n) - 1] = '\0';
pthread_setname_np (tid, "%s", (void*)n);
}
} else {
char n [16];
- memcpy (n, name, sizeof (n) - 1);
+ strncpy (n, name, sizeof (n) - 1);
n [sizeof (n) - 1] = '\0';
pthread_setname_np (tid, n);
}
return !pthread_join (tid, &res);
}
-#endif /* defined(_POSIX_VERSION) || defined(__native_client__) */
+#endif /* defined(_POSIX_VERSION) */
#if defined(USE_POSIX_BACKEND)
void
mono_threads_suspend_register (MonoThreadInfo *info)
{
-#if defined (PLATFORM_ANDROID)
+#if defined (HOST_ANDROID)
info->native_handle = gettid ();
#endif
}