X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=nageru%2Fcef_capture.cpp;h=952486158cdb67e19d604c6322af253d745b71ea;hb=f9024d141398e69e7b4011becd3ebbe37eaa1776;hp=09c451fa2c7b6dff968f9b828e6c08f42a9d570b;hpb=5982dac8e7df84c42f9a42c228e003c60f837f21;p=nageru diff --git a/nageru/cef_capture.cpp b/nageru/cef_capture.cpp index 09c451f..9524861 100644 --- a/nageru/cef_capture.cpp +++ b/nageru/cef_capture.cpp @@ -97,8 +97,17 @@ void CEFCapture::resize(unsigned width, unsigned height) this->height = height; } -void CEFCapture::request_new_frame() +void CEFCapture::request_new_frame(bool ignore_if_locked) { + unique_lock outer_lock(browser_mutex, defer_lock); + if (ignore_if_locked && !outer_lock.try_lock()) { + // If the caller is holding card_mutex, we need to abort here + // if we can't get browser_mutex, since otherwise, the UI thread + // might hold browser_mutex (blocking post_to_cef_ui_thread()) + // and be waiting for card_mutex. + return; + } + // By adding a delay, we make sure we don't get a new frame // delivered immediately (we probably already are on the UI thread), // where we couldn't really deal with it. @@ -129,7 +138,7 @@ void CEFCapture::OnPaint(const void *buffer, int width, int height) // (CEF only sends OnPaint when there are actual changes, // so we need to do this explicitly, or we could be stuck on an // old frame forever if the image doesn't change.) - request_new_frame(); + request_new_frame(/*ignore_if_locked=*/false); ++timecode; } else { assert(video_frame.size >= unsigned(width * height * 4));