From 215bb3499c7eeea6303e55fac66452f2574c022a Mon Sep 17 00:00:00 2001 From: Igor Murashkin Date: Mon, 7 Oct 2013 18:01:46 -0700 Subject: camera2: Don't race while dumping last frame metadata Bug: 11095203 Change-Id: Icfb31e1719634b62004d6c15a95a9316e9642e4c --- services/camera/libcameraservice/common/FrameProcessorBase.cpp | 10 +++++++++- services/camera/libcameraservice/common/FrameProcessorBase.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'services/camera/libcameraservice') diff --git a/services/camera/libcameraservice/common/FrameProcessorBase.cpp b/services/camera/libcameraservice/common/FrameProcessorBase.cpp index e7b440a..52906ee 100644 --- a/services/camera/libcameraservice/common/FrameProcessorBase.cpp +++ b/services/camera/libcameraservice/common/FrameProcessorBase.cpp @@ -66,7 +66,14 @@ status_t FrameProcessorBase::removeListener(int32_t minId, void FrameProcessorBase::dump(int fd, const Vector& /*args*/) { String8 result(" Latest received frame:\n"); write(fd, result.string(), result.size()); - mLastFrame.dump(fd, 2, 6); + + CameraMetadata lastFrame; + { + // Don't race while dumping metadata + Mutex::Autolock al(mLastFrameMutex); + lastFrame = CameraMetadata(mLastFrame); + } + lastFrame.dump(fd, 2, 6); } bool FrameProcessorBase::threadLoop() { @@ -113,6 +120,7 @@ void FrameProcessorBase::processNewFrames(const sp &device) { } if (!frame.isEmpty()) { + Mutex::Autolock al(mLastFrameMutex); mLastFrame.acquire(frame); } } diff --git a/services/camera/libcameraservice/common/FrameProcessorBase.h b/services/camera/libcameraservice/common/FrameProcessorBase.h index f96caff..4d80ebf 100644 --- a/services/camera/libcameraservice/common/FrameProcessorBase.h +++ b/services/camera/libcameraservice/common/FrameProcessorBase.h @@ -58,6 +58,7 @@ class FrameProcessorBase: public Thread { virtual bool threadLoop(); Mutex mInputMutex; + Mutex mLastFrameMutex; struct RangeListener { int32_t minId; -- cgit v1.1