• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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