123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // Copyright 2017 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #ifndef BASE_THREADING_SEQUENCE_LOCAL_STORAGE_MAP_H_
- #define BASE_THREADING_SEQUENCE_LOCAL_STORAGE_MAP_H_
- #include "base/base_export.h"
- #include "base/containers/flat_map.h"
- #include "base/macros.h"
- namespace base {
- namespace internal {
- // A SequenceLocalStorageMap holds (slot_id) -> (value, destructor) items for a
- // sequence. When a task runs, it is expected that a pointer to its sequence's
- // SequenceLocalStorageMap is set in TLS using
- // ScopedSetSequenceMapLocalStorageForCurrentThread. When a
- // SequenceLocalStorageMap is destroyed, it invokes the destructors associated
- // with values stored within it.
- // The Get() and Set() methods should not be accessed directly.
- // Use SequenceLocalStorageSlot to Get() and Set() values in the current
- // sequence's SequenceLocalStorageMap.
- class BASE_EXPORT SequenceLocalStorageMap {
- public:
- SequenceLocalStorageMap();
- ~SequenceLocalStorageMap();
- // Returns the SequenceLocalStorage bound to the current thread. It is invalid
- // to call this outside the scope of a
- // ScopedSetSequenceLocalStorageForCurrentThread.
- static SequenceLocalStorageMap& GetForCurrentThread();
- // Holds a pointer to a value alongside a destructor for this pointer.
- // Calls the destructor on the value upon destruction.
- class BASE_EXPORT ValueDestructorPair {
- public:
- using DestructorFunc = void(void*);
- ValueDestructorPair(void* value, DestructorFunc* destructor);
- ~ValueDestructorPair();
- ValueDestructorPair(ValueDestructorPair&& value_destructor_pair);
- ValueDestructorPair& operator=(ValueDestructorPair&& value_destructor_pair);
- void* value() const { return value_; }
- private:
- void* value_;
- DestructorFunc* destructor_;
- DISALLOW_COPY_AND_ASSIGN(ValueDestructorPair);
- };
- // Returns the value stored in |slot_id| or nullptr if no value was stored.
- void* Get(int slot_id);
- // Stores |value_destructor_pair| in |slot_id|. Overwrites and destroys any
- // previously stored value.
- void Set(int slot_id, ValueDestructorPair value_destructor_pair);
- private:
- // Map from slot id to ValueDestructorPair.
- // flat_map was chosen because there are expected to be relatively few entries
- // in the map. For low number of entries, flat_map is known to perform better
- // than other map implementations.
- base::flat_map<int, ValueDestructorPair> sls_map_;
- DISALLOW_COPY_AND_ASSIGN(SequenceLocalStorageMap);
- };
- // Within the scope of this object,
- // SequenceLocalStorageMap::GetForCurrentThread() will return a reference to the
- // SequenceLocalStorageMap object passed to the constructor. There can be only
- // one ScopedSetSequenceLocalStorageMapForCurrentThread instance per scope.
- class BASE_EXPORT ScopedSetSequenceLocalStorageMapForCurrentThread {
- public:
- ScopedSetSequenceLocalStorageMapForCurrentThread(
- SequenceLocalStorageMap* sequence_local_storage);
- ~ScopedSetSequenceLocalStorageMapForCurrentThread();
- private:
- DISALLOW_COPY_AND_ASSIGN(ScopedSetSequenceLocalStorageMapForCurrentThread);
- };
- } // namespace internal
- } // namespace base
- #endif // BASE_THREADING_SEQUENCE_LOCAL_STORAGE_MAP_H_
|