Lines Matching defs:daemon

84 struct daemon {
98 static struct daemon __daemon = {
103 "perf daemon {start|signal|stop|ping} [<options>]",
104 "perf daemon [<options>]",
115 static struct daemon_session *daemon__add_session(struct daemon *config, char *name)
133 static struct daemon_session *daemon__find_session(struct daemon *daemon, char *name)
137 list_for_each_entry(session, &daemon->sessions, list) {
156 static int session_config(struct daemon *daemon, const char *var, const char *value)
170 session = daemon__find_session(daemon, name);
174 session = daemon__add_session(daemon, name);
217 struct daemon *daemon = cb;
220 return session_config(daemon, var, value);
221 } else if (!strcmp(var, "daemon.base") && !daemon->base_user) {
222 if (daemon->base && strcmp(daemon->base, value)) {
226 daemon->base = strdup(value);
227 if (!daemon->base)
236 struct daemon *daemon = cb;
238 if (!strcmp(var, "daemon.base") && !daemon->base_user) {
239 daemon->base = strdup(value);
240 if (!daemon->base)
247 static int check_base(struct daemon *daemon)
251 if (!daemon->base) {
256 if (stat(daemon->base, &st)) {
260 daemon->base);
264 daemon->base);
268 daemon->base, strerror(errno));
275 daemon->base);
282 static int setup_client_config(struct daemon *daemon)
284 struct perf_config_set *set = perf_config_set__load_file(daemon->config_real);
288 err = perf_config_set(set, client_config, daemon);
292 return err ?: check_base(daemon);
295 static int setup_server_config(struct daemon *daemon)
308 list_for_each_entry(session, &daemon->sessions, list)
311 set = perf_config_set__load_file(daemon->config_real);
313 err = perf_config_set(set, server_config, daemon);
317 return err ?: check_base(daemon);
321 struct daemon *daemon)
328 daemon->base, session->name) < 0) {
384 daemon->perf, SESSION_CONTROL, SESSION_ACK, session->run);
390 exit(execve(daemon->perf, argv, NULL));
394 static pid_t handle_signalfd(struct daemon *daemon)
408 err = read(daemon->signal_fd, &si, sizeof(struct signalfd_siginfo));
414 list_for_each_entry(session, &daemon->sessions, list) {
443 static int daemon_session__wait(struct daemon_session *session, struct daemon *daemon,
447 .fd = daemon->signal_fd,
458 handle_signalfd(daemon);
471 static bool daemon__has_alive_session(struct daemon *daemon)
475 list_for_each_entry(session, &daemon->sessions, list) {
483 static int daemon__wait(struct daemon *daemon, int secs)
486 .fd = daemon->signal_fd,
497 handle_signalfd(daemon);
505 } while (daemon__has_alive_session(daemon));
581 static int setup_server_socket(struct daemon *daemon)
598 scnprintf(path, sizeof(path), "%s/control", daemon->base);
672 static int cmd_session_list(struct daemon *daemon, union cmd *cmd, FILE *out)
680 /* pid daemon */
681 getpid(), csv_sep, "daemon",
683 csv_sep, daemon->base,
685 csv_sep, daemon->base, SESSION_OUTPUT);
689 csv_sep, daemon->base, "lock");
693 csv_sep, (curr - daemon->start) / 60);
697 fprintf(out, "[%d:daemon] base: %s\n", getpid(), daemon->base);
700 daemon->base, SESSION_OUTPUT);
702 daemon->base);
704 (curr - daemon->start) / 60);
708 list_for_each_entry(session, &daemon->sessions, list) {
763 static int cmd_session_kill(struct daemon *daemon, union cmd *cmd, FILE *out)
770 list_for_each_entry(session, &daemon->sessions, list) {
786 static int cmd_session_ping(struct daemon *daemon, union cmd *cmd, FILE *out)
793 list_for_each_entry(session, &daemon->sessions, list) {
809 static int handle_server_socket(struct daemon *daemon, int sock_fd)
834 ret = cmd_session_list(daemon, &cmd, out);
837 ret = cmd_session_kill(daemon, &cmd, out);
842 pr_debug("perf daemon is exciting\n");
845 ret = cmd_session_ping(daemon, &cmd, out);
859 static int setup_client_socket(struct daemon *daemon)
870 scnprintf(path, sizeof(path), "%s/control", daemon->base);
892 struct daemon *daemon)
914 } while (daemon_session__wait(session, daemon, 10));
917 static void daemon__signal(struct daemon *daemon, int sig)
921 list_for_each_entry(session, &daemon->sessions, list)
939 static void daemon__stop(struct daemon *daemon)
943 list_for_each_entry(session, &daemon->sessions, list)
947 static void daemon__kill(struct daemon *daemon)
954 daemon__stop(daemon);
957 daemon__signal(daemon, SIGTERM);
960 daemon__signal(daemon, SIGKILL);
968 } while (daemon__wait(daemon, 10));
971 static void daemon__exit(struct daemon *daemon)
975 list_for_each_entry_safe(session, h, &daemon->sessions, list)
978 zfree(&daemon->config_real);
979 zfree(&daemon->config_base);
980 zfree(&daemon->base);
983 static int daemon__reconfig(struct daemon *daemon)
987 list_for_each_entry_safe(session, n, &daemon->sessions, list) {
995 daemon_session__kill(session, daemon);
1004 daemon_session__kill(session, daemon);
1007 if (daemon_session__run(session, daemon))
1016 static int setup_config_changes(struct daemon *daemon)
1018 char *basen = strdup(daemon->config_real);
1019 char *dirn = strdup(daemon->config_real);
1038 daemon->config_base = strdup(base);
1039 if (!daemon->config_base) {
1053 static bool process_inotify_event(struct daemon *daemon, char *buf, ssize_t len)
1066 if (!strcmp(event->name, daemon->config_base))
1074 static int handle_config_changes(struct daemon *daemon, int conf_fd,
1089 *config_changed = process_inotify_event(daemon, buf, len);
1094 static int setup_config(struct daemon *daemon)
1096 if (daemon->base_user) {
1097 daemon->base = strdup(daemon->base_user);
1098 if (!daemon->base)
1102 if (daemon->config) {
1103 char *real = realpath(daemon->config, NULL);
1109 daemon->config_real = real;
1114 daemon->config_real = strdup(perf_etc_perfconfig());
1116 daemon->config_real = strdup(perf_home_perfconfig());
1118 return daemon->config_real ? 0 : -1;
1134 * Each daemon tries to create and lock BASE/lock file,
1135 * if it's successful we are sure we're the only daemon
1138 * Once daemon is finished, file descriptor to lock file
1141 static int check_lock(struct daemon *daemon)
1148 scnprintf(path, sizeof(path), "%s/lock", daemon->base);
1156 fprintf(stderr, "failed: another perf daemon (pid %d) owns %s\n",
1157 pid, daemon->base);
1180 static int go_background(struct daemon *daemon)
1194 if (check_lock(daemon))
1199 if (chdir(daemon->base)) {
1221 daemon->out = fdopen(1, "w");
1222 if (!daemon->out) {
1228 setbuf(daemon->out, NULL);
1232 static int setup_signalfd(struct daemon *daemon)
1242 daemon->signal_fd = signalfd(-1, &mask, SFD_NONBLOCK|SFD_CLOEXEC);
1243 return daemon->signal_fd;
1246 static int __cmd_start(struct daemon *daemon, struct option parent_options[],
1264 daemon->start = time(NULL);
1266 if (setup_config(daemon)) {
1271 if (setup_server_config(daemon))
1274 if (foreground && check_lock(daemon))
1278 err = go_background(daemon);
1283 daemon__exit(daemon);
1288 debug_set_file(daemon->out);
1291 pr_info("daemon started (pid %d)\n", getpid());
1295 sock_fd = setup_server_socket(daemon);
1299 conf_fd = setup_config_changes(daemon);
1303 signal_fd = setup_signalfd(daemon);
1324 err = daemon__reconfig(daemon);
1330 err = handle_server_socket(daemon, sock_fd);
1332 err = handle_config_changes(daemon, conf_fd, &reconfig);
1334 err = handle_signalfd(daemon) < 0;
1337 err = setup_server_config(daemon);
1344 daemon__kill(daemon);
1345 daemon__exit(daemon);
1354 pr_info("daemon exited\n");
1355 fclose(daemon->out);
1359 static int send_cmd(struct daemon *daemon, union cmd *cmd)
1367 if (setup_client_config(daemon))
1370 fd = setup_client_socket(daemon);
1402 static int send_cmd_list(struct daemon *daemon)
1409 cmd.list.csv_sep = daemon->csv_sep ? *daemon->csv_sep : 0;
1411 return send_cmd(daemon, &cmd);
1414 static int __cmd_signal(struct daemon *daemon, struct option parent_options[],
1430 if (setup_config(daemon)) {
1440 return send_cmd(daemon, &cmd);
1443 static int __cmd_stop(struct daemon *daemon, struct option parent_options[],
1456 if (setup_config(daemon)) {
1463 return send_cmd(daemon, &cmd);
1466 static int __cmd_ping(struct daemon *daemon, struct option parent_options[],
1482 if (setup_config(daemon)) {
1490 return send_cmd(daemon, &cmd);