source: titan/titan/queue.h @ 15288

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

fix

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