libipc-old/tests/func_05_read-write-loop.c

80 lines
2.1 KiB
C

// #define _BSD_SOURCE
#define _DEFAULT_SOURCE
#include "../src/ipc.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#define SERVICE_NAME "pong"
#define SECURE_MALLOC(p, s, wat) p = malloc (s); if (p == NULL) { wat; }
#define DEFAULT_MSG "coucou"
int main(int argc, char * argv[])
{
SECURE_DECLARATION(struct ipc_ctx, ctx);
SECURE_DECLARATION(struct ipc_event, event);
SECURE_DECLARATION (struct ipc_message, write_m);
SECURE_DECLARATION (struct ipc_message, read_m);
// timing the exchange duration
struct timeval tval_before, tval_after, tval_result;
size_t nb_rounds = 1000;
char *message_str = NULL;
if (argc > 1 && strncmp(argv[1], "-h", 2) == 0) {
fprintf (stderr, "usage: %s [nb-rounds [message]]\n", argv[0]);
fprintf (stderr, "default: nb-rounds = 1000, message='coucou'\n");
exit(0);
}
if (argc > 1) {
nb_rounds = (size_t) atoi(argv[1]);
}
if (argc > 2) {
message_str = argv[2];
}
if (message_str == NULL) {
// message par defaut
SECURE_MALLOC (message_str, strlen(DEFAULT_MSG) +1, exit(EXIT_FAILURE));
memcpy(message_str, DEFAULT_MSG, strlen(DEFAULT_MSG));
}
TEST_IPC_Q (ipc_connection (&ctx, SERVICE_NAME, NULL), EXIT_FAILURE);
SECURE_MALLOC (write_m.payload, strlen(message_str), exit(EXIT_FAILURE));
memcpy (write_m.payload, message_str, strlen(message_str));
write_m.type = MSG_TYPE_DATA;
write_m.user_type = 42;
write_m.fd = ctx.pollfd[0].fd;
write_m.length = strlen(message_str);
gettimeofday(&tval_before, NULL);
for (size_t i = 0 ; i < nb_rounds ; i++) {
ipc_write_fd (ctx.pollfd[0].fd, &write_m);
// reading
TEST_IPC_Q(ipc_read (&ctx, 0 /* only valid index */, &read_m), EXIT_FAILURE);
// printf ("received message (%d bytes): %*s\n", read_m.length, read_m.length, read_m.payload);
// ipc_message_empty (&read_m);
}
gettimeofday(&tval_after, NULL);
timersub(&tval_after, &tval_before, &tval_result);
printf("Time elapsed: %ld.%06ld\n", (long int)tval_result.tv_sec, (long int)tval_result.tv_usec);
// disconnection
TEST_IPC_Q (ipc_close_all (&ctx), EXIT_FAILURE);
return EXIT_SUCCESS;
}