shithub: libvpx

Download patch

ref: eeb811730362868458410ed96673ee75c2d79220
parent: eb16f00cf25e54f08c5a9ec25a8780ca708a2c3a
author: Aron Rosenberg <arosenberg@logitech.com>
date: Thu May 5 20:10:37 EDT 2011

Fix semaphore emulation on Windows

The existing emulation of posix semaphores on Windows uses SetEvent()
and WaitForSingleObject(), which implements a binary semaphore, not a
counting semaphore as implemented by posix. This causes deadlock when
used with the expected posix semantics. Instead, this patch uses the
CreateSemaphore() and ReleaseSemaphore() calls (introduced in Windows
2000) which have the expected behavior.

This patch also reverts commit eb16f00, which split a semaphore that
was being used with counting semantics into two binary semaphores.
That commit is unnecessary with corrected emulation.

Change-Id: If400771536a27af4b0c3a31aa4c4e9ced89ce6a0

--- a/vp8/common/threading.h
+++ b/vp8/common/threading.h
@@ -59,9 +59,9 @@
 #ifdef _WIN32
 #define sem_t HANDLE
 #define pause(voidpara) __asm PAUSE
-#define sem_init(sem, sem_attr1, sem_init_value) (int)((*sem = CreateEvent(NULL,FALSE,FALSE,NULL))==NULL)
+#define sem_init(sem, sem_attr1, sem_init_value) (int)((*sem = CreateSemaphore(NULL,0,32768,NULL))==NULL)
 #define sem_wait(sem) (int)(WAIT_OBJECT_0 != WaitForSingleObject(*sem,INFINITE))
-#define sem_post(sem) SetEvent(*sem)
+#define sem_post(sem) ReleaseSemaphore(*sem,1,NULL)
 #define sem_destroy(sem) if(*sem)((int)(CloseHandle(*sem))==TRUE)
 #define thread_sleep(nms) Sleep(nms)
 
--- a/vp8/encoder/ethreading.c
+++ b/vp8/encoder/ethreading.c
@@ -514,7 +514,6 @@
             LPFTHREAD_DATA * lpfthd = &cpi->lpf_thread_data;
 
             sem_init(&cpi->h_event_start_lpf, 0, 0);
-            sem_init(&cpi->h_event_end_picklpf, 0, 0);
             sem_init(&cpi->h_event_end_lpf, 0, 0);
 
             lpfthd->ptr1 = (void *)cpi;
@@ -548,7 +547,6 @@
 
         sem_destroy(&cpi->h_event_end_encoding);
         sem_destroy(&cpi->h_event_end_lpf);
-        sem_destroy(&cpi->h_event_end_picklpf);
         sem_destroy(&cpi->h_event_start_lpf);
 
         //free thread related resources
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -3140,7 +3140,7 @@
 
 #if CONFIG_MULTITHREAD
     if (cpi->b_multi_threaded)
-        sem_post(&cpi->h_event_end_picklpf); /* signal that we have set filter_level */
+        sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
 #endif
 
     if (cm->filter_level > 0)
@@ -4135,7 +4135,7 @@
 #if CONFIG_MULTITHREAD
     /* wait that filter_level is picked so that we can continue with stream packing */
     if (cpi->b_multi_threaded)
-        sem_wait(&cpi->h_event_end_picklpf);
+        sem_wait(&cpi->h_event_end_lpf);
 #endif
 
     // build the bitstream
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -590,7 +590,6 @@
     sem_t *h_event_start_encoding;
     sem_t h_event_end_encoding;
     sem_t h_event_start_lpf;
-    sem_t h_event_end_picklpf;
     sem_t h_event_end_lpf;
 #endif