fixup! [M120 Migration] Notify media device state to webbrowser
[platform/framework/web/chromium-efl.git] / base / sequence_token.cc
1 // Copyright 2016 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/sequence_token.h"
6
7 #include "base/atomic_sequence_num.h"
8 #include "third_party/abseil-cpp/absl/base/attributes.h"
9
10 namespace base {
11
12 namespace {
13
14 base::AtomicSequenceNumber g_sequence_token_generator;
15
16 base::AtomicSequenceNumber g_task_token_generator;
17
18 ABSL_CONST_INIT thread_local SequenceToken current_sequence_token;
19 ABSL_CONST_INIT thread_local TaskToken current_task_token;
20
21 }  // namespace
22
23 bool SequenceToken::operator==(const SequenceToken& other) const {
24   return token_ == other.token_ && IsValid();
25 }
26
27 bool SequenceToken::operator!=(const SequenceToken& other) const {
28   return !(*this == other);
29 }
30
31 bool SequenceToken::IsValid() const {
32   return token_ != kInvalidSequenceToken;
33 }
34
35 int SequenceToken::ToInternalValue() const {
36   return token_;
37 }
38
39 SequenceToken SequenceToken::Create() {
40   return SequenceToken(g_sequence_token_generator.GetNext());
41 }
42
43 SequenceToken SequenceToken::GetForCurrentThread() {
44   return current_sequence_token;
45 }
46
47 bool TaskToken::operator==(const TaskToken& other) const {
48   return token_ == other.token_ && IsValid();
49 }
50
51 bool TaskToken::operator!=(const TaskToken& other) const {
52   return !(*this == other);
53 }
54
55 bool TaskToken::IsValid() const {
56   return token_ != kInvalidTaskToken;
57 }
58
59 TaskToken TaskToken::Create() {
60   return TaskToken(g_task_token_generator.GetNext());
61 }
62
63 TaskToken TaskToken::GetForCurrentThread() {
64   return current_task_token;
65 }
66
67 ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread(
68     const SequenceToken& sequence_token)
69     // The lambdas here exist because invalid tokens don't compare equal, so
70     // passing invalid sequence/task tokens as the third args to AutoReset
71     // constructors doesn't work.
72     : sequence_token_resetter_(&current_sequence_token,
73                                [&sequence_token]() {
74                                  DCHECK(!current_sequence_token.IsValid());
75                                  return sequence_token;
76                                }()),
77       task_token_resetter_(&current_task_token, [] {
78         DCHECK(!current_task_token.IsValid());
79         return TaskToken::Create();
80       }()) {}
81
82 ScopedSetSequenceTokenForCurrentThread::
83     ~ScopedSetSequenceTokenForCurrentThread() = default;
84
85 }  // namespace base