citrun

watch C/C++ source code execute
Log | Files | Refs | LICENSE

commit ed707775f291801c46a9519863ec8dbde68f18df
parent c2e04946a259f1d04c88f21bfb8e25529b3c7821
Author: Kyle Milz <kyle@getaddrinfo.net>
Date:   Sun,  3 Apr 2016 23:02:59 -0600

gl: use a template member function for flexible reads

Diffstat:
Msrc/af_unix.cc | 22----------------------
Msrc/af_unix.h | 27++++++++++++++++++++++++---
Msrc/gl_runtime_conn.cc | 10+++++-----
3 files changed, 29 insertions(+), 30 deletions(-)

diff --git a/src/af_unix.cc b/src/af_unix.cc @@ -97,28 +97,6 @@ af_unix::write_all(uint8_t *buf, size_t bytes_total) } int -af_unix::read_all(uint64_t &buf) -{ - int bytes_left = sizeof(uint64_t); - int bytes_read = 0; - ssize_t n; - - while (bytes_left > 0) { - n = read(fd, &buf + bytes_read, bytes_left); - - if (n == 0) - errx(1, "read(): read 0 bytes on socket"); - if (n < 0) - err(1, "read()"); - - bytes_read += n; - bytes_left -= n; - } - - return bytes_read; -} - -int af_unix::read_all(uint8_t *buf, size_t bytes_total) { int bytes_left = bytes_total; diff --git a/src/af_unix.h b/src/af_unix.h @@ -1,7 +1,7 @@ #ifndef AF_UNIX_H #define AF_UNIX_H -#include <cstddef> +#include <unistd.h> // read #include <vector> class af_unix { @@ -13,9 +13,30 @@ public: void set_listen(); af_unix *accept(); - int read_all(uint64_t &); - int read_all(uint8_t *, size_t); + // Makes sure reads don't overflow or underflow types + template<typename T> + int read_all(T &buf) + { + int bytes_left = sizeof(T); + int bytes_read = 0; + ssize_t n; + + while (bytes_left > 0) { + n = read(fd, &buf + bytes_read, bytes_left); + + if (n == 0) + errx(1, "read(): read 0 bytes on socket"); + if (n < 0) + err(1, "read()"); + bytes_read += n; + bytes_left -= n; + } + + return bytes_read; + }; + + int read_all(uint8_t *, size_t); int write_all(uint8_t *, size_t); private: int fd; diff --git a/src/gl_runtime_conn.cc b/src/gl_runtime_conn.cc @@ -18,9 +18,9 @@ RuntimeProcess::RuntimeProcess(af_unix *sock, demo_buffer_t *buf, demo_font_t *f translation_units.resize(num_tus); assert(sizeof(pid_t) == 4); - socket->read_all((uint8_t *)&process_id, 4); - socket->read_all((uint8_t *)&parent_process_id, 4); - socket->read_all((uint8_t *)&process_group, 4); + socket->read_all(process_id); + socket->read_all(parent_process_id); + socket->read_all(process_group); std::stringstream ss; ss << "Translation Units: " << num_tus << std::endl; @@ -44,10 +44,10 @@ RuntimeProcess::RuntimeProcess(af_unix *sock, demo_buffer_t *buf, demo_font_t *f read_file(current_unit.file_name, top_left); top_left.x += 50; - socket->read_all((uint8_t *)&current_unit.num_lines, 4); + socket->read_all(current_unit.num_lines); current_unit.execution_counts.resize(current_unit.num_lines); - socket->read_all((uint8_t *)&current_unit.inst_sites, 4); + socket->read_all(current_unit.inst_sites); } demo_font_print_stats(font);