Fix ASAN crash in RCTMessageThread
Summary:
This should fix a race condition uncovered by ASAN build that results in `m_shutdown` being referenced after destruction.
This mirrors a similar fix made in react-native-macos: ea7767a211
Changelog: [Internal]
Reviewed By: shergin
Differential Revision: D24263156
fbshipit-source-id: 5fb1e7053c107dfb7050242fce8fcf0435e5592c
This commit is contained in:
Родитель
8f45db3b9e
Коммит
42d232901c
|
@ -5,6 +5,7 @@
|
|||
* LICENSE file in the root directory of this source tree.
|
||||
*/
|
||||
|
||||
#import <memory>
|
||||
#import <string>
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
@ -15,7 +16,8 @@
|
|||
namespace facebook {
|
||||
namespace react {
|
||||
|
||||
class RCTMessageThread : public MessageQueueThread {
|
||||
class RCTMessageThread : public MessageQueueThread,
|
||||
public std::enable_shared_from_this<RCTMessageThread> {
|
||||
public:
|
||||
RCTMessageThread(NSRunLoop *runLoop, RCTJavaScriptCompleteBlock errorBlock);
|
||||
~RCTMessageThread() override;
|
||||
|
|
|
@ -31,6 +31,7 @@ RCTMessageThread::RCTMessageThread(NSRunLoop *runLoop, RCTJavaScriptCompleteBloc
|
|||
|
||||
RCTMessageThread::~RCTMessageThread()
|
||||
{
|
||||
RCTAssert(m_shutdown, @"RCTMessageThread: quitSynchronous() not called before destructor");
|
||||
CFRelease(m_cfRunLoop);
|
||||
}
|
||||
|
||||
|
@ -76,10 +77,9 @@ void RCTMessageThread::runOnQueue(std::function<void()> &&func)
|
|||
if (m_shutdown) {
|
||||
return;
|
||||
}
|
||||
|
||||
runAsync([this, func = std::make_shared<std::function<void()>>(std::move(func))] {
|
||||
if (!m_shutdown) {
|
||||
tryFunc(*func);
|
||||
runAsync([sharedThis = shared_from_this(), func = std::make_shared<std::function<void()>>(std::move(func))] {
|
||||
if (!sharedThis->m_shutdown) {
|
||||
sharedThis->tryFunc(*func);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -89,9 +89,9 @@ void RCTMessageThread::runOnQueueSync(std::function<void()> &&func)
|
|||
if (m_shutdown) {
|
||||
return;
|
||||
}
|
||||
runSync([this, func = std::move(func)] {
|
||||
if (!m_shutdown) {
|
||||
tryFunc(func);
|
||||
runSync([sharedThis = shared_from_this(), func = std::move(func)] {
|
||||
if (!sharedThis->m_shutdown) {
|
||||
sharedThis->tryFunc(func);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче