sequence_token.cc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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
  3. // found in the LICENSE file.
  4. #include "base/sequence_token.h"
  5. #include "base/atomic_sequence_num.h"
  6. #include "base/check_op.h"
  7. #include "base/no_destructor.h"
  8. #include "base/threading/thread_local.h"
  9. namespace base {
  10. namespace {
  11. base::AtomicSequenceNumber g_sequence_token_generator;
  12. base::AtomicSequenceNumber g_task_token_generator;
  13. ThreadLocalPointer<const SequenceToken>& GetTlsCurrentSequenceToken() {
  14. static base::NoDestructor<ThreadLocalPointer<const SequenceToken>> instance;
  15. return *instance;
  16. }
  17. ThreadLocalPointer<const TaskToken>& GetTlsCurrentTaskToken() {
  18. static base::NoDestructor<ThreadLocalPointer<const TaskToken>> instance;
  19. return *instance;
  20. }
  21. } // namespace
  22. bool SequenceToken::operator==(const SequenceToken& other) const {
  23. return token_ == other.token_ && IsValid();
  24. }
  25. bool SequenceToken::operator!=(const SequenceToken& other) const {
  26. return !(*this == other);
  27. }
  28. bool SequenceToken::IsValid() const {
  29. return token_ != kInvalidSequenceToken;
  30. }
  31. int SequenceToken::ToInternalValue() const {
  32. return token_;
  33. }
  34. SequenceToken SequenceToken::Create() {
  35. return SequenceToken(g_sequence_token_generator.GetNext());
  36. }
  37. SequenceToken SequenceToken::GetForCurrentThread() {
  38. const SequenceToken* current_sequence_token =
  39. GetTlsCurrentSequenceToken().Get();
  40. return current_sequence_token ? *current_sequence_token : SequenceToken();
  41. }
  42. bool TaskToken::operator==(const TaskToken& other) const {
  43. return token_ == other.token_ && IsValid();
  44. }
  45. bool TaskToken::operator!=(const TaskToken& other) const {
  46. return !(*this == other);
  47. }
  48. bool TaskToken::IsValid() const {
  49. return token_ != kInvalidTaskToken;
  50. }
  51. TaskToken TaskToken::Create() {
  52. return TaskToken(g_task_token_generator.GetNext());
  53. }
  54. TaskToken TaskToken::GetForCurrentThread() {
  55. const TaskToken* current_task_token = GetTlsCurrentTaskToken().Get();
  56. return current_task_token ? *current_task_token : TaskToken();
  57. }
  58. ScopedSetSequenceTokenForCurrentThread::ScopedSetSequenceTokenForCurrentThread(
  59. const SequenceToken& sequence_token)
  60. : sequence_token_(sequence_token), task_token_(TaskToken::Create()) {
  61. DCHECK(!GetTlsCurrentSequenceToken().Get());
  62. DCHECK(!GetTlsCurrentTaskToken().Get());
  63. GetTlsCurrentSequenceToken().Set(&sequence_token_);
  64. GetTlsCurrentTaskToken().Set(&task_token_);
  65. }
  66. ScopedSetSequenceTokenForCurrentThread::
  67. ~ScopedSetSequenceTokenForCurrentThread() {
  68. DCHECK_EQ(GetTlsCurrentSequenceToken().Get(), &sequence_token_);
  69. DCHECK_EQ(GetTlsCurrentTaskToken().Get(), &task_token_);
  70. GetTlsCurrentSequenceToken().Set(nullptr);
  71. GetTlsCurrentTaskToken().Set(nullptr);
  72. }
  73. } // namespace base