Bug #1065 ยป lighttpd-mmap.patch
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;
|
||
}
|
||
}
|
||
|