view test/testsem.c @ 4240:cb44bf8f8a0f SDL-1.2

Fixed bug #719 Mike Blaguszewski 2009-03-23 13:32:22 PDT Patch to 1.2 HEAD that fixes the issue Fixes bug in SDL 1.2.13 where clicking on an app's title bar to activate the app, when cursor capturing is enabled, will cause the window to jump. This is because SDL's handler for activate events calls a low-level Quartz function to move the cursor. Calling this when the mouse is down in the title bar confuses the WindowServer into thinking the title bar has been dragged. The patch defers processing of activate events in this case. The bottom line is that CGWarpMouseCursorPosition() is not safe to call when the mouse in down in a window's title bar.
author Sam Lantinga <slouken@libsdl.org>
date Wed, 23 Sep 2009 07:18:02 +0000
parents 290b5baf2fca
children 782fd950bd46 c121d94672cb 99acf3d856cb
line wrap: on
line source


/* Simple test of the SDL semaphore code */

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include "SDL.h"
#include "SDL_thread.h"

#define NUM_THREADS 10

static SDL_sem *sem;
int alive = 1;

int SDLCALL ThreadFunc(void *data)
{
	int threadnum = (int)(uintptr_t)data;
	while ( alive ) {
		SDL_SemWait(sem);
		fprintf(stderr, "Thread number %d has got the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem));
		SDL_Delay(200);
		SDL_SemPost(sem);
		fprintf(stderr, "Thread number %d has released the semaphore (value = %d)!\n", threadnum, SDL_SemValue(sem));
		SDL_Delay(1); /* For the scheduler */
	}
	printf("Thread number %d exiting.\n", threadnum);
	return 0;
}

static void killed(int sig)
{
	alive = 0;
}

int main(int argc, char **argv)
{
	SDL_Thread *threads[NUM_THREADS];
	uintptr_t i;
	int init_sem;

	if(argc < 2) {
		fprintf(stderr,"Usage: %s init_value\n", argv[0]);
		return(1);
	}

	/* Load the SDL library */
	if ( SDL_Init(0) < 0 ) {
		fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
		return(1);
	}
	signal(SIGTERM, killed);
	signal(SIGINT, killed);
	
	init_sem = atoi(argv[1]);
	sem = SDL_CreateSemaphore(init_sem);
	
	printf("Running %d threads, semaphore value = %d\n", NUM_THREADS, init_sem);
	/* Create all the threads */
	for( i = 0; i < NUM_THREADS; ++i ) {
		threads[i] = SDL_CreateThread(ThreadFunc, (void*)i);
	}

	/* Wait 10 seconds */
	SDL_Delay(10 * 1000);

	/* Wait for all threads to finish */
	printf("Waiting for threads to finish\n");
	alive = 0;
	for( i = 0; i < NUM_THREADS; ++i ) {
		SDL_WaitThread(threads[i], NULL);
	}
	printf("Finished waiting for threads\n");

	SDL_DestroySemaphore(sem);
	SDL_Quit();
	return(0);
}