Bug 189880 - [WTF] Make isMainThread more reliable
Summary: [WTF] Make isMainThread more reliable
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: New Bugs (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Yusuke Suzuki
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2018-09-22 00:21 PDT by Yusuke Suzuki
Modified: 2018-11-05 15:12 PST (History)
12 users (show)

See Also:


Attachments
Patch (24.91 KB, patch)
2018-09-22 00:28 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (24.91 KB, patch)
2018-09-22 01:28 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (27.63 KB, patch)
2018-09-23 03:44 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Yusuke Suzuki 2018-09-22 00:21:01 PDT
[WTF] Make isMainThread more reliable
Comment 1 Yusuke Suzuki 2018-09-22 00:28:14 PDT
Created attachment 350501 [details]
Patch
Comment 2 Yusuke Suzuki 2018-09-22 01:28:07 PDT
Created attachment 350503 [details]
Patch
Comment 3 Don Olmstead 2018-09-22 11:18:59 PDT
Comment on attachment 350503 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=350503&action=review

Informal r+.

I'm just wondering about the additional symbol check. Its probably good to have those sorts of checks to be absolutely certain. I'm not sure how standardized that header is.

> Source/WTF/wtf/generic/MainThreadGeneric.cpp:33
> +#include <pthread.h>

Is this really generic anymore if it relies on pthread.h being present?

> Source/cmake/OptionsCommon.cmake:137
> +WEBKIT_CHECK_HAVE_SYMBOL(HAVE_PTHREAD_MAIN_NP pthread_main_np pthread_np.h)

There's already a check for whether pthread_np.h is present. Is there a case where pthread_main_np would not be present in that scenario?
Comment 4 Yusuke Suzuki 2018-09-22 11:58:56 PDT
Comment on attachment 350503 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=350503&action=review

>> Source/WTF/wtf/generic/MainThreadGeneric.cpp:33
>> +#include <pthread.h>
> 
> Is this really generic anymore if it relies on pthread.h being present?

We only support two types of thresding models: Windows and Pthreads. Since MainThreadWin.cpp is used for Windows, we can say this requires pthread.h.

>> Source/cmake/OptionsCommon.cmake:137
>> +WEBKIT_CHECK_HAVE_SYMBOL(HAVE_PTHREAD_MAIN_NP pthread_main_np pthread_np.h)
> 
> There's already a check for whether pthread_np.h is present. Is there a case where pthread_main_np would not be present in that scenario?

This code checks pthread_main_np carefully since pthread_np just meams pthread NonPortable. It is not guaranteed that pthread_main_np is included in pthread_np.h when pthread_np.h exists.
Comment 5 Ross Kirsling 2018-09-22 13:29:46 PDT
Thank you for doing this, Yusuke!

Unfortunately, it seems that WinCairo JSC tests still get stuck in Release mode, with all eight subprocesses sitting on this line:
https://github.com/WebKit/webkit/blob/master/Source/JavaScriptCore/jsc.cpp#L172

The stack trace before this patch looked like:
> [External Code]
> [Inline Frame] WTF.dll!std::_Cnd_waitX(_Cnd_internal_imp_t *)
> [Inline Frame] WTF.dll!std::condition_variable::wait(std::unique_lock<std::mutex> &)
> WTF.dll!WTF::WordLock::lockSlow()
> [Inline Frame] WTF.dll!WTF::WordLock::lock()
> [Inline Frame] WTF.dll!WTF::Locker<WTF::WordLock>::lock()
> [Inline Frame] WTF.dll!WTF::Locker<WTF::WordLock>::{ctor}(WTF::WordLock &)
> [Inline Frame] WTF.dll!WTF::holdLock(WTF::WordLock &)
> WTF.dll!WTF::Thread::didExit()
> WTF.dll!WTF::Thread::destructTLS(void * data)
> [External Code]
> jscLib.dll!`anonymous namespace'::jscExit(int status)
> jscLib.dll!main(int argc, char * * argv)
> jscLib.dll!dllLauncherEntryPoint(int argc, const char * * argv)
> jsc.exe!main(int argc, const char * * argv)
> [External Code]

After this patch, it's just the last six lines (i.e. nothing WTF-related appearing).

I'll see whether Debug is different...
Comment 6 Ross Kirsling 2018-09-22 22:39:05 PDT
Hmm, Debug mode completed successfully (for anyone curious: ~8.5 hours, 141 failures).

Will retry Release once more...
Comment 7 Yusuke Suzuki 2018-09-22 22:54:25 PDT
(In reply to Ross Kirsling from comment #6)
> Hmm, Debug mode completed successfully (for anyone curious: ~8.5 hours, 141
> failures).
> 
> Will retry Release once more...

My guess is that std::mutex implementation in Windowsis broken if it is used in TLS destructor. We can avoid this problem if we use spinlock here instead.

Anyway, this patch also touch TLS in TLS destructor. So in addition to this patch, spinlock patch would be requied.
Comment 8 Yusuke Suzuki 2018-09-23 03:36:20 PDT
(In reply to Ross Kirsling from comment #5)
> Thank you for doing this, Yusuke!
> 
> Unfortunately, it seems that WinCairo JSC tests still get stuck in Release
> mode, with all eight subprocesses sitting on this line:
> https://github.com/WebKit/webkit/blob/master/Source/JavaScriptCore/jsc.
> cpp#L172
> 
> The stack trace before this patch looked like:
> > [External Code]
> > [Inline Frame] WTF.dll!std::_Cnd_waitX(_Cnd_internal_imp_t *)
> > [Inline Frame] WTF.dll!std::condition_variable::wait(std::unique_lock<std::mutex> &)
> > WTF.dll!WTF::WordLock::lockSlow()
> > [Inline Frame] WTF.dll!WTF::WordLock::lock()
> > [Inline Frame] WTF.dll!WTF::Locker<WTF::WordLock>::lock()
> > [Inline Frame] WTF.dll!WTF::Locker<WTF::WordLock>::{ctor}(WTF::WordLock &)
> > [Inline Frame] WTF.dll!WTF::holdLock(WTF::WordLock &)
> > WTF.dll!WTF::Thread::didExit()
> > WTF.dll!WTF::Thread::destructTLS(void * data)
> > [External Code]
> > jscLib.dll!`anonymous namespace'::jscExit(int status)
> > jscLib.dll!main(int argc, char * * argv)
> > jscLib.dll!dllLauncherEntryPoint(int argc, const char * * argv)
> > jsc.exe!main(int argc, const char * * argv)
> > [External Code]
> 
> After this patch, it's just the last six lines (i.e. nothing WTF-related
> appearing).
> 
> I'll see whether Debug is different...

And I want to know that whether this `isMainThread()` is working well.
Is this `holdLock()` called inside `if (shouldRemoveThreadFromThreadGroup())` clause?
Or just before `m_didExit = true;`? If the above problem is caused in the latter place, we can say that updated `isMainThread()` seems working as we expected.
Comment 9 Yusuke Suzuki 2018-09-23 03:40:53 PDT
(In reply to Yusuke Suzuki from comment #7)
> (In reply to Ross Kirsling from comment #6)
> > Hmm, Debug mode completed successfully (for anyone curious: ~8.5 hours, 141
> > failures).
> > 
> > Will retry Release once more...
> 
> My guess is that std::mutex implementation in Windowsis broken if it is used
> in TLS destructor. We can avoid this problem if we use spinlock here instead.
> 
> Anyway, this patch also touch TLS in TLS destructor. So in addition to this
> patch, spinlock patch would be requied.

Maybe, the sampling profiler or the other thread taking the mutex, and destroyed by the system. So waiting forever happens.
The way to avoid this is simple, we should move this holdLock code inside `if (shouldRemoveThreadFromThreadGroup())`.
Comment 10 Yusuke Suzuki 2018-09-23 03:44:17 PDT
Created attachment 350560 [details]
Patch
Comment 11 Ross Kirsling 2018-09-23 14:27:52 PDT
Oops, I had dropped the line numbers from that stack trace. This is the holdLock() call:
https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Threading.cpp#L200
So then shouldRemoveThreadFromThreadGroup() definitely seems to be returning `true` for the main thread in a certain scenario (without your patch).

I confirmed that the first patch here doesn't work in Release mode, but I'll try the new one now. :)
Comment 12 Ross Kirsling 2018-09-23 20:31:39 PDT
(In reply to Ross Kirsling from comment #11)
> Oops, I had dropped the line numbers from that stack trace. This is the
> holdLock() call:
> https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Threading.
> cpp#L200
> So then shouldRemoveThreadFromThreadGroup() definitely seems to be returning
> `true` for the main thread in a certain scenario (without your patch).
> 
> I confirmed that the first patch here doesn't work in Release mode, but I'll
> try the new one now. :)

Ugh, I can't believe it. It managed to start running every single test, but at the very end, two subprocesses are hanging in the usual location (jsc.cpp line 172) and so the runner can't exit.
Comment 13 Yusuke Suzuki 2018-09-23 20:36:25 PDT
(In reply to Ross Kirsling from comment #12)
> (In reply to Ross Kirsling from comment #11)
> > Oops, I had dropped the line numbers from that stack trace. This is the
> > holdLock() call:
> > https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Threading.
> > cpp#L200
> > So then shouldRemoveThreadFromThreadGroup() definitely seems to be returning
> > `true` for the main thread in a certain scenario (without your patch).
> > 
> > I confirmed that the first patch here doesn't work in Release mode, but I'll
> > try the new one now. :)
> 
> Ugh, I can't believe it. It managed to start running every single test, but
> at the very end, two subprocesses are hanging in the usual location (jsc.cpp
> line 172) and so the runner can't exit.

Where is the hanging location? And does that mean isMainThread is not working well even with this patch?
Also, I would like to know,

1. what is the value stored in `mainThread` variable in MainThreadWin.cpp
2. what is the returned value from Thread::currentID() in such situation?
3. Is GetCurrentThreadId broken in TLS destructor?
4. Is TLS destructor called in the main thread?
Comment 14 Ross Kirsling 2018-09-23 21:32:42 PDT
(In reply to Yusuke Suzuki from comment #13)
> (In reply to Ross Kirsling from comment #12)
> > (In reply to Ross Kirsling from comment #11)
> > > Oops, I had dropped the line numbers from that stack trace. This is the
> > > holdLock() call:
> > > https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Threading.
> > > cpp#L200
> > > So then shouldRemoveThreadFromThreadGroup() definitely seems to be returning
> > > `true` for the main thread in a certain scenario (without your patch).
> > > 
> > > I confirmed that the first patch here doesn't work in Release mode, but I'll
> > > try the new one now. :)
> > 
> > Ugh, I can't believe it. It managed to start running every single test, but
> > at the very end, two subprocesses are hanging in the usual location (jsc.cpp
> > line 172) and so the runner can't exit.
> 
> Where is the hanging location? And does that mean isMainThread is not
> working well even with this patch?
> Also, I would like to know,
> 
> 1. what is the value stored in `mainThread` variable in MainThreadWin.cpp
> 2. what is the returned value from Thread::currentID() in such situation?
> 3. Is GetCurrentThreadId broken in TLS destructor?
> 4. Is TLS destructor called in the main thread?

Both subprocesses are hung in the location mentioned above:
> [External Code] 
> jscLib.dll!`anonymous namespace'::jscExit(int status) Line 172
> jscLib.dll!main(int argc, char * * argv) Line 2270
> jscLib.dll!dllLauncherEntryPoint(int argc, const char * * argv) Line 2850
> jsc.exe!main(int argc, const char * * argv) Line 222
> [External Code] 

So jscExit is calling `exit(status);` (with status 0, FWIW).

It seems clear that isMainThread is not working *before* the patch, but it's unclear with the patch.

I'm not sure if any of the other questions can be answered by simply attaching to process, without rebuilding and rerunning...? The call stack is so short and uninformative, and using "WTF::isMainThread()" as a watch expression doesn't seem to work.
Comment 15 Don Olmstead 2018-09-24 14:10:29 PDT
(In reply to Ross Kirsling from comment #14)
> (In reply to Yusuke Suzuki from comment #13)
> > (In reply to Ross Kirsling from comment #12)
> > > (In reply to Ross Kirsling from comment #11)
> > > > Oops, I had dropped the line numbers from that stack trace. This is the
> > > > holdLock() call:
> > > > https://github.com/WebKit/webkit/blob/master/Source/WTF/wtf/Threading.
> > > > cpp#L200
> > > > So then shouldRemoveThreadFromThreadGroup() definitely seems to be returning
> > > > `true` for the main thread in a certain scenario (without your patch).
> > > > 
> > > > I confirmed that the first patch here doesn't work in Release mode, but I'll
> > > > try the new one now. :)
> > > 
> > > Ugh, I can't believe it. It managed to start running every single test, but
> > > at the very end, two subprocesses are hanging in the usual location (jsc.cpp
> > > line 172) and so the runner can't exit.
> > 
> > Where is the hanging location? And does that mean isMainThread is not
> > working well even with this patch?
> > Also, I would like to know,
> > 
> > 1. what is the value stored in `mainThread` variable in MainThreadWin.cpp
> > 2. what is the returned value from Thread::currentID() in such situation?
> > 3. Is GetCurrentThreadId broken in TLS destructor?
> > 4. Is TLS destructor called in the main thread?
> 
> Both subprocesses are hung in the location mentioned above:
> > [External Code] 
> > jscLib.dll!`anonymous namespace'::jscExit(int status) Line 172
> > jscLib.dll!main(int argc, char * * argv) Line 2270
> > jscLib.dll!dllLauncherEntryPoint(int argc, const char * * argv) Line 2850
> > jsc.exe!main(int argc, const char * * argv) Line 222
> > [External Code] 
> 
> So jscExit is calling `exit(status);` (with status 0, FWIW).
> 
> It seems clear that isMainThread is not working *before* the patch, but it's
> unclear with the patch.
> 
> I'm not sure if any of the other questions can be answered by simply
> attaching to process, without rebuilding and rerunning...? The call stack is
> so short and uninformative, and using "WTF::isMainThread()" as a watch
> expression doesn't seem to work.

Ok so its dying at exit.

So according to MSDN https://msdn.microsoft.com/en-us/library/6wdz5232.aspx#Anchor_1

> The exit function calls destructors for thread-local objects, then calls—in last-in-first-out (LIFO) order—the functions that are registered by atexit and _onexit, and then flushes all file buffers before it terminates the process.

You could try and register a function and see if it ever gets to it. Possibly some destructor is getting called and stalling.
Comment 16 Ross Kirsling 2018-09-24 16:08:17 PDT
Oops, looking at the outstanding questions again...

> 4. Is TLS destructor called in the main thread?

This is surely false given the shortened call stack which seems not to enter WTF.

What's also interesting is that before the patch, I tried adding a printf to isMainThread to see the comparison it was making when called from shouldRemoveThreadFromThreadGroup. (This printf was enough to cause Debug mode to succeed for some strange reason, but Release mode failed in the original way, i.e. eight hanging subprocesses with the main thread waiting for the thread group lock.) The only comparisons that were printed out were for child threads -- I never saw a comparison of the main thread ID against itself for subprocesses that exited successfully, and the hanging subprocesses (or at least, the very last one) printed nothing at all.
Comment 17 Ross Kirsling 2018-09-24 21:22:01 PDT
(In reply to Ross Kirsling from comment #16)
> Oops, looking at the outstanding questions again...
> 
> > 4. Is TLS destructor called in the main thread?
> 
> This is surely false given the shortened call stack which seems not to enter
> WTF.
> 
> What's also interesting is that before the patch, I tried adding a printf to
> isMainThread to see the comparison it was making when called from
> shouldRemoveThreadFromThreadGroup. (This printf was enough to cause Debug
> mode to succeed for some strange reason, but Release mode failed in the
> original way, i.e. eight hanging subprocesses with the main thread waiting
> for the thread group lock.) The only comparisons that were printed out were
> for child threads -- I never saw a comparison of the main thread ID against
> itself for subprocesses that exited successfully, and the hanging
> subprocesses (or at least, the very last one) printed nothing at all.

With the current patch, if I add a print statement to isMainThread when called from shouldRemoveThreadFromThreadGroup, I see exactly the desired output when a subprocess exits properly:
> Running stress/activation-sink-osrexit-default-value.js.dfg-eager
> stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 10992)
> stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 7460)
> stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 2756)
> stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 1 (main: 8252, current: 8252)
> PASS: stress/activation-sink-osrexit-default-value.js.dfg-eager

...while, as before, no output at all when a subprocess hangs:
> Running stress/try-catch-getter-as-get-by-id-register-restoration.js.no-cjit-collect-continuously
Comment 18 Ross Kirsling 2018-09-25 20:00:41 PDT
(In reply to Ross Kirsling from comment #17)
> With the current patch, if I add a print statement to isMainThread when
> called from shouldRemoveThreadFromThreadGroup, I see exactly the desired
> output when a subprocess exits properly:
> > Running stress/activation-sink-osrexit-default-value.js.dfg-eager
> > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 10992)
> > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 7460)
> > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 2756)
> > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 1 (main: 8252, current: 8252)
> > PASS: stress/activation-sink-osrexit-default-value.js.dfg-eager
> 
> ...while, as before, no output at all when a subprocess hangs:
> > Running stress/try-catch-getter-as-get-by-id-register-restoration.js.no-cjit-collect-continuously

Other things I managed to confirm:
- There is no sampling profiler thread interfering (ENABLE_SAMPLING_PROFILER is true but Options::useSamplingProfiler is false).
- I ensured that the buffer is flushed after printing, but still no output in the hanging case.
- I attached an atexit() from initializeMainThreadPlatform() -- it fires as expected in the normal case and does not fire in the hanging case.

I think all of this suffices to answer the questions you asked and I think that the most recent change related to m_didExit shouldn't be necessary (since I believe your earlier patch fixes the isMainThread invalidity?)...but I'm still very confused as to what could possibly be missing.
Comment 19 Yusuke Suzuki 2018-09-26 00:14:01 PDT
(In reply to Ross Kirsling from comment #18)
> (In reply to Ross Kirsling from comment #17)
> > With the current patch, if I add a print statement to isMainThread when
> > called from shouldRemoveThreadFromThreadGroup, I see exactly the desired
> > output when a subprocess exits properly:
> > > Running stress/activation-sink-osrexit-default-value.js.dfg-eager
> > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 10992)
> > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 7460)
> > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 2756)
> > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 1 (main: 8252, current: 8252)
> > > PASS: stress/activation-sink-osrexit-default-value.js.dfg-eager
> > 
> > ...while, as before, no output at all when a subprocess hangs:
> > > Running stress/try-catch-getter-as-get-by-id-register-restoration.js.no-cjit-collect-continuously

Does this mean `shouldRemoveThreadFromThreadGroup` is not called when hanging?
In that case, what is the backtrace of the hanging thread? Is `Thread::didExit` still included?

> Other things I managed to confirm:
> - There is no sampling profiler thread interfering (ENABLE_SAMPLING_PROFILER
> is true but Options::useSamplingProfiler is false).
> - I ensured that the buffer is flushed after printing, but still no output
> in the hanging case.
> - I attached an atexit() from initializeMainThreadPlatform() -- it fires as
> expected in the normal case and does not fire in the hanging case.
> 
> I think all of this suffices to answer the questions you asked and I think
> that the most recent change related to m_didExit shouldn't be necessary
> (since I believe your earlier patch fixes the isMainThread
> invalidity?)...but I'm still very confused as to what could possibly be
> missing.

I think the recent change for m_didExit is required anyway since it touches Thread::m_mutex anyway.
For example, concurrent GC thread can take this mutex, and be destroyed earlier.
Comment 20 Ross Kirsling 2018-09-26 09:49:41 PDT
(In reply to Yusuke Suzuki from comment #19)
> (In reply to Ross Kirsling from comment #18)
> > (In reply to Ross Kirsling from comment #17)
> > > With the current patch, if I add a print statement to isMainThread when
> > > called from shouldRemoveThreadFromThreadGroup, I see exactly the desired
> > > output when a subprocess exits properly:
> > > > Running stress/activation-sink-osrexit-default-value.js.dfg-eager
> > > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 10992)
> > > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 7460)
> > > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 0 (main: 8252, current: 2756)
> > > > stress/activation-sink-osrexit-default-value.js.dfg-eager: *isMainThread* 1 (main: 8252, current: 8252)
> > > > PASS: stress/activation-sink-osrexit-default-value.js.dfg-eager
> > > 
> > > ...while, as before, no output at all when a subprocess hangs:
> > > > Running stress/try-catch-getter-as-get-by-id-register-restoration.js.no-cjit-collect-continuously
> 
> Does this mean `shouldRemoveThreadFromThreadGroup` is not called when
> hanging?

Correct.

> In that case, what is the backtrace of the hanging thread? Is
> `Thread::didExit` still included?

No, both versions of the patch produce the same backtrace that I pasted in comment 14 above -- exit() goes into [External Code] and nothing beyond that can be seen. In particular, WTF no longer appears at all.

> > Other things I managed to confirm:
> > - There is no sampling profiler thread interfering (ENABLE_SAMPLING_PROFILER
> > is true but Options::useSamplingProfiler is false).
> > - I ensured that the buffer is flushed after printing, but still no output
> > in the hanging case.
> > - I attached an atexit() from initializeMainThreadPlatform() -- it fires as
> > expected in the normal case and does not fire in the hanging case.
> > 
> > I think all of this suffices to answer the questions you asked and I think
> > that the most recent change related to m_didExit shouldn't be necessary
> > (since I believe your earlier patch fixes the isMainThread
> > invalidity?)...but I'm still very confused as to what could possibly be
> > missing.
> 
> I think the recent change for m_didExit is required anyway since it touches
> Thread::m_mutex anyway.
> For example, concurrent GC thread can take this mutex, and be destroyed
> earlier.

Okay -- I just didn't know whether that could cause a problem with hasExited() elsewhere. :)
Comment 21 Yusuke Suzuki 2018-09-27 10:41:06 PDT
OK! So I think this patch fixes the `isMainThread()` issue.
And now, the other issue appears in Windows JSC tests b/c isMainThread issue is fixed.
Comment 22 Ross Kirsling 2018-09-27 15:41:29 PDT
(In reply to Yusuke Suzuki from comment #21)
> OK! So I think this patch fixes the `isMainThread()` issue.
> And now, the other issue appears in Windows JSC tests b/c isMainThread issue
> is fixed.

Sounds good. It does seem that after this patch, WinCairo JSC tests are able to run to completion in Debug mode, and with --quick and some good luck, it is possible for Release mode to reach completion too. Hopefully we can solve the remaining Release issue in a follow-up.
Comment 23 Mark Lam 2018-09-28 14:30:41 PDT
Comment on attachment 350560 [details]
Patch

r=me
Comment 24 WebKit Commit Bot 2018-09-28 15:32:44 PDT
Comment on attachment 350560 [details]
Patch

Clearing flags on attachment: 350560

Committed r236617: <https://trac.webkit.org/changeset/236617>
Comment 25 WebKit Commit Bot 2018-09-28 15:32:46 PDT
All reviewed patches have been landed.  Closing bug.
Comment 26 Radar WebKit Bug Importer 2018-09-28 15:33:37 PDT
<rdar://problem/44877012>