#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 <mach/notify.h>
#include <servers/bootstrap.h>
#include <sys/event.h>
+#include <sys/select.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/signal.h>
static boolean_t timeshare = FALSE;
static boolean_t threaded = FALSE;
static boolean_t oneway = FALSE;
+static boolean_t do_select = FALSE;
int msg_type;
int num_ints;
int num_msgs;
fprintf(stderr, " -delay num\t\tmicroseconds to sleep clients between messages\n");
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, "default values are:\n");
fprintf(stderr, " . no affinity\n");
fprintf(stderr, " . not timeshare\n");
usage(progname);
client_pages = strtoul(argv[1], NULL, 0);
argc -= 2; argv += 2;
+ } else if (0 == strcmp("-select", argv[0])) {
+ do_select = 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 *
int kq;
struct kevent64_s kev[1];
int err;
+ int count;
struct port_args args;
int idx;
kern_return_t ret;
int totalmsg = num_msgs * num_clients;
+ fd_set readfds;
args.server_num = (int) (long) serverarg;
setup_server_ports(&args);
perror("kevent");
exit(1);
}
+
for (idx = 0; idx < totalmsg; idx++) {
if (verbose)
printf("server awaiting message %d\n", idx);
retry:
+ if (do_select) {
+ FD_ZERO(&readfds);
+ FD_SET(kq, &readfds);
+
+ if (verbose)
+ printf("Calling select() prior to kevent64().\n");
+
+ count = select(kq + 1, &readfds, NULL, NULL, NULL);
+ if (count == -1) {
+ perror("select");
+ exit(1);
+ }
+ }
+
EV_SET64(&kev[0], args.pset, EVFILT_MACHPORT, EV_ENABLE,
#if DIRECT_MSG_RCV
MACH_RCV_MSG|MACH_RCV_LARGE, 0, 0, (mach_vm_address_t)args.req_msg, args.req_size);
}
#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)
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);
+ 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",