Change EventBeatManager and AsyncEventBeat to use RuntimeExecutor

Summary:
Right now we have a raw pointer to the js runtime in Java and we pass that to EventBeatManager's constructor; this diff adds a setter for the runtime ptr and removes it from the member initializer list, so that you can set it later from cpp instead.

Q: Should I just rewrite this to use RuntimeExecutor instead?

Reviewed By: shergin

Differential Revision: D14318893

fbshipit-source-id: 1221dd5959927967bad870f15c901c15e5455874
This commit is contained in:
Emily Janzer 2019-03-12 10:54:32 -07:00 коммит произвёл Facebook Github Bot
Родитель 34b7087515
Коммит 0b266458ea
6 изменённых файлов: 40 добавлений и 31 удалений

Просмотреть файл

@ -52,7 +52,7 @@ public class FabricJSIModuleProvider implements JSIModuleProvider<UIManager> {
@Override
public UIManager get() {
final EventBeatManager eventBeatManager =
new EventBeatManager(mJSContext, mReactApplicationContext);
new EventBeatManager(mReactApplicationContext);
final FabricUIManager uiManager = createUIManager(eventBeatManager);
Systrace.beginSection(
Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "FabricJSIModuleProvider.registerBinding");

Просмотреть файл

@ -27,13 +27,12 @@ public class EventBeatManager implements BatchEventDispatchedListener {
@DoNotStrip private final HybridData mHybridData;
private final ReactApplicationContext mReactApplicationContext;
private static native HybridData initHybrid(long jsContext);
private static native HybridData initHybrid();
private native void beat();
public EventBeatManager(
JavaScriptContextHolder jsContext, ReactApplicationContext reactApplicationContext) {
mHybridData = initHybrid(jsContext.get());
public EventBeatManager(ReactApplicationContext reactApplicationContext) {
mHybridData = initHybrid();
mReactApplicationContext = reactApplicationContext;
}

Просмотреть файл

@ -6,6 +6,8 @@
#include <jsi/jsi.h>
#include <react/core/EventBeat.h>
#include <react/uimanager/primitives.h>
#include "EventBeatManager.h"
namespace facebook {
@ -16,7 +18,7 @@ namespace {
class AsyncEventBeat : public EventBeat {
private:
EventBeatManager* eventBeatManager_;
jsi::Runtime* runtime_;
RuntimeExecutor runtimeExecutor_;
jni::global_ref<jobject> javaUIManager_;
public:
@ -24,11 +26,11 @@ class AsyncEventBeat : public EventBeat {
AsyncEventBeat(
EventBeatManager* eventBeatManager,
jsi::Runtime* runtime,
jni::global_ref<jobject> javaUIManager) {
eventBeatManager_ = eventBeatManager;
runtime_ = runtime;
javaUIManager_ = javaUIManager;
RuntimeExecutor runtimeExecutor,
jni::global_ref<jobject> javaUIManager) :
eventBeatManager_(eventBeatManager),
runtimeExecutor_(std::move(runtimeExecutor)),
javaUIManager_(javaUIManager) {
eventBeatManager->registerEventBeat(this);
}
@ -37,7 +39,9 @@ class AsyncEventBeat : public EventBeat {
}
void induce() const override {
beat(*runtime_);
runtimeExecutor_([=](jsi::Runtime &runtime) {
this->beat(runtime);
});
}
void request() const override {

Просмотреть файл

@ -94,8 +94,6 @@ void Binding::installFabricUIManager(
jni::alias_ref<JavaMessageQueueThread::javaobject> jsMessageQueueThread,
ComponentFactoryDelegate* componentsRegistry,
jni::alias_ref<jobject> reactNativeConfig) {
Runtime* runtime = (Runtime*)jsContextNativePointer;
javaUIManager_ = make_global(javaUIManager);
SharedContextContainer contextContainer =
@ -103,6 +101,8 @@ void Binding::installFabricUIManager(
auto sharedJSMessageQueueThread =
std::make_shared<JMessageQueueThread>(jsMessageQueueThread);
Runtime* runtime = (Runtime*)jsContextNativePointer;
RuntimeExecutor runtimeExecutor =
[runtime, sharedJSMessageQueueThread](
std::function<void(facebook::jsi::Runtime & runtime)>&& callback) {
@ -112,18 +112,20 @@ void Binding::installFabricUIManager(
});
};
eventBeatManager->setRuntimeExecutor(runtimeExecutor);
// TODO: T31905686 Create synchronous Event Beat
jni::global_ref<jobject> localJavaUIManager = javaUIManager_;
EventBeatFactory synchronousBeatFactory =
[eventBeatManager, runtime, localJavaUIManager]() mutable {
[eventBeatManager, runtimeExecutor, localJavaUIManager]() {
return std::make_unique<AsyncEventBeat>(
eventBeatManager, runtime, localJavaUIManager);
eventBeatManager, runtimeExecutor, localJavaUIManager);
};
EventBeatFactory asynchronousBeatFactory =
[eventBeatManager, runtime, localJavaUIManager]() mutable {
[eventBeatManager, runtimeExecutor, localJavaUIManager]() {
return std::make_unique<AsyncEventBeat>(
eventBeatManager, runtime, localJavaUIManager);
eventBeatManager, runtimeExecutor, localJavaUIManager);
};
std::shared_ptr<const ReactNativeConfig> config = std::make_shared<const ReactNativeConfigHolder>(reactNativeConfig);

Просмотреть файл

@ -10,14 +10,16 @@ namespace facebook {
namespace react {
EventBeatManager::EventBeatManager(
Runtime* runtime,
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject)
: runtime_(runtime), jhybridobject_(jhybridobject) {}
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject)
: jhybridobject_(jhybridobject) {}
jni::local_ref<EventBeatManager::jhybriddata> EventBeatManager::initHybrid(
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject,
jlong jsContext) {
return makeCxxInstance((Runtime*)jsContext, jhybridobject);
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject) {
return makeCxxInstance(jhybridobject);
}
void EventBeatManager::setRuntimeExecutor(RuntimeExecutor runtimeExecutor) {
runtimeExecutor_ = runtimeExecutor;
}
void EventBeatManager::registerEventBeat(EventBeat* eventBeat) const {
@ -36,7 +38,9 @@ void EventBeatManager::beat() {
std::lock_guard<std::mutex> lock(mutex_);
for (const auto eventBeat : registeredEventBeats_) {
eventBeat->beat(*runtime_);
runtimeExecutor_([=](jsi::Runtime &runtime) mutable {
eventBeat->beat(runtime);
});
}
}

Просмотреть файл

@ -7,6 +7,7 @@
#include <fb/fbjni.h>
#include <jsi/jsi.h>
#include <react/core/EventBeat.h>
#include <react/uimanager/primitives.h>
#include <mutex>
#include <unordered_set>
@ -24,18 +25,18 @@ class EventBeatManager : public jni::HybridClass<EventBeatManager> {
static void registerNatives();
void setRuntimeExecutor(RuntimeExecutor runtimeExecutor);
void registerEventBeat(EventBeat* eventBeat) const;
void unregisterEventBeat(EventBeat* eventBeat) const;
void beat();
EventBeatManager(
Runtime* runtime,
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject);
EventBeatManager(jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject);
private:
Runtime* runtime_;
RuntimeExecutor runtimeExecutor_;
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject_;
@ -45,8 +46,7 @@ class EventBeatManager : public jni::HybridClass<EventBeatManager> {
mutable std::mutex mutex_;
static jni::local_ref<EventBeatManager::jhybriddata> initHybrid(
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject,
jlong jsContext);
jni::alias_ref<EventBeatManager::jhybriddata> jhybridobject);
};
} // namespace react