1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/supports_user_data.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker namespace base { 8*635a8641SAndroid Build Coastguard Worker SupportsUserData()9*635a8641SAndroid Build Coastguard WorkerSupportsUserData::SupportsUserData() { 10*635a8641SAndroid Build Coastguard Worker // Harmless to construct on a different execution sequence to subsequent 11*635a8641SAndroid Build Coastguard Worker // usage. 12*635a8641SAndroid Build Coastguard Worker sequence_checker_.DetachFromSequence(); 13*635a8641SAndroid Build Coastguard Worker } 14*635a8641SAndroid Build Coastguard Worker GetUserData(const void * key) const15*635a8641SAndroid Build Coastguard WorkerSupportsUserData::Data* SupportsUserData::GetUserData(const void* key) const { 16*635a8641SAndroid Build Coastguard Worker DCHECK(sequence_checker_.CalledOnValidSequence()); 17*635a8641SAndroid Build Coastguard Worker // Avoid null keys; they are too vulnerable to collision. 18*635a8641SAndroid Build Coastguard Worker DCHECK(key); 19*635a8641SAndroid Build Coastguard Worker DataMap::const_iterator found = user_data_.find(key); 20*635a8641SAndroid Build Coastguard Worker if (found != user_data_.end()) 21*635a8641SAndroid Build Coastguard Worker return found->second.get(); 22*635a8641SAndroid Build Coastguard Worker return nullptr; 23*635a8641SAndroid Build Coastguard Worker } 24*635a8641SAndroid Build Coastguard Worker SetUserData(const void * key,std::unique_ptr<Data> data)25*635a8641SAndroid Build Coastguard Workervoid SupportsUserData::SetUserData(const void* key, 26*635a8641SAndroid Build Coastguard Worker std::unique_ptr<Data> data) { 27*635a8641SAndroid Build Coastguard Worker DCHECK(sequence_checker_.CalledOnValidSequence()); 28*635a8641SAndroid Build Coastguard Worker // Avoid null keys; they are too vulnerable to collision. 29*635a8641SAndroid Build Coastguard Worker DCHECK(key); 30*635a8641SAndroid Build Coastguard Worker user_data_[key] = std::move(data); 31*635a8641SAndroid Build Coastguard Worker } 32*635a8641SAndroid Build Coastguard Worker RemoveUserData(const void * key)33*635a8641SAndroid Build Coastguard Workervoid SupportsUserData::RemoveUserData(const void* key) { 34*635a8641SAndroid Build Coastguard Worker DCHECK(sequence_checker_.CalledOnValidSequence()); 35*635a8641SAndroid Build Coastguard Worker user_data_.erase(key); 36*635a8641SAndroid Build Coastguard Worker } 37*635a8641SAndroid Build Coastguard Worker DetachFromSequence()38*635a8641SAndroid Build Coastguard Workervoid SupportsUserData::DetachFromSequence() { 39*635a8641SAndroid Build Coastguard Worker sequence_checker_.DetachFromSequence(); 40*635a8641SAndroid Build Coastguard Worker } 41*635a8641SAndroid Build Coastguard Worker ~SupportsUserData()42*635a8641SAndroid Build Coastguard WorkerSupportsUserData::~SupportsUserData() { 43*635a8641SAndroid Build Coastguard Worker DCHECK(sequence_checker_.CalledOnValidSequence() || user_data_.empty()); 44*635a8641SAndroid Build Coastguard Worker DataMap local_user_data; 45*635a8641SAndroid Build Coastguard Worker user_data_.swap(local_user_data); 46*635a8641SAndroid Build Coastguard Worker // Now this->user_data_ is empty, and any destructors called transitively from 47*635a8641SAndroid Build Coastguard Worker // the destruction of |local_user_data| will see it that way instead of 48*635a8641SAndroid Build Coastguard Worker // examining a being-destroyed object. 49*635a8641SAndroid Build Coastguard Worker } 50*635a8641SAndroid Build Coastguard Worker 51*635a8641SAndroid Build Coastguard Worker } // namespace base 52