1 // Copyright 2012 The Chromium Authors 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 "net/url_request/url_request_context_getter.h" 6 7 #include "base/debug/leak_annotations.h" 8 #include "base/location.h" 9 #include "base/observer_list.h" 10 #include "base/task/single_thread_task_runner.h" 11 #include "net/url_request/url_request_context.h" 12 #include "net/url_request/url_request_context_getter_observer.h" 13 14 namespace net { 15 AddObserver(URLRequestContextGetterObserver * observer)16void URLRequestContextGetter::AddObserver( 17 URLRequestContextGetterObserver* observer) { 18 DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); 19 observer_list_.AddObserver(observer); 20 } 21 RemoveObserver(URLRequestContextGetterObserver * observer)22void URLRequestContextGetter::RemoveObserver( 23 URLRequestContextGetterObserver* observer) { 24 DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); 25 observer_list_.RemoveObserver(observer); 26 } 27 28 URLRequestContextGetter::URLRequestContextGetter() = default; 29 30 URLRequestContextGetter::~URLRequestContextGetter() = default; 31 OnDestruct() const32void URLRequestContextGetter::OnDestruct() const { 33 scoped_refptr<base::SingleThreadTaskRunner> network_task_runner = 34 GetNetworkTaskRunner(); 35 DCHECK(network_task_runner.get()); 36 if (network_task_runner.get()) { 37 if (network_task_runner->BelongsToCurrentThread()) { 38 delete this; 39 } else { 40 if (!network_task_runner->DeleteSoon(FROM_HERE, this)) { 41 // Can't force-delete the object here, because some derived classes 42 // can only be deleted on the owning thread, so just emit a warning to 43 // aid in debugging. 44 DLOG(WARNING) << "URLRequestContextGetter leaking due to no owning" 45 << " thread."; 46 // Let LSan know we know this is a leak. https://crbug.com/594130 47 ANNOTATE_LEAKING_OBJECT_PTR(this); 48 } 49 } 50 } 51 // If no IO task runner was available, we will just leak memory. 52 // This is also true if the IO thread is gone. 53 } 54 NotifyContextShuttingDown()55void URLRequestContextGetter::NotifyContextShuttingDown() { 56 DCHECK(GetNetworkTaskRunner()->BelongsToCurrentThread()); 57 58 // Once shutdown starts, this must always return NULL. 59 DCHECK(!GetURLRequestContext()); 60 61 for (auto& observer : observer_list_) 62 observer.OnContextShuttingDown(); 63 } 64 65 } // namespace net 66