From dc54ec5b2b4391791b4b7f3471b6031c492d26f1 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sat, 16 Feb 2013 01:28:46 -0800 Subject: [PATCH] Migrate connection_t from storing a huge buffer to a std::vector --- env_universal.cpp | 3 ++- env_universal_common.cpp | 24 +++++++++++++----------- env_universal_common.h | 7 +------ 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/env_universal.cpp b/env_universal.cpp index d6f572e35..5fcd97a65 100644 --- a/env_universal.cpp +++ b/env_universal.cpp @@ -259,7 +259,8 @@ static void reconnect() debug(3, L"Get new fishd connection"); s_env_univeral_inited = false; - env_universal_server.buffer_consumed = env_universal_server.buffer_used = 0; + env_universal_server.buffer_consumed = 0; + env_universal_server.read_buffer.clear(); env_universal_server.fd = get_socket(); s_env_univeral_inited = true; if (env_universal_server.fd >= 0) diff --git a/env_universal_common.cpp b/env_universal_common.cpp index 5f1c1eaa5..6887f8cf9 100644 --- a/env_universal_common.cpp +++ b/env_universal_common.cpp @@ -422,10 +422,11 @@ void env_universal_common_init(void (*cb)(fish_message_type_t type, const wchar_ static int read_byte(connection_t *src) { - if (src->buffer_consumed >= src->buffer_used) + if (src->buffer_consumed >= src->read_buffer.size()) { - - ssize_t res = read(src->fd, src->buffer, ENV_UNIVERSAL_BUFFER_SIZE); + char local[ENV_UNIVERSAL_BUFFER_SIZE]; + + ssize_t res = read(src->fd, local, sizeof local); // debug(4, L"Read chunk '%.*s'", res, src->buffer ); @@ -441,17 +442,19 @@ static int read_byte(connection_t *src) return ENV_UNIVERSAL_ERROR; } - - if (res == 0) + else if (res == 0) { return ENV_UNIVERSAL_EOF; } - - src->buffer_consumed = 0; - src->buffer_used = res; + else + { + src->read_buffer.clear(); + src->read_buffer.insert(src->read_buffer.begin(), local, local + res); + src->buffer_consumed = 0; + } } - return src->buffer[src->buffer_consumed++]; + return src->read_buffer.at(src->buffer_consumed++); } @@ -934,8 +937,7 @@ void enqueue_all(connection_t *c) connection_t::connection_t(int input_fd) : fd(input_fd), killme(false), - buffer_consumed(0), - buffer_used(0) + buffer_consumed(0) { } diff --git a/env_universal_common.h b/env_universal_common.h index 294c0e0b8..30361f59d 100644 --- a/env_universal_common.h +++ b/env_universal_common.h @@ -107,17 +107,12 @@ class connection_t /** The read buffer. */ - char buffer[ENV_UNIVERSAL_BUFFER_SIZE]; + std::vector read_buffer; /** Number of bytes that have already been consumed. */ size_t buffer_consumed; - - /** - Number of bytes that have been read into the buffer. - */ - size_t buffer_used; /* Constructor */ connection_t(int input_fd);