diff --git a/media-layer/proxy/src/common/common.c b/media-layer/proxy/src/common/common.c index 9bebf3c..5595ead 100644 --- a/media-layer/proxy/src/common/common.c +++ b/media-layer/proxy/src/common/common.c @@ -54,18 +54,14 @@ void safe_read(void *buf, size_t len) { // Flush Write Cache flush_write_cache(); // Read Remaining Data - size_t to_read_to_cache; - { + size_t to_read_to_cache = 0; + while (to_read_to_cache < 1) { int bytes_available; if (ioctl(get_connection_read(), FIONREAD, &bytes_available) == -1) { bytes_available = 0; } to_read_to_cache = max((size_t) bytes_available, to_read); } - if (to_read_to_cache < 1) { - // Nothing To Read - return; - } // Resize Buffer _read_cache_position = 0; _read_cache_size = to_read_to_cache; diff --git a/media-layer/proxy/src/server/server.cpp b/media-layer/proxy/src/server/server.cpp index bc1c81e..f76d56a 100644 --- a/media-layer/proxy/src/server/server.cpp +++ b/media-layer/proxy/src/server/server.cpp @@ -86,6 +86,34 @@ static void start_media_layer_proxy_client(int read, int write) { update_client_state(1, 0); } +// Maximize Pipe Buffer Size +static void maximize_pipe_fd_size(int fd) { + // Read Maximum Pipe Size + std::ifstream max_size_file("/proc/sys/fs/pipe-max-size"); + if (!max_size_file.good()) { + PROXY_ERR("%s", "Unable To Open Maximum Pipe Size File"); + } + // Read One Line + int max_size; + std::string line; + if (std::getline(max_size_file, line) && line.size() > 0) { + max_size = std::stoi(line); + } else { + PROXY_ERR("%s", "Unable To Read Maximum Pipe Size File"); + } + // Close + max_size_file.close(); + // Set Maximum Pipe Size + errno = 0; + if (fcntl(fd, F_SETPIPE_SZ, max_size) < max_size) { + PROXY_ERR("Unable To Set Maximum Pipe Size: %s", errno != 0 ? strerror(errno) : "Unknown Error"); + } +} +static void maximize_pipe_size(int pipe[2]) { + maximize_pipe_fd_size(pipe[0]); + maximize_pipe_fd_size(pipe[1]); +} + // Start Server static int loaded = 0; __attribute__((constructor)) void media_ensure_loaded() { @@ -98,8 +126,10 @@ __attribute__((constructor)) void media_ensure_loaded() { // Create Connection int server_to_client_pipe[2]; safe_pipe2(server_to_client_pipe, 0); + maximize_pipe_size(server_to_client_pipe); int client_to_server_pipe[2]; safe_pipe2(client_to_server_pipe, 0); + maximize_pipe_size(client_to_server_pipe); // Set Connection set_connection(client_to_server_pipe[0], server_to_client_pipe[1]);