aboutsummaryrefslogtreecommitdiff
path: root/src/progman.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/progman.c')
-rw-r--r--src/progman.c74
1 files changed, 58 insertions, 16 deletions
diff --git a/src/progman.c b/src/progman.c
index a625885..bae82ba 100644
--- a/src/progman.c
+++ b/src/progman.c
@@ -287,7 +287,9 @@ register_prog0 (struct component *comp)
287 else 287 else
288 newp->v.p.status = status_stopped; 288 newp->v.p.status = status_stopped;
289 289
290 if ((comp->flags & CF_DISABLED) || comp->mode == pies_comp_ondemand) 290 if ((comp->flags & CF_DISABLED)
291 || comp->mode == pies_comp_ondemand
292 || comp->mode == pies_comp_shutdown)
291 newp->active = 0; 293 newp->active = 0;
292 else 294 else
293 newp->active = 1; 295 newp->active = 1;
@@ -1795,21 +1797,6 @@ prog_stop (struct prog *prog, int sig)
1795 kill (prog->pid, sig); 1797 kill (prog->pid, sig);
1796} 1798}
1797 1799
1798static int
1799mark_for_stopping (struct prog *prog, void *data)
1800{
1801 if (IS_COMPONENT (prog))
1802 prog->stop = 1;
1803 return 0;
1804}
1805
1806void
1807progman_stop (void)
1808{
1809 progman_foreach (mark_for_stopping, NULL);
1810 progman_gc ();
1811}
1812
1813static void 1800static void
1814print_status (const char *tag, pid_t pid, int status, int expect_term) 1801print_status (const char *tag, pid_t pid, int status, int expect_term)
1815{ 1802{
@@ -2582,4 +2569,59 @@ progman_gc (void)
2582 2569
2583} 2570}
2584 2571
2572static int
2573start_shutdown (struct prog *prog, void *data)
2574{
2575 if (IS_COMPONENT (prog) && prog->v.p.comp->mode == pies_comp_shutdown)
2576 {
2577 int *p = data;
2578 if (!*p)
2579 {
2580 diagmsg (DIAG_CON, LOG_INFO, "Starting shutdown components");
2581 *p = 1;
2582 }
2583 prog->active = 1;
2584 prog_start (prog);
2585 prog->stop = 1;
2586 }
2587 return 0;
2588}
2589
2590void
2591program_shutdown (void)
2592{
2593 time_t start = time (NULL);
2594 int sd = 0;
2595
2596 /* Activate shutdown components. */
2597 progman_foreach (start_shutdown, &sd);
2598 while (prog_to_stop (proghead))
2599 {
2600 progman_cleanup (1);
2601 if (time (NULL) - start < shutdown_timeout)
2602 sleep (1);
2603 else
2604 {
2605 progman_gc ();
2606 break;
2607 }
2608 }
2609}
2610
2611static int
2612mark_for_stopping (struct prog *prog, void *data)
2613{
2614 if (IS_COMPONENT (prog))
2615 prog->stop = 1;
2616 return 0;
2617}
2618
2619void
2620progman_stop (void)
2621{
2622 progman_foreach (mark_for_stopping, NULL);
2623 progman_gc ();
2624 program_shutdown ();
2625}
2626
2585/* EOF */ 2627/* EOF */

Return to:

Send suggestions and report system problems to the System administrator.