url_request_context_getter.cc 2.2 KB

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