--nextPart1208871.ufsJEfDTOy
Content-Type: text/plain;
charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hi!

I've just updated to today's current and now some SDL based applications ar=
e=20
crashing. I debugged a bit and found out, that the changes made to libthr a=
re=20
causing these crashes. The attached program crashes immediately using the=20
current libthr. This program does not crash when I'm using an old version o=
f=20
libthr (before 2007/11/21).

/*
compiled with:
cc -g -I/usr/local/include -L/usr/local/lib sdltest.c -lSDL -lthr -o sdltest
*/

#include
#include
#include
#include

#define SAMPLE_FREQ 44100
#define SAMPLE_SIZE (512*2)

void AudioCallbackSDL(void *udata, u_int8_t *buffer, int length)
{
}

main()
{
SDL_AudioSpec audioSpec;
SDL_AudioSpec mySpec;

if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_AUDIO ) < 0) {
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
}

memset((void*)&audioSpec, 0, sizeof(SDL_AudioSpec));
memset((void*)&mySpec, 0, sizeof(SDL_AudioSpec));

audioSpec.freq =3D SAMPLE_FREQ;
audioSpec.format =3D AUDIO_U8;
audioSpec.channels =3D 1;
audioSpec.samples =3D SAMPLE_SIZE/(44100/SAMPLE_FREQ);
audioSpec.callback =3D AudioCallbackSDL;
audioSpec.userdata =3D (void*)1;
if (SDL_OpenAudio(&audioSpec, &mySpec) < 0) {
fprintf(stderr, "can't open SDL audio: %s\n", SDL_GetError());
exit(1);
}

sleep(10);
}

=2D------------------------------------------------------------------------=
=2D-

I debugged SDL and found the following piece of code, which causes the crash
in SDL_thread.c (around line 249).

args->func =3D fn;
args->data =3D data;
args->info =3D thread;
args->wait =3D SDL_CreateSemaphore(0);
^
+ here a semaphore is created with initial value 0

if ( args->wait =3D=3D NULL ) {
SDL_free(thread);
SDL_free(args);
return(NULL);
}

/* Add the thread to the list of available threads */
SDL_AddThread(thread);

/* Create the thread and go! */
#ifdef SDL_PASSED_BEGINTHREAD_ENDTHREAD
ret =3D SDL_SYS_CreateThread(thread, args, pfnBeginThread,=20
pfnEndThread);
#else
ret =3D SDL_SYS_CreateThread(thread, args);
#endif
if ( ret >=3D 0 ) {
/* Wait for the thread function to use arguments */
SDL_SemWait(args->wait);
^
+ here the calling thread should wait for the newly created
thread (but it doesn't)
} else {
/* Oops, failed. Gotta free everything */
SDL_DelThread(thread);
SDL_free(thread);
thread =3D NULL;
}
SDL_DestroySemaphore(args->wait);
SDL_free(args);
^
+ here the args are freed, which causes the crash of the newly
created thread. So I assume something's wrong with the semaphore
operations

The newly created thread crashes, because he uses the args area passed as=20
parameter to the SDL_SYS_CreateThread call and the parent thread is not=20
waiting as it is supposed to.

Could someone please have a look at these libthr changes?

Many thanks,
Christian.

--nextPart1208871.ufsJEfDTOy
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part.

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4 (FreeBSD)

iD8DBQBHSDRG73Wh/GTgh8wRAq+iAJ43bWwFOjMfd9OSQYjLMAptOkEvRgCfQbUS
hh7ue8U9MMp3ME73lHwf0I0=
=acqz
-----END PGP SIGNATURE-----

--nextPart1208871.ufsJEfDTOy--