ObjFW  Diff

Differences From Artifact [200dbcfe20]:

To Artifact [cf0b2b29a1]:


16
17
18
19
20
21
22
23

24
25
26
27
28
29

30
31
32
33
34
35
36
16
17
18
19
20
21
22

23
24
25
26
27
28

29
30
31
32
33
34
35
36







-
+





-
+








#include "config.h"

#import "threading.h"

#if defined(OF_HAVE_PTHREADS)
# include "threading_pthread.m"
#elif defined(_WIN32)
#elif defined(OF_WINDOWS)
# include "threading_winapi.m"
#else
# error No threads available!
#endif

#ifdef __HAIKU__
#ifdef OF_HAIKU
# include <kernel/OS.h>
#endif

bool
of_rmutex_new(of_rmutex_t *rmutex)
{
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES)
45
46
47
48
49
50
51
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

69
70
71
72
73
74
75
45
46
47
48
49
50
51

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

68
69
70
71
72
73
74
75







-
+















-
+







	if (pthread_mutex_init(rmutex, &attr) != 0)
		return false;

	if (pthread_mutexattr_destroy(&attr) != 0)
		return false;

	return true;
#elif defined(_WIN32)
#elif defined(OF_WINDOWS)
	return of_mutex_new(rmutex);
#else
	if (!of_mutex_new(&rmutex->mutex))
		return false;

	if (!of_tlskey_new(&rmutex->count))
		return false;

	return true;
#endif
}

bool
of_rmutex_lock(of_rmutex_t *rmutex)
{
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(_WIN32)
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS)
	return of_mutex_lock(rmutex);
#else
	uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count);

	if (count > 0) {
		if (!of_tlskey_set(rmutex->count, (void*)(count + 1)))
			return false;
88
89
90
91
92
93
94
95

96
97
98
99
100
101
102
88
89
90
91
92
93
94

95
96
97
98
99
100
101
102







-
+







	return true;
#endif
}

bool
of_rmutex_trylock(of_rmutex_t *rmutex)
{
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(_WIN32)
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS)
	return of_mutex_trylock(rmutex);
#else
	uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count);

	if (count > 0) {
		if (!of_tlskey_set(rmutex->count, (void*)(count + 1)))
			return false;
115
116
117
118
119
120
121
122

123
124
125
126
127
128
129
115
116
117
118
119
120
121

122
123
124
125
126
127
128
129







-
+







	return true;
#endif
}

bool
of_rmutex_unlock(of_rmutex_t *rmutex)
{
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(_WIN32)
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS)
	return of_mutex_unlock(rmutex);
#else
	uintptr_t count = (uintptr_t)of_tlskey_get(rmutex->count);

	if (count > 1) {
		if (!of_tlskey_set(rmutex->count, (void*)(count - 1)))
			return false;
140
141
142
143
144
145
146
147

148
149
150
151
152
153
154
155
156
157
158
140
141
142
143
144
145
146

147
148
149
150
151
152
153
154
155
156
157
158







-
+











	return true;
#endif
}

bool
of_rmutex_free(of_rmutex_t *rmutex)
{
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(_WIN32)
#if defined(OF_HAVE_RECURSIVE_PTHREAD_MUTEXES) || defined(OF_WINDOWS)
	return of_mutex_free(rmutex);
#else
	if (!of_mutex_free(&rmutex->mutex))
		return false;

	if (!of_tlskey_free(rmutex->count))
		return false;

	return true;
#endif
}