X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=test%2Fchannels-aio-cornercases.c;h=208c9553da08b9f1b6ea6c1155fc55af4995ffd2;hb=HEAD;hp=0640c7df6e6de513bedea610f2f4c8d282f0d3a9;hpb=1278c5d654a4f555a1be1ce5351017201fe34d0b;p=meshlink diff --git a/test/channels-aio-cornercases.c b/test/channels-aio-cornercases.c index 0640c7df..208c9553 100644 --- a/test/channels-aio-cornercases.c +++ b/test/channels-aio-cornercases.c @@ -12,7 +12,7 @@ #include "meshlink.h" #include "utils.h" -static const size_t size = 10000000; // size of data to transfer +static const size_t size = 12000000; // size of data to transfer struct aio_info { int port; @@ -27,8 +27,6 @@ struct channel_info { struct aio_info aio_infos[2]; }; -static size_t b_received_len; -static struct timeval b_received_tv; 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) { @@ -66,15 +64,14 @@ static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint switch(port) { case 1: case 3: - meshlink_channel_aio_receive(mesh, channel, info->data, size / 4, aio_cb, &info->aio_infos[0]); - meshlink_channel_aio_receive(mesh, channel, info->data + size / 4, size - size / 4, aio_cb_close, &info->aio_infos[1]); + assert(meshlink_channel_aio_receive(mesh, channel, info->data, size / 4, aio_cb, &info->aio_infos[0])); + assert(meshlink_channel_aio_receive(mesh, channel, info->data + size / 4, size - size / 4, aio_cb_close, &info->aio_infos[1])); break; case 2: case 4: - meshlink_channel_aio_receive(mesh, channel, info->data, size / 4, aio_cb_close, &info->aio_infos[0]); - meshlink_channel_aio_receive(mesh, channel, info->data + size / 4, size - size / 4, aio_cb, &info->aio_infos[1]); - set_sync_flag(&info->aio_infos[1].flag, true); + assert(meshlink_channel_aio_receive(mesh, channel, info->data, size / 4, aio_cb_close, &info->aio_infos[0])); + assert(meshlink_channel_aio_receive(mesh, channel, info->data + size / 4, size - size / 4, aio_cb, &info->aio_infos[1])); break; default: @@ -84,9 +81,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); @@ -107,6 +103,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; @@ -149,23 +150,32 @@ int main(int argc, char *argv[]) { if(i < 2) { assert(meshlink_channel_aio_send(mesh_a, channels[i], outdata, size / 3, aio_cb, &out_infos[i].aio_infos[0])); assert(meshlink_channel_aio_send(mesh_a, channels[i], outdata + size / 3, size - size / 3, aio_cb_close, &out_infos[i].aio_infos[1])); - assert(wait_sync_flag(&out_infos[i].aio_infos[0].flag, 10)); - assert(wait_sync_flag(&out_infos[i].aio_infos[1].flag, 10)); } else { assert(meshlink_channel_aio_send(mesh_a, channels[i], outdata, size / 3, aio_cb_close, &out_infos[i].aio_infos[0])); assert(meshlink_channel_aio_send(mesh_a, channels[i], outdata + size / 3, size - size / 3, aio_cb, &out_infos[i].aio_infos[1])); - assert(wait_sync_flag(&out_infos[i].aio_infos[0].flag, 10)); - set_sync_flag(&out_infos[i].aio_infos[1].flag, true); } } // Wait for all AIO buffers to finish. for(size_t i = 0; i < nchannels; i++) { + // The first chunk should always have succeeded assert(wait_sync_flag(&in_infos[i].aio_infos[0].flag, 10)); - assert(wait_sync_flag(&in_infos[i].aio_infos[1].flag, 10)); assert(wait_sync_flag(&out_infos[i].aio_infos[0].flag, 10)); - assert(wait_sync_flag(&out_infos[i].aio_infos[1].flag, 10)); + + // The second chunk should only have completed if we didn't close the channel yet + if(i % 2) { + assert(!check_sync_flag(&in_infos[i].aio_infos[1].flag)); + } else { + assert(wait_sync_flag(&in_infos[i].aio_infos[1].flag, 10)); + } + + if(i < 2) { + assert(wait_sync_flag(&out_infos[i].aio_infos[1].flag, 10)); + } else { + assert(!check_sync_flag(&out_infos[i].aio_infos[1].flag)); + } + } // Check that everything is correct.