Project

General

Profile

Bug #1065 ยป lighttpd-mmap.patch

lighttpd-mmap.patch - jwmcglynn, 2007-03-03 04:00

View differences:

src/network_posix_aio.c (working copy)
#include "sys-files.h"
#include "status_counter.h"
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
#define MAP_ANONYMOUS MAP_ANON
#endif
typedef struct {
server *srv;
connection *con;
......
* read()
* */
if (-1 == c->file.copy.fd ) {
int mmap_fd = -1;
c->file.mmap.offset = 0;
c->file.mmap.length = toSend;
/* open a file in /dev/shm to write to */
if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) {
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (c->file.mmap.start == MAP_FAILED) {
async_error = 1;
if (errno != EMFILE) {
TRACE("open(/dev/zero) returned: %d (%s), falling back to sync-io",
errno, strerror(errno));
} else {
return NETWORK_STATUS_WAIT_FOR_FD;
}
} else {
c->file.mmap.offset = 0;
c->file.mmap.length = toSend;
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0);
if (c->file.mmap.start == MAP_FAILED) {
async_error = 1;
} else {
c->file.copy.length = toSend;
}
close(mmap_fd);
mmap_fd = -1;
c->file.copy.length = toSend;
}
}
src/network_gthread_aio.c (working copy)
#include "sys-files.h"
#include "sys-socket.h"
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
#define MAP_ANONYMOUS MAP_ANON
#endif
typedef struct {
chunk *c;
......
size_t toSend;
const off_t max_toSend = 4 * 256 * 1024; /** should be larger than the send buffer */
chunk *c = wj->c;
int mmap_fd;
offset = c->file.start + c->offset;
......
/* open a file in /dev/shm to write to */
if (c->file.mmap.start == MAP_FAILED) {
if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) {
if (errno != EMFILE) {
TRACE("open(/dev/zero) returned: %d (%s)",
errno, strerror(errno));
c->async.ret_val = NETWORK_STATUS_FATAL_ERROR;
} else {
c->async.ret_val = NETWORK_STATUS_WAIT_FOR_FD;
}
} else {
c->file.mmap.offset = 0;
c->file.mmap.length = toSend;
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0);
if (c->file.mmap.start == MAP_FAILED) {
c->async.ret_val = NETWORK_STATUS_FATAL_ERROR;
}
close(mmap_fd);
mmap_fd = -1;
c->file.mmap.offset = 0;
c->file.mmap.length = toSend;
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (c->file.mmap.start == MAP_FAILED) {
c->async.ret_val = NETWORK_STATUS_FATAL_ERROR;
}
}
......
/* we small files don't take the overhead of a full async-loop */
if (toSend < 4 * 1024) {
int mmap_fd;
c->file.copy.offset = 0;
c->file.copy.length = toSend;
/* open a file in /dev/shm to write to */
if (c->file.mmap.start == MAP_FAILED) {
if (-1 == (mmap_fd = open("/dev/zero", O_RDWR))) {
if (errno != EMFILE) {
TRACE("open(/dev/zero) returned: %d (%s), open fds: %d",
errno, strerror(errno));
return NETWORK_STATUS_FATAL_ERROR;
} else {
return NETWORK_STATUS_WAIT_FOR_FD;
}
} else {
c->file.mmap.offset = 0;
c->file.mmap.length = c->file.copy.length; /* align to page-size */
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED, mmap_fd, 0);
if (c->file.mmap.start == MAP_FAILED) {
return NETWORK_STATUS_FATAL_ERROR;
}
close(mmap_fd);
mmap_fd = -1;
c->file.mmap.offset = 0;
c->file.mmap.length = c->file.copy.length; /* align to page-size */
c->file.mmap.start = mmap(0, c->file.mmap.length,
PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (c->file.mmap.start == MAP_FAILED) {
return NETWORK_STATUS_FATAL_ERROR;
}
}
    (1-1/1)