mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
a13d595ddb
There are multiple defects in NetworkWorker and the related parts since the C++ rewrite. 1) NetworkService holds a reference to NetworkWorker and never releases it. It has to wait until the cycle collector comes up to resolve their ownership loop and free NetworkWorker manually. However 2) nsINetworkWorker::shutdown is never called, and that leaves everything living till the end, inclusive of that gNetdConsumer in Netd.cpp. 3) when GC comes to free NetworkWorker, it calls its parent destructor ~NetConsumer(), which in turn calls ~RefCounted<NetdConsumer>(). Having a valid gNetdConsumer in Netd.cpp follows its refCnt is not zero and this triggers an assertion in ~RefCounted<NetdConsumer>(). So, some obvious treatments here. A) NetworkService should call nsINetworkWorker::shutdown upon receiving a shutdown observer event and release the reference to NetworkWorker. B) NetworkWorker should never be double ref-counted. Move NetdConsumer implementation into a separated class.
38 lines
909 B
C++
38 lines
909 B
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#ifndef NetworkWorker_h
|
|
#define NetworkWorker_h
|
|
|
|
#include "mozilla/dom/NetworkOptionsBinding.h"
|
|
#include "mozilla/ipc/Netd.h"
|
|
#include "nsINetworkWorker.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsThread.h"
|
|
|
|
namespace mozilla {
|
|
|
|
class NetworkWorker MOZ_FINAL : public nsINetworkWorker
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSINETWORKWORKER
|
|
|
|
static already_AddRefed<NetworkWorker> FactoryCreate();
|
|
|
|
void DispatchNetworkResult(const mozilla::dom::NetworkResultOptions& aOptions);
|
|
|
|
private:
|
|
NetworkWorker();
|
|
~NetworkWorker();
|
|
|
|
static void NotifyResult(mozilla::dom::NetworkResultOptions& aResult);
|
|
|
|
nsCOMPtr<nsINetworkEventListener> mListener;
|
|
};
|
|
|
|
} // namespace mozilla
|
|
|
|
#endif // NetworkWorker_h
|