electron/shell/common/gin_helper/pinnable.h
2020-03-24 09:03:29 -07:00

34 lines
883 B
C++

// Copyright (c) 2020 Slack Technologies, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef SHELL_COMMON_GIN_HELPER_PINNABLE_H_
#define SHELL_COMMON_GIN_HELPER_PINNABLE_H_
#include "v8/include/v8.h"
namespace gin_helper {
template <typename T>
class Pinnable {
protected:
// Prevent the object from being garbage collected until Unpin() is called.
void Pin(v8::Isolate* isolate) {
v8::Locker locker(isolate);
v8::HandleScope scope(isolate);
v8::Local<v8::Value> wrapper;
if (static_cast<T*>(this)->GetWrapper(isolate).ToLocal(&wrapper)) {
pinned_.Reset(isolate, wrapper);
}
}
// Allow the object to be garbage collected.
void Unpin() { pinned_.Reset(); }
private:
v8::Global<v8::Value> pinned_;
};
} // namespace gin_helper
#endif // SHELL_COMMON_GIN_HELPER_PINNABLE_H_