13 #include "../src/meshlink.h"
15 static struct sync_flag b_responded;
16 static struct sync_flag aio_finished;
18 static const size_t size = 25000000; // size of data to transfer
20 static void a_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
24 if(len == 5 && !memcmp(data, "Hello", 5)) {
25 set_sync_flag(&b_responded, true);
29 static void b_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len) {
30 assert(meshlink_channel_send(mesh, channel, data, len) == (ssize_t)len);
33 static bool reject_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
43 static bool accept_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len) {
44 printf("accept_cb: (from %s on port %u) ", channel->node->name, (unsigned int)port);
47 fwrite(data, 1, len, stdout);
56 meshlink_set_channel_receive_cb(mesh, channel, b_receive_cb);
57 meshlink_set_channel_sndbuf(mesh, channel, size);
60 b_receive_cb(mesh, channel, data, len);
66 static void poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len) {
69 meshlink_set_channel_poll_cb(mesh, channel, NULL);
71 assert(meshlink_channel_send(mesh, channel, "Hello", 5) == 5);
74 static void aio_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len, void *priv) {
81 set_sync_flag(&aio_finished, true);
85 init_sync_flag(&b_responded);
86 init_sync_flag(&aio_finished);
88 meshlink_set_log_cb(NULL, MESHLINK_INFO, log_cb);
90 // Open two new meshlink instance.
92 meshlink_handle_t *mesh_a, *mesh_b;
93 open_meshlink_pair(&mesh_a, &mesh_b, "channels-buffer-storage");
97 meshlink_set_channel_accept_cb(mesh_a, reject_cb);
98 meshlink_set_channel_accept_cb(mesh_b, accept_cb);
100 // Start both instances
102 start_meshlink_pair(mesh_a, mesh_b);
104 // Open a channel from a to b.
106 meshlink_node_t *b = meshlink_get_node(mesh_a, "b");
109 meshlink_channel_t *channel = meshlink_channel_open(mesh_a, b, 7, a_receive_cb, NULL, 0);
112 size_t buf_size = 1024 * 1024;
113 char *sndbuf = malloc(1024 * 1024);
115 char *rcvbuf = malloc(1024 * 1024);
118 // Set external buffers
120 meshlink_set_channel_sndbuf_storage(mesh_a, channel, sndbuf, buf_size);
121 meshlink_set_channel_rcvbuf_storage(mesh_a, channel, rcvbuf, buf_size);
123 // Check that we can transition back and forth to external buffers
125 meshlink_set_channel_sndbuf_storage(mesh_a, channel, NULL, 4096);
126 meshlink_set_channel_rcvbuf(mesh_a, channel, 4096);
128 meshlink_set_channel_sndbuf_storage(mesh_a, channel, sndbuf, buf_size);
129 meshlink_set_channel_rcvbuf_storage(mesh_a, channel, rcvbuf, buf_size);
131 // Wait for the channel to finish connecting
133 meshlink_set_channel_poll_cb(mesh_a, channel, poll_cb);
134 assert(wait_sync_flag(&b_responded, 20));
136 // Send a lot of data
138 char *outdata = malloc(size);
141 for(size_t i = 0; i < size; i++) {
145 char *indata = malloc(size);
148 assert(meshlink_channel_aio_receive(mesh_a, channel, indata, size, aio_cb, NULL));
149 assert(meshlink_channel_aio_send(mesh_a, channel, outdata, size, NULL, NULL));
150 assert(wait_sync_flag(&aio_finished, 20));
151 assert(!memcmp(indata, outdata, size));
155 meshlink_channel_close(mesh_a, channel);
164 close_meshlink_pair(mesh_a, mesh_b);