1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
| /*
| * queue.c
| * Description:
| *
| * Created on: 2014-11-13
| * Author: Graydon
| * Modify:
| */
|
| #include <stdio.h>
| #include <stdlib.h>
| #include <assert.h>
| #include <string.h>
| #include "drv/hmem.h"
| #include "queue.h"
|
| typedef struct{
| int wr;
| int rd;
| int len;
| int count;
| int lock;
| char data[4];
| }tag_queue,*ptag_queue;
|
|
|
|
| void* queue_create(int size)
| {
| ptag_queue q = malloc(size+(sizeof(tag_queue)-4));
| assert(q!=0);
|
| q->len = size;
| q->wr=q->rd=0;
| q->count =0;
| q->lock =0;
| return q;
| }
|
|
| int queue_push(void* queue, const void* data, int size )
| {
| ptag_queue q = queue;
|
| memcpy(q->data+q->wr,data,size);
| q->wr+=size;
| if(q->wr+size>q->len){
| q->wr=0;
| }
|
| q->count+=size;
|
| return size;
| }
|
|
| int queue_count(void* queue)
| {
| ptag_queue q = queue;
|
| if(q->count>q->len){
| q->rd=q->wr;
| q->count=q->len;
| }
| return q->count;
| }
|
|
| int queue_pop(void* queue,void* data, int size)
| {
| ptag_queue q = queue;
|
| memcpy(data,q->data+q->rd,size);
| q->rd+=size;
| if(q->rd+size>q->len){
| q->rd = 0;
| }
|
| q->count-=size;
|
| return size;
| }
|
|
|
| void queue_destroy(void* queue)
| {
| free(queue);
| }
|
|