eroman@chromium.org | 59a3802 | 2012-03-22 02:29:13 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
eroman@chromium.org | be180c80 | 2009-10-23 06:33:31 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
sanjeevr@chromium.org | abe2c03 | 2011-03-31 18:49:34 | [diff] [blame] | 5 | #include "net/url_request/url_request_context_getter.h" |
| 6 | |
reillyg | 4c58f9e | 2016-03-12 04:52:36 | [diff] [blame] | 7 | #include "base/debug/leak_annotations.h" |
ajwong@chromium.org | c62dd9d | 2011-09-21 18:05:41 | [diff] [blame] | 8 | #include "base/location.h" |
sergeyu@chromium.org | 4969b012 | 2012-06-16 01:58:28 | [diff] [blame] | 9 | #include "base/single_thread_task_runner.h" |
eroman@chromium.org | be180c80 | 2009-10-23 06:33:31 | [diff] [blame] | 10 | #include "net/url_request/url_request_context.h" |
mmenke | 36753833 | 2015-05-09 15:40:53 | [diff] [blame] | 11 | #include "net/url_request/url_request_context_getter_observer.h" |
eroman@chromium.org | be180c80 | 2009-10-23 06:33:31 | [diff] [blame] | 12 | |
sanjeevr@chromium.org | abe2c03 | 2011-03-31 18:49:34 | [diff] [blame] | 13 | namespace net { |
mmenke | 36753833 | 2015-05-09 15:40:53 | [diff] [blame] | 14 | |
| 15 | void URLRequestContextGetter::AddObserver( |
| 16 | URLRequestContextGetterObserver* observer) { |
| 17 | DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); |
| 18 | observer_list_.AddObserver(observer); |
| 19 | } |
| 20 | |
| 21 | void URLRequestContextGetter::RemoveObserver( |
| 22 | URLRequestContextGetterObserver* observer) { |
| 23 | DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); |
| 24 | observer_list_.RemoveObserver(observer); |
| 25 | } |
sanjeevr@chromium.org | 83a7d2eb | 2010-05-03 21:46:19 | [diff] [blame] | 26 | |
willchan@chromium.org | 77feb46 | 2011-05-16 23:37:25 | [diff] [blame] | 27 | URLRequestContextGetter::URLRequestContextGetter() {} |
erg@google.com | 20f0487a | 2010-09-30 20:06:30 | [diff] [blame] | 28 | |
| 29 | URLRequestContextGetter::~URLRequestContextGetter() {} |
| 30 | |
mpcomplete@chromium.org | 00ed48f | 2010-10-22 22:19:24 | [diff] [blame] | 31 | void URLRequestContextGetter::OnDestruct() const { |
sergeyu@chromium.org | 4969b012 | 2012-06-16 01:58:28 | [diff] [blame] | 32 | scoped_refptr<base::SingleThreadTaskRunner> network_task_runner = |
| 33 | GetNetworkTaskRunner(); |
rsleevi@chromium.org | 9049948 | 2013-06-01 00:39:50 | [diff] [blame] | 34 | DCHECK(network_task_runner.get()); |
| 35 | if (network_task_runner.get()) { |
sergeyu@chromium.org | 4969b012 | 2012-06-16 01:58:28 | [diff] [blame] | 36 | if (network_task_runner->BelongsToCurrentThread()) { |
sanjeevr@chromium.org | 83a7d2eb | 2010-05-03 21:46:19 | [diff] [blame] | 37 | delete this; |
sergeyu@chromium.org | 4969b012 | 2012-06-16 01:58:28 | [diff] [blame] | 38 | } else { |
atwilson@chromium.org | a33393c | 2012-08-15 23:52:29 | [diff] [blame] | 39 | if (!network_task_runner->DeleteSoon(FROM_HERE, this)) { |
| 40 | // Can't force-delete the object here, because some derived classes |
| 41 | // can only be deleted on the owning thread, so just emit a warning to |
| 42 | // aid in debugging. |
wez | c59596d1 | 2017-02-23 00:04:56 | [diff] [blame] | 43 | #if !defined(NDEBUG) |
atwilson@chromium.org | a33393c | 2012-08-15 23:52:29 | [diff] [blame] | 44 | DLOG(WARNING) << "URLRequestContextGetter leaking due to no owning" |
wez | c59596d1 | 2017-02-23 00:04:56 | [diff] [blame] | 45 | << " thread. Created at: " << created_at.ToString(); |
| 46 | #endif // !defined(NDEBUG) |
reillyg | 4c58f9e | 2016-03-12 04:52:36 | [diff] [blame] | 47 | // Let LSan know we know this is a leak. https://crbug.com/594130 |
| 48 | ANNOTATE_LEAKING_OBJECT_PTR(this); |
atwilson@chromium.org | a33393c | 2012-08-15 23:52:29 | [diff] [blame] | 49 | } |
sergeyu@chromium.org | 4969b012 | 2012-06-16 01:58:28 | [diff] [blame] | 50 | } |
sanjeevr@chromium.org | 83a7d2eb | 2010-05-03 21:46:19 | [diff] [blame] | 51 | } |
thestig | 529ad8a | 2016-07-08 20:30:12 | [diff] [blame] | 52 | // If no IO task runner was available, we will just leak memory. |
sanjeevr@chromium.org | 83a7d2eb | 2010-05-03 21:46:19 | [diff] [blame] | 53 | // This is also true if the IO thread is gone. |
| 54 | } |
sanjeevr@chromium.org | abe2c03 | 2011-03-31 18:49:34 | [diff] [blame] | 55 | |
mmenke | 36753833 | 2015-05-09 15:40:53 | [diff] [blame] | 56 | void URLRequestContextGetter::NotifyContextShuttingDown() { |
| 57 | DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); |
| 58 | |
| 59 | // Once shutdown starts, this must always return NULL. |
| 60 | DCHECK(!GetURLRequestContext()); |
| 61 | |
ericwilligers | 9d64a5f | 2016-10-18 00:28:49 | [diff] [blame] | 62 | for (auto& observer : observer_list_) |
| 63 | observer.OnContextShuttingDown(); |
mmenke | 36753833 | 2015-05-09 15:40:53 | [diff] [blame] | 64 | } |
| 65 | |
rdsmith@chromium.org | 034dc29f | 2014-05-27 12:55:27 | [diff] [blame] | 66 | TrivialURLRequestContextGetter::TrivialURLRequestContextGetter( |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 67 | URLRequestContext* context, |
rdsmith@chromium.org | 034dc29f | 2014-05-27 12:55:27 | [diff] [blame] | 68 | const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner) |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 69 | : context_(context), main_task_runner_(main_task_runner) { |
| 70 | } |
rdsmith@chromium.org | 034dc29f | 2014-05-27 12:55:27 | [diff] [blame] | 71 | |
| 72 | TrivialURLRequestContextGetter::~TrivialURLRequestContextGetter() {} |
| 73 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 74 | URLRequestContext* TrivialURLRequestContextGetter::GetURLRequestContext() { |
rdsmith@chromium.org | 034dc29f | 2014-05-27 12:55:27 | [diff] [blame] | 75 | return context_; |
| 76 | } |
| 77 | |
| 78 | scoped_refptr<base::SingleThreadTaskRunner> |
| 79 | TrivialURLRequestContextGetter::GetNetworkTaskRunner() const { |
| 80 | return main_task_runner_; |
| 81 | } |
| 82 | |
| 83 | |
sanjeevr@chromium.org | abe2c03 | 2011-03-31 18:49:34 | [diff] [blame] | 84 | } // namespace net |