<div dir="ltr">Gentle ping for review.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 23, 2021 at 1:04 PM Hirokazu Honda <<a href="mailto:hiroh@chromium.org">hiroh@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">CameraWorker::stop() executes Thread::exit() and Thread::wait().<br>
However, intuitively, the two functions doesn't clean up pending<br>
messages in the message queue of the thread. They are rather<br>
cleaned in the destruction of CameraWorker, but CameraWorker's<br>
life time is the same as CameraDevice and thus CameraManager,<br>
which is never destroyed. On the other hand,<br>
Camera3RequestDescriptors are destroyed in CameraDevice::stop().<br>
<br>
This causes CameraWorker::Worker::queueRequest() starts to be<br>
executed after CameraWorker::start(), which is after<br>
CameraDevice::stop(). This obviously causes a segmentation fault,<br>
because CameraWorker::Worker::queueRequest() touches<br>
CaptureRequest which is owned by Camera3RequestDescriptor.<br>
<br>
This fixes the issue by cancel pending message in thread queue in<br>
CameraWorker::stop() with Thread::dispatchMessages().<br>
<br>
Signed-off-by: Hirokazu Honda <<a href="mailto:hiroh@chromium.org" target="_blank">hiroh@chromium.org</a>><br>
---<br>
 src/android/camera_worker.cpp | 1 +<br>
 1 file changed, 1 insertion(+)<br>
<br>
diff --git a/src/android/camera_worker.cpp b/src/android/camera_worker.cpp<br>
index 300ddde0..b68ce9d5 100644<br>
--- a/src/android/camera_worker.cpp<br>
+++ b/src/android/camera_worker.cpp<br>
@@ -62,6 +62,7 @@ void CameraWorker::start()<br>
<br>
 void CameraWorker::stop()<br>
 {<br>
+       thread_.dispatchMessages(Message::Type::InvokeMessage);<br>
        thread_.exit();<br>
        thread_.wait();<br>
 }<br>
-- <br>
2.31.1.498.g6c1eba8ee3d-goog<br>
<br>
</blockquote></div>