#include <unistd.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/time.h>
+#include <time.h>
#include <limits.h>
#include "meshlink.h"
struct aio_info {
int callbacks;
size_t size;
- struct timeval tv;
+ struct timespec ts;
struct sync_flag flag;
};
(void)len;
struct aio_info *info = priv;
- gettimeofday(&info->tv, NULL);
+ clock_gettime(CLOCK_MONOTONIC, &info->ts);
info->callbacks++;
info->size += len;
set_sync_flag(&info->flag, true);
// First batch of data should all be sent and received before the second batch
for(size_t j = 0; j < nchannels; j++) {
- assert(timercmp(&out_infos[i].aio_infos[0].tv, &out_infos[j].aio_infos[1].tv, <=));
- assert(timercmp(&in_infos[i].aio_infos[0].tv, &in_infos[j].aio_infos[1].tv, <=));
+ assert(timespec_lt(&out_infos[i].aio_infos[0].ts, &out_infos[j].aio_infos[1].ts));
+ assert(timespec_lt(&in_infos[i].aio_infos[0].ts, &in_infos[j].aio_infos[1].ts));
}
// Files should be identical
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
-#include <sys/time.h>
+#include <time.h>
#include "meshlink.h"
#include "utils.h"
struct aio_info {
int callbacks;
size_t size;
- struct timeval tv;
+ struct timespec ts;
struct sync_flag flag;
};
};
static size_t b_received_len;
-static struct timeval b_received_tv;
+static struct timespec b_received_ts;
static struct sync_flag b_received_flag;
static void aio_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len, void *priv) {
(void)len;
struct aio_info *info = priv;
- gettimeofday(&info->tv, NULL);
+ clock_gettime(CLOCK_MONOTONIC, &info->ts);
info->callbacks++;
info->size += len;
set_sync_flag(&info->flag, true);
b_received_len += len;
if(b_received_len >= smallsize) {
- gettimeofday(&b_received_tv, NULL);
+ clock_gettime(CLOCK_MONOTONIC, &b_received_ts);
set_sync_flag(&b_received_flag, true);
}
}
// First batch of data should all be sent and received before the second batch
for(size_t j = 0; j < nchannels; j++) {
- assert(timercmp(&out_infos[i].aio_infos[0].tv, &out_infos[j].aio_infos[1].tv, <=));
- assert(timercmp(&in_infos[i].aio_infos[0].tv, &in_infos[j].aio_infos[1].tv, <=));
+ assert(timespec_lt(&out_infos[i].aio_infos[0].ts, &out_infos[j].aio_infos[1].ts));
+ assert(timespec_lt(&in_infos[i].aio_infos[0].ts, &in_infos[j].aio_infos[1].ts));
}
// The non-AIO transfer should have completed before everything else
- assert(timercmp(&out_infos[i].aio_infos[0].tv, &b_received_tv, >=));
- assert(timercmp(&in_infos[i].aio_infos[0].tv, &b_received_tv, >=));
+ assert(!timespec_lt(&out_infos[i].aio_infos[0].ts, &b_received_ts));
+ assert(!timespec_lt(&in_infos[i].aio_infos[0].ts, &b_received_ts));
}
// Clean up.
#ifndef MESHLINK_TEST_UTILS_H
#define MESHLINK_TEST_UTILS_H
+#include <assert.h>
+#include <time.h>
+
#include "../src/meshlink.h"
// Simple synchronisation between threads
} while(0)
#endif
+
+/// Compare two timespec values.
+static bool timespec_lt(const struct timespec *a, const struct timespec *b) {
+ if(a->tv_sec == b->tv_sec) {
+ return a->tv_nsec < b->tv_nsec;
+ } else {
+ return a->tv_sec < b->tv_sec;
+ }
+}