view test/testlock.c @ 666:fbec2501cf9f

ate: Mon, 4 Aug 2003 19:10:14 +0300 From: "Mike Gorchak" Subject: SDL/QNX forgotten fixes Just found, that one chunk for configure.in has not been applied and one for\ gotten by me :) Please add it to CVS. P.S. Now QNX6.2.1 have the dlopen in libc and in the libltdl. So libc's vari\ ant more prefered, and ltdl rest for compatibility. In this small patch I wa\ s added proper checks.
author Sam Lantinga <slouken@libsdl.org>
date Wed, 06 Aug 2003 20:20:30 +0000
parents 74212992fb08
children be9c9c8f6d53
line wrap: on
line source


/* 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 */
}