source: titan/titan/queue.h @ 27899

Last change on this file since 27899 was 23286, checked in by nit, 11 years ago

[titan] cleanup

File size: 2.7 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, void* data1, int len1, int flag, struct queue* last)
16{
17        m_lock(&status.queuemutex, 11);
18
19        struct queue *newnode = NULL, *prev = NULL, *node = queue;
20        void* tmpdata = NULL, *tmpdata1 = NULL;
21
22        newnode = (struct queue*)calloc(1, sizeof(struct queue));
23        if(newnode == NULL)
24        {
25                err("no memory");
26                m_unlock(&status.queuemutex, 11);
27                return NULL;
28        }
29
30        if(len > 0)
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        }
41       
42        if(len1 > 0)
43        {
44                tmpdata1 = malloc(len1);
45                if(tmpdata1 == NULL)
46                {
47                        err("no memory");
48                        free(tmpdata);
49                        free(newnode);
50                        m_unlock(&status.queuemutex, 11);
51                        return NULL;
52                }
53        }
54
55        newnode->type = type;
56        newnode->len = len;
57        newnode->flag = flag;
58        if(len > 0) newnode->data = memcpy(tmpdata, data, len);
59        if(len1 > 0) newnode->data1 = memcpy(tmpdata1, data1, len1);
60
61        if(last == NULL)
62        {
63                while(node != NULL)
64                {
65                        prev = node;
66                        node = node->next;
67                }
68        }
69        else
70        {
71                prev = last;
72                node = last->next;
73        }
74
75        if(prev == NULL)
76                queue = newnode;
77        else
78        {
79                prev->next = newnode;
80                newnode->prev = prev;
81        }
82        newnode->next = node;
83        if(node != NULL) node->prev = queue;
84
85        m_unlock(&status.queuemutex, 11);
86        return newnode;
87}
88
89//flag: 0 = lock
90//flag: 1 = no lock
91void delqueue(struct queue* queuenode, int flag)
92{
93        if(flag == 0) m_lock(&status.queuemutex, 11);
94        struct queue *node = queue, *prev = queue;
95
96        while(node != NULL)
97        {
98                if(node == queuenode)
99                {
100                        if(node == queue)
101                        {
102                                queue = node->next;
103                                if(queue != NULL)
104                                        queue->prev = NULL;
105                        }
106                        else
107                        {
108                                prev->next = node->next;
109                                if(node->next != NULL)
110                                        node->next->prev = prev;
111                        }
112
113                        free(node->data);
114                        node->data = NULL;
115                       
116                        free(node->data1);
117                        node->data1 = NULL;
118
119                        free(node);
120                        node = NULL;
121                        break;
122                }
123
124                prev = node;
125                node = node->next;
126        }
127        if(flag == 0) m_unlock(&status.queuemutex, 11);
128}
129
130struct queue* getqueue(int type)
131{
132        m_lock(&status.queuemutex, 11);
133        struct queue *node = queue;
134
135        while(node != NULL)
136        {
137                if(node->type == type)
138                {
139                        m_unlock(&status.queuemutex, 11);
140                        return node;
141                }
142
143                node = node->next;
144        }
145        m_unlock(&status.queuemutex, 11);
146        return NULL;
147}
148
149void freequeue()
150{
151        m_lock(&status.queuemutex, 11);
152        struct queue *node = queue, *prev = queue;
153
154        while(node != NULL)
155        {
156                prev = node;
157                node = node->next;
158                if(prev != NULL)
159                        delqueue(prev, 1);
160        }
161        m_unlock(&status.queuemutex, 11);
162}
163
164#endif
165
Note: See TracBrowser for help on using the repository browser.