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