test/testlock.c
changeset 0 74212992fb08
child 1151 be9c9c8f6d53
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testlock.c	Thu Apr 26 16:45:43 2001 +0000
@@ -0,0 +1,89 @@
+
+/* Test the thread and mutex locking functions 
+   Also exercises the system's signal/thread interaction
+*/
+
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.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];
+
+void printid(void)
+{
+	printf("Process %u:  exiting\n", SDL_ThreadID());
+}
+	
+void terminate(int sig)
+{
+	printf("Process %u:  raising SIGTERM\n", SDL_ThreadID());
+	raise(SIGTERM);
+}
+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 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);
+	}
+	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);
+
+	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 */
+}