Browse Source

dynamically get and free buffer for response write pipe now

master
Georg Hopp 14 years ago
parent
commit
3497eb8754
  1. 8
      ChangeLog
  2. 4
      include/http/response/writer.h
  3. 41
      src/http/response/writer/write.c
  4. 3
      src/server/run.c

8
ChangeLog

@ -1,10 +1,14 @@
2012-02-15 04:44:38 +0100 Georg Hopp
* dynamically get and free buffer for response write pipe now (HEAD, master)
2012-02-14 21:32:38 +0100 Georg Hopp 2012-02-14 21:32:38 +0100 Georg Hopp
* increase write buffer (HEAD, master)
* increase write buffer (origin/master, origin/HEAD)
2012-02-13 21:27:47 +0100 Georg Hopp 2012-02-13 21:27:47 +0100 Georg Hopp
* use one dynamic buffer less and save at least one write on small responses (origin/master, origin/HEAD)
* use one dynamic buffer less and save at least one write on small responses
2012-02-13 18:25:36 +0100 Georg Hopp 2012-02-13 18:25:36 +0100 Georg Hopp

4
include/http/response/writer.h

@ -5,7 +5,7 @@
#include "http/response.h" #include "http/response.h"
#include "http/message/queue.h" #include "http/message/queue.h"
#define RESPONSE_WRITER_BUF_SIZE 131072
#define RESPONSE_WRITER_MAX_BUF 131072
typedef enum e_HttpResponseState { typedef enum e_HttpResponseState {
@ -15,7 +15,7 @@ typedef enum e_HttpResponseState {
} HttpResponseState; } HttpResponseState;
CLASS(HttpResponseWriter) { CLASS(HttpResponseWriter) {
char pipe[RESPONSE_WRITER_BUF_SIZE];
char * pipe;
size_t nheader; size_t nheader;
size_t nbuffer; size_t nbuffer;

41
src/http/response/writer/write.c

@ -12,11 +12,14 @@
#include "http/response.h" #include "http/response.h"
#include "http/response/writer.h" #include "http/response/writer.h"
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define _PSIZE(x) (MAX((x),RESPONSE_WRITER_MAX_BUF))
#define PSIZE _PSIZE(this->nheader+message->nbody)
HttpResponse HttpResponse
httpResponseWriterWrite(HttpResponseWriter this, int fd) httpResponseWriterWrite(HttpResponseWriter this, int fd)
{ {
HttpMessageQueue respq = this->response_queue; HttpMessageQueue respq = this->response_queue;
HttpResponse retval = this->cur_response;
HttpMessage message = (HttpMessage)this->cur_response; HttpMessage message = (HttpMessage)this->cur_response;
int cont = 1; int cont = 1;
@ -25,7 +28,7 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd)
case HTTP_RESPONSE_GET: case HTTP_RESPONSE_GET:
if (NULL == this->cur_response && 0 < respq->nmsgs) { if (NULL == this->cur_response && 0 < respq->nmsgs) {
message = respq->msgs[0]; message = respq->msgs[0];
retval = this->cur_response = (HttpResponse)message;
this->cur_response = (HttpResponse)message;
memmove(respq->msgs, memmove(respq->msgs,
&(respq->msgs[1]), &(respq->msgs[1]),
@ -34,8 +37,9 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd)
this->nbuffer = 0; this->nbuffer = 0;
this->written = 0; this->written = 0;
this->pstart = 0; this->pstart = 0;
this->pend = httpMessageHeaderSizeGet(message);
this->nheader = this->pend;
this->nheader = httpMessageHeaderSizeGet(message);
this->pend = this->nheader;
this->pipe = malloc(PSIZE);
httpMessageHeaderToString(message, this->pipe); httpMessageHeaderToString(message, this->pipe);
this->state = HTTP_RESPONSE_WRITE; this->state = HTTP_RESPONSE_WRITE;
@ -53,11 +57,11 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd)
size_t temp = 0; size_t temp = 0;
size_t rsize; size_t rsize;
this->pend = (RESPONSE_WRITER_BUF_SIZE == this->pend)?
this->pend = (PSIZE == this->pend)?
0 : this->pend; 0 : this->pend;
rsize = (this->pstart <= this->pend)? rsize = (this->pstart <= this->pend)?
RESPONSE_WRITER_BUF_SIZE - this->pend :
PSIZE - this->pend :
this->pstart - 1; this->pstart - 1;
switch (message->type) { switch (message->type) {
@ -92,44 +96,51 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd)
wsize = (this->pstart <= this->pend)? wsize = (this->pstart <= this->pend)?
this->pend - this->pstart : this->pend - this->pstart :
RESPONSE_WRITER_BUF_SIZE - this->pstart;
PSIZE - this->pstart;
temp = write(fd, &(this->pipe[this->pstart]), wsize); temp = write(fd, &(this->pipe[this->pstart]), wsize);
this->written += temp; this->written += temp;
this->pstart += temp; this->pstart += temp;
this->pstart = (RESPONSE_WRITER_BUF_SIZE == this->pstart)?
this->pstart = (PSIZE == this->pstart)?
0 : this->pstart; 0 : this->pstart;
} }
if (this->written == message->nbody + this->nheader) { if (this->written == message->nbody + this->nheader) {
this->state = HTTP_RESPONSE_DONE;
}
else {
cont = 0;
}
break;
case HTTP_RESPONSE_DONE:
if (HTTP_MESSAGE_PIPED == message->type) { if (HTTP_MESSAGE_PIPED == message->type) {
close(message->handle); close(message->handle);
} }
free(this->pipe);
this->nheader = 0; this->nheader = 0;
this->nbuffer = 0; this->nbuffer = 0;
this->written = 0; this->written = 0;
this->pstart = 0; this->pstart = 0;
this->pend = 0; this->pend = 0;
this->state = HTTP_RESPONSE_DONE;
if (httpMessageHasKeepAlive(message)) {
delete(&this->cur_response);
} }
else { else {
cont = 0; cont = 0;
} }
break;
case HTTP_RESPONSE_DONE:
this->cur_response = NULL;
this->state = HTTP_RESPONSE_GET; this->state = HTTP_RESPONSE_GET;
cont = 0;
break; break;
} }
} }
return retval;
return this->cur_response;
} }
// vim: set ts=4 sw=4: // vim: set ts=4 sw=4:

3
src/server/run.c

@ -173,10 +173,9 @@ serverRun(Server this)
(this->fds)[i].events &= ~POLLOUT; (this->fds)[i].events &= ~POLLOUT;
} }
else { else {
delete(&message);
serverCloseConn(this, i); serverCloseConn(this, i);
} }
delete(&message);
} }
} }
} }

Loading…
Cancel
Save