]> git.saurik.com Git - apple/system_cmds.git/blame - mean.tproj/mean.c
system_cmds-790.tar.gz
[apple/system_cmds.git] / mean.tproj / mean.c
CommitLineData
fa62d991
A
1/*
2 * mean.c
3 * mean - lower process priorities with more force than nice
4 *
5 * Created by Lucia Ballard on 9/16/09.
cf37c299 6 * Copyright 2009-2016 Apple Inc. All rights reserved.
fa62d991
A
7 *
8 */
9
10#include <mach/mach.h>
11#include <mach/task.h>
8459d725
A
12#include <mach/thread_act.h>
13#include <mach/thread_policy.h>
fa62d991
A
14
15#include <errno.h>
16#include <getopt.h>
17#include <stdio.h>
18#include <stdlib.h>
19
20void usage(void);
21
cf37c299 22void
fa62d991
A
23usage(void)
24{
8459d725
A
25 fprintf(stderr, "Usage: mean -[r|s|u] <pid>\n");
26 fprintf(stderr, "\tLower <pid>'s priority.\n");
27 fprintf(stderr, "\t-u: return <pid> to normal priority\n");
28 fprintf(stderr, "\t-r: resume <pid>\n");
29 fprintf(stderr, "\t-s: suspend <pid>\n");
fa62d991
A
30 exit(0);
31}
32
cf37c299 33int
fa62d991
A
34main(int argc, char **argv)
35{
8459d725
A
36 int pid, err, i, ch;
37 unsigned int count;
fa62d991 38 mach_port_t task;
8459d725
A
39 thread_act_array_t threads;
40 thread_precedence_policy_data_t policy;
cf37c299 41
8459d725
A
42 boolean_t do_high = 0, do_resume = 0, do_suspend = 0;
43 boolean_t do_low = 1;
cf37c299
A
44
45 if (argc < 2)
fa62d991 46 usage();
cf37c299 47
8459d725 48 while ((ch = getopt(argc, argv, "rsu")) != -1)
fa62d991
A
49 switch (ch) {
50 case 'u':
8459d725
A
51 do_high = 1;
52 do_low = 0;
fa62d991
A
53 continue;
54 case 'r':
55 do_resume = 1;
8459d725 56 do_low = 0;
fa62d991
A
57 continue;
58 case 's':
59 do_suspend = 1;
8459d725 60 do_low = 0;
fa62d991
A
61 continue;
62 default:
63 usage();
64 }
cf37c299 65
fa62d991 66 argc -= optind; argv += optind;
cf37c299 67
fa62d991
A
68 if (argc == 0)
69 usage();
70
71 pid = atoi(*argv);
cf37c299 72 if (!pid)
fa62d991 73 usage();
cf37c299 74
8459d725
A
75 err = task_for_pid(mach_task_self(), pid, &task);
76 if (err) {
77 fprintf(stderr, "Failed to get task port (%d)\n", err);
78 exit(0);
79 }
fa62d991 80
8459d725 81 if (do_low || do_high) {
fa62d991 82
8459d725 83 err = task_threads(task, &threads, &count);
fa62d991 84 if (err) {
8459d725 85 fprintf(stderr, "Failed to get thread list (%d)\n", err);
fa62d991
A
86 exit(0);
87 }
fa62d991 88
8459d725
A
89 if (do_low)
90 policy.importance = -100;
91 else
92 policy.importance = 0;
fa62d991 93
8459d725 94 for (i = 0; i < count; i++) {
cf37c299
A
95 err = thread_policy_set(threads[i],
96 THREAD_PRECEDENCE_POLICY,
97 (thread_policy_t) &policy,
8459d725 98 THREAD_PRECEDENCE_POLICY_COUNT);
fa62d991 99 if (err) {
8459d725
A
100 fprintf(stderr, "Failed to set thread priority (%d)\n", err);
101 exit(0);
fa62d991 102 }
fa62d991
A
103 }
104
cf37c299
A
105 printf("Process %d's threads set to %s priority.\n", pid,
106 (do_low ? "lowest" : "highest"));
8459d725 107 }
cf37c299 108
8459d725
A
109 if (do_suspend) {
110 err = task_suspend(task);
111 if (err) {
112 fprintf(stderr, "Failed to suspend task (%d)\n", err);
113 } else {
114 printf("Process %d suspended.\n", pid);
115 }
8459d725 116 }
cf37c299 117
8459d725
A
118 if (do_resume) {
119 err = task_resume(task);
120 if (err) {
121 fprintf(stderr, "Failed to resume task (%d)\n", err);
122 } else {
123 printf("Process %d resumed.\n", pid);
fa62d991
A
124 }
125 }
126
127 return 0;
128}