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:
Scott Kyle 2020-10-13 15:35:51 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 8f45db3b9e
Коммит 42d232901c
2 изменённых файлов: 10 добавлений и 8 удалений

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

@ -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);
}
});
}