From 9dfdada25877a0eda9655661bd9eb7251cff7092 Mon Sep 17 00:00:00 2001 From: Tyler Luu <tluu@ti.com> Date: Wed, 18 Apr 2012 20:09:02 -0500 Subject: camera_test: destroy buffer source thread properly BufferSourceThread was not properly joining since it was stuck waiting for frame which also meant BufferSourceThread was not being destroyed properly since it still had children. Change-Id: I63f775b7fe46e91c4589779df5647b87aa707360 Signed-off-by: Tyler Luu <tluu@ti.com> --- test/CameraHal/camera_test.h | 15 +++++++++++++++ test/CameraHal/camera_test_menu.cpp | 5 +++++ test/CameraHal/camera_test_surfacetexture.cpp | 2 ++ 3 files changed, 22 insertions(+) (limited to 'test') diff --git a/test/CameraHal/camera_test.h b/test/CameraHal/camera_test.h index 73e33c7..48d670b 100644 --- a/test/CameraHal/camera_test.h +++ b/test/CameraHal/camera_test.h @@ -346,6 +346,13 @@ public: mFrameQueueCondition.signal(); } + virtual void requestExit() { + Thread::requestExit(); + + mExiting = true; + mFrameQueueCondition.signal(); + } + virtual bool threadLoop() { Mutex::Autolock lock(mFrameQueueMutex); while (mDeferQueue.isEmpty() && !mExiting) { @@ -395,6 +402,7 @@ public: virtual ~BufferSourceThread() { mDestroying = true; + mSurfaceTextureBase->deinit(); delete mSurfaceTextureBase; for (unsigned int i = 0; i < mReturnedBuffers.size(); i++) { buffer_info_t info = mReturnedBuffers.itemAt(i); @@ -426,6 +434,13 @@ public: return false; } + virtual void requestExit() { + Thread::requestExit(); + + mDestroying = true; + mFW->onFrameAvailable(); + } + void setBuffer() { mCamera->setBufferSource(NULL, mSurfaceTexture); } diff --git a/test/CameraHal/camera_test_menu.cpp b/test/CameraHal/camera_test_menu.cpp index fc3d7d7..a2e865a 100644 --- a/test/CameraHal/camera_test_menu.cpp +++ b/test/CameraHal/camera_test_menu.cpp @@ -1835,6 +1835,11 @@ int deleteAllocatedMemory() { delete [] layoutstr; delete [] capturelayoutstr; + if (bufferSourceOutputThread.get()) { + bufferSourceOutputThread->requestExit(); + bufferSourceOutputThread.clear(); + } + return 0; } diff --git a/test/CameraHal/camera_test_surfacetexture.cpp b/test/CameraHal/camera_test_surfacetexture.cpp index e71f6d0..35b39b6 100644 --- a/test/CameraHal/camera_test_surfacetexture.cpp +++ b/test/CameraHal/camera_test_surfacetexture.cpp @@ -283,6 +283,8 @@ void SurfaceTextureBase::initialize(int tex_id, EGLenum tex_target) { void SurfaceTextureBase::deinit() { mANW.clear(); mSTC.clear(); + + mST->abandon(); mST.clear(); } -- cgit v1.1