|
|
|
@ -7,7 +7,6 @@
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include "chunk.h" |
|
|
|
|
#include "base.h" |
|
|
|
|
#include "fdevent.h" |
|
|
|
|
#include "log.h" |
|
|
|
|
|
|
|
|
@ -188,7 +187,6 @@ static void chunkqueue_prepend_chunk(chunkqueue *cq, chunk *c) {
|
|
|
|
|
if (NULL == cq->last) { |
|
|
|
|
cq->last = c; |
|
|
|
|
} |
|
|
|
|
cq->bytes_in += chunk_remaining_length(c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void chunkqueue_append_chunk(chunkqueue *cq, chunk *c) { |
|
|
|
@ -201,7 +199,29 @@ static void chunkqueue_append_chunk(chunkqueue *cq, chunk *c) {
|
|
|
|
|
if (NULL == cq->first) { |
|
|
|
|
cq->first = c; |
|
|
|
|
} |
|
|
|
|
cq->bytes_in += chunk_remaining_length(c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static chunk * chunkqueue_prepend_mem_chunk(chunkqueue *cq) { |
|
|
|
|
chunk *c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
chunkqueue_prepend_chunk(cq, c); |
|
|
|
|
return c; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static chunk * chunkqueue_append_mem_chunk(chunkqueue *cq) { |
|
|
|
|
chunk *c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
return c; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static chunk * chunkqueue_append_file_chunk(chunkqueue *cq, buffer *fn, off_t offset, off_t len) { |
|
|
|
|
chunk *c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
c->type = FILE_CHUNK; |
|
|
|
|
c->file.start = offset; |
|
|
|
|
c->file.length = len; |
|
|
|
|
cq->bytes_in += len; |
|
|
|
|
buffer_copy_buffer(c->file.name, fn); |
|
|
|
|
return c; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void chunkqueue_reset(chunkqueue *cq) { |
|
|
|
@ -221,41 +241,18 @@ void chunkqueue_reset(chunkqueue *cq) {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void chunkqueue_append_file_fd(chunkqueue *cq, buffer *fn, int fd, off_t offset, off_t len) { |
|
|
|
|
chunk *c; |
|
|
|
|
|
|
|
|
|
if (0 == len) { |
|
|
|
|
close(fd); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
|
|
|
|
|
c->type = FILE_CHUNK; |
|
|
|
|
|
|
|
|
|
buffer_copy_buffer(c->file.name, fn); |
|
|
|
|
c->file.start = offset; |
|
|
|
|
c->file.length = len; |
|
|
|
|
c->file.fd = fd; |
|
|
|
|
c->offset = 0; |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
if (len > 0) { |
|
|
|
|
(chunkqueue_append_file_chunk(cq, fn, offset, len))->file.fd = fd; |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
close(fd); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void chunkqueue_append_file(chunkqueue *cq, buffer *fn, off_t offset, off_t len) { |
|
|
|
|
chunk *c; |
|
|
|
|
|
|
|
|
|
if (0 == len) return; |
|
|
|
|
|
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
|
|
|
|
|
c->type = FILE_CHUNK; |
|
|
|
|
|
|
|
|
|
buffer_copy_buffer(c->file.name, fn); |
|
|
|
|
c->file.start = offset; |
|
|
|
|
c->file.length = len; |
|
|
|
|
c->offset = 0; |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
if (len > 0) { |
|
|
|
|
chunkqueue_append_file_chunk(cq, fn, offset, len); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -277,12 +274,9 @@ void chunkqueue_append_buffer(chunkqueue *cq, buffer *mem) {
|
|
|
|
|
size_t len = buffer_string_length(mem); |
|
|
|
|
if (len < 256 && chunkqueue_append_mem_extend_chunk(cq, mem->ptr, len)) return; |
|
|
|
|
|
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = MEM_CHUNK; |
|
|
|
|
force_assert(NULL != c->mem); |
|
|
|
|
c = chunkqueue_append_mem_chunk(cq); |
|
|
|
|
cq->bytes_in += len; |
|
|
|
|
buffer_move(c->mem, mem); |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -290,11 +284,9 @@ void chunkqueue_append_mem(chunkqueue *cq, const char * mem, size_t len) {
|
|
|
|
|
chunk *c; |
|
|
|
|
if (len < 4096 && chunkqueue_append_mem_extend_chunk(cq, mem, len)) return; |
|
|
|
|
|
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = MEM_CHUNK; |
|
|
|
|
c = chunkqueue_append_mem_chunk(cq); |
|
|
|
|
cq->bytes_in += len; |
|
|
|
|
buffer_copy_string_len(c->mem, mem, len); |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -316,9 +308,7 @@ void chunkqueue_append_chunkqueue(chunkqueue *cq, chunkqueue *src) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buffer * chunkqueue_prepend_buffer_open(chunkqueue *cq) { |
|
|
|
|
chunk *c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = MEM_CHUNK; |
|
|
|
|
chunkqueue_prepend_chunk(cq, c); |
|
|
|
|
chunk *c = chunkqueue_prepend_mem_chunk(cq); |
|
|
|
|
buffer_string_prepare_append(c->mem, 4095); |
|
|
|
|
return c->mem; |
|
|
|
|
} |
|
|
|
@ -330,9 +320,7 @@ void chunkqueue_prepend_buffer_commit(chunkqueue *cq) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
buffer * chunkqueue_append_buffer_open(chunkqueue *cq) { |
|
|
|
|
chunk *c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = MEM_CHUNK; |
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
chunk *c = chunkqueue_append_mem_chunk(cq); |
|
|
|
|
buffer_string_prepare_append(c->mem, 4095); |
|
|
|
|
return c->mem; |
|
|
|
|
} |
|
|
|
@ -392,14 +380,11 @@ void chunkqueue_get_memory(chunkqueue *cq, char **mem, size_t *len, size_t min_s
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* allocate new chunk */ |
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = MEM_CHUNK; |
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
|
|
|
|
|
c = chunkqueue_append_mem_chunk(cq); |
|
|
|
|
b = c->mem; |
|
|
|
|
buffer_string_prepare_append(b, alloc_size); |
|
|
|
|
|
|
|
|
|
*mem = b->ptr + buffer_string_length(b); |
|
|
|
|
*mem = b->ptr; |
|
|
|
|
*len = buffer_string_space(b); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -466,6 +451,7 @@ void chunkqueue_steal(chunkqueue *dest, chunkqueue *src, off_t len) {
|
|
|
|
|
if (c == src->last) src->last = NULL; |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(dest, c); |
|
|
|
|
dest->bytes_in += use; |
|
|
|
|
} else { |
|
|
|
|
/* partial chunk with length "use" */ |
|
|
|
|
|
|
|
|
@ -538,14 +524,9 @@ static chunk *chunkqueue_get_append_tempfile(server *srv, chunkqueue *cq) {
|
|
|
|
|
} |
|
|
|
|
fdevent_setfd_cloexec(fd); |
|
|
|
|
|
|
|
|
|
c = chunkqueue_get_unused_chunk(cq); |
|
|
|
|
c->type = FILE_CHUNK; |
|
|
|
|
c = chunkqueue_append_file_chunk(cq, template, 0, 0); |
|
|
|
|
c->file.fd = fd; |
|
|
|
|
c->file.is_temp = 1; |
|
|
|
|
buffer_copy_buffer(c->file.name, template); |
|
|
|
|
c->file.length = 0; |
|
|
|
|
|
|
|
|
|
chunkqueue_append_chunk(cq, c); |
|
|
|
|
|
|
|
|
|
buffer_free(template); |
|
|
|
|
|
|
|
|
@ -676,6 +657,7 @@ int chunkqueue_steal_with_tempfiles(server *srv, chunkqueue *dest, chunkqueue *s
|
|
|
|
|
src->first = c->next; |
|
|
|
|
if (c == src->last) src->last = NULL; |
|
|
|
|
chunkqueue_append_chunk(dest, c); |
|
|
|
|
dest->bytes_in += use; |
|
|
|
|
} else { |
|
|
|
|
/* partial chunk with length "use" */ |
|
|
|
|
/* tempfile flag is in "last" chunk after the split */ |
|
|
|
|