Fix one race condition between start and stop.
For a oneshot service, if start happens immediately after stop, the service could be still in stopping status and then start won't do anything. This fix this race condition. Test: manual - see reproduce instructions in bug. Bug: 68020256 Change-Id: I20202fa346f1949a8bda3d90deedc8b6a6d814d3
This commit is contained in:
parent
41a9b3c81d
commit
990d43cb82
1 changed files with 7 additions and 1 deletions
|
@ -706,14 +706,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();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue