Mercurial > sdl-ios-xcode
annotate src/thread/win32/SDL_syssem.c @ 896:b56dc586a5ef
Date: Tue, 16 Mar 2004 12:40:33 +0000
From: Alan Swanson
Subject: [SDL] [PATCH] Linux joystick evdev axis count fix
The event device configuration under Linux does not check the returned
ioctl value when reading the axis information. This means extra
undefined axes are returned.
Note, in EV_HandleEvents, the default for case EV_ABS is to return any
axis information which is fine as we have already checked for all valid
absolute axes. No new axes should be returned after opening the device.
(Unless, of course, the evdev allows closing and reassigning a new
device while in use and I can't believe that happens.)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 16 May 2004 22:48:06 +0000 |
parents | b8d311d90021 |
children | c9b51268668f |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
769
b8d311d90021
Updated copyright information for 2004 (Happy New Year!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
3 Copyright (C) 1997-2004 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 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 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
36
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* Semaphore functions using the Win32 API */ | |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <windows.h> | |
33 | |
34 #include "SDL_error.h" | |
35 #include "SDL_thread.h" | |
36 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
37 #include "win_ce_semaphore.h" |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
38 #endif |
0 | 39 |
40 | |
41 struct SDL_semaphore { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
42 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
43 SYNCHHANDLE id; |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
44 #else |
0 | 45 HANDLE id; |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
46 #endif |
0 | 47 Uint32 volatile count; |
48 }; | |
49 | |
50 | |
51 /* Create a semaphore */ | |
52 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) | |
53 { | |
54 SDL_sem *sem; | |
55 | |
56 /* Allocate sem memory */ | |
57 sem = (SDL_sem *)malloc(sizeof(*sem)); | |
58 if ( sem ) { | |
59 /* Create the semaphore, with max value 32K */ | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
60 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
61 sem->id = CreateSemaphoreCE(NULL, initial_value, 32*1024, NULL); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
62 #else |
0 | 63 sem->id = CreateSemaphore(NULL, initial_value, 32*1024, NULL); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
64 #endif |
0 | 65 sem->count = initial_value; |
66 if ( ! sem->id ) { | |
67 SDL_SetError("Couldn't create semaphore"); | |
68 free(sem); | |
69 sem = NULL; | |
70 } | |
71 } else { | |
72 SDL_OutOfMemory(); | |
73 } | |
74 return(sem); | |
75 } | |
76 | |
77 /* Free the semaphore */ | |
78 void SDL_DestroySemaphore(SDL_sem *sem) | |
79 { | |
80 if ( sem ) { | |
81 if ( sem->id ) { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
82 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
83 CloseSynchHandle(sem->id); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
84 #else |
0 | 85 CloseHandle(sem->id); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
86 #endif |
0 | 87 sem->id = 0; |
88 } | |
89 free(sem); | |
90 } | |
91 } | |
92 | |
93 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) | |
94 { | |
95 int retval; | |
96 DWORD dwMilliseconds; | |
97 | |
98 if ( ! sem ) { | |
99 SDL_SetError("Passed a NULL sem"); | |
100 return -1; | |
101 } | |
102 | |
103 if ( timeout == SDL_MUTEX_MAXWAIT ) { | |
104 dwMilliseconds = INFINITE; | |
105 } else { | |
106 dwMilliseconds = (DWORD)timeout; | |
107 } | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
108 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
109 switch (WaitForSemaphoreCE(sem->id, dwMilliseconds)) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
110 #else |
0 | 111 switch (WaitForSingleObject(sem->id, dwMilliseconds)) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
112 #endif |
0 | 113 case WAIT_OBJECT_0: |
114 --sem->count; | |
115 retval = 0; | |
116 break; | |
117 case WAIT_TIMEOUT: | |
118 retval = SDL_MUTEX_TIMEDOUT; | |
119 break; | |
120 default: | |
121 SDL_SetError("WaitForSingleObject() failed"); | |
122 retval = -1; | |
123 break; | |
124 } | |
125 return retval; | |
126 } | |
127 | |
128 int SDL_SemTryWait(SDL_sem *sem) | |
129 { | |
130 return SDL_SemWaitTimeout(sem, 0); | |
131 } | |
132 | |
133 int SDL_SemWait(SDL_sem *sem) | |
134 { | |
135 return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT); | |
136 } | |
137 | |
138 /* Returns the current count of the semaphore */ | |
139 Uint32 SDL_SemValue(SDL_sem *sem) | |
140 { | |
141 if ( ! sem ) { | |
142 SDL_SetError("Passed a NULL sem"); | |
143 return 0; | |
144 } | |
145 return sem->count; | |
146 } | |
147 | |
148 int SDL_SemPost(SDL_sem *sem) | |
149 { | |
150 if ( ! sem ) { | |
151 SDL_SetError("Passed a NULL sem"); | |
152 return -1; | |
153 } | |
154 /* Increase the counter in the first place, because | |
155 * after a successful release the semaphore may | |
156 * immediately get destroyed by another thread which | |
157 * is waiting for this semaphore. | |
158 */ | |
159 ++sem->count; | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
160 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
161 if ( ReleaseSemaphoreCE(sem->id, 1, NULL) == FALSE ) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
162 #else |
0 | 163 if ( ReleaseSemaphore(sem->id, 1, NULL) == FALSE ) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
164 #endif |
0 | 165 --sem->count; /* restore */ |
166 SDL_SetError("ReleaseSemaphore() failed"); | |
167 return -1; | |
168 } | |
169 return 0; | |
170 } |