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

Side by Side Diff: base/sequence_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: CR gab #6 (fix comment) 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_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
20 LazyInstance<ThreadLocalPointer<const SequenceToken>>::Leaky
19 tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER; 21 tls_current_sequence_token = LAZY_INSTANCE_INITIALIZER;
20 22
23 LazyInstance<ThreadLocalPointer<const TaskToken>>::Leaky
24 tls_current_task_token = LAZY_INSTANCE_INITIALIZER;
25
21 } // namespace 26 } // namespace
22 27
23 bool SequenceToken::operator==(const SequenceToken& other) const { 28 bool SequenceToken::operator==(const SequenceToken& other) const {
24 return token_ == other.token_ && token_ != kInvalidSequenceToken; 29 return token_ == other.token_ && token_ != kInvalidSequenceToken;
25 } 30 }
26 31
27 bool SequenceToken::operator!=(const SequenceToken& other) const { 32 bool SequenceToken::operator!=(const SequenceToken& other) const {
28 return !(*this == other); 33 return !(*this == other);
29 } 34 }
30 35
31 bool SequenceToken::IsValid() const { 36 bool SequenceToken::IsValid() const {
32 return token_ != kInvalidSequenceToken; 37 return token_ != kInvalidSequenceToken;
33 } 38 }
34 39
35 SequenceToken SequenceToken::Create() { 40 SequenceToken SequenceToken::Create() {
36 return SequenceToken(g_sequence_token_generator.GetNext()); 41 return SequenceToken(g_sequence_token_generator.GetNext());
37 } 42 }
38 43
39 SequenceToken SequenceToken::GetForCurrentThread() { 44 SequenceToken SequenceToken::GetForCurrentThread() {
40 const ScopedSetSequenceTokenForCurrentThread* current_sequence_token = 45 const SequenceToken* current_sequence_token =
41 tls_current_sequence_token.Get().Get(); 46 tls_current_sequence_token.Get().Get();
42 return current_sequence_token ? current_sequence_token->token_ 47 return current_sequence_token ? *current_sequence_token : SequenceToken();
43 : SequenceToken(); 48 }
49
50 bool TaskToken::operator==(const TaskToken& other) const {
51 return token_ == other.token_ && token_ != kInvalidTaskToken;
Lei Zhang 2016/08/08 23:21:26 Just call IsValid() in the latter half?
gab 2016/08/09 15:50:15 Done.
52 }
53
54 bool TaskToken::operator!=(const TaskToken& other) const {
55 return !(*this == other);
56 }
57
58 bool TaskToken::IsValid() const {
59 return token_ != kInvalidTaskToken;
60 }
61
62 TaskToken TaskToken::Create() {
63 return TaskToken(g_task_token_generator.GetNext());
64 }
65
66 TaskToken TaskToken::GetForCurrentThread() {
67 const TaskToken* current_task_token = tls_current_task_token.Get().Get();
68 return current_task_token ? *current_task_token : TaskToken();
44 } 69 }
45 70
46 ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread( 71 ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread(
47 const SequenceToken& token) 72 const SequenceToken& sequence_token)
48 : token_(token) { 73 : sequence_token_(sequence_token), task_token_(TaskToken::Create()) {
49 DCHECK(!tls_current_sequence_token.Get().Get()); 74 DCHECK(!tls_current_sequence_token.Get().Get());
50 tls_current_sequence_token.Get().Set(this); 75 DCHECK(!tls_current_task_token.Get().Get());
76 tls_current_sequence_token.Get().Set(&sequence_token_);
77 tls_current_task_token.Get().Set(&task_token_);
51 } 78 }
52 79
53 ScopedSetSequenceTokenForCurrentThread:: 80 ScopedSetSequenceTokenForCurrentThread::
54 ~ScopedSetSequenceTokenForCurrentThread() { 81 ~ScopedSetSequenceTokenForCurrentThread() {
55 DCHECK_EQ(tls_current_sequence_token.Get().Get(), this); 82 DCHECK_EQ(tls_current_sequence_token.Get().Get(), &sequence_token_);
83 DCHECK_EQ(tls_current_task_token.Get().Get(), &task_token_);
56 tls_current_sequence_token.Get().Set(nullptr); 84 tls_current_sequence_token.Get().Set(nullptr);
85 tls_current_task_token.Get().Set(nullptr);
57 } 86 }
58 87
59 } // namespace base 88 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698