Loading...
tests/locks_throughput.c xnu-12377.101.15 /dev/null
--- xnu/xnu-12377.101.15/tests/locks_throughput.c
+++ /dev/null
@@ -1,193 +0,0 @@
-#include <errno.h>
-#include <libgen.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <sys/sysctl.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-/* keep in sync with osfmk/kern/locks.c */
-
-__enum_closed_decl(lck_bench_type_t, uint16_t, {
-	LCK_BENCH_TYPE_NONE,
-	LCK_BENCH_TYPE_BIT,
-	LCK_BENCH_TYPE_SPIN,
-	LCK_BENCH_TYPE_TICKET,
-	LCK_BENCH_TYPE_MTX,
-	LCK_BENCH_TYPE_RW,
-	LCK_BENCH_TYPE_RW_LEGACY,
-});
-
-static struct lck_bench_spec {
-	lck_bench_type_t        lock_type;
-	bool                    false_sharing;
-	uint16_t                duration_ms;
-	uint16_t                num_threads;
-	uint32_t                write_ratio;
-	uint32_t                iterations_read;
-	uint32_t                iterations_write;
-	uint32_t                iterations_unlocked;
-} spec = {
-	.lock_type           = LCK_BENCH_TYPE_NONE,
-	.false_sharing       = false,
-	.duration_ms         = 3000,
-	.num_threads         = 1,
-	.write_ratio         = (uint32_t)((UINT32_MAX + 1ull) * 10. / 100),
-	.iterations_read     = 10,
-	.iterations_write    = 10,
-	.iterations_unlocked = 10,
-};
-
-static const char *const lock_types[] = {
-	[LCK_BENCH_TYPE_BIT]       = "bit",
-	[LCK_BENCH_TYPE_SPIN]      = "spin",
-	[LCK_BENCH_TYPE_TICKET]    = "ticket",
-	[LCK_BENCH_TYPE_MTX]       = "mutex",
-	[LCK_BENCH_TYPE_RW]        = "rw",
-	[LCK_BENCH_TYPE_RW_LEGACY] = "rwold",
-};
-
-static bool stress_test = false;
-
-__dead2
-static void
-print_help(char *prog)
-{
-	fprintf(stderr,
-	    "%s: [options] <lock_type> <read iterations> <write iterations> <unlocked iterations>\n"
-	    "\n"
-	    "Valid lock types:\n"
-	    "\n"
-	    "    bit             hw_lock_bit_t\n"
-	    "    spin            lck_spin_t\n"
-	    "    ticket          lck_ticket_t\n"
-	    "    mutex           lck_mtx_t\n"
-	    "    rw              lck_rw_t\n"
-	    "    rwold           lck_rw_t (legacy)\n"
-	    "\n"
-	    "Valid options:\n"
-	    "    -s              false share the data with its lock (default: false)\n"
-	    "    -S              stress test mode                   (default: false)\n"
-	    "    -d <msecs>      specify the test duration in ms    (default 3,000ms)\n"
-	    "    -r <percent>    percentage of write operations     (default: 10%%)\n"
-	    "    -n <threads>    number of threads                  (default: 1)\n"
-	    "\n",
-	    basename(prog));
-	exit(-1);
-}
-
-static lck_bench_type_t
-parse_lock_type(const char *arg)
-{
-	for (int i = 1; i < sizeof(lock_types) / sizeof(lock_types[0]); i++) {
-		if (strcmp(arg, lock_types[i]) == 0) {
-			return (lck_bench_type_t)i;
-		}
-	}
-	return LCK_BENCH_TYPE_NONE;
-}
-
-static void
-parse_arguments(int argc, char **argv)
-{
-	int ch;
-
-	while ((ch = getopt(argc, argv, "d:hn:r:sS")) != -1) {
-		switch (ch) {
-		case 'd':
-			spec.duration_ms = atoi(optarg);
-			break;
-
-		case 'h':
-			print_help(argv[0]);
-			break;
-
-		case 'n':
-			spec.num_threads = atoi(optarg);
-			break;
-
-		case 'r':
-			spec.write_ratio = (uint32_t)(atof(optarg) * (UINT32_MAX + 1ull) / 100.);
-			break;
-
-		case 's':
-			spec.false_sharing = true;
-			break;
-
-		case 'S':
-			stress_test = true;
-			break;
-		}
-	}
-
-	if (argc != optind + 4) {
-		fprintf(stderr,
-		    "error: expects 4 arguments, got %d\n"
-		    "\n", argc - optind);
-		print_help(argv[0]);
-	}
-
-	spec.lock_type = parse_lock_type(argv[optind]);
-	spec.iterations_read = atoi(argv[optind + 1]);
-	spec.iterations_write = atoi(argv[optind + 2]);
-	spec.iterations_unlocked = atoi(argv[optind + 3]);
-
-	if (spec.lock_type == LCK_BENCH_TYPE_NONE) {
-		fprintf(stderr,
-		    "error: unknown lock type `%s'\n"
-		    "\n", argv[optind]);
-		print_help(argv[0]);
-	}
-}
-
-int
-main(int argc, char **argv)
-{
-	uint64_t arg;
-	uint64_t ret;
-	size_t   retlen = sizeof(ret);
-	int rc;
-
-	parse_arguments(argc, argv);
-	fprintf(stderr,
-	    "========================================\n"
-	    "test type:      %s\n"
-	    "lock type:      %s\n"
-	    "false sharing:  %d\n"
-	    "duration:       %'dms\n"
-	    "write ratio:    %.2g%%\n"
-	    "iterations:\n"
-	    " read:          %d\n"
-	    " write:         %d\n"
-	    " unlocked:      %d\n"
-	    " threads:       %d\n"
-	    "========================================\n",
-	    stress_test ? "stress" : "perf",
-	    lock_types[spec.lock_type],
-	    spec.false_sharing,
-	    spec.duration_ms,
-	    spec.write_ratio * 100. / (UINT32_MAX + 1ull),
-	    spec.iterations_read,
-	    spec.iterations_write,
-	    spec.iterations_unlocked,
-	    spec.num_threads);
-
-	arg = (uint64_t)&spec;
-	if (stress_test) {
-		rc = sysctlbyname("debug.test.lck_stress", &ret, &retlen, &arg, sizeof(arg));
-	} else {
-		rc = sysctlbyname("debug.test.lck_bench", &ret, &retlen, &arg, sizeof(arg));
-	}
-	if (rc != 0) {
-		fprintf(stderr, "error: test failed: %s (error: %d)\n",
-		    strerror(errno), errno);
-		exit(-1);
-	}
-
-	printf("%'lld\n", ret);
-	return 0;
-}