Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 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 
      5 #include "base/supports_user_data.h"
      6 
      7 namespace base {
      8 
      9 SupportsUserData::SupportsUserData() {
     10   // Harmless to construct on a different thread to subsequent usage.
     11   thread_checker_.DetachFromThread();
     12 }
     13 
     14 SupportsUserData::Data* SupportsUserData::GetUserData(const void* key) const {
     15   DCHECK(thread_checker_.CalledOnValidThread());
     16   DataMap::const_iterator found = user_data_.find(key);
     17   if (found != user_data_.end())
     18     return found->second.get();
     19   return NULL;
     20 }
     21 
     22 void SupportsUserData::SetUserData(const void* key, Data* data) {
     23   DCHECK(thread_checker_.CalledOnValidThread());
     24   user_data_[key] = linked_ptr<Data>(data);
     25 }
     26 
     27 void SupportsUserData::RemoveUserData(const void* key) {
     28   DCHECK(thread_checker_.CalledOnValidThread());
     29   user_data_.erase(key);
     30 }
     31 
     32 void SupportsUserData::DetachUserDataThread() {
     33   thread_checker_.DetachFromThread();
     34 }
     35 
     36 SupportsUserData::~SupportsUserData() {
     37   DCHECK(thread_checker_.CalledOnValidThread() || user_data_.empty());
     38   DataMap local_user_data;
     39   user_data_.swap(local_user_data);
     40   // Now this->user_data_ is empty, and any destructors called transitively from
     41   // the destruction of |local_user_data| will see it that way instead of
     42   // examining a being-destroyed object.
     43 }
     44 
     45 }  // namespace base
     46