create_thread_identity.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * Copyright 2017 The Abseil Authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * https://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. // Interface for getting the current ThreadIdentity, creating one if necessary.
  17. // See thread_identity.h.
  18. //
  19. // This file is separate from thread_identity.h because creating a new
  20. // ThreadIdentity requires slightly higher level libraries (per_thread_sem
  21. // and low_level_alloc) than accessing an existing one. This separation allows
  22. // us to have a smaller //absl/base:base.
  23. #ifndef ABSL_SYNCHRONIZATION_INTERNAL_CREATE_THREAD_IDENTITY_H_
  24. #define ABSL_SYNCHRONIZATION_INTERNAL_CREATE_THREAD_IDENTITY_H_
  25. #include "absl/base/internal/thread_identity.h"
  26. #include "absl/base/port.h"
  27. namespace absl {
  28. ABSL_NAMESPACE_BEGIN
  29. namespace synchronization_internal {
  30. // Allocates and attaches a ThreadIdentity object for the calling thread.
  31. // For private use only.
  32. base_internal::ThreadIdentity* CreateThreadIdentity();
  33. // A per-thread destructor for reclaiming associated ThreadIdentity objects.
  34. // For private use only.
  35. void ReclaimThreadIdentity(void* v);
  36. // Returns the ThreadIdentity object representing the calling thread; guaranteed
  37. // to be unique for its lifetime. The returned object will remain valid for the
  38. // program's lifetime; although it may be re-assigned to a subsequent thread.
  39. // If one does not exist for the calling thread, allocate it now.
  40. inline base_internal::ThreadIdentity* GetOrCreateCurrentThreadIdentity() {
  41. base_internal::ThreadIdentity* identity =
  42. base_internal::CurrentThreadIdentityIfPresent();
  43. if (ABSL_PREDICT_FALSE(identity == nullptr)) {
  44. return CreateThreadIdentity();
  45. }
  46. return identity;
  47. }
  48. } // namespace synchronization_internal
  49. ABSL_NAMESPACE_END
  50. } // namespace absl
  51. #endif // ABSL_SYNCHRONIZATION_INTERNAL_CREATE_THREAD_IDENTITY_H_