diff options
author | 2021-05-09 14:20:58 -0400 | |
---|---|---|
committer | 2021-05-09 14:20:58 -0400 | |
commit | 5fd83771641d15c418f747bd343ba6738d3875f7 (patch) | |
tree | 5abf0f78f680d9837dbd93d4d4c3933bb7509599 /system_cmds/mean.tproj/mean.c | |
download | apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.gz apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.tar.zst apple_cmds-5fd83771641d15c418f747bd343ba6738d3875f7.zip |
Import macOS userland
adv_cmds-176
basic_cmds-55
bootstrap_cmds-116.100.1
developer_cmds-66
diskdev_cmds-667.40.1
doc_cmds-53.60.1
file_cmds-321.40.3
mail_cmds-35
misc_cmds-34
network_cmds-606.40.1
patch_cmds-17
remote_cmds-63
shell_cmds-216.60.1
system_cmds-880.60.2
text_cmds-106
Diffstat (limited to 'system_cmds/mean.tproj/mean.c')
-rw-r--r-- | system_cmds/mean.tproj/mean.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/system_cmds/mean.tproj/mean.c b/system_cmds/mean.tproj/mean.c new file mode 100644 index 0000000..87ecdc2 --- /dev/null +++ b/system_cmds/mean.tproj/mean.c @@ -0,0 +1,128 @@ +/* + * mean.c + * mean - lower process priorities with more force than nice + * + * Created by Lucia Ballard on 9/16/09. + * Copyright 2009-2016 Apple Inc. All rights reserved. + * + */ + +#include <mach/mach.h> +#include <mach/task.h> +#include <mach/thread_act.h> +#include <mach/thread_policy.h> + +#include <errno.h> +#include <getopt.h> +#include <stdio.h> +#include <stdlib.h> + +void usage(void); + +void +usage(void) +{ + fprintf(stderr, "Usage: mean -[r|s|u] <pid>\n"); + fprintf(stderr, "\tLower <pid>'s priority.\n"); + fprintf(stderr, "\t-u: return <pid> to normal priority\n"); + fprintf(stderr, "\t-r: resume <pid>\n"); + fprintf(stderr, "\t-s: suspend <pid>\n"); + exit(0); +} + +int +main(int argc, char **argv) +{ + int pid, err, i, ch; + unsigned int count; + mach_port_t task; + thread_act_array_t threads; + thread_precedence_policy_data_t policy; + + boolean_t do_high = 0, do_resume = 0, do_suspend = 0; + boolean_t do_low = 1; + + if (argc < 2) + usage(); + + while ((ch = getopt(argc, argv, "rsu")) != -1) + switch (ch) { + case 'u': + do_high = 1; + do_low = 0; + continue; + case 'r': + do_resume = 1; + do_low = 0; + continue; + case 's': + do_suspend = 1; + do_low = 0; + continue; + default: + usage(); + } + + argc -= optind; argv += optind; + + if (argc == 0) + usage(); + + pid = atoi(*argv); + if (!pid) + usage(); + + err = task_for_pid(mach_task_self(), pid, &task); + if (err) { + fprintf(stderr, "Failed to get task port (%d)\n", err); + exit(0); + } + + if (do_low || do_high) { + + err = task_threads(task, &threads, &count); + if (err) { + fprintf(stderr, "Failed to get thread list (%d)\n", err); + exit(0); + } + + if (do_low) + policy.importance = -100; + else + policy.importance = 0; + + for (i = 0; i < count; i++) { + err = thread_policy_set(threads[i], + THREAD_PRECEDENCE_POLICY, + (thread_policy_t) &policy, + THREAD_PRECEDENCE_POLICY_COUNT); + if (err) { + fprintf(stderr, "Failed to set thread priority (%d)\n", err); + exit(0); + } + } + + printf("Process %d's threads set to %s priority.\n", pid, + (do_low ? "lowest" : "highest")); + } + + if (do_suspend) { + err = task_suspend(task); + if (err) { + fprintf(stderr, "Failed to suspend task (%d)\n", err); + } else { + printf("Process %d suspended.\n", pid); + } + } + + if (do_resume) { + err = task_resume(task); + if (err) { + fprintf(stderr, "Failed to resume task (%d)\n", err); + } else { + printf("Process %d resumed.\n", pid); + } + } + + return 0; +} |