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