Skip to content

Commit

Permalink
Back out "Check for thread consistency in JSCRuntime"
Browse files Browse the repository at this point in the history
Summary:
This check is too aggressive.  We will consider putting it back once we are
more certain nothing will trigger it.

Differential Revision: D13350907

fbshipit-source-id: 6033bdbfe7adb2a18bdf889c090cf271497605e5
  • Loading branch information
mhorowitz authored and facebook-github-bot committed Dec 6, 2018
1 parent 01d7aad commit 3f0f25f
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 33 deletions.
2 changes: 0 additions & 2 deletions ReactCommon/cxxreact/Instance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,6 @@ void Instance::initializeBridge(
m_syncCV.notify_all();
});

// If the NativeToJsBridge ctor throws an exception, this check will
// likely happen before before the redbox can be rendered.
CHECK(nativeToJsBridge_);
}

Expand Down
40 changes: 9 additions & 31 deletions ReactCommon/jsi/JSCRuntime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,6 @@ struct Lock {
void unlock(const jsc::JSCRuntime&) const {}
};

#if __has_builtin(__builtin_expect)
#define JSC_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
#define JSC_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
#else
#define JSC_LIKELY(EXPR) (EXPR)
#define JSC_UNLIKELY(EXPR) (EXPR)
#endif

class JSCRuntime : public jsi::Runtime {
public:
// Creates new context in new context group
Expand Down Expand Up @@ -199,32 +191,23 @@ class JSCRuntime : public jsi::Runtime {
void checkException(JSValueRef exc, const char* msg);
void checkException(JSValueRef res, JSValueRef exc, const char* msg);

void checkThreadId() {
#ifndef NDEBUG
if (JSC_UNLIKELY(tid_ != std::this_thread::get_id())) {
// In the version of JSC on iOS 11, creating a JSContext on one
// thread and using it on another can trigger subtle and nearly
// impossible to debug reentrancy-related crashes in the VM (see
// https://bugs.webkit.org/show_bug.cgi?id=186827). In !NDEBUG
// builds, check for this case and throw an exception, so it can
// be detected early. This could be called anywhere, but for
// now, it's called only in a few less frequently used places to
// avoid unnecessary checks.
throw std::logic_error("Detected JSC thread hazard");
}
#endif
}

JSGlobalContextRef ctx_;
std::atomic<bool> ctxInvalid_;
std::string desc_;
#ifndef NDEBUG
mutable std::atomic<intptr_t> objectCounter_;
mutable std::atomic<intptr_t> stringCounter_;
std::thread::id tid_;
#endif
};

#if __has_builtin(__builtin_expect)
#define JSC_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
#define JSC_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
#else
#define JSC_LIKELY(EXPR) (EXPR)
#define JSC_UNLIKELY(EXPR) (EXPR)
#endif

#define JSC_ASSERT(x) \
do { \
if (JSC_UNLIKELY(!!(x))) { \
Expand Down Expand Up @@ -309,8 +292,7 @@ JSCRuntime::JSCRuntime(JSGlobalContextRef ctx)
#ifndef NDEBUG
,
objectCounter_(0),
stringCounter_(0),
tid_(std::this_thread::get_id())
stringCounter_(0)
#endif
{
}
Expand All @@ -335,8 +317,6 @@ JSCRuntime::~JSCRuntime() {
void JSCRuntime::evaluateJavaScript(
std::unique_ptr<const jsi::Buffer> buffer,
const std::string& sourceURL) {
checkThreadId();

std::string tmp(
reinterpret_cast<const char*>(buffer->data()), buffer->size());
JSStringRef sourceRef = JSStringCreateWithUTF8CString(tmp.c_str());
Expand All @@ -355,8 +335,6 @@ void JSCRuntime::evaluateJavaScript(
}

jsi::Object JSCRuntime::global() {
checkThreadId();

return createObject(JSContextGetGlobalObject(ctx_));
}

Expand Down

0 comments on commit 3f0f25f

Please sign in to comment.