166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* Redistribution and use in source and binary forms, with or without 466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* modification, are permitted provided that the following conditions are 566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* met: 666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions of source code must retain the above copyright 766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* notice, this list of conditions and the following disclaimer. 866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Redistributions in binary form must reproduce the above 966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* copyright notice, this list of conditions and the following 1066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* disclaimer in the documentation and/or other materials provided 1166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* with the distribution. 1266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* * Neither the name of The Linux Foundation nor the names of its 1366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* contributors may be used to endorse or promote products derived 1466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* from this software without specific prior written permission. 1566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 1666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin* 2866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin*/ 2966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// System dependencies 3166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <string.h> 3266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include <utils/Errors.h> 3366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin// Camera dependencies 3566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "QCameraQueue.h" 3666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 3766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinextern "C" { 3866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin#include "mm_camera_dbg.h" 3966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 4066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinnamespace qcamera { 4266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 4366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 4466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraQueue 4566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 4666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: default constructor of QCameraQueue 4766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 4866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 4966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 5066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 5166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 5266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraQueue::QCameraQueue() 5366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 5466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&m_lock, NULL); 5566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_init(&m_head.list); 5666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size = 0; 5766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataFn = NULL; 5866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_userData = NULL; 5966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_active = true; 6066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 6166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 6266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 6366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : QCameraQueue 6466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: constructor of QCameraQueue 6666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 6766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 6866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data_rel_fn : function ptr to release node data internal resource 6966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @user_data : user data ptr 7066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 7166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 7266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 7366f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraQueue::QCameraQueue(release_data_fn data_rel_fn, void *user_data) 7466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 7566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_init(&m_lock, NULL); 7666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_init(&m_head.list); 7766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size = 0; 7866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataFn = data_rel_fn; 7966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_userData = user_data; 8066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_active = true; 8166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 8266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 8366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 8466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : ~QCameraQueue 8566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: deconstructor of QCameraQueue 8766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 8866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 8966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 9066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 9166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 9266f9976540f830b0090ff2ca557b0364a53f2008Patrick TjinQCameraQueue::~QCameraQueue() 9366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 9466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin flush(); 9566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_destroy(&m_lock); 9666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 9766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 9866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 9966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : init 10066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: Put the queue to active state (ready to enqueue and dequeue) 10266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 10466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 10566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 10666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 10766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraQueue::init() 10866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 10966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 11066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_active = true; 11166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 11266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 11366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 11466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 11566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : isEmpty 11666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return if the queue is empty or not 11866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 11966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 12066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 12166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true -- queue is empty; false -- not empty 12266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 12366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraQueue::isEmpty() 12466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 12566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool flag = true; 12666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 12766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_size > 0) { 12866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin flag = false; 12966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 13066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 13166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return flag; 13266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 13366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 13466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 13566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : enqueue 13666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue data into the queue 13866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 13966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 14066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data to be enqueued 14166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 14266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true -- success; false -- failed 14366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 14466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraQueue::enqueue(void *data) 14566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 14666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool rc; 14766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node *node = 14866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (camera_q_node *)malloc(sizeof(camera_q_node)); 14966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == node) { 15066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for camera_q_node"); 15166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 15266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 15366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(camera_q_node)); 15566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->data = data; 15666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 15766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 15866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 15966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_add_tail_node(&node->list, &m_head.list); 16066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size++; 16166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = true; 16266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 16366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 16466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = false; 16566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 16666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 16766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 16866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 16966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 17066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 17166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : enqueueWithPriority 17266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: enqueue data into queue with priority, will insert into the 17466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * head of the queue 17566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 17766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @data : data to be enqueued 17866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 17966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : true -- success; false -- failed 18066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 18166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinbool QCameraQueue::enqueueWithPriority(void *data) 18266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 18366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin bool rc; 18466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node *node = 18566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin (camera_q_node *)malloc(sizeof(camera_q_node)); 18666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL == node) { 18766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin LOGE("No memory for camera_q_node"); 18866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return false; 18966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 19066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin memset(node, 0, sizeof(camera_q_node)); 19266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->data = data; 19366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 19566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 19666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *p_next = m_head.list.next; 19766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 19866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_head.list.next = &node->list; 19966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin p_next->prev = &node->list; 20066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->list.next = p_next; 20166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node->list.prev = &m_head.list; 20266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 20366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size++; 20466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = true; 20566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 20666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 20766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin rc = false; 20866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 20966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 21066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return rc; 21166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 21266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 21366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 21466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : peek 21566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: return the head element without removing it 21766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 21866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 21966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 22066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : data ptr. NULL if not any data in the queue. 22166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 22266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid* QCameraQueue::peek() 22366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 22466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 22566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void* data = NULL; 22666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 22766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 22866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 22966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 23066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 23166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 23266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 23366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pos != head) { 23466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 23566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 23766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 23866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 23966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 24066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = node->data; 24166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 24266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return data; 24466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 24566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 24666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 24766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dequeue 24866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 24966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: dequeue data from the queue 25066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 25266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @bFromHead : if true, dequeue from the head 25366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * if false, dequeue from the tail 25466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 25566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : data ptr. NULL if not any data in the queue. 25666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 25766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid* QCameraQueue::dequeue(bool bFromHead) 25866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin{ 25966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 26066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void* data = NULL; 26166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 26266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 26366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 26466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 26566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 26666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 26766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (bFromHead) { 26866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 26966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } else { 27066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->prev; 27166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (pos != head) { 27366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 27466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 27566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size--; 27666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 27866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 27966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 28166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = node->data; 28266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 28366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 28466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return data; 28666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 28766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 28866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 28966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : dequeue 29066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: dequeue data from the queue 29266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 29466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @match : matching function callback 29566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @match_data : the actual data to be matched 29666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 29766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : data ptr. NULL if not any data in the queue. 29866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 29966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid* QCameraQueue::dequeue(match_fn_data match, void *match_data){ 30066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 30166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 30266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 30366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin void* data = NULL; 30466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == match || NULL == match_data ) { 30666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 30766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 30866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 30966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 31066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 31166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 31266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 31366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 31466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while(pos != head) { 31566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 31666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 31766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node) { 31866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( match(node->data, m_userData, match_data) ) { 31966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 32066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size--; 32166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin data = node->data; 32266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 32366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 32466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return data; 32566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 32966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 33066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return NULL; 33166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 33266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 33366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 33466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : flush 33566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 33666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush all nodes from the queue, queue will be empty after this 33766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * operation. 33866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 33966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : None 34066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 34166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 34266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 34366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraQueue::flush(){ 34466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 34566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 34666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 34766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 34866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 34966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 35066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 35166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 35266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while(pos != head) { 35466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 35566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 35666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 35766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size--; 35866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 35966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node->data) { 36066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_dataFn) { 36166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataFn(node->data, m_userData); 36266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node->data); 36466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 36666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 36766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 36866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size = 0; 36966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_active = false; 37066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 37166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 37266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 37366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 37466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 37566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : flushNodes 37666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 37766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush only specific nodes, depending on 37866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * the given matching function. 37966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 38166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @match : matching function 38266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 38366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 38466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 38566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraQueue::flushNodes(match_fn match){ 38666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 38766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 38866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 38966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == match ) { 39166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 39266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 39366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 39566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 39666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 39766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 39866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 39966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while(pos != head) { 40066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 40166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 40266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( match(node->data, m_userData) ) { 40366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 40466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size--; 40566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 40666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node->data) { 40766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_dataFn) { 40866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataFn(node->data, m_userData); 40966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node->data); 41166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 41366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 41666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 41766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 41866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 41966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin/*=========================================================================== 42066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * FUNCTION : flushNodes 42166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * DESCRIPTION: flush only specific nodes, depending on 42366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * the given matching function. 42466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * PARAMETERS : 42666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * @match : matching function 42766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * 42866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin * RETURN : None 42966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin *==========================================================================*/ 43066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjinvoid QCameraQueue::flushNodes(match_fn_data match, void *match_data){ 43166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin camera_q_node* node = NULL; 43266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *head = NULL; 43366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin struct cam_list *pos = NULL; 43466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( NULL == match ) { 43666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin return; 43766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 43866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 43966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_lock(&m_lock); 44066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_active) { 44166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin head = &m_head.list; 44266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = head->next; 44366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 44466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin while(pos != head) { 44566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin node = member_of(pos, camera_q_node, list); 44666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pos = pos->next; 44766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if ( match(node->data, m_userData, match_data) ) { 44866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin cam_list_del_node(&node->list); 44966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_size--; 45066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 45166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (NULL != node->data) { 45266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin if (m_dataFn) { 45366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin m_dataFn(node->data, m_userData); 45466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45566f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node->data); 45666f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45766f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin free(node); 45866f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 45966f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46066f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin } 46166f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin pthread_mutex_unlock(&m_lock); 46266f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin} 46366f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin 46466f9976540f830b0090ff2ca557b0364a53f2008Patrick Tjin}; // namespace qcamera 465