Browse Source

[core] chunk.c code reuse

personal/stbuehler/fix-fdevent
Glenn Strauss 4 years ago
parent
commit
a9ae35128d
  1. 104
      src/chunk.c

104
src/chunk.c

@ -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 */

Loading…
Cancel
Save