REGRESSION(313609@main): visionOS debug uid 1 == main thread invariant
d1483c0
WTF의 Thread와 WorkQueue는 단조 증가하는 UID 네임스페이스를 공유합니다. main work queue의 mainThreadID는 1로 하드코딩되어 있습니다. IDB, DOMCacheEngine, NativePromise resolution 전반에 걸쳐 있는 sequence 안전성 assertion들은 main thread의 Thread::uid() 역시 1이라는 불변 조건에 의존합니다. 이 수정 이전에는 UID 할당이 순서에 따라 결정되었습니다. 즉, Thread 객체를 가장 먼저 생성한 thread가 uid 1을 가져갔습니다.
Source/WTF/wtf/Threading.h
- explicit Thread(SchedulingPolicy schedulingPolicy)
+ enum class IsMain : uint8_t { No, Yes, Unknown };
+
+ explicit Thread(SchedulingPolicy schedulingPolicy, IsMain isMain = IsMain::Unknown)
: m_isRealtime(schedulingPolicy == SchedulingPolicy::Realtime)
+ , m_uid(isMain == IsMain::Yes ? 1 : ++s_uid)
{
}
Source/WTF/wtf/posix/ThreadingPOSIX.cpp
+#if PLATFORM(COCOA)
+ Ref thread = adoptRef(*new Thread(SchedulingPolicy::Other, pthread_main_np() ? IsMain::Yes : IsMain::No));
+#else
Ref thread = adoptRef(*new Thread(SchedulingPolicy::Other));
+#endif
Source/WTF/wtf/MainThread.cpp
+ RELEASE_ASSERT(Thread::currentSingleton().uid() == 1);
visionOS debug 환경에서는 CStringBuffer 생성자 내부의 RefCountDebugger 경로가 initializeMainThread() 실행 전에 libxpc bootstrap queue에서 Thread::currentSingleton()을 호출했습니다. 그 결과 uid 1을 선점하게 되어 실제 main thread는 uid 2를 받게 되었습니다. 이번 수정에서는 IsMain enum이 도입되었습니다. Cocoa 플랫폼에서는 pthread_main_np()를 사용해 main thread를 안정적으로 감지하도록 변경되었고, 이 불변 조건을 강제하는 RELEASE_ASSERT도 추가되었습니다.
Significance
uid 1 == main thread 불변 조건은 WebKit의 전체 concurrency model에서 핵심적인 역할을 합니다. uid가 탈취되면 무관한 코드 경로에서 RELEASE_ASSERT가 조용히 오동작하고, crash가 엉뚱한 위치에서 발생하여 실제 threading 버그가 은폐됩니다.
Audit directions
Aaaaaaaa Aaaaaaa Aaaaaaaa Aaaaaaaaaaaaaaaaa Aaa Aaa Aa Aaa Aaaaaa Aa Aaaaaaaaaaaaaaaaaaaaaaaa Aa Aa Aaaaaaaa Aaaaaaaa Aaaaaaaaa Aaaa Aaa Aaaa Aaa Aa Aa Aaaaa Aa Aaa Aaaaaaaaaaaaaaaaa Aaa a Aaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaa Aaaaaaaaaaaa Aaa Aaa Aaaaaaaaaaaaaaaaa Aaaaaaa Aa Aaaaaaaaaaaaaaaaaa Aaaa Aaaaaa Aaaaaaaaaaaaaaaaa Aa Aaaaaaa Aaaaaa Aaaaaaaaa Aaaa Aaaaa Aaaaaa Aa Aaaaaaaa Aaaa Aaaaaaaaaaaaaaaaaaaa Aa Aaaaa Aaa Aa Aaaa Aaa Aaaaaa Aaa Aaaaaaaaaaaaa Aaa Aa Aaaaaaaa Aaaaaa Aaaaaaaaa Aaaaaaaaa Aaaa Aaaaa Aaa Aaa Aaaaa
🔒The non-Cocoa fallback path and WebThread identity edge cases in the new dispatcher logic are worth investigating.
더 확인하려면 구독해 주세요