| diff -rup upstart-1.2~/init/job_process.c upstart-1.2/init/job_process.c |
| --- upstart-1.2~/init/job_process.c 2011-03-22 10:18:00.000000000 -0700 |
| +++ upstart-1.2/init/job_process.c 2013-07-30 17:24:03.663026253 -0700 |
| @@ -1074,11 +1074,11 @@ job_process_terminated (Job *job |
| * the exit signal or status is in that list, and only |
| * if not, do we consider it failed. |
| * |
| - * For services that can be respawned, a zero exit status is |
| - * also a failure unless listed. |
| + * For services, a zero exit status is also a failure |
| + * unless listed. |
| */ |
| - if (status || (job->class->respawn && (! job->class->task))) |
| - { |
| + if ((status || (! job->class->task)) |
| + && (job->goal == JOB_START)) { |
| failed = TRUE; |
| for (size_t i = 0; i < job->class->normalexit_len; i++) { |
| if (job->class->normalexit[i] == status) { |
| diff -rup upstart-1.2~/init/tests/test_job_process.c upstart-1.2/init/tests/test_job_process.c |
| --- upstart-1.2~/init/tests/test_job_process.c 2011-03-16 15:17:44.000000000 -0700 |
| +++ upstart-1.2/init/tests/test_job_process.c 2013-07-30 17:27:56.733675356 -0700 |
| @@ -1270,7 +1270,7 @@ test_handler (void) |
| |
| /* Check that we can handle the running task of the job terminating, |
| * which should set the goal to stop and transition a state change |
| - * into the stopping state. This should not be considered a failure. |
| + * into the stopping state. |
| */ |
| TEST_FEATURE ("with running process"); |
| TEST_ALLOC_FAIL { |
| @@ -1301,13 +1301,11 @@ test_handler (void) |
| TEST_EQ (job->state, JOB_STOPPING); |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| - event_unblock (event); |
| + TEST_LIST_EMPTY (&job->blocking); |
| + TEST_FREE (blocked); |
| |
| TEST_NE_P (job->blocker, NULL); |
| |
| @@ -1322,8 +1320,8 @@ test_handler (void) |
| |
| TEST_LIST_EMPTY (&job->blocker->blocking); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| nih_free (job); |
| @@ -2406,7 +2404,7 @@ test_handler (void) |
| |
| |
| /* A running task exiting with the zero exit code is considered |
| - * a normal termination if not marked respawn. |
| + * a failed termination. |
| */ |
| TEST_FEATURE ("with running task and zero exit"); |
| TEST_ALLOC_FAIL { |
| @@ -2437,13 +2435,11 @@ test_handler (void) |
| TEST_EQ (job->state, JOB_STOPPING); |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| - event_unblock (event); |
| + TEST_LIST_EMPTY (&job->blocking); |
| + TEST_FREE (blocked); |
| |
| TEST_NE_P (job->blocker, NULL); |
| |
| @@ -2458,8 +2454,8 @@ test_handler (void) |
| |
| TEST_LIST_EMPTY (&job->blocker->blocking); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| nih_free (job); |
| @@ -2719,13 +2715,11 @@ test_handler (void) |
| TEST_EQ (job->state, JOB_STOPPING); |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| - event_unblock (event); |
| + TEST_LIST_EMPTY (&job->blocking); |
| + TEST_FREE (blocked); |
| |
| TEST_NE_P (job->blocker, NULL); |
| |
| @@ -2740,8 +2734,8 @@ test_handler (void) |
| |
| TEST_LIST_EMPTY (&job->blocker->blocking); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| nih_free (job); |
| @@ -2790,18 +2784,16 @@ test_handler (void) |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| TEST_EQ (job->pid[PROCESS_POST_START], 2); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| TEST_EQ_P (job->blocker, NULL); |
| |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| - event_unblock (event); |
| + TEST_LIST_EMPTY (&job->blocking); |
| + TEST_FREE (blocked); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| nih_free (job); |
| @@ -2850,17 +2842,16 @@ test_handler (void) |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| TEST_EQ (job->pid[PROCESS_POST_START], 2); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| TEST_EQ_P (job->blocker, NULL); |
| |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| + TEST_LIST_EMPTY (&job->blocking); |
| + TEST_FREE (blocked); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| job_process_handler (NULL, 2, NIH_CHILD_EXITED, 0); |
| @@ -2870,13 +2861,8 @@ test_handler (void) |
| TEST_EQ (job->pid[PROCESS_MAIN], 0); |
| TEST_EQ (job->pid[PROCESS_POST_START], 0); |
| |
| - TEST_EQ (event->blockers, 1); |
| - TEST_EQ (event->failed, FALSE); |
| - |
| - TEST_LIST_NOT_EMPTY (&job->blocking); |
| - TEST_NOT_FREE (blocked); |
| - TEST_EQ_P (blocked->event, event); |
| - event_unblock (event); |
| + TEST_EQ (event->blockers, 0); |
| + TEST_EQ (event->failed, TRUE); |
| |
| TEST_NE_P (job->blocker, NULL); |
| |
| @@ -2891,8 +2877,8 @@ test_handler (void) |
| |
| TEST_LIST_EMPTY (&job->blocker->blocking); |
| |
| - TEST_EQ (job->failed, FALSE); |
| - TEST_EQ (job->failed_process, (ProcessType)-1); |
| + TEST_EQ (job->failed, TRUE); |
| + TEST_EQ (job->failed_process, PROCESS_MAIN); |
| TEST_EQ (job->exit_status, 0); |
| |
| nih_free (job); |