jam@chromium.org | 533df72 | 2012-02-16 07:07:34 +0900 | [diff] [blame] | 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 | |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 9 | SupportsUserData::SupportsUserData() { |
| 10 | // Harmless to construct on a different thread to subsequent usage. |
| 11 | thread_checker_.DetachFromThread(); |
| 12 | } |
jam@chromium.org | 533df72 | 2012-02-16 07:07:34 +0900 | [diff] [blame] | 13 | |
| 14 | SupportsUserData::Data* SupportsUserData::GetUserData(const void* key) const { |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 15 | DCHECK(thread_checker_.CalledOnValidThread()); |
jam@chromium.org | 533df72 | 2012-02-16 07:07:34 +0900 | [diff] [blame] | 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) { |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 23 | DCHECK(thread_checker_.CalledOnValidThread()); |
jam@chromium.org | 533df72 | 2012-02-16 07:07:34 +0900 | [diff] [blame] | 24 | user_data_[key] = linked_ptr<Data>(data); |
| 25 | } |
| 26 | |
avi@chromium.org | b2d507b | 2012-08-12 11:25:13 +0900 | [diff] [blame] | 27 | void SupportsUserData::RemoveUserData(const void* key) { |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 28 | DCHECK(thread_checker_.CalledOnValidThread()); |
avi@chromium.org | b2d507b | 2012-08-12 11:25:13 +0900 | [diff] [blame] | 29 | user_data_.erase(key); |
| 30 | } |
| 31 | |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 32 | void SupportsUserData::DetachUserDataThread() { |
| 33 | thread_checker_.DetachFromThread(); |
| 34 | } |
| 35 | |
| 36 | SupportsUserData::~SupportsUserData() { |
| 37 | DCHECK(thread_checker_.CalledOnValidThread() || user_data_.empty()); |
jyasskin@chromium.org | 9c355a3 | 2014-05-30 05:10:36 +0900 | [diff] [blame] | 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. |
joth@chromium.org | db2811b | 2012-09-11 04:18:53 +0900 | [diff] [blame] | 43 | } |
rsleevi@chromium.org | d55e9a4 | 2012-06-26 15:23:00 +0900 | [diff] [blame] | 44 | |
jam@chromium.org | 533df72 | 2012-02-16 07:07:34 +0900 | [diff] [blame] | 45 | } // namespace base |