DECLARE_MASK_MAP(PC),
};
-#define S_OPTS "d:a:A:r:o:"
+#define S_OPTS "d:a:A:r:o:k"
static struct option l_opts[] = {
{
.name = "dev",
.flag = NULL,
.val = 'o'
},
+ {
+ .name = "kill",
+ .has_arg = 0,
+ .flag = NULL,
+ .val = 'k'
+ },
{
.name = NULL,
.has_arg = 0,
static char *output_name;
static int act_mask = ~0U;
static int trace_started;
+static int kill_running_trace;
static pthread_mutex_t stdout_mutex = PTHREAD_MUTEX_INITIALIZER;
{
struct blk_user_trace_setup buts;
- devfd = open(dev, O_RDONLY);
- if (devfd < 0) {
- perror(dev);
- return 1;
- }
-
memset(&buts, sizeof(buts), 0);
buts.buf_size = BUF_SIZE;
buts.buf_nr = BUF_NR;
static void stop_trace(void)
{
- if (trace_started) {
+ if (trace_started || kill_running_trace) {
if (ioctl(devfd, BLKSTOPTRACE) < 0)
perror("BLKSTOPTRACE");
- close(devfd);
trace_started = 0;
}
}
case 'o':
output_name = strdup(optarg);
break;
+ case 'k':
+ kill_running_trace = 1;
+ break;
default:
fprintf(stderr,"Usage: %s -d <dev> "
return 2;
}
+ devfd = open(dev, O_RDONLY);
+ if (devfd < 0) {
+ perror(dev);
+ return 3;
+ }
+
+ if (kill_running_trace) {
+ stop_trace();
+ exit(0);
+ }
+
if (start_trace(dev)) {
close(devfd);
fprintf(stderr, "Failed to start trace on %s\n", dev);
- return 3;
+ return 4;
}
setlocale(LC_NUMERIC, "en_US");
if (!i) {
fprintf(stderr, "Failed to start worker threads\n");
stop_trace();
- return 4;
+ return 5;
}
signal(SIGINT, handle_sigint);
stop_threads();
stop_trace();
show_stats();
+ close(devfd);
return 0;
}