From 45d88ed49d2e90f6d9f51aff91e84adfef480245 Mon Sep 17 00:00:00 2001 From: Laurent MAZET Date: Thu, 2 Oct 2025 15:16:41 +0200 Subject: [PATCH] new test for mq latency --- mq_lat.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++ mq.c => mq_rtt.c | 4 +- 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 mq_lat.c rename mq.c => mq_rtt.c (97%) diff --git a/mq_lat.c b/mq_lat.c new file mode 100644 index 0000000..08a1fed --- /dev/null +++ b/mq_lat.c @@ -0,0 +1,164 @@ +/* depend: */ +/* cflags: */ +/* linker: mtime.o test.o stat.o -lm -lrt */ + +#include +#include +#include + +#include /* For O_* constants */ +#include /* For mode constants */ +#include + +#include +#include + +#include "mtime.h" +#include "test.h" + +/* global variables */ + +dts_t *deltas = NULL; +int nb_measurements = 0; + +char *message = "Message queue latency"; +void (*usage_ext) (FILE *) = NULL; +int (*parse_arg_ext) (char *) = NULL; + +#define MAXBUF 1024 + +ts_t ts1; +ts_t ts2; +int rc = 0; + +void *ping (__attribute__((unused)) void *arg) +{ + + /* open mq */ + + struct mq_attr attr; + attr.mq_flags = 0; + attr.mq_maxmsg = 5; + attr.mq_msgsize = MAXBUF; + attr.mq_curmsgs = 0; + + mqd_t mq = mq_open ("/test_queue", O_CREAT | O_RDWR, 0644, &attr); + if (mq == -1) { + fprintf (stderr, "ping: mq_open\n"); + rc = 1; + return NULL; + } + + usleep (10 * 1000); + + /* main loop */ + + printf ("Sending ping...\n"); + for (int i = 0; i < nb_measurements / 2; i++) { + + char buffer[MAXBUF] = { 0 }; + sprintf (buffer, "ping %d", i); + + sys_timestamp (&ts1); + + if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { + fprintf (stderr, "ping error: mq_send (%d)\n", i); + rc = 1; + return NULL; + } + //printf ("send '%s'\n", buffer); + + if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { + fprintf (stderr, "ping error: mq_receive (%d)\n", i); + rc = 1; + return NULL; + } + //printf ("receive '%s'\n", buffer); + + sys_timestamp (&ts2); + deltas[2 * i + 1] = diff_timestamp (&ts2, &ts1); + } + + mq_close (mq); + + return 0; +} + +void *pong (__attribute__((unused)) void *arg) +{ + + printf ("Responding pong...\n"); + + /* open mq */ + + struct mq_attr attr; + attr.mq_flags = 0; + attr.mq_maxmsg = 5; + attr.mq_msgsize = MAXBUF; + attr.mq_curmsgs = 0; + + mqd_t mq = mq_open ("/test_queue", O_CREAT | O_RDWR, 0644, &attr); + if (mq == -1) { + fprintf (stderr, "pong: mq_open\n"); + rc = 1; + return NULL; + } + + /* main loop */ + + for (int i = 0; i < nb_measurements / 2; i++) { + + char buffer[MAXBUF] = { 0 }; + + if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { + fprintf (stderr, "pong error: mq_receive (%d)\n", i); + rc = 1; + return NULL; + } + //printf ("receive '%s'\n", buffer); + + sys_timestamp (&ts2); + deltas[2 * i] = diff_timestamp (&ts2, &ts1); + + sys_timestamp (&ts1); + + if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { + fprintf (stderr, "pong error: mq_send (%d)\n", i); + rc = 1; + return NULL; + } + //printf ("send '%s'\n", buffer); + } + + mq_close (mq); + + return NULL; +} + +int test (dts_t *buffer, int nb) +{ + + /* set global variables */ + + deltas = buffer; + nb_measurements = nb; + + /* mq latency test */ + + pthread_t tid1; + if (pthread_create (&tid1, NULL, ping, NULL) != 0) { + fprintf (stderr, "error on pthread_create\n"); + return 1; + } + + pthread_t tid2; + if (pthread_create (&tid2, NULL, pong, NULL) != 0) { + fprintf (stderr, "error on pthread_create\n"); + return 1; + } + + pthread_join (tid1, NULL); + pthread_join (tid2, NULL); + + return rc; +} diff --git a/mq.c b/mq_rtt.c similarity index 97% rename from mq.c rename to mq_rtt.c index 2f31e39..d387063 100644 --- a/mq.c +++ b/mq_rtt.c @@ -22,7 +22,7 @@ dts_t *deltas = NULL; int nb_measurements = 0; -char *message = "message queue"; +char *message = "Message queue RTT"; void (*usage_ext) (FILE *) = NULL; int (*parse_arg_ext) (char *) = NULL; @@ -92,7 +92,7 @@ int test (dts_t *buffer, int nb) deltas = buffer; nb_measurements = nb; - /* mutex test */ + /* mq rtt test */ struct mq_attr attr; attr.mq_flags = 0; -- 2.30.2