Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
159 lines (139 loc) · 4.01 KB

SDL_sysmutex.c

File metadata and controls

159 lines (139 loc) · 4.01 KB
 
1
2
/*
SDL - Simple DirectMedia Layer
Feb 1, 2006
Feb 1, 2006
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
20
21
Sam Lantinga
slouken@libsdl.org
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
23
24
25
/* RISC OS implementations uses pthreads based on linux code */
Feb 16, 2006
Feb 16, 2006
26
27
28
#include "SDL_thread.h"
#if SDL_THREADS_DISABLED
29
30
31
32
33
#include "../generic/SDL_sysmutex.c"
#else
#include <pthread.h>
Jul 10, 2006
Jul 10, 2006
34
35
36
struct SDL_mutex
{
pthread_mutex_t id;
Feb 16, 2006
Feb 16, 2006
37
#if SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX
Jul 10, 2006
Jul 10, 2006
38
39
int recursive;
pthread_t owner;
40
41
42
#endif
};
Jul 10, 2006
Jul 10, 2006
43
44
SDL_mutex *
SDL_CreateMutex(void)
45
{
Jul 10, 2006
Jul 10, 2006
46
47
SDL_mutex *mutex;
pthread_mutexattr_t attr;
48
Jul 10, 2006
Jul 10, 2006
49
50
51
52
/* Allocate the structure */
mutex = (SDL_mutex *) SDL_calloc(1, sizeof(*mutex));
if (mutex) {
pthread_mutexattr_init(&attr);
Feb 16, 2006
Feb 16, 2006
53
#if SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX
Jul 10, 2006
Jul 10, 2006
54
/* No extra attributes necessary */
55
#else
Jul 10, 2006
Jul 10, 2006
56
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
Feb 16, 2006
Feb 16, 2006
57
#endif /* SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX */
Jul 10, 2006
Jul 10, 2006
58
59
60
61
62
63
64
65
66
if (pthread_mutex_init(&mutex->id, &attr) != 0) {
SDL_SetError("pthread_mutex_init() failed");
SDL_free(mutex);
mutex = NULL;
}
} else {
SDL_OutOfMemory();
}
return (mutex);
67
68
}
Jul 10, 2006
Jul 10, 2006
69
70
void
SDL_DestroyMutex(SDL_mutex * mutex)
71
{
Jul 10, 2006
Jul 10, 2006
72
73
74
75
if (mutex) {
pthread_mutex_destroy(&mutex->id);
SDL_free(mutex);
}
76
77
78
}
/* Lock the mutex */
Jul 10, 2006
Jul 10, 2006
79
80
int
SDL_mutexP(SDL_mutex * mutex)
81
{
Jul 10, 2006
Jul 10, 2006
82
int retval;
Feb 16, 2006
Feb 16, 2006
83
#if SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX
Jul 10, 2006
Jul 10, 2006
84
pthread_t this_thread;
85
86
#endif
Jul 10, 2006
Jul 10, 2006
87
88
89
90
if (mutex == NULL) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
91
Jul 10, 2006
Jul 10, 2006
92
retval = 0;
Feb 16, 2006
Feb 16, 2006
93
#if SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX
Jul 10, 2006
Jul 10, 2006
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
this_thread = pthread_self();
if (mutex->owner == this_thread) {
++mutex->recursive;
} else {
/* The order of operations is important.
We set the locking thread id after we obtain the lock
so unlocks from other threads will fail.
*/
if (pthread_mutex_lock(&mutex->id) == 0) {
mutex->owner = this_thread;
mutex->recursive = 0;
} else {
SDL_SetError("pthread_mutex_lock() failed");
retval = -1;
}
}
110
#else
Jul 10, 2006
Jul 10, 2006
111
112
113
114
if (pthread_mutex_lock(&mutex->id) < 0) {
SDL_SetError("pthread_mutex_lock() failed");
retval = -1;
}
115
#endif
Jul 10, 2006
Jul 10, 2006
116
return retval;
117
118
}
Jul 10, 2006
Jul 10, 2006
119
120
int
SDL_mutexV(SDL_mutex * mutex)
121
{
Jul 10, 2006
Jul 10, 2006
122
int retval;
123
Jul 10, 2006
Jul 10, 2006
124
125
126
127
if (mutex == NULL) {
SDL_SetError("Passed a NULL mutex");
return -1;
}
128
Jul 10, 2006
Jul 10, 2006
129
retval = 0;
Feb 16, 2006
Feb 16, 2006
130
#if SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX
Jul 10, 2006
Jul 10, 2006
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* We can only unlock the mutex if we own it */
if (pthread_self() == mutex->owner) {
if (mutex->recursive) {
--mutex->recursive;
} else {
/* The order of operations is important.
First reset the owner so another thread doesn't lock
the mutex and set the ownership before we reset it,
then release the lock semaphore.
*/
mutex->owner = 0;
pthread_mutex_unlock(&mutex->id);
}
} else {
SDL_SetError("mutex not owned by this thread");
retval = -1;
}
148
149
#else
Jul 10, 2006
Jul 10, 2006
150
151
152
153
if (pthread_mutex_unlock(&mutex->id) < 0) {
SDL_SetError("pthread_mutex_unlock() failed");
retval = -1;
}
Feb 16, 2006
Feb 16, 2006
154
#endif /* SDL_THREAD_PTHREAD_NO_RECURSIVE_MUTEX */
155
Jul 10, 2006
Jul 10, 2006
156
return retval;
157
158
}
#endif
Jul 10, 2006
Jul 10, 2006
159
/* vi: set ts=4 sw=4 expandtab: */