Make sure handles of callbacks are releases on exit
Some callbacks are stored in native resources that not managed by JavaScript, so when those resources are destroyed the JavaScript context may already be destroyed, and releasing callbacks then would result in crash.
This commit is contained in:
parent
acf4372cf7
commit
d70706f876
2 changed files with 66 additions and 11 deletions
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include "atom/common/native_mate_converters/callback.h"
|
||||
|
||||
#include "atom/browser/atom_browser_main_parts.h"
|
||||
|
||||
namespace mate {
|
||||
|
||||
namespace internal {
|
||||
|
@ -54,6 +56,33 @@ v8::Local<v8::Value> BindFunctionWith(v8::Isolate* isolate,
|
|||
|
||||
} // namespace
|
||||
|
||||
SafeV8Function::SafeV8Function(v8::Isolate* isolate, v8::Local<v8::Value> value)
|
||||
: v8_function_(new RefCountedPersistent<v8::Function>(isolate, value)),
|
||||
weak_factory_(this) {
|
||||
Init();
|
||||
}
|
||||
|
||||
SafeV8Function::SafeV8Function(const SafeV8Function& other)
|
||||
: v8_function_(other.v8_function_),
|
||||
weak_factory_(this) {
|
||||
Init();
|
||||
}
|
||||
|
||||
v8::Local<v8::Function> SafeV8Function::NewHandle() const {
|
||||
return v8_function_->NewHandle();
|
||||
}
|
||||
|
||||
void SafeV8Function::Init() {
|
||||
if (Locker::IsBrowserProcess() && atom::AtomBrowserMainParts::Get())
|
||||
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(
|
||||
base::Bind(&SafeV8Function::FreeHandle, weak_factory_.GetWeakPtr()));
|
||||
}
|
||||
|
||||
void SafeV8Function::FreeHandle() {
|
||||
Locker locker(v8_function_->isolate());
|
||||
v8_function_ = nullptr;
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> CreateFunctionFromTranslater(
|
||||
v8::Isolate* isolate, const Translater& translater) {
|
||||
// The FunctionTemplate is cached.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue