+++ /dev/null
-/* 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;
-}
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+}