// 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 #include #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 counter_; }; } // namespace internal } // namespace sequence_manager } // namespace base #endif // BASE_TASK_SEQUENCE_MANAGER_ENQUEUE_ORDER_GENERATOR_H_