diff options
-rw-r--r-- | tools/perf/builtin-daemon.c | 88 |
1 files changed, 85 insertions, 3 deletions
diff --git a/tools/perf/builtin-daemon.c b/tools/perf/builtin-daemon.c index c77668b50023..ea6c439978a8 100644 --- a/tools/perf/builtin-daemon.c +++ b/tools/perf/builtin-daemon.c @@ -81,6 +81,7 @@ struct daemon { const char *config; char *config_real; char *config_base; + const char *csv_sep; const char *base_user; char *base; struct list_head sessions; @@ -528,11 +529,78 @@ static int setup_server_socket(struct daemon *daemon) return fd; } +enum { + CMD_LIST = 0, + CMD_MAX, +}; + union cmd { int cmd; + + /* CMD_LIST */ + struct { + int cmd; + int verbose; + char csv_sep; + } list; }; -static int handle_server_socket(struct daemon *daemon __maybe_unused, int sock_fd) +static int cmd_session_list(struct daemon *daemon, union cmd *cmd, FILE *out) +{ + char csv_sep = cmd->list.csv_sep; + struct daemon_session *session; + + if (csv_sep) { + fprintf(out, "%d%c%s%c%s%c%s/%s", + /* pid daemon */ + getpid(), csv_sep, "daemon", + /* base */ + csv_sep, daemon->base, + /* output */ + csv_sep, daemon->base, SESSION_OUTPUT); + + fprintf(out, "\n"); + } else { + fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base); + if (cmd->list.verbose) { + fprintf(out, " output: %s/%s\n", + daemon->base, SESSION_OUTPUT); + } + } + + list_for_each_entry(session, &daemon->sessions, list) { + if (csv_sep) { + fprintf(out, "%d%c%s%c%s", + /* pid */ + session->pid, + /* name */ + csv_sep, session->name, + /* base */ + csv_sep, session->run); + + fprintf(out, "%c%s%c%s/%s", + /* session dir */ + csv_sep, session->base, + /* session output */ + csv_sep, session->base, SESSION_OUTPUT); + + fprintf(out, "\n"); + } else { + fprintf(out, "[%d:%s] perf record %s\n", + session->pid, session->name, session->run); + if (!cmd->list.verbose) + continue; + fprintf(out, " base: %s\n", + session->base); + fprintf(out, " output: %s/%s\n", + session->base, SESSION_OUTPUT); + } + } + + return 0; +} + +static int handle_server_socket(struct daemon *daemon, int sock_fd) { int ret = -1, fd; FILE *out = NULL; @@ -556,6 +624,9 @@ static int handle_server_socket(struct daemon *daemon __maybe_unused, int sock_f } switch (cmd.cmd) { + case CMD_LIST: + ret = cmd_session_list(daemon, &cmd, out); + break; default: break; } @@ -968,7 +1039,6 @@ out: return err; } -__maybe_unused static int send_cmd(struct daemon *daemon, union cmd *cmd) { int ret = -1, fd; @@ -1012,6 +1082,16 @@ out: return ret; } +static int send_cmd_list(struct daemon *daemon) +{ + union cmd cmd = { .cmd = CMD_LIST, }; + + cmd.list.verbose = verbose; + cmd.list.csv_sep = daemon->csv_sep ? *daemon->csv_sep : 0; + + return send_cmd(daemon, &cmd); +} + int cmd_daemon(int argc, const char **argv) { struct option daemon_options[] = { @@ -1020,6 +1100,8 @@ int cmd_daemon(int argc, const char **argv) "config file", "config file path"), OPT_STRING(0, "base", &__daemon.base_user, "directory", "base directory"), + OPT_STRING_OPTARG('x', "field-separator", &__daemon.csv_sep, + "field separator", "print counts with custom separator", ","), OPT_END() }; @@ -1042,5 +1124,5 @@ int cmd_daemon(int argc, const char **argv) return -1; } - return -1; + return send_cmd_list(&__daemon); } |