16f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundation. 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 <pthread.h>
316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_jpeg_dbg.h"
326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev#include "mm_jpeg.h"
336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_jpeg_queue_init(mm_jpeg_queue_t* queue)
356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_init(&queue->lock, NULL);
376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_list_init(&queue->head.list);
386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    queue->size = 0;
396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_jpeg_queue_enq(mm_jpeg_queue_t* queue, void* data)
436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_q_node_t* node =
456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        (mm_jpeg_q_node_t *)malloc(sizeof(mm_jpeg_q_node_t));
466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL == node) {
476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        CDBG_ERROR("%s: No memory for mm_jpeg_q_node_t", __func__);
486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        return -1;
496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    memset(node, 0, sizeof(mm_jpeg_q_node_t));
526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    node->data = data;
536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&queue->lock);
556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    cam_list_add_tail_node(&node->list, &queue->head.list);
566f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    queue->size++;
576f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&queue->lock);
586f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
596f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
606f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
616f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
626f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
636f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid* mm_jpeg_queue_deq(mm_jpeg_queue_t* queue)
646f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
656f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_q_node_t* node = NULL;
666f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void* data = NULL;
676f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *head = NULL;
686f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *pos = NULL;
696f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
706f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&queue->lock);
716f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    head = &queue->head.list;
726f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pos = head->next;
736f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pos != head) {
746f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        node = member_of(pos, mm_jpeg_q_node_t, list);
756f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cam_list_del_node(&node->list);
766f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        queue->size--;
776f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
786f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&queue->lock);
796f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
806f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL != node) {
816f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        data = node->data;
826f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(node);
836f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
846f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
856f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return data;
866f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
876f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
886f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevuint32_t mm_jpeg_queue_get_size(mm_jpeg_queue_t* queue)
896f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
906f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    uint32_t size = 0;
916f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
926f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&queue->lock);
936f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    size = queue->size;
946f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&queue->lock);
956f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
966f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return size;
976f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
986f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
996f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1006f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_jpeg_queue_deinit(mm_jpeg_queue_t* queue)
1016f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1026f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_queue_flush(queue);
1036f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_destroy(&queue->lock);
1046f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
1056f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1066f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1076f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevint32_t mm_jpeg_queue_flush(mm_jpeg_queue_t* queue)
1086f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1096f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_q_node_t* node = NULL;
1106f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void* data = NULL;
1116f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *head = NULL;
1126f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *pos = NULL;
1136f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1146f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&queue->lock);
1156f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    head = &queue->head.list;
1166f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pos = head->next;
1176f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1186f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    while(pos != head) {
1196f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        node = member_of(pos, mm_jpeg_q_node_t, list);
1206f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        cam_list_del_node(&node->list);
1216f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        queue->size--;
1226f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1236f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        /* for now we only assume there is no ptr inside data
1246f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev         * so we free data directly */
1256f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        if (NULL != node->data) {
1266f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev            free(node->data);
1276f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        }
1286f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        free(node);
1296f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        pos = pos->next;
1306f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1316f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    queue->size = 0;
1326f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&queue->lock);
1336f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return 0;
1346f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
1356f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1366f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchevvoid* mm_jpeg_queue_peek(mm_jpeg_queue_t* queue)
1376f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev{
1386f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    mm_jpeg_q_node_t* node = NULL;
1396f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    void* data = NULL;
1406f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *head = NULL;
1416f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    struct cam_list *pos = NULL;
1426f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1436f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_lock(&queue->lock);
1446f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    head = &queue->head.list;
1456f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pos = head->next;
1466f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (pos != head) {
1476f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        node = member_of(pos, mm_jpeg_q_node_t, list);
1486f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1496f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    pthread_mutex_unlock(&queue->lock);
1506f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev
1516f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    if (NULL != node) {
1526f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev        data = node->data;
1536f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    }
1546f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev    return data;
1556f83d735d8e3b918da42e6b559fcd0efb78133e5Iliyan Malchev}
156