blob: 9689014d4ad8ebe08b487e228f7fa67b6e052e7f [file] [log] [blame]
jam@chromium.org533df722012-02-16 07:07:34 +09001// 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
joth@chromium.orgdb2811b2012-09-11 04:18:53 +09009SupportsUserData::SupportsUserData() {
10 // Harmless to construct on a different thread to subsequent usage.
11 thread_checker_.DetachFromThread();
12}
jam@chromium.org533df722012-02-16 07:07:34 +090013
14SupportsUserData::Data* SupportsUserData::GetUserData(const void* key) const {
joth@chromium.orgdb2811b2012-09-11 04:18:53 +090015 DCHECK(thread_checker_.CalledOnValidThread());
jam@chromium.org533df722012-02-16 07:07:34 +090016 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) {
joth@chromium.orgdb2811b2012-09-11 04:18:53 +090023 DCHECK(thread_checker_.CalledOnValidThread());
jam@chromium.org533df722012-02-16 07:07:34 +090024 user_data_[key] = linked_ptr<Data>(data);
25}
26
avi@chromium.orgb2d507b2012-08-12 11:25:13 +090027void SupportsUserData::RemoveUserData(const void* key) {
joth@chromium.orgdb2811b2012-09-11 04:18:53 +090028 DCHECK(thread_checker_.CalledOnValidThread());
avi@chromium.orgb2d507b2012-08-12 11:25:13 +090029 user_data_.erase(key);
30}
31
joth@chromium.orgdb2811b2012-09-11 04:18:53 +090032void SupportsUserData::DetachUserDataThread() {
33 thread_checker_.DetachFromThread();
34}
35
36SupportsUserData::~SupportsUserData() {
37 DCHECK(thread_checker_.CalledOnValidThread() || user_data_.empty());
jyasskin@chromium.org9c355a32014-05-30 05:10:36 +090038 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.
joth@chromium.orgdb2811b2012-09-11 04:18:53 +090043}
rsleevi@chromium.orgd55e9a42012-06-26 15:23:00 +090044
jam@chromium.org533df722012-02-16 07:07:34 +090045} // namespace base