// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_DNS_SERIAL_WORKER_H_ #define NET_DNS_SERIAL_WORKER_H_ #include <memory> #include "base/compiler_specific.h" #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/task/task_traits.h" #include "base/timer/timer.h" #include "net/base/backoff_entry.h" #include "net/base/net_export.h" namespace net { // `SerialWorker` executes a job on `ThreadPool` serially -- **one at a time**. // On `WorkNow()`, a `WorkItem` is created using `CreateWorkItem()` and sent to // the `ThreadPool`. There, a call to `DoWork()` is made. On completion of work, // `OnWorkFinished()` is called on the origin thread (if the `SerialWorker` is // still alive), passing back the `WorkItem` to allow retrieving any results or // passed objects. If `WorkNow()` is called (1 or more times) while a `WorkItem` // is already under way, after completion of the work and before any call is // made to `OnWorkFinished()` the same `WorkItem` will be passed back to the // `ThreadPool`, and `DoWork()` will be called once more. // // If |OnWorkFinished| returns a failure and |max_number_of_retries| // is non-zero, retries will be scheduled according to the |backoff_policy|. // A default backoff policy is used if one is not provided. // // This behavior is designed for updating a result after some trigger, for // example reading a file once FilePathWatcher indicates it changed. // // Derived classes should store results of work in the `WorkItem` and retrieve // results from it when passed back to `OnWorkFinished()`. The `SerialWorker` is // guaranteed to only run one `WorkItem` at a time, always passing it back to // `OnWorkFinished()` before calling `CreateWorkItem()` again. Therefore, a // derived class may safely pass objects between `WorkItem`s, or even reuse the // same `WorkItem`, to allow storing helper objects directly in the `WorkItem`. // However, it is not guaranteed that the `SerialWorker` will remain alive while // the `WorkItem` runs. Therefore, the `WorkItem` should never access any memory // owned by the `SerialWorker` or derived class. class NET_EXPORT_PRIVATE SerialWorker { … }; } // namespace net #endif // NET_DNS_SERIAL_WORKER_H_