xref: /rockchip-linux_mpp/osal/mpp_queue.c (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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