16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012, The Linux Foundataion. All rights reserved. 26f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 36f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* Redistribution and use in source and binary forms, with or without 46f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* modification, are permitted provided that the following conditions are 56f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* met: 66f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions of source code must retain the above copyright 76f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* notice, this list of conditions and the following disclaimer. 86f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Redistributions in binary form must reproduce the above 96f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* copyright notice, this list of conditions and the following 106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* disclaimer in the documentation and/or other materials provided 116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* with the distribution. 126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* * Neither the name of The Linux Foundation nor the names of its 136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* contributors may be used to endorse or promote products derived 146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* from this software without specific prior written permission. 156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev* 286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev*/ 296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include <utils/Errors.h> 316c6d887243f26c81543d33c2f8aa169862324b40Shuzhen Wang#include <utils/Log.h> 326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "QCameraQueue.h" 336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevnamespace qcamera { 356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraQueue 386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: default constructor of QCameraQueue 406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraQueue::QCameraQueue() 466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_init(&m_lock, NULL); 486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_init(&m_head.list); 496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size = 0; 506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataFn = NULL; 516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_userData = NULL; 526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : QCameraQueue 566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: constructor of QCameraQueue 586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data_rel_fn : function ptr to release node data internal resource 616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @user_data : user data ptr 626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraQueue::QCameraQueue(release_data_fn data_rel_fn, void *user_data) 666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_init(&m_lock, NULL); 686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_init(&m_head.list); 696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size = 0; 706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataFn = data_rel_fn; 716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_userData = user_data; 726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : ~QCameraQueue 766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: deconstructor of QCameraQueue 786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan MalchevQCameraQueue::~QCameraQueue() 846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev flush(); 866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_destroy(&m_lock); 876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : isEmpty 916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: return if the queue is empty or not 936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true -- queue is empty; false -- not empty 976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCameraQueue::isEmpty() 996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev bool flag = true; 1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_size > 0) { 1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev flag = false; 1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return flag; 1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : enqueue 1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue data into the queue 1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : data to be enqueued 1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true -- success; false -- failed 1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCameraQueue::enqueue(void *data) 1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_q_node *node = 1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (camera_q_node *)malloc(sizeof(camera_q_node)); 1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == node) { 1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for camera_q_node", __func__); 1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(node, 0, sizeof(camera_q_node)); 1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node->data = data; 1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_add_tail_node(&node->list, &m_head.list); 1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size++; 1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return true; 1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : enqueueWithPriority 1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: enqueue data into queue with priority, will insert into the 1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * head of the queue 1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @data : data to be enqueued 1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : true -- success; false -- failed 1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevbool QCameraQueue::enqueueWithPriority(void *data) 1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_q_node *node = 1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev (camera_q_node *)malloc(sizeof(camera_q_node)); 1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL == node) { 1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev ALOGE("%s: No memory for camera_q_node", __func__); 1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return false; 1566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev memset(node, 0, sizeof(camera_q_node)); 1596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node->data = data; 1606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 1626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *p_next = m_head.list.next; 1636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_head.list.next = &node->list; 1656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev p_next->prev = &node->list; 1666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node->list.next = p_next; 1676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node->list.prev = &m_head.list; 1686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size++; 1706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 1716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return true; 1726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 1736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 1756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : dequeue 1766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: dequeue data from the queue 1786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 1806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @bFromHead : if true, dequeue from the head 1816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * if false, dequeue from the tail 1826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 1836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : data ptr. NULL if not any data in the queue. 1846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 1856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid* QCameraQueue::dequeue(bool bFromHead) 1866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{ 1876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_q_node* node = NULL; 1886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev void* data = NULL; 1896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *head = NULL; 1906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *pos = NULL; 1916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 1926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 1936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev head = &m_head.list; 1946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (bFromHead) { 1956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = head->next; 1966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } else { 1976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = head->prev; 1986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 1996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (pos != head) { 2006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node = member_of(pos, camera_q_node, list); 2016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_del_node(&node->list); 2026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size--; 2036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 2056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != node) { 2076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev data = node->data; 2086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node); 2096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return data; 2126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : flush 2166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: flush all nodes from the queue, queue will be empty after this 2186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * operation. 2196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : None 2216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 2236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraQueue::flush(){ 2256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_q_node* node = NULL; 2266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *head = NULL; 2276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *pos = NULL; 2286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 2306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev head = &m_head.list; 2316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = head->next; 2326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while(pos != head) { 2346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node = member_of(pos, camera_q_node, list); 2356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = pos->next; 2366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_del_node(&node->list); 2376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size--; 2386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != node->data) { 2406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_dataFn) { 2416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataFn(node->data, m_userData); 2426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node->data); 2446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node); 2466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size = 0; 2496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 2506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/*=========================================================================== 2536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * FUNCTION : flushNodes 2546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * DESCRIPTION: flush only specific nodes, depending on 2566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * the given matching function. 2576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * PARAMETERS : 2596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * @match : matching function 2606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * 2616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev * RETURN : None 2626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev *==========================================================================*/ 2636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid QCameraQueue::flushNodes(match_fn match){ 2646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev camera_q_node* node = NULL; 2656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *head = NULL; 2666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev struct cam_list *pos = NULL; 2676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( NULL == match ) { 2696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev return; 2706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_lock(&m_lock); 2736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev head = &m_head.list; 2746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = head->next; 2756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev while(pos != head) { 2776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev node = member_of(pos, camera_q_node, list); 2786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pos = pos->next; 2796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if ( match(node->data, m_userData) ) { 2806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev cam_list_del_node(&node->list); 2816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_size--; 2826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (NULL != node->data) { 2846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev if (m_dataFn) { 2856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev m_dataFn(node->data, m_userData); 2866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node->data); 2886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev free(node); 2906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev } 2926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev pthread_mutex_unlock(&m_lock); 2936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev} 2946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev 2956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}; // namespace qcamera 296