Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: base/sequence_and_task_token.cc

Issue 2213263002: Make ThreadChecker::CalledOnValidThread() return true when called from the same task. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: similarity Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/sequence_token.h" 5 #include "base/sequence_and_task_token.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/threading/thread_local.h" 10 #include "base/threading/thread_local.h"
11 11
12 namespace base { 12 namespace base {
13 13
14 namespace { 14 namespace {
15 15
16 base::StaticAtomicSequenceNumber g_sequence_token_generator; 16 base::StaticAtomicSequenceNumber g_sequence_token_generator;
17 17
18 LazyInstance<ThreadLocalPointer<ScopedSetSequenceTokenForCurrentThread>>::Leaky 18 base::StaticAtomicSequenceNumber g_task_token_generator;
19 tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; 19
20 LazyInstance<
21 ThreadLocalPointer<ScopedSetSequenceAndTaskTokenForCurrentThread>>::Leaky
22 tls_current_sequence_and_task_token = LAZY_INSTANCE_INITIALIZER;
20 23
21 } // namespace 24 } // namespace
22 25
23 bool SequenceToken::operator==(const SequenceToken& other) const { 26 bool SequenceToken::operator==(const SequenceToken& other) const {
24 return token_ == other.token_ && token_ != kInvalidSequenceToken; 27 return token_ == other.token_ && token_ != kInvalidSequenceToken;
25 } 28 }
26 29
27 bool SequenceToken::operator!=(const SequenceToken& other) const { 30 bool SequenceToken::operator!=(const SequenceToken& other) const {
28 return !(*this == other); 31 return !(*this == other);
29 } 32 }
30 33
31 bool SequenceToken::IsValid() const { 34 bool SequenceToken::IsValid() const {
32 return token_ != kInvalidSequenceToken; 35 return token_ != kInvalidSequenceToken;
33 } 36 }
34 37
35 SequenceToken SequenceToken::Create() { 38 SequenceToken SequenceToken::Create() {
36 return SequenceToken(g_sequence_token_generator.GetNext()); 39 return SequenceToken(g_sequence_token_generator.GetNext());
37 } 40 }
38 41
39 SequenceToken SequenceToken::GetForCurrentThread() { 42 SequenceToken SequenceToken::GetForCurrentThread() {
40 const ScopedSetSequenceTokenForCurrentThread* current_sequence_token = 43 const ScopedSetSequenceAndTaskTokenForCurrentThread*
41 tls_current_sequence_token.Get().Get(); 44 current_sequence_and_task_token =
42 return current_sequence_token ? current_sequence_token->token_ 45 tls_current_sequence_and_task_token.Get().Get();
43 : SequenceToken(); 46 return current_sequence_and_task_token
47 ? current_sequence_and_task_token->sequence_token_
48 : SequenceToken();
44 } 49 }
45 50
46 ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( 51 bool TaskToken::operator==(const TaskToken& other) const {
47 const SequenceToken& token) 52 return token_ == other.token_ && token_ != kInvalidTaskToken;
48 : token_(token) {
49 DCHECK(!tls_current_sequence_token.Get().Get());
50 tls_current_sequence_token.Get().Set(this);
51 } 53 }
52 54
53 ScopedSetSequenceTokenForCurrentThread:: 55 bool TaskToken::operator!=(const TaskToken& other) const {
54 ~ScopedSetSequenceTokenForCurrentThread() { 56 return !(*this == other);
55 DCHECK_EQ(tls_current_sequence_token.Get().Get(), this); 57 }
56 tls_current_sequence_token.Get().Set(nullptr); 58
59 bool TaskToken::IsValid() const {
60 return token_ != kInvalidTaskToken;
61 }
62
63 TaskToken TaskToken::Create() {
64 return TaskToken(g_task_token_generator.GetNext());
65 }
66
67 TaskToken TaskToken::GetForCurrentThread() {
68 const ScopedSetSequenceAndTaskTokenForCurrentThread*
69 current_sequence_and_task_token =
70 tls_current_sequence_and_task_token.Get().Get();
71 return current_sequence_and_task_token
72 ? current_sequence_and_task_token->task_token_
73 : TaskToken();
74 }
75
76 ScopedSetSequenceAndTaskTokenForCurrentThread::
77 ScopedSetSequenceAndTaskTokenForCurrentThread(
78 const SequenceToken& sequence_token)
79 : sequence_token_(sequence_token), task_token_(TaskToken::Create()) {
80 DCHECK(!tls_current_sequence_and_task_token.Get().Get());
81 tls_current_sequence_and_task_token.Get().Set(this);
82 }
83
84 ScopedSetSequenceAndTaskTokenForCurrentThread::
85 ~ScopedSetSequenceAndTaskTokenForCurrentThread() {
86 DCHECK_EQ(tls_current_sequence_and_task_token.Get().Get(), this);
87 tls_current_sequence_and_task_token.Get().Set(nullptr);
57 } 88 }
58 89
59 } // namespace base 90 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698