mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
db3625a3b0
Summary: RuntimeExecutor is currently declared inside NativeToJsBridge. It doesn't need to be: Instance.cpp can use NativeToJsBridge::runOnExecutorQueue to schedule work on the JS Thread. So, this diff moves RuntimeExecutor out of NativeToJsBridge into Instance.cpp. Now, both the JS CallInvoker and the RuntimeExecutor are declared in the same file. Changelog: [Internal] Reviewed By: JoshuaGross Differential Revision: D27975840 fbshipit-source-id: aa06f479fa24bb7a15bfd21712df5414a183266c
137 lines
4.0 KiB
C++
137 lines
4.0 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <functional>
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include <ReactCommon/CallInvoker.h>
|
|
#include <ReactCommon/RuntimeExecutor.h>
|
|
#include <cxxreact/JSExecutor.h>
|
|
|
|
namespace folly {
|
|
struct dynamic;
|
|
}
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
struct InstanceCallback;
|
|
class JsToNativeBridge;
|
|
class MessageQueueThread;
|
|
class ModuleRegistry;
|
|
class RAMBundleRegistry;
|
|
|
|
// This class manages calls from native code to JS. It also manages
|
|
// executors and their threads. All functions here can be called from
|
|
// any thread.
|
|
//
|
|
// Except for loadBundleSync(), all void methods will queue
|
|
// work to run on the jsQueue passed to the ctor, and return
|
|
// immediately.
|
|
class NativeToJsBridge {
|
|
public:
|
|
friend class JsToNativeBridge;
|
|
|
|
/**
|
|
* This must be called on the main JS thread.
|
|
*/
|
|
NativeToJsBridge(
|
|
JSExecutorFactory *jsExecutorFactory,
|
|
std::shared_ptr<ModuleRegistry> registry,
|
|
std::shared_ptr<MessageQueueThread> jsQueue,
|
|
std::shared_ptr<InstanceCallback> callback);
|
|
virtual ~NativeToJsBridge();
|
|
|
|
/**
|
|
* Executes a function with the module ID and method ID and any additional
|
|
* arguments in JS.
|
|
*/
|
|
void callFunction(
|
|
std::string &&module,
|
|
std::string &&method,
|
|
folly::dynamic &&args);
|
|
|
|
/**
|
|
* Invokes a callback with the cbID, and optional additional arguments in JS.
|
|
*/
|
|
void invokeCallback(double callbackId, folly::dynamic &&args);
|
|
|
|
/**
|
|
* Sets global variables in the JS Context.
|
|
*/
|
|
void initializeRuntime();
|
|
|
|
/**
|
|
* Starts the JS application. If bundleRegistry is non-null, then it is
|
|
* used to fetch JavaScript modules as individual scripts.
|
|
* Otherwise, the script is assumed to include all the modules.
|
|
*/
|
|
void loadBundle(
|
|
std::unique_ptr<RAMBundleRegistry> bundleRegistry,
|
|
std::unique_ptr<const JSBigString> startupCode,
|
|
std::string sourceURL);
|
|
void loadBundleSync(
|
|
std::unique_ptr<RAMBundleRegistry> bundleRegistry,
|
|
std::unique_ptr<const JSBigString> startupCode,
|
|
std::string sourceURL);
|
|
|
|
void registerBundle(uint32_t bundleId, const std::string &bundlePath);
|
|
void setGlobalVariable(
|
|
std::string propName,
|
|
std::unique_ptr<const JSBigString> jsonValue);
|
|
void *getJavaScriptContext();
|
|
bool isInspectable();
|
|
bool isBatchActive();
|
|
|
|
void handleMemoryPressure(int pressureLevel);
|
|
|
|
/**
|
|
* Synchronously tears down the bridge and the main executor.
|
|
*/
|
|
void destroy();
|
|
|
|
void runOnExecutorQueue(std::function<void(JSExecutor *)> task);
|
|
|
|
/**
|
|
* Native CallInvoker is used by TurboModules to schedule work on the
|
|
* NativeModule thread(s).
|
|
*/
|
|
std::shared_ptr<CallInvoker> getDecoratedNativeCallInvoker(
|
|
std::shared_ptr<CallInvoker> nativeInvoker);
|
|
|
|
private:
|
|
// This is used to avoid a race condition where a proxyCallback gets queued
|
|
// after ~NativeToJsBridge(), on the same thread. In that case, the callback
|
|
// will try to run the task on m_callback which will have been destroyed
|
|
// within ~NativeToJsBridge(), thus causing a SIGSEGV.
|
|
std::shared_ptr<bool> m_destroyed;
|
|
std::shared_ptr<JsToNativeBridge> m_delegate;
|
|
std::unique_ptr<JSExecutor> m_executor;
|
|
std::shared_ptr<MessageQueueThread> m_executorMessageQueueThread;
|
|
|
|
// Memoize this on the JS thread, so that it can be inspected from
|
|
// any thread later. This assumes inspectability doesn't change for
|
|
// a JSExecutor instance, which is true for all existing implementations.
|
|
bool m_inspectable;
|
|
|
|
// Keep track of whether the JS bundle containing the application logic causes
|
|
// exception when evaluated initially. If so, more calls to JS will very
|
|
// likely fail as well, so this flag can help prevent them.
|
|
bool m_applicationScriptHasFailure = false;
|
|
|
|
#ifdef WITH_FBSYSTRACE
|
|
std::atomic_uint_least32_t m_systraceCookie = ATOMIC_VAR_INIT(0);
|
|
#endif
|
|
};
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|