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 @@
1/* 1/*
2 * thread.c 2 * thread.c
3 * 3 *
4 * Copyright (c) 2012 Martin Szulecki All Rights Reserved. 4 * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved.
5 * Copyright (c) 2012 Nikias Bassen All Rights Reserved. 5 * Copyright (c) 2012 Martin Szulecki, All Rights Reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
@@ -19,9 +19,12 @@
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */ 20 */
21 21
22#ifdef HAVE_CONFIG_H
23#include <config.h>
24#endif
22#include "thread.h" 25#include "thread.h"
23 26
24int thread_new(thread_t *thread, thread_func_t thread_func, void* data) 27int thread_new(THREAD_T *thread, thread_func_t thread_func, void* data)
25{ 28{
26#ifdef WIN32 29#ifdef WIN32
27 HANDLE th = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_func, data, 0, NULL); 30 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)
36#endif 39#endif
37} 40}
38 41
39void thread_free(thread_t thread) 42void thread_detach(THREAD_T thread)
40{ 43{
41#ifdef WIN32 44#ifdef WIN32
42 CloseHandle(thread); 45 CloseHandle(thread);
46#else
47 pthread_detach(thread);
43#endif 48#endif
44} 49}
45 50
46void thread_join(thread_t thread) 51void thread_free(THREAD_T thread)
52{
53#ifdef WIN32
54 CloseHandle(thread);
55#endif
56}
57
58int thread_join(THREAD_T thread)
47{ 59{
48 /* wait for thread to complete */ 60 /* wait for thread to complete */
49#ifdef WIN32 61#ifdef WIN32
50 WaitForSingleObject(thread, INFINITE); 62 return (int)WaitForSingleObject(thread, INFINITE);
63#else
64 return pthread_join(thread, NULL);
65#endif
66}
67
68int thread_alive(THREAD_T thread)
69{
70#ifdef WIN32
71 return WaitForSingleObject(thread, 0) == WAIT_TIMEOUT;
51#else 72#else
52 pthread_join(thread, NULL); 73 return pthread_kill(thread, 0) == 0;
74#endif
75}
76
77int thread_cancel(THREAD_T thread)
78{
79#ifdef WIN32
80 return -1;
81#else
82#ifdef HAVE_PTHREAD_CANCEL
83 return pthread_cancel(thread);
84#else
85 return -1;
86#endif
53#endif 87#endif
54} 88}
55 89
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 @@
1/* 1/*
2 * thread.h 2 * thread.h
3 * 3 *
4 * Copyright (c) 2012 Martin Szulecki All Rights Reserved. 4 * Copyright (c) 2012-2019 Nikias Bassen, All Rights Reserved.
5 * Copyright (c) 2012 Nikias Bassen All Rights Reserved. 5 * Copyright (c) 2012 Martin Szulecki, All Rights Reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
@@ -22,9 +22,11 @@
22#ifndef __THREAD_H 22#ifndef __THREAD_H
23#define __THREAD_H 23#define __THREAD_H
24 24
25#include <stddef.h>
26
25#ifdef WIN32 27#ifdef WIN32
26#include <windows.h> 28#include <windows.h>
27typedef HANDLE thread_t; 29typedef HANDLE THREAD_T;
28typedef CRITICAL_SECTION mutex_t; 30typedef CRITICAL_SECTION mutex_t;
29typedef volatile struct { 31typedef volatile struct {
30 LONG lock; 32 LONG lock;
@@ -32,20 +34,37 @@ typedef volatile struct {
32} thread_once_t; 34} thread_once_t;
33#define THREAD_ONCE_INIT {0, 0} 35#define THREAD_ONCE_INIT {0, 0}
34#define THREAD_ID GetCurrentThreadId() 36#define THREAD_ID GetCurrentThreadId()
37#define THREAD_T_NULL (THREAD_T)NULL
35#else 38#else
36#include <pthread.h> 39#include <pthread.h>
37typedef pthread_t thread_t; 40#include <signal.h>
41typedef pthread_t THREAD_T;
38typedef pthread_mutex_t mutex_t; 42typedef pthread_mutex_t mutex_t;
39typedef pthread_once_t thread_once_t; 43typedef pthread_once_t thread_once_t;
40#define THREAD_ONCE_INIT PTHREAD_ONCE_INIT 44#define THREAD_ONCE_INIT PTHREAD_ONCE_INIT
41#define THREAD_ID pthread_self() 45#define THREAD_ID pthread_self()
46#define THREAD_T_NULL (THREAD_T)NULL
42#endif 47#endif
43 48
44typedef void* (*thread_func_t)(void* data); 49typedef void* (*thread_func_t)(void* data);
45 50
46int thread_new(thread_t* thread, thread_func_t thread_func, void* data); 51int thread_new(THREAD_T* thread, thread_func_t thread_func, void* data);
47void thread_free(thread_t thread); 52void thread_detach(THREAD_T thread);
48void thread_join(thread_t thread); 53void thread_free(THREAD_T thread);
54int thread_join(THREAD_T thread);
55int thread_alive(THREAD_T thread);
56
57int thread_cancel(THREAD_T thread);
58
59#ifdef WIN32
60#undef HAVE_THREAD_CLEANUP
61#else
62#ifdef HAVE_PTHREAD_CANCEL
63#define HAVE_THREAD_CLEANUP 1
64#define thread_cleanup_push(routine, arg) pthread_cleanup_push(routine, arg)
65#define thread_cleanup_pop(execute) pthread_cleanup_pop(execute)
66#endif
67#endif
49 68
50void mutex_init(mutex_t* mutex); 69void mutex_init(mutex_t* mutex);
51void mutex_destroy(mutex_t* mutex); 70void mutex_destroy(mutex_t* mutex);