| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| 3 * Distributed under the terms of the GNU General Public License v2 | 3 * Distributed under the terms of the GNU General Public License v2 |
| 4 */ | 4 */ |
| 5 | 5 |
| 6 | 6 |
| 7 #include <sys/syscall.h> | 7 #include <sys/syscall.h> |
| 8 #include <pthread.h> | 8 #include <pthread.h> |
| 9 #include <signal.h> | 9 #include <signal.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| 11 #include <stdlib.h> | 11 #include <stdlib.h> |
| 12 #include <string.h> | 12 #include <string.h> |
| 13 #include <unistd.h> | 13 #include <unistd.h> |
| 14 | 14 |
| 15 #include <debug.h> |
| 15 #include <eprintf.h> | 16 #include <eprintf.h> |
| 16 #include <style.h> | 17 #include <style.h> |
| 17 | 18 |
| 18 #include "ktop.h" | 19 #include "ktop.h" |
| 19 | 20 |
| 20 int Command; | 21 bool Halt = FALSE; |
| 21 | 22 |
| 22 bool Dump = FALSE; | 23 bool Dump = FALSE; |
| 23 bool Trace_exit = FALSE; | 24 bool Trace_exit = TRUE; |
| 24 bool Trace_self = FALSE; | 25 bool Trace_self = FALSE; |
| 25 | 26 |
| 27 display_fn Display = kernel_display; |
| 28 |
| 26 pid_t gettid(void) { return syscall(__NR_gettid); } | 29 pid_t gettid(void) { return syscall(__NR_gettid); } |
| 27 | 30 |
| 28 u8 Ignore_pid[(MAX_PID + 4) / 8]; | 31 u8 Ignore_pid[(MAX_PID + 4) / 8]; |
| 29 pthread_mutex_t Ignore_pid_lock = PTHREAD_MUTEX_INITIALIZER; | 32 pthread_mutex_t Ignore_pid_lock = PTHREAD_MUTEX_INITIALIZER; |
| 30 | 33 |
| 31 void ignore_pid(int pid) | 34 void ignore_pid(int pid) |
| 32 { | 35 { |
| 33 if ((pid < 0) || (pid >= MAX_PID)) warn("pid out of range %d", pid); | 36 if ((pid < 0) || (pid >= MAX_PID)) warn("pid out of range %d", pid); |
| 34 | 37 |
| 35 pthread_mutex_lock(&Ignore_pid_lock); | 38 pthread_mutex_lock(&Ignore_pid_lock); |
| 36 Ignore_pid[pid / 8] |= (1 << (pid & 0x7)); | 39 Ignore_pid[pid / 8] |= (1 << (pid & 0x7)); |
| 37 pthread_mutex_unlock(&Ignore_pid_lock); | 40 pthread_mutex_unlock(&Ignore_pid_lock); |
| 38 } | 41 } |
| 39 | 42 |
| 40 bool do_ignore_pid(int pid) | 43 bool do_ignore_pid(int pid) |
| 41 { | 44 { |
| 42 if ((pid < 0) || (pid >= MAX_PID)) { | 45 if ((pid < 0) || (pid >= MAX_PID)) { |
| 43 warn("pid out of range %d", pid); | 46 warn("pid out of range %d", pid); |
| 44 return TRUE; | 47 return TRUE; |
| 45 } | 48 } |
| 46 return Ignore_pid[pid / 8] & (1 << (pid & 0x7)); | 49 return Ignore_pid[pid / 8] & (1 << (pid & 0x7)); |
| 47 } | 50 } |
| 48 | 51 |
| 49 | 52 |
| 50 void cleanup(int sig) | 53 void cleanup(int sig) |
| 51 { | 54 { |
| 55 PRd(sig); |
| 56 if (sig) { |
| 57 fprintf(stderr, "died because %d\n", sig); |
| 58 } |
| 52 cleanup_collector(); | 59 cleanup_collector(); |
| 53 cleanup_display(); | 60 cleanup_display(); |
| 54 exit(0); | 61 exit(0); |
| 55 } | 62 } |
| 56 | 63 |
| 57 void set_signals(void) | 64 void set_signals(void) |
| 58 { | 65 { |
| 59 signal(SIGHUP, cleanup); | 66 signal(SIGHUP, cleanup); |
| 60 signal(SIGINT, cleanup); | 67 signal(SIGINT, cleanup); |
| 61 signal(SIGQUIT, cleanup); | 68 signal(SIGQUIT, cleanup); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 102 default: | 109 default: |
| 103 fprintf(stderr, "unknown option %c\n", c); | 110 fprintf(stderr, "unknown option %c\n", c); |
| 104 usage(); | 111 usage(); |
| 105 break; | 112 break; |
| 106 } | 113 } |
| 107 } | 114 } |
| 108 } | 115 } |
| 109 | 116 |
| 110 void quit(void) | 117 void quit(void) |
| 111 { | 118 { |
| 112 » Command = 1; | 119 » Halt = TRUE; |
| 113 } | 120 } |
| 114 | 121 |
| 115 void clear(void) | 122 void clear(void) |
| 116 { | 123 { |
| 117 » clear_display(); | 124 » reset_reduce(); |
| 118 } | 125 } |
| 119 | 126 |
| 120 void commander(void) | 127 void commander(void) |
| 121 { | 128 { |
| 122 for (;;) { | 129 for (;;) { |
| 123 int c = getchar(); | 130 int c = getchar(); |
| 124 if (c == EOF) cleanup(0); | 131 if (c == EOF) cleanup(0); |
| 125 switch (c) { | 132 switch (c) { |
| 126 case 'q': | 133 case 'q': |
| 127 quit(); | 134 quit(); |
| 128 return; | 135 return; |
| 129 case 'c': | 136 case 'c': |
| 130 clear(); | 137 clear(); |
| 131 break; | 138 break; |
| 139 case '<': |
| 140 decrease_reduce_interval(); |
| 141 break; |
| 142 case '>': |
| 143 increase_reduce_interval(); |
| 144 break; |
| 145 case 'i': |
| 146 Display = internal_display; |
| 147 break; |
| 148 case 'k': |
| 149 Display = kernel_display; |
| 150 break; |
| 151 case 'f': |
| 152 Display = file_system_display; |
| 153 break; |
| 132 default: | 154 default: |
| 133 break; // ignore | 155 break; // ignore |
| 134 } | 156 } |
| 135 } | 157 } |
| 136 } | 158 } |
| 137 | 159 |
| 138 int main(int argc, char **argv) | 160 int main(int argc, char **argv) |
| 139 { | 161 { |
| 140 » pthread_t display_thread; | 162 » pthread_t reduce_thread; |
| 141 int rc; | 163 int rc; |
| 142 | 164 |
| 165 debugstderr(); |
| 166 |
| 143 init(argc, argv); | 167 init(argc, argv); |
| 144 | 168 |
| 145 ignore_pid(gettid()); | 169 ignore_pid(gettid()); |
| 146 | 170 |
| 147 start_collector(); | 171 start_collector(); |
| 148 | 172 |
| 149 if (!Dump) { | 173 if (!Dump) { |
| 150 » » rc = pthread_create(&display_thread, NULL, display, NULL); | 174 » » rc = pthread_create(&reduce_thread, NULL, reduce, NULL); |
| 151 } | 175 } |
| 152 commander(); | 176 commander(); |
| 153 | 177 |
| 154 cleanup(0); | 178 cleanup(0); |
| 155 return 0; | 179 return 0; |
| 156 } | 180 } |
| OLD | NEW |