From: Laurent MAZET Date: Thu, 2 Oct 2025 13:16:41 +0000 (+0200) Subject: new test for mq latency X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=45d88ed49d2e90f6d9f51aff91e84adfef480245;p=benchmarks.git new test for mq latency --- diff --git a/mq.c b/mq.c deleted file mode 100644 index 2f31e39..0000000 --- a/mq.c +++ /dev/null @@ -1,130 +0,0 @@ -/* 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 - -#include "mtime.h" -#include "test.h" - -/* global variables */ - -dts_t *deltas = NULL; -int nb_measurements = 0; - -char *message = "message queue"; -void (*usage_ext) (FILE *) = NULL; -int (*parse_arg_ext) (char *) = NULL; - -#define MAXBUF 1024 - -int ping (mqd_t mq) -{ - - printf ("Sending ping...\n"); - for (int i = 0; i < nb_measurements; i++) { - - char buffer[MAXBUF] = { 0 }; - sprintf (buffer, "ping %d", i); - - ts_t ts1; - sys_timestamp (&ts1); - - if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { - fprintf (stderr, "ping error: mq_send (%d)\n", i); - return 1; - } - //printf ("send '%s'\n", buffer); - - if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { - fprintf (stderr, "ping error: mq_receive (%d)\n", i); - return 1; - } - //printf ("receive '%s'\n", buffer); - - ts_t ts2; - sys_timestamp (&ts2); - deltas[i] = diff_timestamp (&ts2, &ts1); - } - - return 0; -} - -int pong (mqd_t mq) -{ - - printf ("Responding pong...\n"); - for (int i = 0; i < nb_measurements; i++) { - - char buffer[MAXBUF] = { 0 }; - - if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { - fprintf (stderr, "pong error: mq_receive (%d)\n", i); - return 1; - } - //printf ("receive '%s'\n", buffer); - - if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { - fprintf (stderr, "pong error: mq_send (%d)\n", i); - return 1; - } - //printf ("send '%s'\n", buffer); - } - - return 0; -} - -int test (dts_t *buffer, int nb) -{ - - /* set global variables */ - - deltas = buffer; - nb_measurements = nb; - - /* mutex test */ - - 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, "error: mq_open\n"); - return 1; - } - - pid_t pid = fork (); - if (pid == -1) { - fprintf (stderr, "error: fork\n"); - return 1; - } else if (pid == 0) { - int rc = pong (mq); - mq_close (mq); - exit (rc); - } - - int rc = ping (mq); - mq_close (mq); - - if (kill (pid, SIGTERM) == 0) { - int wstatus; - if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) { - fprintf (stderr, "error: waitpid\n"); - } - } - - return rc; -} 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_rtt.c b/mq_rtt.c new file mode 100644 index 0000000..d387063 --- /dev/null +++ b/mq_rtt.c @@ -0,0 +1,130 @@ +/* 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 + +#include "mtime.h" +#include "test.h" + +/* global variables */ + +dts_t *deltas = NULL; +int nb_measurements = 0; + +char *message = "Message queue RTT"; +void (*usage_ext) (FILE *) = NULL; +int (*parse_arg_ext) (char *) = NULL; + +#define MAXBUF 1024 + +int ping (mqd_t mq) +{ + + printf ("Sending ping...\n"); + for (int i = 0; i < nb_measurements; i++) { + + char buffer[MAXBUF] = { 0 }; + sprintf (buffer, "ping %d", i); + + ts_t ts1; + sys_timestamp (&ts1); + + if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { + fprintf (stderr, "ping error: mq_send (%d)\n", i); + return 1; + } + //printf ("send '%s'\n", buffer); + + if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { + fprintf (stderr, "ping error: mq_receive (%d)\n", i); + return 1; + } + //printf ("receive '%s'\n", buffer); + + ts_t ts2; + sys_timestamp (&ts2); + deltas[i] = diff_timestamp (&ts2, &ts1); + } + + return 0; +} + +int pong (mqd_t mq) +{ + + printf ("Responding pong...\n"); + for (int i = 0; i < nb_measurements; i++) { + + char buffer[MAXBUF] = { 0 }; + + if (mq_receive (mq, buffer, sizeof(buffer), NULL) == -1) { + fprintf (stderr, "pong error: mq_receive (%d)\n", i); + return 1; + } + //printf ("receive '%s'\n", buffer); + + if (mq_send (mq, buffer, strlen (buffer) + 1, 0) == -1) { + fprintf (stderr, "pong error: mq_send (%d)\n", i); + return 1; + } + //printf ("send '%s'\n", buffer); + } + + return 0; +} + +int test (dts_t *buffer, int nb) +{ + + /* set global variables */ + + deltas = buffer; + nb_measurements = nb; + + /* mq rtt test */ + + 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, "error: mq_open\n"); + return 1; + } + + pid_t pid = fork (); + if (pid == -1) { + fprintf (stderr, "error: fork\n"); + return 1; + } else if (pid == 0) { + int rc = pong (mq); + mq_close (mq); + exit (rc); + } + + int rc = ping (mq); + mq_close (mq); + + if (kill (pid, SIGTERM) == 0) { + int wstatus; + if (waitpid (pid, &wstatus, WUNTRACED | WCONTINUED) == -1) { + fprintf (stderr, "error: waitpid\n"); + } + } + + return rc; +}