Commit a239fc98e8aded12a7259bc74fae2a45e617ba94
1 parent
514b7843
changed HttpMessageQueue to be a real queue and not a fixed size array
Showing
8 changed files
with
144 additions
and
46 deletions
... | ... | @@ -26,17 +26,32 @@ |
26 | 26 | #ifndef __HTTP_MESSAGE_QUEUE_H__ |
27 | 27 | #define __HTTP_MESSAGE_QUEUE_H__ |
28 | 28 | |
29 | +#include <sys/types.h> | |
30 | + | |
29 | 31 | #include "class.h" |
30 | 32 | #include "http/message.h" |
31 | - | |
32 | -#define HTTP_MESSAGE_QUEUE_MAX 1024 | |
33 | +#include "commons.h" | |
33 | 34 | |
34 | 35 | |
35 | 36 | CLASS(HttpMessageQueue) { |
36 | - HttpMessage msgs[HTTP_MESSAGE_QUEUE_MAX]; | |
37 | - size_t nmsgs; | |
37 | + HttpMessage msg; | |
38 | + HttpMessageQueue next; | |
39 | + | |
40 | + /** | |
41 | + * first and last are only available in the initial queue | |
42 | + * element (the root). This elelment does not contain any message | |
43 | + * and exists only for organizational purpose. | |
44 | + */ | |
45 | + HttpMessageQueue first; | |
46 | + HttpMessageQueue last; | |
47 | + size_t nmsg; | |
38 | 48 | }; |
39 | 49 | |
50 | +void httpMessageQueuePut(HttpMessageQueue, HttpMessage); | |
51 | +HttpMessage httpMessageQueueGet(HttpMessageQueue); | |
52 | + | |
53 | +#define httpMessageQueueEmpty(this) (0 >= (this)->nmsg) | |
54 | + | |
40 | 55 | #endif // __HTTP_MESSAGE_QUEUE_H__ |
41 | 56 | |
42 | 57 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -6,7 +6,9 @@ MSG = message.c \ |
6 | 6 | message/header_to_string.c \ |
7 | 7 | message/get_version.c \ |
8 | 8 | message/has_valid_version.c |
9 | -MSGQ = message/queue.c | |
9 | +MSGQ = message/queue.c \ | |
10 | + message/queue/get.c \ | |
11 | + message/queue/put.c | |
10 | 12 | REQ = request.c \ |
11 | 13 | request/has_valid_method.c |
12 | 14 | RESP = response.c \ | ... | ... |
... | ... | @@ -38,10 +38,14 @@ void |
38 | 38 | messageQueueDtor(void * _this) |
39 | 39 | { |
40 | 40 | HttpMessageQueue this = _this; |
41 | + HttpMessageQueue node = this->first; | |
41 | 42 | int i; |
42 | - | |
43 | - for (i=0; i<this->nmsgs; i++) { | |
44 | - delete((this->msgs)[i]); | |
43 | + | |
44 | + while (NULL != node) { | |
45 | + HttpMessageQueue next = node->next; | |
46 | + delete(node->msg); | |
47 | + delete(node); | |
48 | + node = next; | |
45 | 49 | } |
46 | 50 | } |
47 | 51 | ... | ... |
src/http/message/queue/get.c
0 → 100644
1 | +/** | |
2 | + * \file | |
3 | + * | |
4 | + * \author Georg Hopp | |
5 | + * | |
6 | + * \copyright | |
7 | + * Copyright © 2012 Georg Hopp | |
8 | + * | |
9 | + * This program is free software: you can redistribute it and/or modify | |
10 | + * it under the terms of the GNU General Public License as published by | |
11 | + * the Free Software Foundation, either version 3 of the License, or | |
12 | + * (at your option) any later version. | |
13 | + * | |
14 | + * This program is distributed in the hope that it will be useful, | |
15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | + * GNU General Public License for more details. | |
18 | + * | |
19 | + * You should have received a copy of the GNU General Public License | |
20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | + */ | |
22 | + | |
23 | +#include "class.h" | |
24 | +#include "http/message.h" | |
25 | +#include "http/message/queue.h" | |
26 | + | |
27 | +HttpMessage | |
28 | +httpMessageQueueGet(HttpMessageQueue this) | |
29 | +{ | |
30 | + HttpMessageQueue first; | |
31 | + HttpMessage msg; | |
32 | + | |
33 | + if (NULL == this->first) { | |
34 | + return NULL; | |
35 | + } | |
36 | + | |
37 | + msg = this->first->msg; | |
38 | + first = this->first->next; | |
39 | + delete(this->first); | |
40 | + | |
41 | + this->first = first; | |
42 | + this->nmsg--; | |
43 | + | |
44 | + return msg; | |
45 | +} | |
46 | + | |
47 | +// vim: set ts=4 sw=4: | ... | ... |
src/http/message/queue/put.c
0 → 100644
1 | +/** | |
2 | + * \file | |
3 | + * | |
4 | + * \author Georg Hopp | |
5 | + * | |
6 | + * \copyright | |
7 | + * Copyright © 2012 Georg Hopp | |
8 | + * | |
9 | + * This program is free software: you can redistribute it and/or modify | |
10 | + * it under the terms of the GNU General Public License as published by | |
11 | + * the Free Software Foundation, either version 3 of the License, or | |
12 | + * (at your option) any later version. | |
13 | + * | |
14 | + * This program is distributed in the hope that it will be useful, | |
15 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | + * GNU General Public License for more details. | |
18 | + * | |
19 | + * You should have received a copy of the GNU General Public License | |
20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 | + */ | |
22 | + | |
23 | +#include "class.h" | |
24 | +#include "http/message.h" | |
25 | +#include "http/message/queue.h" | |
26 | + | |
27 | +void | |
28 | +httpMessageQueuePut(HttpMessageQueue this, HttpMessage msg) | |
29 | +{ | |
30 | + HttpMessageQueue node = (this->last)? this->last : this; | |
31 | + | |
32 | + node->next = new(HttpMessageQueue); | |
33 | + this->last = node->next; | |
34 | + | |
35 | + if (node == this) { | |
36 | + this->first = node->next; | |
37 | + } | |
38 | + | |
39 | + node->next->msg = msg; | |
40 | + this->nmsg++; | |
41 | +} | |
42 | + | |
43 | +// vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -167,16 +167,16 @@ httpParserParse(void * _this, Stream st) |
167 | 167 | httpParserPostVars(this); |
168 | 168 | } |
169 | 169 | |
170 | - /** | |
171 | - * enqueue current request | |
172 | - */ | |
173 | - this->queue->msgs[(this->queue->nmsgs)++] = this->current; | |
174 | - this->current = NULL; | |
175 | - | |
176 | - /** | |
177 | - * prepare for next request | |
178 | - */ | |
179 | - this->state = HTTP_MESSAGE_GARBAGE; | |
170 | + /** | |
171 | + * enqueue current request | |
172 | + */ | |
173 | + httpMessageQueuePut(this->queue, this->current); | |
174 | + this->current = NULL; | |
175 | + | |
176 | + /** | |
177 | + * prepare for next request | |
178 | + */ | |
179 | + this->state = HTTP_MESSAGE_GARBAGE; | |
180 | 180 | } |
181 | 181 | break; |
182 | 182 | |
... | ... | @@ -185,7 +185,7 @@ httpParserParse(void * _this, Stream st) |
185 | 185 | } |
186 | 186 | } |
187 | 187 | |
188 | - return this->queue->nmsgs; | |
188 | + return this->queue->nmsg; | |
189 | 189 | } |
190 | 190 | |
191 | 191 | // vim: set ts=4 sw=4: | ... | ... |
... | ... | @@ -60,13 +60,11 @@ httpWorkerProcess(HttpWorker this, Stream st) |
60 | 60 | |
61 | 61 | if (0 < (size = httpParserParse(this->parser, st))) { |
62 | 62 | int i; |
63 | - HttpMessageQueue reqq = this->parser->queue; | |
64 | - HttpMessageQueue respq = this->writer->queue; | |
65 | 63 | |
66 | - for (i=0; i<reqq->nmsgs; i++) { | |
67 | - HttpMessage rmessage = reqq->msgs[i]; | |
68 | - HttpRequest request = (HttpRequest)(reqq->msgs[i]); | |
69 | - HttpMessage response = NULL; | |
64 | + while (! httpMessageQueueEmpty(this->parser->queue)) { | |
65 | + HttpRequest request = (HttpRequest)httpMessageQueueGet( | |
66 | + this->parser->queue); | |
67 | + HttpMessage response = NULL; | |
70 | 68 | |
71 | 69 | /** |
72 | 70 | * \todo store the cookie count in the request to make a simple |
... | ... | @@ -238,19 +236,11 @@ httpWorkerProcess(HttpWorker this, Stream st) |
238 | 236 | |
239 | 237 | httpWorkerAddCommonHeader((HttpMessage)request, response); |
240 | 238 | |
241 | - t = time(NULL); | |
242 | - tmp = localtime(&t); | |
243 | - strftime(buffer, sizeof(buffer), "%a, %d %b %Y %T %Z", tmp); | |
244 | - httpHeaderAdd(&(response->header), | |
245 | - new(HttpHeader, "Date", buffer)); | |
239 | + delete(request); | |
246 | 240 | |
247 | - respq->msgs[(respq->nmsgs)++] = response; | |
241 | + httpMessageQueuePut(this->writer->queue, response); | |
248 | 242 | response = NULL; |
249 | - delete((reqq->msgs)[i]); | |
250 | 243 | } |
251 | - | |
252 | - reqq->nmsgs = 0; | |
253 | - size = respq->nmsgs; | |
254 | 244 | } |
255 | 245 | |
256 | 246 | return size; | ... | ... |
... | ... | @@ -25,6 +25,7 @@ |
25 | 25 | |
26 | 26 | #include "class.h" |
27 | 27 | #include "http/message.h" |
28 | +#include "http/message/queue.h" | |
28 | 29 | #include "http/writer.h" |
29 | 30 | #include "cbuf.h" |
30 | 31 | #include "stream.h" |
... | ... | @@ -35,9 +36,8 @@ |
35 | 36 | ssize_t |
36 | 37 | httpWriterWrite(void * _this, Stream st) |
37 | 38 | { |
38 | - HttpWriter this = _this; | |
39 | - HttpMessageQueue respq = this->queue; | |
40 | - int cont = 1; | |
39 | + HttpWriter this = _this; | |
40 | + int cont = 1; | |
41 | 41 | |
42 | 42 | if (cbufIsLocked(this->buffer)) { |
43 | 43 | if (FALSE == this->ourLock) |
... | ... | @@ -51,8 +51,9 @@ httpWriterWrite(void * _this, Stream st) |
51 | 51 | while (cont) { |
52 | 52 | switch (this->state) { |
53 | 53 | case HTTP_WRITER_GET: |
54 | - if (NULL == this->current && 0 < respq->nmsgs) { | |
55 | - this->current = respq->msgs[0]; | |
54 | + if (NULL == this->current && | |
55 | + ! httpMessageQueueEmpty(this->queue)) { | |
56 | + this->current = httpMessageQueueGet(this->queue); | |
56 | 57 | |
57 | 58 | this->written = 0; |
58 | 59 | this->nbody = 0; |
... | ... | @@ -122,11 +123,7 @@ httpWriterWrite(void * _this, Stream st) |
122 | 123 | break; |
123 | 124 | |
124 | 125 | case HTTP_WRITER_DONE: |
125 | - this->state = HTTP_WRITER_GET; | |
126 | - | |
127 | - memmove(respq->msgs, | |
128 | - &(respq->msgs[1]), | |
129 | - sizeof(void*) * (--respq->nmsgs + 1)); | |
126 | + this->state = HTTP_WRITER_GET; | |
130 | 127 | |
131 | 128 | cbufRelease(this->buffer); |
132 | 129 | this->ourLock = FALSE; |
... | ... | @@ -148,7 +145,7 @@ httpWriterWrite(void * _this, Stream st) |
148 | 145 | } |
149 | 146 | } |
150 | 147 | |
151 | - return respq->nmsgs; | |
148 | + return this->queue->nmsg; | |
152 | 149 | } |
153 | 150 | |
154 | 151 | // vim: set ts=4 sw=4: | ... | ... |
Please
register
or
login
to post a comment