Mercurial > sdl-ios-xcode
annotate test/testlock.c @ 1207:c9ec00d3e8bc
To: sdl@libsdl.org
From: Christian Walther <cwalther@gmx.ch>
Date: Wed, 21 Dec 2005 13:39:39 +0100
Subject: [SDL] Another mouse bug patch for Mac OS X
Oh my, yet another change in the quartz mouse handling code! :)
The attached patch fixes the following bug:
Calling SDL_WarpMouse() while the cursor is invisible and grabbed should
only update SDL's internal mouse location, not try to warp the system
cursor (which is not at that location, but fixed in the middle of the
window). Otherwise, the next mouse motion event is wrong.
Please apply.
Thanks
Christian
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Wed, 21 Dec 2005 18:02:36 +0000 |
parents | be9c9c8f6d53 |
children | 14717b52abc0 |
rev | line source |
---|---|
0 | 1 |
2 /* Test the thread and mutex locking functions | |
3 Also exercises the system's signal/thread interaction | |
4 */ | |
5 | |
6 #include <signal.h> | |
7 #include <stdio.h> | |
8 #include <stdlib.h> | |
9 | |
10 #include "SDL.h" | |
11 #include "SDL_mutex.h" | |
12 #include "SDL_thread.h" | |
13 | |
14 static SDL_mutex *mutex = NULL; | |
15 static Uint32 mainthread; | |
16 static SDL_Thread *threads[6]; | |
17 | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
18 /* |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
19 * SDL_Quit() shouldn't be used with atexit() directly because |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
20 * calling conventions may differ... |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
21 */ |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
22 static void SDL_Quit_Wrapper(void) |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
23 { |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
24 SDL_Quit(); |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
25 } |
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
26 |
0 | 27 void printid(void) |
28 { | |
29 printf("Process %u: exiting\n", SDL_ThreadID()); | |
30 } | |
31 | |
32 void terminate(int sig) | |
33 { | |
34 printf("Process %u: raising SIGTERM\n", SDL_ThreadID()); | |
35 raise(SIGTERM); | |
36 } | |
37 void closemutex(int sig) | |
38 { | |
39 Uint32 id = SDL_ThreadID(); | |
40 int i; | |
41 printf("Process %u: Cleaning up...\n", id == mainthread ? 0 : id); | |
42 for ( i=0; i<6; ++i ) | |
43 SDL_KillThread(threads[i]); | |
44 SDL_DestroyMutex(mutex); | |
45 exit(sig); | |
46 } | |
47 int Run(void *data) | |
48 { | |
49 if ( SDL_ThreadID() == mainthread ) | |
50 signal(SIGTERM, closemutex); | |
51 while ( 1 ) { | |
52 printf("Process %u ready to work\n", SDL_ThreadID()); | |
53 if ( SDL_mutexP(mutex) < 0 ) { | |
54 fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError()); | |
55 exit(1); | |
56 } | |
57 printf("Process %u, working!\n", SDL_ThreadID()); | |
58 SDL_Delay(1*1000); | |
59 printf("Process %u, done!\n", SDL_ThreadID()); | |
60 if ( SDL_mutexV(mutex) < 0 ) { | |
61 fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError()); | |
62 exit(1); | |
63 } | |
64 /* If this sleep isn't done, then threads may starve */ | |
65 SDL_Delay(10); | |
66 } | |
67 return(0); | |
68 } | |
69 | |
70 int main(int argc, char *argv[]) | |
71 { | |
72 int i; | |
73 int maxproc = 6; | |
74 | |
75 /* Load the SDL library */ | |
76 if ( SDL_Init(0) < 0 ) { | |
77 fprintf(stderr, "%s\n", SDL_GetError()); | |
78 exit(1); | |
79 } | |
1151
be9c9c8f6d53
Removed atexit() from most of the test programs; atexit(SDL_Quit) isn't safe
Ryan C. Gordon <icculus@icculus.org>
parents:
0
diff
changeset
|
80 atexit(SDL_Quit_Wrapper); |
0 | 81 |
82 if ( (mutex=SDL_CreateMutex()) == NULL ) { | |
83 fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError()); | |
84 exit(1); | |
85 } | |
86 | |
87 mainthread = SDL_ThreadID(); | |
88 printf("Main thread: %u\n", mainthread); | |
89 atexit(printid); | |
90 for ( i=0; i<maxproc; ++i ) { | |
91 if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL ) | |
92 fprintf(stderr, "Couldn't create thread!\n"); | |
93 } | |
94 signal(SIGINT, terminate); | |
95 Run(NULL); | |
96 | |
97 return(0); /* Never reached */ | |
98 } |