7 #import "flutter/fml/synchronization/waitable_event.h"
8 #import "flutter/testing/testing.h"
20 - (nullable instancetype)
init;
21 - (void)dispatchMainTask:(nonnull
void (^)())task;
22 - (void)dispatchRenderTask:(nonnull
void (^)())task;
28 dispatch_queue_t _mainQueue;
29 std::shared_ptr<fml::AutoResetWaitableEvent>
_mainLatch;
39 - (nullable instancetype)
init {
42 _mainQueue = dispatch_queue_create(
"MAIN", DISPATCH_QUEUE_SERIAL);
43 _renderQueue = dispatch_queue_create(
"RENDER", DISPATCH_QUEUE_SERIAL);
49 - (void)dispatchMainTask:(nonnull
void (^)())task {
50 dispatch_async(_mainQueue, task);
53 - (void)dispatchRenderTask:(nonnull
void (^)())task {
58 fml::AutoResetWaitableEvent latch;
59 fml::AutoResetWaitableEvent* pLatch = &latch;
60 dispatch_async(_mainQueue, ^{
67 fml::AutoResetWaitableEvent latch;
68 fml::AutoResetWaitableEvent* pLatch = &latch;
77 TEST(FlutterThreadSynchronizerTest, RegularCommit) {
83 __block
int notifiedResize = 0;
92 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
94 EXPECT_EQ(notifiedResize, 1);
104 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
106 EXPECT_EQ(notifiedResize, 2);
109 __block
int notifiedCommit = 0;
117 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
119 EXPECT_EQ(notifiedCommit, 1);
122 TEST(FlutterThreadSynchronizerTest, ResizingBlocksRenderingUntilSizeMatches) {
129 fml::AutoResetWaitableEvent begunResizingLatch;
130 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
141 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
151 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
158 begunResizing->Signal();
161 begunResizing->Wait();
162 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
172 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
182 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
187 TEST(FlutterThreadSynchronizerTest, ShutdownMakesEverythingNonBlocking) {
191 fml::AutoResetWaitableEvent begunResizingLatch;
192 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
203 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
213 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
224 begunResizing->Signal();
227 begunResizing->Wait();
228 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
239 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
242 TEST(FlutterThreadSynchronizerTest, RegularCommitForMultipleViews) {
246 fml::AutoResetWaitableEvent begunResizingLatch;
247 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
260 begunResizing->Signal();
263 begunResizing->Wait();
264 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
272 begunResizing->Signal();
275 begunResizing->Signal();
276 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
291 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
294 TEST(FlutterThreadSynchronizerTest, ResizingForMultipleViews) {
298 fml::AutoResetWaitableEvent begunResizingLatch;
299 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
315 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
329 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
336 begunResizing->Signal();
339 begunResizing->Wait();
340 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
350 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
360 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
370 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
381 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);