|  | // Copyright 2019 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_ | 
|  | #define BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <atomic> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/task/sequence_manager/enqueue_order.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace sequence_manager { | 
|  | namespace internal { | 
|  |  | 
|  | // EnqueueOrder can't be created from a raw number in non-test code. | 
|  | // EnqueueOrderGenerator is used to create it with strictly monotonic guarantee. | 
|  | class BASE_EXPORT EnqueueOrderGenerator { | 
|  | public: | 
|  | EnqueueOrderGenerator(); | 
|  | EnqueueOrderGenerator(const EnqueueOrderGenerator&) = delete; | 
|  | EnqueueOrderGenerator& operator=(const EnqueueOrderGenerator&) = delete; | 
|  | ~EnqueueOrderGenerator(); | 
|  |  | 
|  | // Can be called from any thread. | 
|  | EnqueueOrder GenerateNext() { | 
|  | return EnqueueOrder(std::atomic_fetch_add_explicit( | 
|  | &counter_, uint64_t(1), std::memory_order_relaxed)); | 
|  | } | 
|  |  | 
|  | private: | 
|  | std::atomic<uint64_t> counter_; | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace sequence_manager | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_ |