blob: 787a601e5e599ae6368e7333f095e361e551bce7 [file] [log] [blame]
you.chen5ef374a2023-12-26 17:25:16 +08001#include "seq_queue.h"
2
3
4seq_queue_t *create_seq_queue(in unsigned int block_size, in unsigned int total_block, in BOOL expand) {
5
6 seq_queue_t *queue = (seq_queue_t *)malloc(sizeof(seq_queue_t));
7 if (queue) {
8
9 memset(queue, 0, sizeof(seq_queue_t));
10 queue->block_buffer = malloc(total_block * block_size);
11 if (queue->block_buffer == NULL) {
12 free(queue);
13 queue = NULL;
14 } else {
15 queue->block_size = block_size;
16 queue->total_block = total_block;
17 queue->expandabilit = expand;
18 queue->expand_blocks = EXPAND_BLOCK_NUM;
19
20 create_sem(&queue->task_queue_lock, 1);
21// init_mutex_handle(&queue->task_queue_lock);
22 }
23 }
24
25 return queue;
26}
27
28void destroy_seq_queue(in seq_queue_t *queue) {
29
30 if (queue == NULL)
31 return ;
32
33 destroy_sem(&queue->task_queue_lock);
34// mutex_destroy(&queue->task_queue_lock);
35 free(queue->block_buffer);
36 free(queue);
37}
38
39
40BOOL expand_seq_queue(in seq_queue_t *queue) {
41
42 void *new_buffer;
43 BOOL ret = FALSE;
44 if (queue == NULL || !queue->expandabilit)
45 return FALSE;
46
47 new_buffer = malloc((queue->total_block+queue->expand_blocks) * queue->block_size);
48 if (new_buffer) {
49 if (queue->current_block > queue->tail_block) {
50 memcpy(new_buffer, (char *)queue->block_buffer, queue->total_block * queue->block_size);
51 } else if (queue->current_block < queue->tail_block || (queue->current_block == queue->tail_block && queue->used_block != 0)) {
52 int head_block = queue->total_block - queue->tail_block;
53 int head_data_len = head_block * queue->block_size;
54 memcpy(new_buffer, (char *)queue->block_buffer + queue->tail_block * queue->block_size, head_data_len);
55 memcpy((char *)new_buffer + head_data_len, (char *)queue->block_buffer, queue->current_block * queue->block_size);
56 queue->tail_block = 0;
57 queue->current_block = head_block + queue->current_block;
58 } else if (queue->current_block == queue->tail_block){
59 queue->current_block = 0;
60 queue->tail_block = 0;
61 }
62
63 queue->total_block += queue->expand_blocks;
64
65 free(queue->block_buffer);
66 queue->block_buffer = new_buffer;
67 ret = TRUE;
68 }
69
70 return ret;
71}
72
73
74BOOL en_seq_queue(in seq_queue_t *queue, in void *data) {
75
76 if (queue == NULL || data == NULL)
77 return FALSE;
78
79 wait_sem(&queue->task_queue_lock);
80 //mutex_lock(&queue->task_queue_lock);
81 if (queue->used_block >= queue->total_block) {
82 static int times= 0;
83 times++;
84 if (!expand_seq_queue(queue)) {
85
86 return FALSE;
87 }
88 }
89
90 memcpy((char *)queue->block_buffer + queue->current_block * queue->block_size
91 , data, queue->block_size);
92 queue->current_block++;
93 queue->current_block = queue->current_block % queue->total_block;
94 queue->used_block++;
95
96 post_sem(&queue->task_queue_lock);
97 //mutex_unlock(&queue->task_queue_lock);
98
99 return TRUE;
100}
101
102BOOL de_seq_queue(in seq_queue_t *queue, out void *data) {
103
104 BOOL ret = FALSE;
105 if (queue == NULL)
106 return FALSE;
107
108 wait_sem(&queue->task_queue_lock);
109 //mutex_lock(&queue->task_queue_lock);
110 if (queue->used_block != 0) {
111 memcpy(data, (char *)queue->block_buffer + queue->tail_block * queue->block_size
112 , queue->block_size);
113 queue->tail_block++;
114 queue->tail_block = queue->tail_block % queue->total_block;
115 queue->used_block--;
116 ret = TRUE;
117 }
118 post_sem(&queue->task_queue_lock);
119 //mutex_unlock(&queue->task_queue_lock);
120
121 return ret;
122}
123
124unsigned int get_count_seq_queue(in seq_queue_t *queue) {
125 return queue->used_block;
126}
127
128unsigned int get_size_seq_queue(in seq_queue_t *queue) {
129 return queue->total_block;
130}
131
132