• fdoray's avatar
    [Sync] Refactor ModelSafeWorker::DoWorkAndWaitUntilDone() to avoid code duplication. · 316c08f3
    fdoray authored
    Before this CL, logic to wait for a WorkCallback to run or be
    abandoned was duplicated in multiple
    ModelSafeWorker::DoWorkAndWaitUntilDoneImpl() implementations.
    
    With this CL, ModelSafeWorker::DoWorkAndWaitUntilDoneImpl() is
    replaced with ModelSafeWorker::ScheduleWork(). Implementations
    are merely responsible for scheduling the callback that they
    receive; they don't have to wait for it to run or be abandoned.
    
    The logic to wait for the callback to run or be abandoned is moved
    into ModelSafeWorker::DoWorkAndWaitUntilDone().
    ModelSafeWorker::DoWorkAndWaitUntilDone() calls
    ModelSafeWorker::ScheduleWork(). Then, it waits until either the
    callback that it passed to ModelSafeWorker::ScheduleWork() is deleted
    (may or may not have run) or ModelSafeWorker::RequestStop() is called
    before the callback has started to run. Additionnaly, calling
    ModelSafeWorker::RequestStop() transforms into no-op further
    invocations of callbacks passed to ModelSafeWorker::ScheduleWork().
    
    Unblocking ModelSafeWorker::DoWorkAndWaitUntilDone() when
    ModelSafeWorker::RequestStop() is called is important to
    prevent deadlocks in workers that schedule work on the UI
    thread. Indeed, in Chrome, no tasks are scheduled on the UI
    thread after ModelSafeWorker::RequestStop() is called and
    pending UI tasks are not scheduled until after the sync thread
    is joined.
    
    BUG=663600
    
    Review-Url: https://codereview.chromium.org/2782573002
    Cr-Commit-Position: refs/heads/master@{#463413}
    316c08f3
model_safe_worker_unittest.cc 6.78 KB