Lines Matching full:session

38  * Session states:
40 * OK - session is up and running
41 * RECONFIG - session is pending for reconfiguration,
42 * new values are already loaded in session object
43 * KILL - session is pending to be killed
45 * Session object life and its state is maintained by
49 * - reads config file and setup session objects
53 * RECONFIG - session needs to be changed
55 * KILL - session needs to be killed
56 * (session is no longer in config file)
59 * - scans session objects and does following actions
63 * RECONFIG - session is killed and re-run with new config
64 * KILL - session is killed
118 struct daemon_session *session = zalloc(sizeof(*session));
120 if (!session)
123 session->name = strdup(name);
124 if (!session->name) {
125 free(session);
129 session->pid = -1;
130 list_add_tail(&session->list, &config->sessions);
131 return session;
136 struct daemon_session *session;
138 list_for_each_entry(session, &daemon->sessions, list) {
139 if (!strcmp(session->name, name))
140 return session;
146 static int get_session_name(const char *var, char *session, int len)
148 const char *p = var + sizeof("session-") - 1;
151 *session++ = *p++;
153 *session = 0;
159 struct daemon_session *session;
171 session = daemon__find_session(daemon, name);
173 if (!session) {
174 /* New session is defined. */
175 session = daemon__add_session(daemon, name);
176 if (!session)
179 pr_debug("reconfig: found new session %s\n", name);
182 session->state = RECONFIG;
183 } else if (session->state == KILL) {
184 /* Current session is defined, no action needed. */
185 pr_debug("reconfig: found current session %s\n", name);
186 session->state = OK;
192 if (session->run)
193 same = !strcmp(session->run, value);
196 if (session->run) {
197 zfree(&session->run);
198 pr_debug("reconfig: session %s is changed\n", name);
201 session->run = strdup(value);
202 if (!session->run)
207 * trigger reconfig for the session.
209 session->state = RECONFIG;
220 if (strstarts(var, "session-")) {
298 struct daemon_session *session;
308 list_for_each_entry(session, &daemon->sessions, list)
309 session->state = KILL;
320 static int daemon_session__run(struct daemon_session *session,
327 if (asprintf(&session->base, "%s/session-%s",
328 daemon->base, session->name) < 0) {
333 if (mkdir(session->base, 0755) && errno != EEXIST) {
338 session->start = time(NULL);
340 session->pid = fork();
341 if (session->pid < 0)
343 if (session->pid > 0) {
344 pr_info("reconfig: ruining session [%s:%d]: %s\n",
345 session->name, session->pid, session->run);
349 if (chdir(session->base)) {
365 perror("failed: open session output");
384 daemon->perf, SESSION_CONTROL, SESSION_ACK, session->run);
396 struct daemon_session *session;
414 list_for_each_entry(session, &daemon->sessions, list) {
415 if (session->pid == -1)
418 pid = waitpid(session->pid, &status, WNOHANG);
423 pr_info("session '%s' exited, status=%d\n",
424 session->name, WEXITSTATUS(status));
426 pr_info("session '%s' killed (signal %d)\n",
427 session->name, WTERMSIG(status));
429 pr_info("session '%s' stopped (signal %d)\n",
430 session->name, WSTOPSIG(status));
432 pr_info("session '%s' Unexpected status (0x%x)\n",
433 session->name, status);
436 session->state = KILL;
437 session->pid = -1;
443 static int daemon_session__wait(struct daemon_session *session, struct daemon *daemon,
466 } while (session->pid != -1);
473 struct daemon_session *session;
475 list_for_each_entry(session, &daemon->sessions, list) {
476 if (session->pid != -1)
510 static int daemon_session__control(struct daemon_session *session,
523 session->base, SESSION_CONTROL);
532 session->base, SESSION_ACK);
666 static int daemon_session__ping(struct daemon_session *session)
668 return daemon_session__control(session, "ping", true) ? PING_FAIL : PING_OK;
674 struct daemon_session *session;
691 /* session up time */
707 list_for_each_entry(session, &daemon->sessions, list) {
711 session->pid,
713 csv_sep, session->name,
715 csv_sep, session->run);
718 /* session dir */
719 csv_sep, session->base,
720 /* session output */
721 csv_sep, session->base, SESSION_OUTPUT);
724 /* session control */
725 csv_sep, session->base, SESSION_CONTROL,
726 /* session ack */
727 csv_sep, session->base, SESSION_ACK);
730 /* session up time */
731 csv_sep, (uint64_t)((curr - session->start) / 60));
736 session->pid, session->name, session->run);
740 session->base);
742 session->base, SESSION_OUTPUT);
744 session->base, SESSION_CONTROL);
746 session->base, SESSION_ACK);
748 (uint64_t)((curr - session->start) / 60));
755 static int daemon_session__signal(struct daemon_session *session, int sig)
757 if (session->pid < 0)
759 return kill(session->pid, sig);
764 struct daemon_session *session;
769 list_for_each_entry(session, &daemon->sessions, list) {
770 if (all || !strcmp(cmd->signal.name, session->name)) {
771 daemon_session__signal(session, cmd->signal.sig);
772 fprintf(out, "signal %d sent to session '%s [%d]'\n",
773 cmd->signal.sig, session->name, session->pid);
787 struct daemon_session *session;
792 list_for_each_entry(session, &daemon->sessions, list) {
793 if (all || !strcmp(cmd->ping.name, session->name)) {
794 int state = daemon_session__ping(session);
796 fprintf(out, "%-4s %s\n", ping_str[state], session->name);
890 static void daemon_session__kill(struct daemon_session *session,
898 daemon_session__control(session, "stop", false);
901 daemon_session__signal(session, SIGTERM);
904 daemon_session__signal(session, SIGKILL);
907 pr_err("failed to wait for session %s\n",
908 session->name);
913 } while (daemon_session__wait(session, daemon, 10));
918 struct daemon_session *session;
920 list_for_each_entry(session, &daemon->sessions, list)
921 daemon_session__signal(session, sig);
924 static void daemon_session__delete(struct daemon_session *session)
926 zfree(&session->base);
927 zfree(&session->name);
928 zfree(&session->run);
929 free(session);
932 static void daemon_session__remove(struct daemon_session *session)
934 list_del(&session->list);
935 daemon_session__delete(session);
940 struct daemon_session *session;
942 list_for_each_entry(session, &daemon->sessions, list)
943 daemon_session__control(session, "stop", false);
972 struct daemon_session *session, *h;
974 list_for_each_entry_safe(session, h, &daemon->sessions, list)
975 daemon_session__remove(session);
984 struct daemon_session *session, *n;
986 list_for_each_entry_safe(session, n, &daemon->sessions, list) {
988 if (session->state == OK)
991 /* Remove session. */
992 if (session->state == KILL) {
993 if (session->pid > 0) {
994 daemon_session__kill(session, daemon);
995 pr_info("reconfig: session '%s' killed\n", session->name);
997 daemon_session__remove(session);
1001 /* Reconfig session. */
1002 if (session->pid > 0) {
1003 daemon_session__kill(session, daemon);
1004 pr_info("reconfig: session '%s' killed\n", session->name);
1006 if (daemon_session__run(session, daemon))
1009 session->state = OK;
1418 OPT_STRING(0, "session", &name, "session",
1419 "Sent signal to specific session"),
1470 OPT_STRING(0, "session", &name, "session",
1471 "Ping to specific session"),