7 #import "flutter/fml/synchronization/waitable_event.h"
8 #import "flutter/testing/testing.h"
14 - (nullable instancetype)
init;
15 - (void)dispatchMainTask:(nonnull
void (^)())task;
16 - (void)dispatchRenderTask:(nonnull
void (^)())task;
22 dispatch_queue_t _mainQueue;
23 std::shared_ptr<fml::AutoResetWaitableEvent>
_mainLatch;
31 - (nullable instancetype)
init {
34 _mainQueue = dispatch_queue_create(
"MAIN", DISPATCH_QUEUE_SERIAL);
35 _renderQueue = dispatch_queue_create(
"RENDER", DISPATCH_QUEUE_SERIAL);
41 - (void)dispatchMainTask:(nonnull
void (^)())task {
42 dispatch_async(_mainQueue, task);
45 - (void)dispatchRenderTask:(nonnull
void (^)())task {
50 fml::AutoResetWaitableEvent latch;
51 fml::AutoResetWaitableEvent* pLatch = &latch;
52 dispatch_async(_mainQueue, ^{
59 fml::AutoResetWaitableEvent latch;
60 fml::AutoResetWaitableEvent* pLatch = &latch;
69 TEST(FlutterThreadSynchronizerTest, RegularCommit) {
75 __block
int notifiedResize = 0;
84 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
86 EXPECT_EQ(notifiedResize, 1);
96 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
98 EXPECT_EQ(notifiedResize, 2);
101 __block
int notifiedCommit = 0;
109 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
111 EXPECT_EQ(notifiedCommit, 1);
114 TEST(FlutterThreadSynchronizerTest, ResizingBlocksRenderingUntilSizeMatches) {
121 fml::AutoResetWaitableEvent begunResizingLatch;
122 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
133 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
143 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
150 begunResizing->Signal();
153 begunResizing->Wait();
154 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
164 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
174 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
179 TEST(FlutterThreadSynchronizerTest, ShutdownMakesEverythingNonBlocking) {
183 fml::AutoResetWaitableEvent begunResizingLatch;
184 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
195 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
205 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
216 begunResizing->Signal();
219 begunResizing->Wait();
220 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
231 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
234 TEST(FlutterThreadSynchronizerTest, RegularCommitForMultipleViews) {
238 fml::AutoResetWaitableEvent begunResizingLatch;
239 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
252 begunResizing->Signal();
255 begunResizing->Wait();
256 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
264 begunResizing->Signal();
267 begunResizing->Signal();
268 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
283 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
286 TEST(FlutterThreadSynchronizerTest, ResizingForMultipleViews) {
290 fml::AutoResetWaitableEvent begunResizingLatch;
291 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
307 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
321 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
328 begunResizing->Signal();
331 begunResizing->Wait();
332 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
342 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
352 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
362 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
373 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);