summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/thread.c48
-rw-r--r--common/thread.h33
2 files changed, 67 insertions, 14 deletions
diff --git a/common/thread.c b/common/thread.c
index fdc8112..eb535ab 100644
--- a/common/thread.c
+++ b/common/thread.c
@@ -1,8 +1,8 @@
/*
* thread.c
*
- * Copyright (c) 2012 Martin Szulecki All Rights Reserved.
- * Copyright (c) 2012 Nikias Bassen All Rights Reserved.
+ * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved.
+ * Copyright (c) 2012 Martin Szulecki, All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -19,9 +19,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
#include "thread.h"
-int thread_new(thread_t *thread, thread_func_t thread_func, void* data)
+int thread_new(THREAD_T *thread, thread_func_t thread_func, void* data)
{
#ifdef WIN32
HANDLE th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, data, 0, NULL);
@@ -36,20 +39,51 @@ int thread_new(thread_t *thread, thread_func_t thread_func, void* data)
#endif
}
-void thread_free(thread_t thread)
+void thread_detach(THREAD_T thread)
{
#ifdef WIN32
CloseHandle(thread);
+#else
+ pthread_detach(thread);
#endif
}
-void thread_join(thread_t thread)
+void thread_free(THREAD_T thread)
+{
+#ifdef WIN32
+ CloseHandle(thread);
+#endif
+}
+
+int thread_join(THREAD_T thread)
{
/* wait for thread to complete */
#ifdef WIN32
- WaitForSingleObject(thread, INFINITE);
+ return (int)WaitForSingleObject(thread, INFINITE);
+#else
+ return pthread_join(thread, NULL);
+#endif
+}
+
+int thread_alive(THREAD_T thread)
+{
+#ifdef WIN32
+ return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT;
#else
- pthread_join(thread, NULL);
+ return pthread_kill(thread, 0) == 0;
+#endif
+}
+
+int thread_cancel(THREAD_T thread)
+{
+#ifdef WIN32
+ return -1;
+#else
+#ifdef HAVE_PTHREAD_CANCEL
+ return pthread_cancel(thread);
+#else
+ return -1;
+#endif
#endif
}
diff --git a/common/thread.h b/common/thread.h
index bd53c5b..23e4510 100644
--- a/common/thread.h
+++ b/common/thread.h
@@ -1,8 +1,8 @@
/*
* thread.h
*
- * Copyright (c) 2012 Martin Szulecki All Rights Reserved.
- * Copyright (c) 2012 Nikias Bassen All Rights Reserved.
+ * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved.
+ * Copyright (c) 2012 Martin Szulecki, All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,9 +22,11 @@
#ifndef __THREAD_H
#define __THREAD_H
+#include <stddef.h>
+
#ifdef WIN32
#include <windows.h>
-typedef HANDLE thread_t;
+typedef HANDLE THREAD_T;
typedef CRITICAL_SECTION mutex_t;
typedef volatile struct {
LONG lock;
@@ -32,20 +34,37 @@ typedef volatile struct {
} thread_once_t;
#define THREAD_ONCE_INIT {0, 0}
#define THREAD_ID GetCurrentThreadId()
+#define THREAD_T_NULL (THREAD_T)NULL
#else
#include <pthread.h>
-typedef pthread_t thread_t;
+#include <signal.h>
+typedef pthread_t THREAD_T;
typedef pthread_mutex_t mutex_t;
typedef pthread_once_t thread_once_t;
#define THREAD_ONCE_INIT PTHREAD_ONCE_INIT
#define THREAD_ID pthread_self()
+#define THREAD_T_NULL (THREAD_T)NULL
#endif
typedef void* (*thread_func_t)(void* data);
-int thread_new(thread_t* thread, thread_func_t thread_func, void* data);
-void thread_free(thread_t thread);
-void thread_join(thread_t thread);
+int thread_new(THREAD_T* thread, thread_func_t thread_func, void* data);
+void thread_detach(THREAD_T thread);
+void thread_free(THREAD_T thread);
+int thread_join(THREAD_T thread);
+int thread_alive(THREAD_T thread);
+
+int thread_cancel(THREAD_T thread);
+
+#ifdef WIN32
+#undef HAVE_THREAD_CLEANUP
+#else
+#ifdef HAVE_PTHREAD_CANCEL
+#define HAVE_THREAD_CLEANUP 1
+#define thread_cleanup_push(routine, arg) pthread_cleanup_push(routine, arg)
+#define thread_cleanup_pop(execute) pthread_cleanup_pop(execute)
+#endif
+#endif
void mutex_init(mutex_t* mutex);
void mutex_destroy(mutex_t* mutex);