symbian-qemu-0.9.1-12/libsdl-trunk/test/testlock.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/libsdl-trunk/test/testlock.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,102 @@
+
+/* Test the thread and mutex locking functions 
+   Also exercises the system's signal/thread interaction
+*/
+
+#include <signal.h>
+#include <stdio.h>
+
+#include "SDL.h"
+#include "SDL_mutex.h"
+#include "SDL_thread.h"
+
+static SDL_mutex *mutex = NULL;
+static Uint32 mainthread;
+static SDL_Thread *threads[6];
+static volatile int doterminate = 0;
+
+/*
+ * SDL_Quit() shouldn't be used with atexit() directly because
+ *  calling conventions may differ...
+ */
+static void SDL_Quit_Wrapper(void)
+{
+	SDL_Quit();
+}
+
+void printid(void)
+{
+	printf("Process %u:  exiting\n", SDL_ThreadID());
+}
+	
+void terminate(int sig)
+{
+	signal(SIGINT, terminate);
+	doterminate = 1;
+}
+void closemutex(int sig)
+{
+	Uint32 id = SDL_ThreadID();
+	int i;
+	printf("Process %u:  Cleaning up...\n", id == mainthread ? 0 : id);
+	for ( i=0; i<6; ++i )
+		SDL_KillThread(threads[i]);
+	SDL_DestroyMutex(mutex);
+	exit(sig);
+}
+int SDLCALL Run(void *data)
+{
+	if ( SDL_ThreadID() == mainthread )
+		signal(SIGTERM, closemutex);
+	while ( 1 ) {
+		printf("Process %u ready to work\n", SDL_ThreadID());
+		if ( SDL_mutexP(mutex) < 0 ) {
+			fprintf(stderr, "Couldn't lock mutex: %s", SDL_GetError());
+			exit(1);
+		}
+		printf("Process %u, working!\n", SDL_ThreadID());
+		SDL_Delay(1*1000);
+		printf("Process %u, done!\n", SDL_ThreadID());
+		if ( SDL_mutexV(mutex) < 0 ) {
+			fprintf(stderr, "Couldn't unlock mutex: %s", SDL_GetError());
+			exit(1);
+		}
+		/* If this sleep isn't done, then threads may starve */
+		SDL_Delay(10);
+		if (SDL_ThreadID() == mainthread && doterminate) {
+			printf("Process %u:  raising SIGTERM\n", SDL_ThreadID());
+			raise(SIGTERM);
+		}
+	}
+	return(0);
+}
+
+int main(int argc, char *argv[])
+{
+	int i;
+	int maxproc = 6;
+
+	/* Load the SDL library */
+	if ( SDL_Init(0) < 0 ) {
+		fprintf(stderr, "%s\n", SDL_GetError());
+		exit(1);
+	}
+	atexit(SDL_Quit_Wrapper);
+
+	if ( (mutex=SDL_CreateMutex()) == NULL ) {
+		fprintf(stderr, "Couldn't create mutex: %s\n", SDL_GetError());
+		exit(1);
+	}
+
+	mainthread = SDL_ThreadID();
+	printf("Main thread: %u\n", mainthread);
+	atexit(printid);
+	for ( i=0; i<maxproc; ++i ) {
+		if ( (threads[i]=SDL_CreateThread(Run, NULL)) == NULL )
+			fprintf(stderr, "Couldn't create thread!\n");
+	}
+	signal(SIGINT, terminate);
+	Run(NULL);
+
+	return(0);	/* Never reached */
+}