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. 53
      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
* increase write buffer (HEAD, master)
* increase write buffer (origin/master, origin/HEAD)
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

4
include/http/response/writer.h

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

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

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

3
src/server/run.c

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

Loading…
Cancel
Save