1*437bfbebSnyanmisaka /* SPDX-License-Identifier: Apache-2.0 OR MIT */
2*437bfbebSnyanmisaka /*
3*437bfbebSnyanmisaka * Copyright (c) 2017 Rockchip Electronics Co., Ltd.
4*437bfbebSnyanmisaka */
5*437bfbebSnyanmisaka
6*437bfbebSnyanmisaka #include "mpp_mem.h"
7*437bfbebSnyanmisaka #include "mpp_queue.h"
8*437bfbebSnyanmisaka
mpp_queue_create(node_destructor func)9*437bfbebSnyanmisaka MppQueue* mpp_queue_create(node_destructor func)
10*437bfbebSnyanmisaka {
11*437bfbebSnyanmisaka MppQueue *queue = mpp_malloc(MppQueue, 1);
12*437bfbebSnyanmisaka
13*437bfbebSnyanmisaka queue->list = mpp_list_create(func);
14*437bfbebSnyanmisaka sem_init(&queue->queue_pending, 0, 0);
15*437bfbebSnyanmisaka queue->flush_flag = 0;
16*437bfbebSnyanmisaka
17*437bfbebSnyanmisaka return queue;
18*437bfbebSnyanmisaka }
19*437bfbebSnyanmisaka
mpp_queue_destroy(MppQueue * queue)20*437bfbebSnyanmisaka void mpp_queue_destroy(MppQueue *queue)
21*437bfbebSnyanmisaka {
22*437bfbebSnyanmisaka mpp_list_destroy(queue->list);
23*437bfbebSnyanmisaka mpp_free(queue);
24*437bfbebSnyanmisaka }
25*437bfbebSnyanmisaka
mpp_queue_push(MppQueue * queue,void * data,rk_s32 size)26*437bfbebSnyanmisaka rk_s32 mpp_queue_push(MppQueue *queue, void *data, rk_s32 size)
27*437bfbebSnyanmisaka {
28*437bfbebSnyanmisaka rk_s32 ret = rk_ok;
29*437bfbebSnyanmisaka
30*437bfbebSnyanmisaka ret = mpp_list_add_at_tail(queue->list, data, size);
31*437bfbebSnyanmisaka queue->flush_flag = 0;
32*437bfbebSnyanmisaka sem_post(&queue->queue_pending);
33*437bfbebSnyanmisaka
34*437bfbebSnyanmisaka return ret;
35*437bfbebSnyanmisaka }
36*437bfbebSnyanmisaka
mpp_queue_pull(MppQueue * queue,void * data,rk_s32 size)37*437bfbebSnyanmisaka rk_s32 mpp_queue_pull(MppQueue *queue, void *data, rk_s32 size)
38*437bfbebSnyanmisaka {
39*437bfbebSnyanmisaka rk_s32 ret = rk_ok;
40*437bfbebSnyanmisaka
41*437bfbebSnyanmisaka if (!queue->flush_flag)
42*437bfbebSnyanmisaka sem_wait(&queue->queue_pending);
43*437bfbebSnyanmisaka
44*437bfbebSnyanmisaka mpp_mutex_cond_lock(&queue->list->cond_lock);
45*437bfbebSnyanmisaka if (!mpp_list_size(queue->list)) {
46*437bfbebSnyanmisaka mpp_mutex_cond_unlock(&queue->list->cond_lock);
47*437bfbebSnyanmisaka return ret;
48*437bfbebSnyanmisaka }
49*437bfbebSnyanmisaka
50*437bfbebSnyanmisaka ret = mpp_list_del_at_head(queue->list, data, size);
51*437bfbebSnyanmisaka mpp_mutex_cond_unlock(&queue->list->cond_lock);
52*437bfbebSnyanmisaka
53*437bfbebSnyanmisaka return ret;
54*437bfbebSnyanmisaka }
55*437bfbebSnyanmisaka
mpp_queue_flush(MppQueue * queue)56*437bfbebSnyanmisaka rk_s32 mpp_queue_flush(MppQueue *queue)
57*437bfbebSnyanmisaka {
58*437bfbebSnyanmisaka if (queue->flush_flag)
59*437bfbebSnyanmisaka return 0;
60*437bfbebSnyanmisaka
61*437bfbebSnyanmisaka queue->flush_flag = 1;
62*437bfbebSnyanmisaka sem_post(&queue->queue_pending);
63*437bfbebSnyanmisaka mpp_list_flush(queue->list);
64*437bfbebSnyanmisaka
65*437bfbebSnyanmisaka return 0;
66*437bfbebSnyanmisaka }
67