From 6ca4d3c44fe75d0ad475d214d55d73b9b4699cc4 Mon Sep 17 00:00:00 2001 From: Johns Date: Tue, 24 Jan 2012 10:02:39 +0100 Subject: [PATCH] Fix dead-lock in VdpauExit. --- ChangeLog | 1 + video.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a0ec3eb..5a171ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,7 @@ User johns Date: + Fix for dead-lock in VdpauExit. Workaround for dead-lock in VdpauExit. VDPAU: Add very primitive software scaler for grab image. VA-API: Add auto-crop support. diff --git a/video.c b/video.c index 37e1ea0..dcf724c 100644 --- a/video.c +++ b/video.c @@ -3587,12 +3587,15 @@ static void VaapiSyncRenderFrame(VaapiDecoder * decoder, VideoPollEvent(); + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_testcancel(); // give osd some time slot while (pthread_cond_timedwait(&VideoWakeupCond, &VideoLockMutex, &abstime) != ETIMEDOUT) { // SIGUSR1 Debug(3, "video/vaapi: pthread_cond_timedwait error\n"); } + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); VaapiSyncDisplayFrame(decoder); } @@ -6526,12 +6529,16 @@ static void VdpauSyncRenderFrame(VdpauDecoder * decoder, VideoPollEvent(); + // fix dead-lock with VdpauExit + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_testcancel(); // give osd some time slot while (pthread_cond_timedwait(&VideoWakeupCond, &VideoLockMutex, &abstime) != ETIMEDOUT) { // SIGUSR1 Debug(3, "video/vdpau: pthread_cond_timedwait error\n"); } + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); VdpauSyncDisplayFrame(decoder); } @@ -7360,11 +7367,10 @@ static void *VideoDisplayHandlerThread(void *dummy) #endif for (;;) { - /* other way to try to fix dead-lock with VdpauExit - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - pthread_testcancel(); - pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); - */ + // fix dead-lock with VdpauExit + pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); + pthread_testcancel(); + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); VideoPollEvent();