120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License. 720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at 820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software 1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and 1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License. 1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file Exynos_OSAL_Queue.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Memory.h" 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h" 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Queue.h" 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OSAL_QueueCreate(EXYNOS_QUEUE *queueHandle, int maxNumElem) 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QElem *newqelem = NULL; 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QElem *currentqelem = NULL; 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!queue) 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorBadParameter; 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_MutexCreate(&queue->qMutex); 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first = (EXYNOS_QElem *)Exynos_OSAL_Malloc(sizeof(EXYNOS_QElem)); 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (queue->first == NULL) 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorInsufficientResources; 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(queue->first, 0, sizeof(EXYNOS_QElem)); 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem = queue->last = queue->first; 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->numElem = 0; 6038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang queue->maxNumElem = maxNumElem; 6138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for (i = 0; i < (queue->maxNumElem - 2); i++) { 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang newqelem = (EXYNOS_QElem *)Exynos_OSAL_Malloc(sizeof(EXYNOS_QElem)); 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (newqelem == NULL) { 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while (queue->first != NULL) { 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem = queue->first->qNext; 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free((OMX_PTR)queue->first); 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first = currentqelem; 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorInsufficientResources; 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(newqelem, 0, sizeof(EXYNOS_QElem)); 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem->qNext = newqelem; 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem = newqelem; 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem->qNext = queue->first; 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorNone; 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OSAL_QueueTerminate(EXYNOS_QUEUE *queueHandle) 8320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QElem *currentqelem = NULL; 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!queue) 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return OMX_ErrorBadParameter; 9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang for ( i = 0; i < (queue->maxNumElem - 2); i++) { 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang currentqelem = queue->first->qNext; 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(queue->first); 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first = currentqelem; 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if(queue->first) { 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(queue->first); 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first = NULL; 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = Exynos_OSAL_MutexTerminate(queue->qMutex); 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changint Exynos_OSAL_Queue(EXYNOS_QUEUE *queueHandle, void *data) 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (queue == NULL) 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return -1; 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(queue->qMutex); 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if ((queue->last->data != NULL) || (queue->numElem >= queue->maxNumElem)) { 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return -1; 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->last->data = data; 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->last = queue->last->qNext; 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->numElem++; 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return 0; 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changvoid *Exynos_OSAL_Dequeue(EXYNOS_QUEUE *queueHandle) 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang void *data = NULL; 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (queue == NULL) 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return NULL; 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(queue->qMutex); 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((queue->first->data == NULL) || (queue->numElem <= 0)) { 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return NULL; 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang data = queue->first->data; 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first->data = NULL; 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->first = queue->first->qNext; 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang queue->numElem--; 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return data; 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changint Exynos_OSAL_GetElemNum(EXYNOS_QUEUE *queueHandle) 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int ElemNum = 0; 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (queue == NULL) 15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return -1; 15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(queue->qMutex); 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ElemNum = queue->numElem; 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ElemNum; 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Changint Exynos_OSAL_SetElemNum(EXYNOS_QUEUE *queueHandle, int ElemNum) 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (queue == NULL) 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return -1; 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexLock(queue->qMutex); 170f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim queue->numElem = ElemNum; 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ElemNum; 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Changint Exynos_OSAL_ResetQueue(EXYNOS_QUEUE *queueHandle) 17638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{ 17738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle; 17838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang EXYNOS_QElem *currentqelem = NULL; 17938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 18038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (queue == NULL) 18138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return -1; 18238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 18338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexLock(queue->qMutex); 18438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang queue->first->data = NULL; 18538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang currentqelem = queue->first->qNext; 18638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang while (currentqelem != queue->first) { 18738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang currentqelem->data = NULL; 18838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang currentqelem = currentqelem->qNext; 18938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang } 19038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang queue->last = queue->first; 19138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang queue->numElem = 0x00; 19238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang Exynos_OSAL_MutexUnlock(queue->qMutex); 19338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang 19438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang return 0; 19538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang} 196