From a61024853e8c050cb4f19ce14de660bbf5ffd9e2 Mon Sep 17 00:00:00 2001 From: Martin Pulec Date: Sat, 26 Nov 2011 17:19:05 +0100 Subject: [PATCH] lock critical SDL calls against (Display *), FastDXT small fix --- ultragrid/src/video_compress/fastdxt.c | 17 +++++++++----- ultragrid/src/video_display/sdl.c | 32 +++++++++++++++++++++----- ultragrid/src/x11_common.c | 7 +++--- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/ultragrid/src/video_compress/fastdxt.c b/ultragrid/src/video_compress/fastdxt.c index 55c2f7a85..7d637ea10 100644 --- a/ultragrid/src/video_compress/fastdxt.c +++ b/ultragrid/src/video_compress/fastdxt.c @@ -98,7 +98,7 @@ struct video_compress { int tx_aux; codec_t tx_color_spec; sem_t thread_compress[MAX_THREADS]; - sem_t threads_done; + sem_t thread_done[MAX_THREADS]; int dxt_height; @@ -245,9 +245,9 @@ void *fastdxt_init(const char *num_threads_str) exit(128); } - platform_sem_init(&compress->threads_done, 0, 0); for (x = 0; x < compress->num_threads; x++) { platform_sem_init(&compress->thread_compress[x], 0, 0); + platform_sem_init(&compress->thread_done[x], 0, 0); } pthread_mutex_lock(&(compress->lock)); @@ -261,6 +261,11 @@ void *fastdxt_init(const char *num_threads_str) } } pthread_mutex_unlock(&(compress->lock)); + + while(compress->num_threads != compress->thread_count) /* wait for all threads online */ + ; + fprintf(stderr, "All compression threads are online.\n"); + return compress; } @@ -305,7 +310,7 @@ struct video_frame * fastdxt_compress(void *args, struct video_frame *tx) } for (x = 0; x < compress->num_threads; x++) { - platform_sem_wait(&compress->threads_done); + platform_sem_wait(&compress->thread_done[x]); } compress->tile->data_len = compress->tile->width * compress->tile->height / 2; @@ -367,10 +372,10 @@ static void compress_thread(void *args) ((unsigned char *) compress->tile->data) + myId * range / 2, compress->tile->width, my_height); - platform_sem_post(&compress->threads_done); + platform_sem_post(&compress->thread_done[myId]); } - platform_sem_post(&compress->threads_done); + platform_sem_post(&compress->thread_done[myId]); } void fastdxt_done(void *args) @@ -386,7 +391,7 @@ void fastdxt_done(void *args) } for (x = 0; x < compress->num_threads; x++) { - platform_sem_wait(&compress->threads_done); + platform_sem_wait(&compress->thread_done[x]); } pthread_mutex_unlock(&(compress->lock)); diff --git a/ultragrid/src/video_display/sdl.c b/ultragrid/src/video_display/sdl.c index ca26c0e02..6a39537fa 100644 --- a/ultragrid/src/video_display/sdl.c +++ b/ultragrid/src/video_display/sdl.c @@ -115,6 +115,9 @@ struct state_sdl { int rshift, gshift, bshift; int pitch; +#ifndef HAVE_MACOS_X + Display *display; +#endif }; extern int should_exit; @@ -432,6 +435,9 @@ void display_sdl_reconfigure(void *state, struct video_desc desc) s->buffer_writable_lock); SDL_mutexV(s->buffer_writable_lock); +#ifndef HAVE_MACOS_X + if(s->display) XLockDisplay(s->display); +#endif cleanup_screen(s); s->tile->width = desc.width; @@ -549,6 +555,11 @@ void display_sdl_reconfigure(void *state, struct video_desc desc) s->pitch = PITCH_DEFAULT; } + +#ifndef HAVE_MACOS_X + if(s->display) XUnlockDisplay(s->display); +#endif + s->rshift = s->sdl_screen->format->Rshift; s->gshift = s->sdl_screen->format->Gshift; s->bshift = s->sdl_screen->format->Bshift; @@ -624,24 +635,25 @@ void *display_sdl_init(char *fmt, unsigned int flags) s->screen_w = video_info->current_w; s->screen_h = video_info->current_h; - struct video_desc desc = {500, 500, RGBA, 0, 30.0}; - display_sdl_reconfigure(s, desc); - loadSplashscreen(s); - SDL_SysWMinfo info; memset(&info, 0, sizeof(SDL_SysWMinfo)); ret = SDL_GetWMInfo(&info); #ifndef HAVE_MACOS_X + s->display = NULL; if (ret == 1) { x11_set_display(info.info.x11.display); + s->display = info.info.x11.display; } else if (ret == 0) { fprintf(stderr, "[SDL] Warning: SDL_GetWMInfo unimplemented\n"); } else if (ret == -1) { fprintf(stderr, "[SDL] Warning: SDL_GetWMInfo failure: %s\n", SDL_GetError()); - } - + } else abort(); #endif + struct video_desc desc = {500, 500, RGBA, 0, 30.0}; + display_sdl_reconfigure(s, desc); + loadSplashscreen(s); + /*if (pthread_create(&(s->thread_id), NULL, display_thread_sdl, (void *)s) != 0) { @@ -665,6 +677,10 @@ void display_sdl_done(void *state) assert(s->magic == MAGIC_SDL); +#ifndef HAVE_MACOS_X + if(s->display) XLockDisplay(s->display); +#endif + SDL_DestroyCond(s->buffer_writable_cond); SDL_DestroyMutex(s->buffer_writable_lock); cleanup_screen(s); @@ -672,7 +688,11 @@ void display_sdl_done(void *state) /*FIXME: free all the stuff */ SDL_ShowCursor(SDL_ENABLE); +#ifndef HAVE_MACOS_X + if(s->display) XUnlockDisplay(s->display); +#endif SDL_Quit(); + } struct video_frame *display_sdl_getf(void *state) diff --git a/ultragrid/src/x11_common.c b/ultragrid/src/x11_common.c index 56b6d8131..cc9278373 100644 --- a/ultragrid/src/x11_common.c +++ b/ultragrid/src/x11_common.c @@ -121,8 +121,9 @@ void glx_free(void *arg) pthread_mutex_lock(&lock); - glXMakeCurrent( display, context->win, context->ctx ); XLockDisplay(display); + glXMakeCurrent( display, context->win, context->ctx ); + glXDestroyContext( display, context->ctx ); fprintf(stderr, "GLX context destroyed\n"); @@ -138,9 +139,9 @@ void glx_free(void *arg) XUnlockDisplay(display); if(display_opened_here && ref_num == 0) { - fprintf(stderr, "Display closed\n"); + fprintf(stderr, "Display closed (last client disconnected)\n"); XCloseDisplay( display ); - display = NULL; /* should it be here? eg. is legal to reopen display? */ + display = NULL; } free(context);