X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=test%2Fchannels-aio-fd.c;h=677944b85957c90c3c5cd46a2168c064b679c89c;hb=e40d5bf3a0e030105334046319f377efbf3f06c4;hp=c793db8305f2c5203faed24f4fc644c1a586cb52;hpb=c023ad12147aa88810629c110ea6b1ab94267196;p=meshlink diff --git a/test/channels-aio-fd.c b/test/channels-aio-fd.c index c793db83..677944b8 100644 --- a/test/channels-aio-fd.c +++ b/test/channels-aio-fd.c @@ -1,9 +1,13 @@ +#ifdef NDEBUG +#undef NDEBUG +#endif + #include #include #include #include #include -#include +#include #include #include "meshlink.h" @@ -15,7 +19,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; }; @@ -31,22 +35,12 @@ static void aio_fd_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, int (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 bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) { assert(port && port <= nchannels); assert(!data); @@ -61,14 +55,12 @@ 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) { + meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_cb); // Prepare file char *outdata = malloc(size); - assert(outdata); for(size_t i = 0; i < size; i++) { @@ -88,6 +80,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); + char filename[PATH_MAX]; snprintf(filename, sizeof(filename), "channels_aio_fd.out%d", (int)i); in_infos[i].file = fopen(filename, "w"); @@ -98,61 +95,39 @@ int main(int argc, char *argv[]) { // Open two new meshlink instance. - meshlink_destroy("channels_aio_fd_conf.1"); - meshlink_destroy("channels_aio_fd_conf.2"); - - meshlink_handle_t *mesh1 = meshlink_open("channels_aio_fd_conf.1", "foo", "channels", DEV_CLASS_BACKBONE); - assert(mesh1); - - meshlink_handle_t *mesh2 = meshlink_open("channels_aio_fd_conf.2", "bar", "channels", DEV_CLASS_BACKBONE); - assert(mesh2); - - mesh2->priv = in_infos; + meshlink_handle_t *mesh_a, *mesh_b; + open_meshlink_pair(&mesh_a, &mesh_b, "channels_aio_fd"); - meshlink_enable_discovery(mesh1, false); - meshlink_enable_discovery(mesh2, false); + mesh_b->priv = in_infos; - // Import and export both side's data - - meshlink_add_address(mesh1, "localhost"); - - char *data = meshlink_export(mesh1); - assert(data); - assert(meshlink_import(mesh2, data)); - free(data); - - data = meshlink_export(mesh2); - assert(data); - assert(meshlink_import(mesh1, data)); - free(data); + meshlink_enable_discovery(mesh_a, false); + meshlink_enable_discovery(mesh_b, false); // Set the callbacks. - meshlink_set_channel_accept_cb(mesh1, reject_cb); - meshlink_set_channel_accept_cb(mesh2, accept_cb); + meshlink_set_channel_accept_cb(mesh_b, accept_cb); // Start both instances - assert(meshlink_start(mesh1)); - assert(meshlink_start(mesh2)); + start_meshlink_pair(mesh_a, mesh_b); - // Open channels from foo to bar. + // Open channels from a to b. - meshlink_node_t *bar = meshlink_get_node(mesh1, "bar"); - assert(bar); + meshlink_node_t *b = meshlink_get_node(mesh_a, "b"); + assert(b); meshlink_channel_t *channels[nchannels]; for(size_t i = 0; i < nchannels; i++) { - channels[i] = meshlink_channel_open(mesh1, bar, i + 1, NULL, NULL, 0); + channels[i] = meshlink_channel_open(mesh_a, b, i + 1, NULL, NULL, 0); assert(channels[i]); } // Send a large buffer of data on each channel. for(size_t i = 0; i < nchannels; i++) { - assert(meshlink_channel_aio_fd_send(mesh1, channels[i], fileno(out_infos[i].file), size / 3, aio_fd_cb, &out_infos[i].aio_infos[0])); - assert(meshlink_channel_aio_fd_send(mesh1, channels[i], fileno(out_infos[i].file), size - size / 3, aio_fd_cb, &out_infos[i].aio_infos[1])); + assert(meshlink_channel_aio_fd_send(mesh_a, channels[i], fileno(out_infos[i].file), size / 3, aio_fd_cb, &out_infos[i].aio_infos[0])); + assert(meshlink_channel_aio_fd_send(mesh_a, channels[i], fileno(out_infos[i].file), size - size / 3, aio_fd_cb, &out_infos[i].aio_infos[1])); } // Wait for everyone to finish. @@ -184,8 +159,8 @@ 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)); } // Files should be identical @@ -197,8 +172,5 @@ int main(int argc, char *argv[]) { // Clean up. - meshlink_close(mesh2); - meshlink_close(mesh1); - - return 0; + close_meshlink_pair(mesh_a, mesh_b); }