#include <AvailabilityMacros.h>
-#ifdef AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
-#include </System/Library/Frameworks/System.framework/PrivateHeaders/mach/thread_policy.h>
-#endif
+#include <mach/thread_policy.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <err.h>
+#include <unistd.h>
#include <pthread.h>
#include <mach/mach.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/signal.h>
+#include <errno.h>
+#include "../unit_tests/tests_common.h"
#define MAX(A, B) ((A) < (B) ? (B) : (A))
static boolean_t threaded = FALSE;
static boolean_t oneway = FALSE;
static boolean_t do_select = FALSE;
+static boolean_t save_perfdata = FALSE;
+
int msg_type;
int num_ints;
int num_msgs;
fprintf(stderr, " -work num\t\tmicroseconds of client work\n");
fprintf(stderr, " -pages num\t\tpages of memory touched by client work\n");
fprintf(stderr, " -select \t\tselect prior to calling kevent().\n");
+ fprintf(stderr, " -perf \t\tCreate perfdata files for metrics.\n");
fprintf(stderr, "default values are:\n");
fprintf(stderr, " . no affinity\n");
fprintf(stderr, " . not timeshare\n");
} else if (0 == strcmp("-select", argv[0])) {
do_select = TRUE;
argc--; argv++;
+ } else if (0 == strcmp("-perf", argv[0])) {
+ save_perfdata = TRUE;
+ argc--; argv++;
} else
usage(progname);
}
static void
thread_setup(int tag) {
-#ifdef AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER
kern_return_t ret;
thread_extended_policy_data_t epolicy;
thread_affinity_policy_data_t policy;
if (ret != KERN_SUCCESS)
printf("thread_policy_set(THREAD_AFFINITY_POLICY) returned %d\n", ret);
}
-#endif
}
void *
}
#else
if (kev[0].data != args.port)
- printf("kevent64(MACH_PORT_NULL) port name (0x%x) != expected (0x%x)\n", kev[0].data, args.port);
+ printf("kevent64(MACH_PORT_NULL) port name (%lld) != expected (0x%x)\n", kev[0].data, args.port);
args.req_msg->msgh_bits = 0;
args.req_msg->msgh_size = args.req_size;
}
}
}
+ return NULL;
}
static inline void
printf("calibration_count=%d calibration_usec=%d\n",
calibration_count, calibration_usec);
}
+ return NULL;
}
static void *
if (client_delay) {
usleep(client_delay);
}
+ return NULL;
}
void *client(void *threadarg)
mach_msg_header_t *req, *reply;
mach_port_t bsport, servport;
kern_return_t ret;
- long server_num = (long) threadarg;
+ int server_num = (int) threadarg;
void *ints = malloc(sizeof(u_int32_t) * num_ints);
if (verbose)
}
free(ints);
- return;
+ return NULL;
}
static void
if (ret != 0)
err(1, "pthread_create()");
if (verbose)
- printf("created pthread 0x%x\n", thread->tid);
+ printf("created pthread %p\n", thread->tid);
} else {
thread->pid = fork();
if (thread->pid == 0) {
if (verbose)
- printf("calling 0x%x(0x%x)\n", fn, arg);
+ printf("calling %p(%p)\n", fn, arg);
fn(arg);
exit(0);
}
if (threaded) {
kern_return_t ret;
if (verbose)
- printf("joining thread 0x%x\n", thread->tid);
+ printf("joining thread %p\n", thread->tid);
ret = pthread_join(thread->tid, NULL);
if (ret != KERN_SUCCESS)
- err(1, "pthread_join(0x%x)", thread->tid);
+ err(1, "pthread_join(%p)", thread->tid);
} else {
int stat;
if (verbose)
exit(1);
}
+
int main(int argc, char *argv[])
{
int i;
double dsecs = (double) deltatv.tv_sec +
1.0E-6 * (double) deltatv.tv_usec;
- printf(" in %u.%03u seconds\n",
- deltatv.tv_sec, deltatv.tv_usec/1000);
+ double time_in_sec = (double)deltatv.tv_sec + (double)deltatv.tv_usec/1000.0;
+ double throughput_msg_p_sec = (double) totalmsg/dsecs;
+ double avg_msg_latency = dsecs*1.0E6 / (double)totalmsg;
+
+ printf(" in %ld.%03u seconds\n",
+ (long)deltatv.tv_sec, deltatv.tv_usec/1000);
printf(" throughput in messages/sec: %g\n",
(double)totalmsg / dsecs);
printf(" average message latency (usec): %2.3g\n",
dsecs * 1.0E6 / (double) totalmsg);
+ if (save_perfdata == TRUE) {
+ record_perf_data("kqmpmm_avg_msg_latency", "usec", avg_msg_latency, "Message latency measured in microseconds. Lower is better", stderr);
+ }
return (0);
}