Skip to content

Commit

Permalink
Abort the runner when failing in the middle of reading an event
Browse files Browse the repository at this point in the history
  • Loading branch information
Snaipe committed Sep 26, 2015
1 parent 49106f4 commit f1dfff5
Showing 1 changed file with 22 additions and 31 deletions.
53 changes: 22 additions & 31 deletions src/io/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,24 @@ void destroy_assert_event(void *ptr, UNUSED void *meta) {
free(ev->data);
}

#ifdef __GNUC__
# define unlikely(x) __builtin_expect((x),0)
#else
# define unlikely(x) (x)
#endif

#define ASSERT(Cond) \
do { \
if (unlikely(Cond)) \
abort(); \
} while (0)

struct event *read_event(FILE *f) {
unsigned kind;
if (fread(&kind, sizeof (unsigned), 1, f) == 0)
return NULL;
ASSERT(fread(&kind, sizeof (unsigned), 1, f) == 0);

unsigned long long pid;
if (fread(&pid, sizeof (unsigned long long), 1, f) == 0)
return NULL;
ASSERT(fread(&pid, sizeof (unsigned long long), 1, f) == 0);

switch (kind) {
case ASSERT: {
Expand All @@ -60,16 +70,13 @@ struct event *read_event(FILE *f) {
char *msg = NULL;

buf = malloc(assert_size);
if (fread(buf, assert_size, 1, f) == 0)
goto fail_assert;
ASSERT(fread(buf, assert_size, 1, f) == 0);

size_t len = 0;
if (fread(&len, sizeof (size_t), 1, f) == 0)
goto fail_assert;
ASSERT(fread(&len, sizeof (size_t), 1, f) == 0);

msg = malloc(len);
if (fread(msg, len, 1, f) == 0)
goto fail_assert;
ASSERT(fread(msg, len, 1, f) == 0);

buf->message = msg;

Expand All @@ -79,22 +86,13 @@ struct event *read_event(FILE *f) {
);
*ev = (struct event) { .pid = pid, .kind = kind, .data = buf };
return ev;

fail_assert:
free(buf);
free(msg);
return NULL;
}
case THEORY_FAIL: {
size_t len = 0;
if (fread(&len, sizeof (size_t), 1, f) == 0)
return NULL;
ASSERT(fread(&len, sizeof (size_t), 1, f) == 0);

char *buf = malloc(len);
if (fread(buf, len, 1, f) == 0) {
free(buf);
return NULL;
}
ASSERT(fread(buf, len, 1, f) == 0);

struct event *ev = smalloc(
.size = sizeof (struct event),
Expand All @@ -105,10 +103,7 @@ struct event *read_event(FILE *f) {
}
case POST_TEST: {
double *elapsed_time = malloc(sizeof (double));
if (fread(elapsed_time, sizeof (double), 1, f) == 0) {
free(elapsed_time);
return NULL;
}
ASSERT(fread(elapsed_time, sizeof (double), 1, f) == 0);

struct event *ev = smalloc(
.size = sizeof (struct event),
Expand All @@ -119,10 +114,7 @@ struct event *read_event(FILE *f) {
}
case WORKER_TERMINATED: {
struct worker_status *status = malloc(sizeof (struct worker_status));
if (fread(status, sizeof (struct worker_status), 1, f) == 0) {
free(status);
return NULL;
}
ASSERT(fread(status, sizeof (struct worker_status), 1, f) == 0);

struct event *ev = smalloc(
.size = sizeof (struct event),
Expand All @@ -146,8 +138,7 @@ void send_event(int kind, void *data, size_t size) {
memcpy(buf, &kind, sizeof (int));
memcpy(buf + sizeof (int), &pid, sizeof (pid));
memcpy(buf + sizeof (int) + sizeof (pid), data, size);
if (fwrite(buf, sizeof (int) + sizeof (pid) + size, 1, g_event_pipe) == 0)
abort();
ASSERT(fwrite(buf, sizeof (int) + sizeof (pid) + size, 1, g_event_pipe) == 0);

free(buf);
}

0 comments on commit f1dfff5

Please sign in to comment.