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
7namespace base {
8
9SupportsUserData::SupportsUserData() {
10  // Harmless to construct on a different thread to subsequent usage.
11  thread_checker_.DetachFromThread();
12}
13
14SupportsUserData::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
22void SupportsUserData::SetUserData(const void* key, Data* data) {
23  DCHECK(thread_checker_.CalledOnValidThread());
24  user_data_[key] = linked_ptr<Data>(data);
25}
26
27void SupportsUserData::RemoveUserData(const void* key) {
28  DCHECK(thread_checker_.CalledOnValidThread());
29  user_data_.erase(key);
30}
31
32void SupportsUserData::DetachUserDataThread() {
33  thread_checker_.DetachFromThread();
34}
35
36SupportsUserData::~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