#include <stdbool.h>
#include "c11/threads.h"
+#include "detect_os.h"
#ifdef HAVE_PTHREAD
#include <signal.h>
+#ifdef HAVE_PTHREAD_NP_H
+#include <pthread_np.h>
+#endif
+#endif
+
+#ifdef __HAIKU__
+#include <OS.h>
#endif
+#ifdef __FreeBSD__
+/* pthread_np.h -> sys/param.h -> machine/param.h
+ * - defines ALIGN which clashes with our ALIGN
+ */
+#undef ALIGN
+#define cpu_set_t cpuset_t
+#endif
static inline thrd_t u_thread_create(int (*routine)(void *), void *param)
{
int ret;
sigfillset(&new_set);
- pthread_sigmask(SIG_SETMASK, &new_set, &saved_set);
+ sigdelset(&new_set, SIGSYS);
+ pthread_sigmask(SIG_BLOCK, &new_set, &saved_set);
ret = thrd_create( &thread, routine, param );
pthread_sigmask(SIG_SETMASK, &saved_set, NULL);
#else
static inline void u_thread_setname( const char *name )
{
#if defined(HAVE_PTHREAD)
-# if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \
- (__GLIBC__ >= 3 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12)) && \
- defined(__linux__)
+#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS
pthread_setname_np(pthread_self(), name);
-# endif
+#elif DETECT_OS_FREEBSD || DETECT_OS_OPENBSD
+ pthread_set_name_np(pthread_self(), name);
+#elif DETECT_OS_NETBSD
+ pthread_setname_np(pthread_self(), "%s", (void *)name);
+#elif DETECT_OS_APPLE
+ pthread_setname_np(name);
+#elif DETECT_OS_HAIKU
+ rename_thread(find_thread(NULL), name);
+#else
+#warning Not sure how to call pthread_setname_np
+#endif
#endif
(void)name;
}
static inline void
util_pin_thread_to_L3(thrd_t thread, unsigned L3_index, unsigned cores_per_L3)
{
-#if defined(HAVE_PTHREAD)
+#if defined(HAVE_PTHREAD_SETAFFINITY)
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
static inline int
util_get_L3_for_pinned_thread(thrd_t thread, unsigned cores_per_L3)
{
-#if defined(HAVE_PTHREAD)
+#if defined(HAVE_PTHREAD_SETAFFINITY)
cpu_set_t cpuset;
if (pthread_getaffinity_np(thread, sizeof(cpuset), &cpuset) == 0) {
static inline int64_t
u_thread_get_time_nano(thrd_t thread)
{
-#if defined(__linux__) && defined(HAVE_PTHREAD)
+#if defined(HAVE_PTHREAD) && !defined(__APPLE__) && !defined(__HAIKU__)
struct timespec ts;
clockid_t cid;
static inline bool u_thread_is_self(thrd_t thread)
{
#if defined(HAVE_PTHREAD)
-# if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \
- (__GLIBC__ >= 3 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12))
return pthread_equal(pthread_self(), thread);
-# endif
#endif
return false;
}