0
rb_gc_register_address(&c->env);
0
/* alloc read buffer from pool */
0
- c->read_buffer.ptr = palloc(c->buffer_pool, 1);
0
- assert(c->read_buffer.ptr);
0
- c->read_buffer.nalloc = 1;
0
- c->read_buffer.salloc = c->buffer_pool->size;
0
- c->read_buffer.len = 0;
0
- c->read_buffer.current = 0;
0
+ buffer_init(&c->read_buffer, c->buffer_pool);
0
+ buffer_init(&c->write_buffer, c->buffer_pool);
0
/* assign env[rack.input] */
0
c->input = input_new(&c->read_buffer);
0
rb_gc_register_address(&c->input);
0
rb_hash_aset(c->env, sRackInput, c->input);
0
- /* alloc write buffer from pool */
0
- c->write_buffer.ptr = palloc(c->buffer_pool, 1);
0
- assert(c->write_buffer.ptr);
0
- c->write_buffer.nalloc = 1;
0
- c->write_buffer.salloc = c->buffer_pool->size;
0
- c->write_buffer.len = 0;
0
- c->write_buffer.current = 0;
0
http_parser_init(&c->parser);
0
- /* alloc more mem when buffer full */
0
- /* TODO extract this into buffer.c and optimize */
0
- /* TODO store big body in tempfile */
0
- if (c->read_buffer.len >= c->read_buffer.salloc) {
0
- /* TODO if last alloc, just alloc next block */
0
- old = c->read_buffer.ptr;
0
- new = (char *) palloc(c->buffer_pool, c->read_buffer.nalloc + 1);
0
- memcpy(new, old, c->read_buffer.len);
0
- c->read_buffer.ptr = new;
0
- c->read_buffer.nalloc ++;
0
- c->read_buffer.salloc += c->buffer_pool->size;
0
- pfree(c->buffer_pool, old);
0
+ buffer_append(&c->read_buffer, buf, len);
0
- memcpy(c->read_buffer.ptr + c->read_buffer.len, buf, len);
0
- c->read_buffer.len += len;
0
if (!http_parser_is_finished(&c->parser)) {
0
/* header not all received, we continue parsing ... */
0
static VALUE iter_body(VALUE chunk, VALUE *val_conn)
0
connection_t *c = (connection_t *) val_conn;
0
- size_t len = RSTRING_LEN(chunk);
0
- memcpy(c->write_buffer.ptr + c->write_buffer.len, RSTRING_PTR(chunk), len);
0
- c->write_buffer.len += len;
0
+ buffer_append(&c->write_buffer, RSTRING_PTR(chunk), RSTRING_LEN(chunk));
0
if (TYPE(body) == T_STRING) {
0
/* Calling String#each creates several other strings which is slower and use more mem,
0
- * also Ruby 1.9 doesn't define that method anymore, so it's better to send one big string. */
0
- size_t len = RSTRING_LEN(body);
0
+ * also Ruby 1.9 doesn't define that method anymore, so it's better to send one big string. */
0
+ buffer_append(&c->write_buffer, RSTRING_PTR(body), RSTRING_LEN(body));
0
- memcpy(c->write_buffer.ptr + c->write_buffer.len, RSTRING_PTR(body), len);
0
- c->write_buffer.len += len;
0
/* Iterate over body#each and send each yielded chunk */
0
rb_iterate(rb_each, body, iter_body, (VALUE) c);
0
- if (c->read_buffer.ptr != NULL)
0
- pfree(c->buffer_pool, c->read_buffer.ptr);
0
- c->read_buffer.salloc = 0;
0
- c->read_buffer.nalloc = 0;
0
- if (c->write_buffer.ptr != NULL)
0
- pfree(c->buffer_pool, c->write_buffer.ptr);
0
- c->write_buffer.salloc = 0;
0
- c->write_buffer.nalloc = 0;
0
+ buffer_free(&c->read_buffer);
0
+ buffer_free(&c->write_buffer);
0
/* tell Ruby GC vars are not used anymore */
0
rb_gc_unregister_address(&c->env);
Comments
No one has commented yet.