CacheStreamControlParent.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. #include "mozilla/dom/cache/CacheStreamControlParent.h"
  6. #include "mozilla/Unused.h"
  7. #include "mozilla/dom/cache/CacheTypes.h"
  8. #include "mozilla/dom/cache/ReadStream.h"
  9. #include "mozilla/dom/cache/StreamList.h"
  10. #include "mozilla/ipc/FileDescriptorSetParent.h"
  11. #include "mozilla/ipc/IPCStreamUtils.h"
  12. #include "mozilla/ipc/PBackgroundParent.h"
  13. #include "mozilla/ipc/PFileDescriptorSetParent.h"
  14. #include "nsISupportsImpl.h"
  15. namespace mozilla {
  16. namespace dom {
  17. namespace cache {
  18. using mozilla::dom::OptionalFileDescriptorSet;
  19. using mozilla::ipc::AutoIPCStream;
  20. using mozilla::ipc::FileDescriptor;
  21. using mozilla::ipc::FileDescriptorSetParent;
  22. using mozilla::ipc::PFileDescriptorSetParent;
  23. // declared in ActorUtils.h
  24. void
  25. DeallocPCacheStreamControlParent(PCacheStreamControlParent* aActor)
  26. {
  27. delete aActor;
  28. }
  29. CacheStreamControlParent::CacheStreamControlParent()
  30. {
  31. MOZ_COUNT_CTOR(cache::CacheStreamControlParent);
  32. }
  33. CacheStreamControlParent::~CacheStreamControlParent()
  34. {
  35. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  36. MOZ_DIAGNOSTIC_ASSERT(!mStreamList);
  37. MOZ_COUNT_DTOR(cache::CacheStreamControlParent);
  38. }
  39. void
  40. CacheStreamControlParent::SerializeControl(CacheReadStream* aReadStreamOut)
  41. {
  42. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  43. MOZ_DIAGNOSTIC_ASSERT(aReadStreamOut);
  44. aReadStreamOut->controlChild() = nullptr;
  45. aReadStreamOut->controlParent() = this;
  46. }
  47. void
  48. CacheStreamControlParent::SerializeStream(CacheReadStream* aReadStreamOut,
  49. nsIInputStream* aStream,
  50. nsTArray<UniquePtr<AutoIPCStream>>& aStreamCleanupList)
  51. {
  52. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  53. MOZ_DIAGNOSTIC_ASSERT(aReadStreamOut);
  54. MOZ_DIAGNOSTIC_ASSERT(aStream);
  55. UniquePtr<AutoIPCStream> autoStream(new AutoIPCStream(aReadStreamOut->stream()));
  56. autoStream->Serialize(aStream, Manager());
  57. aStreamCleanupList.AppendElement(Move(autoStream));
  58. }
  59. void
  60. CacheStreamControlParent::NoteClosedAfterForget(const nsID& aId)
  61. {
  62. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  63. RecvNoteClosed(aId);
  64. }
  65. #ifdef DEBUG
  66. void
  67. CacheStreamControlParent::AssertOwningThread()
  68. {
  69. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  70. }
  71. #endif
  72. void
  73. CacheStreamControlParent::ActorDestroy(ActorDestroyReason aReason)
  74. {
  75. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  76. CloseAllReadStreamsWithoutReporting();
  77. // If the initial SendPStreamControlConstructor() fails we will
  78. // be called before mStreamList is set.
  79. if (!mStreamList) {
  80. return;
  81. }
  82. mStreamList->RemoveStreamControl(this);
  83. mStreamList->NoteClosedAll();
  84. mStreamList = nullptr;
  85. }
  86. bool
  87. CacheStreamControlParent::RecvNoteClosed(const nsID& aId)
  88. {
  89. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  90. MOZ_DIAGNOSTIC_ASSERT(mStreamList);
  91. mStreamList->NoteClosed(aId);
  92. return true;
  93. }
  94. void
  95. CacheStreamControlParent::SetStreamList(StreamList* aStreamList)
  96. {
  97. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  98. MOZ_DIAGNOSTIC_ASSERT(!mStreamList);
  99. mStreamList = aStreamList;
  100. }
  101. void
  102. CacheStreamControlParent::Close(const nsID& aId)
  103. {
  104. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  105. NotifyClose(aId);
  106. Unused << SendClose(aId);
  107. }
  108. void
  109. CacheStreamControlParent::CloseAll()
  110. {
  111. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  112. NotifyCloseAll();
  113. Unused << SendCloseAll();
  114. }
  115. void
  116. CacheStreamControlParent::Shutdown()
  117. {
  118. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  119. if (!Send__delete__(this)) {
  120. // child process is gone, allow actor to be destroyed normally
  121. NS_WARNING("Cache failed to delete stream actor.");
  122. return;
  123. }
  124. }
  125. void
  126. CacheStreamControlParent::NotifyClose(const nsID& aId)
  127. {
  128. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  129. CloseReadStreams(aId);
  130. }
  131. void
  132. CacheStreamControlParent::NotifyCloseAll()
  133. {
  134. NS_ASSERT_OWNINGTHREAD(CacheStreamControlParent);
  135. CloseAllReadStreams();
  136. }
  137. } // namespace cache
  138. } // namespace dom
  139. } // namespace mozilla