diff options
Diffstat (limited to 'src/progman.c')
-rw-r--r-- | src/progman.c | 74 |
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 | ||
1798 | static int | ||
1799 | mark_for_stopping (struct prog *prog, void *data) | ||
1800 | { | ||
1801 | if (IS_COMPONENT (prog)) | ||
1802 | prog->stop = 1; | ||
1803 | return 0; | ||
1804 | } | ||
1805 | |||
1806 | void | ||
1807 | progman_stop (void) | ||
1808 | { | ||
1809 | progman_foreach (mark_for_stopping, NULL); | ||
1810 | progman_gc (); | ||
1811 | } | ||
1812 | |||
1813 | static void | 1800 | static void |
1814 | print_status (const char *tag, pid_t pid, int status, int expect_term) | 1801 | print_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 | ||
2572 | static int | ||
2573 | start_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 | |||
2590 | void | ||
2591 | program_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 | |||
2611 | static int | ||
2612 | mark_for_stopping (struct prog *prog, void *data) | ||
2613 | { | ||
2614 | if (IS_COMPONENT (prog)) | ||
2615 | prog->stop = 1; | ||
2616 | return 0; | ||
2617 | } | ||
2618 | |||
2619 | void | ||
2620 | progman_stop (void) | ||
2621 | { | ||
2622 | progman_foreach (mark_for_stopping, NULL); | ||
2623 | progman_gc (); | ||
2624 | program_shutdown (); | ||
2625 | } | ||
2626 | |||
2585 | /* EOF */ | 2627 | /* EOF */ |