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