X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=test%2Fchannels-aio.c;h=19472bad61b0751f9d826aa74ec41cc18fbf0b24;hb=bc2e55e940e45748a49f1a7eb44b156917fca469;hp=f0b3fc030e204b09cca4f9f581d8faa2b490b251;hpb=f1da50294494310d7a299c29af5649d4415bd38a;p=meshlink diff --git a/test/channels-aio.c b/test/channels-aio.c index f0b3fc03..19472bad 100644 --- a/test/channels-aio.c +++ b/test/channels-aio.c @@ -2,12 +2,14 @@ #undef NDEBUG #endif +#define _POSIX_C_SOURCE 200809L + #include #include #include #include #include -#include +#include #include "meshlink.h" #include "utils.h" @@ -19,7 +21,7 @@ static const size_t nchannels = 4; // number of simultaneous channels struct aio_info { int callbacks; size_t size; - struct timeval tv; + struct timespec ts; struct sync_flag flag; }; @@ -29,7 +31,7 @@ struct channel_info { }; 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) { @@ -39,22 +41,12 @@ static void aio_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const v (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); } -static bool reject_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) { - (void)mesh; - (void)channel; - (void)port; - (void)data; - (void)len; - - return false; -} - static void receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) { (void)mesh; (void)channel; @@ -63,7 +55,7 @@ static void receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, con 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); } } @@ -86,9 +78,8 @@ static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint return true; } -int main(int argc, char *argv[]) { - (void)argc; - (void)argv; +int main(void) { + init_sync_flag(&b_received_flag); meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb); @@ -110,6 +101,11 @@ int main(int argc, char *argv[]) { memset(out_infos, 0, sizeof(out_infos)); for(size_t i = 0; i < nchannels; i++) { + init_sync_flag(&in_infos[i].aio_infos[0].flag); + init_sync_flag(&in_infos[i].aio_infos[1].flag); + init_sync_flag(&out_infos[i].aio_infos[0].flag); + init_sync_flag(&out_infos[i].aio_infos[1].flag); + in_infos[i].data = malloc(size); assert(in_infos[i].data); out_infos[i].data = outdata; @@ -124,7 +120,6 @@ int main(int argc, char *argv[]) { mesh_b->priv = in_infos; - meshlink_set_channel_accept_cb(mesh_a, reject_cb); meshlink_set_channel_accept_cb(mesh_b, accept_cb); // Start both instances @@ -187,16 +182,19 @@ int main(int argc, char *argv[]) { // 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)); + + free(in_infos[i].data); } // Clean up. close_meshlink_pair(mesh_a, mesh_b); + free(outdata); }