From 912f11f92b3e18e110d3e63d2a37a1fa90daa15e Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Tue, 21 Jul 2015 11:31:44 -0700 Subject: [PATCH] Bug 1179924 - Create a more modern JS object holder for cross-thread references to JS objects. r=smaug --- xpcom/base/JSObjectHolder.cpp | 9 ++++++++ xpcom/base/JSObjectHolder.h | 42 +++++++++++++++++++++++++++++++++++ xpcom/base/moz.build | 2 ++ 3 files changed, 53 insertions(+) create mode 100644 xpcom/base/JSObjectHolder.cpp create mode 100644 xpcom/base/JSObjectHolder.h diff --git a/xpcom/base/JSObjectHolder.cpp b/xpcom/base/JSObjectHolder.cpp new file mode 100644 index 00000000000..5bcc3cabbf4 --- /dev/null +++ b/xpcom/base/JSObjectHolder.cpp @@ -0,0 +1,9 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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/. */ + +#include "JSObjectHolder.h" + +NS_IMPL_ISUPPORTS(mozilla::JSObjectHolder, nsISupports) diff --git a/xpcom/base/JSObjectHolder.h b/xpcom/base/JSObjectHolder.h new file mode 100644 index 00000000000..7b83b813db2 --- /dev/null +++ b/xpcom/base/JSObjectHolder.h @@ -0,0 +1,42 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* 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 mozilla_JSObjectHolder_h +#define mozilla_JSObjectHolder_h + +#include "js/RootingAPI.h" +#include "nsISupportsImpl.h" + +namespace mozilla { + +// This class is useful when something on one thread needs to keep alive +// a JS Object from another thread. If they are both on the same thread, the +// owning class should instead be made a cycle collected SCRIPT_HOLDER class. +// This object should only be AddRefed and Released on the same thread as +// mJSObject. +// +// Note that this keeps alive the JS object until it goes away, so be sure not to +// create cycles that keep alive the holder. +// +// JSObjectHolder is ISupports to make it usable with NS_ReleaseOnMainThread. +class JSObjectHolder final : public nsISupports +{ +public: + JSObjectHolder(JSContext* aCx, JSObject* aObject) : mJSObject(aCx, aObject) {} + + NS_DECL_ISUPPORTS + + JSObject* GetJSObject() { return mJSObject; } + +private: + ~JSObjectHolder() {} + + JS::PersistentRooted mJSObject; +}; + +} // namespace mozilla + +#endif // mozilla_JSObjectHolder_h diff --git a/xpcom/base/moz.build b/xpcom/base/moz.build index c9ddd3f42fd..bb2f2619a3e 100644 --- a/xpcom/base/moz.build +++ b/xpcom/base/moz.build @@ -75,6 +75,7 @@ EXPORTS.mozilla += [ 'DeferredFinalize.h', 'ErrorNames.h', 'HoldDropJSObjects.h', + 'JSObjectHolder.h', 'LinuxUtils.h', 'nsMemoryInfoDumper.h', 'StaticMutex.h', @@ -98,6 +99,7 @@ UNIFIED_SOURCES += [ 'DeferredFinalize.cpp', 'ErrorNames.cpp', 'HoldDropJSObjects.cpp', + 'JSObjectHolder.cpp', 'nsConsoleMessage.cpp', 'nsConsoleService.cpp', 'nsCycleCollector.cpp',