react-native/React/Fabric/Utils/MainRunLoopEventBeat.h
Valentin Shergin 4eb9b40979 Fabric: Proper thread synchronization in MainRunLoopEventBeat
Summary:
To dispatch events synchonously on the main thread we still have to block the Message Queue.
We actually dispatch events on the Message Queue while the main thread is waiting.

Reviewed By: mdvacca

Differential Revision: D9799853

fbshipit-source-id: 8033be36f27371ad2f1dc7210d564fbca1174910
2018-09-14 15:21:10 -07:00

38 lines
918 B
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 <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFRunLoop.h>
#include <cxxreact/MessageQueueThread.h>
#include <fabric/events/EventBeat.h>
namespace facebook {
namespace react {
/*
* Event beat associated with main run loop cycle.
* The callback is always called on the main thread.
*/
class MainRunLoopEventBeat final:
public EventBeat {
public:
MainRunLoopEventBeat(std::shared_ptr<MessageQueueThread> messageQueueThread);
~MainRunLoopEventBeat();
void induce() const override;
private:
void blockMessageQueueAndThenBeat() const;
std::shared_ptr<MessageQueueThread> messageQueueThread_;
CFRunLoopObserverRef mainRunLoopObserver_;
};
} // namespace react
} // namespace facebook