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:
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 *)¤t_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 *)¤t_unit.inst_sites, 4);
+ socket->read_all(current_unit.inst_sites);
}
demo_font_print_stats(font);