1 /*
2 SDL - Simple DirectMedia Layer
3 Copyright (C) 1997-2006 Sam Lantinga
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19 Sam Lantinga
20 slouken@libsdl.org
21 */
22 #include "SDL_config.h"
23
24 /*
25 SDL_sysmutex.cpp
26
27 Epoc version by Markus Mertama (w@iki.fi)
28 */
29
30
31 /* Mutex functions using the Win32 API */
32
33 #include<e32std.h>
34
35 #include "SDL_error.h"
36 #include "SDL_mutex.h"
37
38
39
40 struct SDL_mutex
41 {
42 TInt handle;
43 };
44
45 extern TInt CreateUnique(TInt (*aFunc)(const TDesC& aName, TAny*, TAny*), TAny*, TAny*);
46
NewMutex(const TDesC & aName,TAny * aPtr1,TAny *)47 TInt NewMutex(const TDesC& aName, TAny* aPtr1, TAny*)
48 {
49 return ((RMutex*)aPtr1)->CreateGlobal(aName);
50 }
51
52 /* Create a mutex */
SDL_CreateMutex(void)53 SDL_mutex *SDL_CreateMutex(void)
54 {
55 RMutex rmutex;
56
57 TInt status = CreateUnique(NewMutex, &rmutex, NULL);
58 if(status != KErrNone)
59 {
60 SDL_SetError("Couldn't create mutex");
61 }
62 SDL_mutex* mutex = new /*(ELeave)*/ SDL_mutex;
63 mutex->handle = rmutex.Handle();
64 return(mutex);
65 }
66
67 /* Free the mutex */
SDL_DestroyMutex(SDL_mutex * mutex)68 void SDL_DestroyMutex(SDL_mutex *mutex)
69 {
70 if ( mutex )
71 {
72 RMutex rmutex;
73 rmutex.SetHandle(mutex->handle);
74 rmutex.Signal();
75 rmutex.Close();
76 delete(mutex);
77 mutex = NULL;
78 }
79 }
80
81 /* Lock the mutex */
SDL_mutexP(SDL_mutex * mutex)82 int SDL_mutexP(SDL_mutex *mutex)
83 {
84 if ( mutex == NULL ) {
85 SDL_SetError("Passed a NULL mutex");
86 return -1;
87 }
88 RMutex rmutex;
89 rmutex.SetHandle(mutex->handle);
90 rmutex.Wait();
91 return(0);
92 }
93
94 /* Unlock the mutex */
SDL_mutexV(SDL_mutex * mutex)95 int SDL_mutexV(SDL_mutex *mutex)
96 {
97 if ( mutex == NULL ) {
98 SDL_SetError("Passed a NULL mutex");
99 return -1;
100 }
101 RMutex rmutex;
102 rmutex.SetHandle(mutex->handle);
103 rmutex.Signal();
104 return(0);
105 }
106