gecko/dom/system/gonk/NetworkWorker.h
Vicamo Yang a13d595ddb Bug 977995 - remove mNetdWorker from SystemWorkerManager. r=khuey, f=vchang
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.
2014-04-11 22:27:55 +08:00

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