source: titan/titan/queue.h @ 15272

Last change on this file since 15272 was 10718, checked in by nit, 11 years ago

[titan] change transponderid to onid + tid

File size: 2.5 KB
Line 
1#ifndef QUEUE_H
2#define QUEUE_H
3
4void debugqueue()
5{
6        struct queue* node = queue;
7
8        while(node != NULL)
9        {
10                printf("%s %p <%p >%p\n", (char*)node->data, node, node->prev, node->next);
11                node = node->next;
12        }
13}
14
15struct queue* addqueue(int type, void* data, int len, int flag, struct queue* last)
16{
17        //debug(1000, "in");
18
19        m_lock(&status.queuemutex, 11);
20
21        struct queue *newnode = NULL, *prev = NULL, *node = queue;
22        void* tmpdata = NULL;
23
24        newnode = (struct queue*)malloc(sizeof(struct queue)); 
25        if(newnode == NULL)
26        {
27                err("no memory");
28                m_unlock(&status.queuemutex, 11);
29                return NULL;
30        }
31
32        tmpdata = malloc(len);
33        if(tmpdata == NULL)
34        {
35                err("no memory");
36                free(newnode);
37                m_unlock(&status.queuemutex, 11);
38                return NULL;
39        }
40        memset(newnode, 0, sizeof(struct queue));
41
42        newnode->type = type;
43        newnode->len = len;
44        newnode->flag = flag;
45        newnode->data = memcpy(tmpdata, data, len);
46
47        if(last == NULL)
48        {
49                while(node != NULL)
50                {
51                        prev = node;
52                        node = node->next;
53                }
54        }
55        else
56        {
57                prev = last;
58                node = last->next;
59        }
60
61        if(prev == NULL)
62                queue = newnode;
63        else
64        {
65                prev->next = newnode;
66                newnode->prev = prev;
67        }
68        newnode->next = node;
69        if(node != NULL) node->prev = queue;
70
71        //debug(1000, "out");
72        m_unlock(&status.queuemutex, 11);
73        return newnode;
74}
75
76//flag: 0 = lock
77//flag: 1 = no lock
78void delqueue(struct queue* queuenode, int flag)
79{
80        debug(1000, "in");
81        if(flag == 0) m_lock(&status.queuemutex, 11);
82        struct queue *node = queue, *prev = queue;
83
84        while(node != NULL)
85        {
86                if(node == queuenode)
87                {
88                        if(node == queue)
89                        {
90                                queue = node->next;
91                                if(queue != NULL)
92                                        queue->prev = NULL;
93                        }
94                        else
95                        {
96                                prev->next = node->next;
97                                if(node->next != NULL)
98                                        node->next->prev = prev;
99                        }
100
101                        free(node->data);
102                        node->data = NULL;
103
104                        free(node);
105                        node = NULL;
106                        break;
107                }
108
109                prev = node;
110                node = node->next;
111        }
112        if(flag == 0) m_unlock(&status.queuemutex, 11);
113        debug(1000, "out");
114}
115
116struct queue* getqueue(int type)
117{
118        //debug(1000, "in");
119        m_lock(&status.queuemutex, 11);
120        struct queue *node = queue;
121
122        while(node != NULL)
123        {
124                if(node->type == type)
125                {
126                        //debug(1000, "out");
127                        m_unlock(&status.queuemutex, 11);
128                        return node;
129                }
130
131                node = node->next;
132        }
133        m_unlock(&status.queuemutex, 11);
134        return NULL;
135}
136
137void freequeue()
138{
139        debug(1000, "in");
140        m_lock(&status.queuemutex, 11);
141        struct queue *node = queue, *prev = queue;
142
143        while(node != NULL)
144        {
145                prev = node;
146                node = node->next;
147                if(prev != NULL)
148                        delqueue(prev, 1);
149        }
150        m_unlock(&status.queuemutex, 11);
151        debug(1000, "out");
152}
153
154#endif
155
Note: See TracBrowser for help on using the repository browser.