Merge "Fix one race condition between start and stop." am: 876b13d0ec

am: 36be7e61bf

Change-Id: I6b46004ac43d1c29ebedd982be10ba33c7460968
This commit is contained in:
Tao Wu 2017-10-27 00:26:42 +00:00 committed by android-build-merger
commit 7cb9d878a0
1 changed files with 7 additions and 1 deletions

View File

@ -720,14 +720,20 @@ Result<Success> Service::ExecStart() {
}
Result<Success> Service::Start() {
bool disabled = (flags_ & (SVC_DISABLED | SVC_RESET));
// Starting a service removes it from the disabled or reset state and
// immediately takes it out of the restarting state if it was in there.
flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START));
// Running processes require no additional work --- if they're in the
// process of exiting, we've ensured that they will immediately restart
// on exit, unless they are ONESHOT.
// on exit, unless they are ONESHOT. For ONESHOT service, if it's in
// stopping status, we just set SVC_RESTART flag so it will get restarted
// in Reap().
if (flags_ & SVC_RUNNING) {
if ((flags_ & SVC_ONESHOT) && disabled) {
flags_ |= SVC_RESTART;
}
// It is not an error to try to start a service that is already running.
return Success();
}