new test for mq latency
authorLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 2 Oct 2025 13:16:41 +0000 (15:16 +0200)
committerLaurent MAZET <laurent.mazet@thalesgroup.com>
Thu, 2 Oct 2025 13:16:41 +0000 (15:16 +0200)
mq.c [deleted file]
mq_lat.c [new file with mode: 0644]
mq_rtt.c [new file with mode: 0644]

diff --git a/mq.c b/mq.c
deleted file mode 100644 (file)
index 2f31e39..0000000
--- a/mq.c
+++ /dev/null
@@ -1,130 +0,0 @@
-/* depend: */
-/* cflags: */
-/* linker: mtime.o test.o stat.o -lm -lrt */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <fcntl.h>           /* For O_* constants */
-#include <sys/stat.h>        /* For mode constants */
-#include <mqueue.h>
-
-#include <signal.h>
-#include <sys/wait.h>
-#include <unistd.h>
-
-#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 (file)
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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>           /* For O_* constants */
+#include <sys/stat.h>        /* For mode constants */
+#include <mqueue.h>
+
+#include <pthread.h>
+#include <unistd.h>
+
+#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 (file)
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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <fcntl.h>           /* For O_* constants */
+#include <sys/stat.h>        /* For mode constants */
+#include <mqueue.h>
+
+#include <signal.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#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;
+}