From eb16f00cf25e54f08c5a9ec25a8780ca708a2c3a Mon Sep 17 00:00:00 2001
From: Yunqing Wang <yunqingwang@google.com>
Date: Thu, 5 May 2011 10:42:29 -0400
Subject: [PATCH] Fix rare hang in multi-thread encoder on Windows

This patch is to fix a rare hang in multi-thread encoder that was
only seen on Windows. Thanks for John's help in debugging the
problem. More test is needed.

Change-Id: Idb11c6d344c2082362a032b34c5a602a1eea62fc
---
 vp8/encoder/ethreading.c | 2 ++
 vp8/encoder/onyx_if.c    | 4 ++--
 vp8/encoder/onyx_int.h   | 1 +
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/vp8/encoder/ethreading.c b/vp8/encoder/ethreading.c
index c00494dcff..c92a366e81 100644
--- a/vp8/encoder/ethreading.c
+++ b/vp8/encoder/ethreading.c
@@ -514,6 +514,7 @@ void vp8cx_create_encoder_threads(VP8_COMP *cpi)
             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;
@@ -547,6 +548,7 @@ void vp8cx_remove_encoder_threads(VP8_COMP *cpi)
 
         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
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 1738e56998..78f86557d1 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -3140,7 +3140,7 @@ void loopfilter_frame(VP8_COMP *cpi, VP8_COMMON *cm)
 
 #if CONFIG_MULTITHREAD
     if (cpi->b_multi_threaded)
-        sem_post(&cpi->h_event_end_lpf); /* signal that we have set filter_level */
+        sem_post(&cpi->h_event_end_picklpf); /* signal that we have set filter_level */
 #endif
 
     if (cm->filter_level > 0)
@@ -4135,7 +4135,7 @@ static void encode_frame_to_data_rate
 #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_lpf);
+        sem_wait(&cpi->h_event_end_picklpf);
 #endif
 
     // build the bitstream
diff --git a/vp8/encoder/onyx_int.h b/vp8/encoder/onyx_int.h
index e2e6b367c6..c2fcff88cd 100644
--- a/vp8/encoder/onyx_int.h
+++ b/vp8/encoder/onyx_int.h
@@ -590,6 +590,7 @@ typedef struct
     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
 
-- 
GitLab