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