Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ThreadSanitizer: data race in ViewLayer.forceRender.setter #3827

Closed
1 task done
low-batt opened this issue Jun 13, 2022 · 1 comment · Fixed by #3979
Closed
1 task done

ThreadSanitizer: data race in ViewLayer.forceRender.setter #3827

low-batt opened this issue Jun 13, 2022 · 1 comment · Fixed by #3979

Comments

@low-batt
Copy link
Contributor

System and IINA version:

  • macOS 12.4
  • IINA 1.3.0

Expected behavior:
IINA runs without error under Xcode with the thread sanitizer enabled.

Actual behavior:
Running under Xcode 13.4 on a M1 MacBookPro18,2 the thread sanitizer reports a data race:

SUMMARY: ThreadSanitizer: data race ViewLayer.swift in ViewLayer.needsMPVRender.setter

Multiple threads are accessing this ViewLayer property:

private var needsMPVRender = false
Xcode console:
IINA(67193,0x101ce0580) malloc: nano zone abandoned due to inability to preallocate reserved vm space.
17:41:39.040 [iina][d] IINA 1.3.0 Build 131
17:41:39.043 [iina][d] Copyright © 2017-2022
17:41:39.043 [iina][d] Collider LI, et al.
17:41:39.044 [iina][d] Released under GPLv3.
17:41:39.044 [iina][d] FFmpeg 4.4.2
17:41:39.044 [iina][d]   libavcodec 58.134.100
17:41:39.044 [iina][d]   libavformat 58.76.100
17:41:39.044 [iina][d]   libavutil 56.70.100
17:41:39.044 [iina][d]   libswscale 5.9.100
17:41:39.044 [iina][d] App will launch
17:41:39.044 [iina][d] Got arguments ["-NSDocumentRevisionsDebugMode", "YES"]
17:41:39.044 [iina][d] IINA arguments: []
17:41:39.044 [iina][d] Filenames from arguments: []
IINA 1.3.0 Build 131
This binary is not intended for being used as a command line tool. Please use the bundled iina-cli.
Please ignore this message if you are running in a debug environment.
17:41:39.110 [iina][d] App launched
17:41:39.120 [player0][d] Set path to /Users/low-batt/Library/Developer/Xcode/DerivedData/iina-echacgeisxgbwucwumppkhklmnkd/Build/Products/Debug/IINA.app/Contents/MacOS:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
2022-06-13 17:41:39.120699-0400 IINA[67193:2269519] [logging-persist] cannot open file at line 45530 of [9ff244ce07]
2022-06-13 17:41:39.120797-0400 IINA[67193:2269519] [logging-persist] os_unix.c:45530: (0) open(/var/db/DetachedSignatures) - Undefined error: 0
2022-06-13 17:41:39.213165-0400 IINA[67193:2268943] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x10b175fa0> F8BB1C28-BAE8-11D6-9C31-00039315CD46
17:41:39.222 [iina][d] Using mpv 0.34.1
17:41:39.225 [iina][d] Loading key bindings
17:41:39.227 [player0][d] Track list changed
17:41:39.228 [iina][d] Set key bindings
17:41:39.357 [iina][d] Setting up MediaPlayer integration
2022-06-13 17:41:39.420569-0400 IINA[67193:2268943] Metal API Validation Enabled
17:41:41.631 [iina][d] Menu - Open URL
17:41:50.858 [player0][d] Open URL: file:///Users/low-batt/Movies/The%20World%20in%20HDR%20in%204K%20(ULTRA%20HD).mp4
17:41:50.859 [player0][d] Opening /Users/low-batt/Movies/The World in HDR in 4K (ULTRA HD).mp4 in main window
2022-06-13 17:41:50.883327-0400 IINA[67193:2268943] [Nib Loading] Could not connect action, target class IINA.MainWindowController does not respond to -additionalInfoTitle:
17:41:51.035 [iina][d] Created OpenGL pixel format with [__C._CGLPixelFormatAttribute(rawValue: 5), __C._CGLPixelFormatAttribute(rawValue: 96), __C._CGLPixelFormatAttribute(rawValue: 99), __C._CGLPixelFormatAttribute(rawValue: 12800), __C._CGLPixelFormatAttribute(rawValue: 73), __C._CGLPixelFormatAttribute(rawValue: 101), __C._CGLPixelFormatAttribute(rawValue: 0)]
17:41:51.062 [iina][d] Falling back to nominal display refresh rate: 120.0 from 0.0
17:41:51.064 [iina][d] window!.screen: Built-in Retina Display visible frame (0.0, 24.0, 1728.0, 1055.0)
17:41:51.064 [iina][d] NSScreen.main: Built-in Retina Display visible frame (0.0, 24.0, 1728.0, 1055.0)
17:41:51.065 [iina][d] NSScreen.screens[0]: Built-in Retina Display visible frame (0.0, 24.0, 1728.0, 1055.0)
17:41:51.065 [iina][d] MainWindowLastPosition (0.0, 65.0) matched: Built-in Retina Display visible frame (0.0, 24.0, 1728.0, 1055.0)
17:41:51.082 [player0][d] File started
17:41:51.083 [player0][d] Started auto load
17:41:51.087 [player0][d] Track list changed
17:41:51.089 [player0][d] Track list changed
17:41:51.103 [fmatcher][d] **Start matching
17:41:51.104 [fmatcher][d] Getting all media files...
17:41:51.109 [fmatcher][d] Got all media files, video=15, audio=0
17:41:51.111 [fmatcher][d] Getting all sub files...
17:41:51.113 [fmatcher][d] Searching subtitles from 5 directories...
17:41:51.119 [fmatcher][d] Got 7 subtitles
17:41:51.119 [fmatcher][d] Grouping video files...
17:41:51.119 [fgroup][d] Start grouping 15 files
17:41:51.120 [fmatcher][d] Finished with 1 groups
17:41:51.120 [fmatcher][d] Grouping sub files...
17:41:51.120 [fgroup][d] Start grouping 7 files
17:41:51.121 [fmatcher][d] Finished with 1 groups
17:41:51.121 [fmatcher][d] Matching video and sub series...
17:41:51.121 [fmatcher][d] Calculated editing distance
17:41:51.121 [fmatcher][d] Finished matching.
17:41:51.121 [fmatcher][d] Matching subs with matched series, prefixes=0...
17:41:51.121 [fmatcher][d] Matching for 1
17:41:51.122 [fmatcher][d] Matched 3 subtitles
17:41:51.122 [fmatcher][d] Matching for 2
17:41:51.122 [fmatcher][d] Matched 2 subtitles
17:41:51.123 [fmatcher][d] Matching for 3
17:41:51.123 [fmatcher][d] Matched 2 subtitles
17:41:51.123 [fmatcher][d] Matching for 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789X
17:41:51.123 [fmatcher][d] No matched sub for this file
17:41:51.123 [fmatcher][d] Matching for Adam Savage's One Day Builds - 1000 Shot NERF Blaster!-G7MDrUG4cws
17:41:51.123 [fmatcher][d] No matched sub for this file
17:41:51.123 [fmatcher][d] Matching for Airplaneski
17:41:51.123 [fmatcher][d] No matched sub for this file
17:41:51.124 [fmatcher][d] Matching for earth
17:41:51.124 [fmatcher][d] No matched sub for this file
17:41:51.125 [fmatcher][d] Matching for issue-316
17:41:51.125 [fmatcher][d] No matched sub for this file
17:41:51.125 [fmatcher][d] Matching for issue-3296
17:41:51.125 [fmatcher][d] No matched sub for this file
17:41:51.125 [fmatcher][d] Matching for issue-3331
17:41:51.125 [fmatcher][d] No matched sub for this file
17:41:51.125 [fmatcher][d] Matching for MowieNoSubtett
17:41:51.126 [fmatcher][d] No matched sub for this file
17:41:51.126 [fmatcher][d] Matching for ten
17:41:51.126 [fmatcher][d] No matched sub for this file
17:41:51.126 [fmatcher][d] Matching for The Great Wall
17:41:51.126 [fmatcher][d] No matched sub for this file
17:41:51.126 [fmatcher][d] Matching for The Night of the Hunted (1980)
17:41:51.126 [fmatcher][d] No matched sub for this file
17:41:51.126 [fmatcher][d] Matching for The World in HDR in 4K (ULTRA HD)
17:41:51.126 [fmatcher][d] No matched sub for this file
17:41:51.126 [fmatcher][d] **Finished matching
17:41:51.363 [player0][d] File loaded
17:41:51.364 [player0][d] Track list changed
17:41:51.428 [player0][d] Getting thumbnails
17:41:51.431 [player0][d] Found thumbnail cache
17:41:51.431 [thumbcache][d] Reading thumbnail cache...
17:41:51.431 [player0][d] Playback restarted
17:41:51.431 [thumbcache][d] Reading from /Users/low-batt/Library/Caches/com.colliderli.iina/thumb_cache/5136587baff284aba811c3f47b084be6
17:41:51.478 [thumbcache][d] Finished reading thumbnail cache, 53 in total
==================
WARNING: ThreadSanitizer: data race (pid=67193)
  Write of size 1 at 0x00010a7f6a80 by thread T7:
    #0 ViewLayer.needsMPVRender.setter ViewLayer.swift (IINA:arm64+0x100472fd4)
    #1 ViewLayer.draw(forced:) ViewLayer.swift:146 (IINA:arm64+0x10047781c)
    #2 PlayerCore.playbackRestarted() PlayerCore.swift:1270 (IINA:arm64+0x100577dcc)
    #3 MPVController.handleEvent(_:) MPVController.swift:780 (IINA:arm64+0x1005dab7c)
    #4 closure #1 in MPVController.readEvents() MPVController.swift:701 (IINA:arm64+0x1005d7f84)
    #5 partial apply for closure #1 in MPVController.readEvents() <compiler-generated> (IINA:arm64+0x1005f2420)
    #6 thunk for @escaping @callee_guaranteed () -> () <compiler-generated> (IINA:arm64+0x1000421f8)
    #7 __tsan::invoke_and_release_block(void*) <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7c808)
    #8 _dispatch_client_callout <null>:34125124 (libdispatch.dylib:arm64e+0x63a4)

  Previous read of size 1 at 0x00010a7f6a80 by thread T6:
    #0 ViewLayer.needsMPVRender.getter ViewLayer.swift (IINA:arm64+0x100472eec)
    #1 ViewLayer.draw(forced:) ViewLayer.swift:153 (IINA:arm64+0x10047789c)
    #2 closure #1 in mpvUpdateCallback(_:) MPVController.swift:1277 (IINA:arm64+0x1005ed350)
    #3 partial apply for closure #1 in mpvUpdateCallback(_:) <compiler-generated> (IINA:arm64+0x1005f2cb8)
    #4 thunk for @escaping @callee_guaranteed () -> () <compiler-generated> (IINA:arm64+0x1000421f8)
    #5 __tsan::invoke_and_release_block(void*) <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7c808)
    #6 _dispatch_client_callout <null>:34125124 (libdispatch.dylib:arm64e+0x63a4)

  Location is heap block of size 80 at 0x00010a7f6a40 allocated by main thread:
    #0 calloc <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x59514)
    #1 _objc_rootAllocWithZone <null>:34125124 (libobjc.A.dylib:arm64e+0xc8b4)
    #2 closure #1 in VideoView.videoLayer.getter VideoView.swift:18 (IINA:arm64+0x100491510)
    #3 VideoView.videoLayer.getter VideoView.swift:17 (IINA:arm64+0x1004913e8)
    #4 VideoView.init(frame:) VideoView.swift:60 (IINA:arm64+0x100494b74)
    #5 @objc VideoView.init(frame:) <compiler-generated> (IINA:arm64+0x1004952a0)
    #6 VideoView.__allocating_init(frame:player:) VideoView.swift:74 (IINA:arm64+0x1004953d0)
    #7 MainWindowController._videoView.getter MainWindowController.swift:78 (IINA:arm64+0x1001d7b78)
    #8 MainWindowController.videoView.getter MainWindowController.swift:75 (IINA:arm64+0x1001d7784)
    #9 MainWindowController.addVideoViewToWindow() MainWindowController.swift:626 (IINA:arm64+0x100206e10)
    #10 MainWindowController.windowDidLoad() MainWindowController.swift:531 (IINA:arm64+0x100203668)
    #11 @objc MainWindowController.windowDidLoad() <compiler-generated> (IINA:arm64+0x100205c00)
    #12 -[NSWindowController _windowDidLoad] <null>:34125124 (AppKit:arm64e+0x1ffa50)
    #13 PlayerCore.open(_:shouldAutoLoad:) PlayerCore.swift:168 (IINA:arm64+0x10054b3b4)
    #14 PlayerCore.openURLs(_:shouldAutoLoad:) PlayerCore.swift:206 (IINA:arm64+0x10054bf08)
    #15 PlayerCore.openURL(_:shouldAutoLoad:) PlayerCore.swift:222 (IINA:arm64+0x10054c704)
    #16 InitialWindowController.openRecentItemFromTable(_:) InitialWindowController.swift:214 (IINA:arm64+0x10001d0dc)
    #17 InitialWindowController.onTableClicked() InitialWindowController.swift:209 (IINA:arm64+0x10001ccf4)
    #18 @objc InitialWindowController.onTableClicked() <compiler-generated> (IINA:arm64+0x10001cd60)
    #19 -[NSApplication(NSResponder) sendAction:to:from:] <null>:34125124 (AppKit:arm64e+0x245840)
    #20 start <null>:34125124 (dyld:arm64e+0x5088)

  Thread T7 (tid=2269535, running) is a GCD worker thread

  Thread T6 (tid=2269534, running) is a GCD worker thread

SUMMARY: ThreadSanitizer: data race ViewLayer.swift in ViewLayer.needsMPVRender.setter
==================
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.
==================
WARNING: ThreadSanitizer: data race (pid=67193)
  Write of size 1 at 0x00010a7f6a81 by thread T7:
    #0 ViewLayer.forceRender.setter ViewLayer.swift (IINA:arm64+0x100473258)
    #1 ViewLayer.draw(forced:) ViewLayer.swift:147 (IINA:arm64+0x10047783c)
    #2 PlayerCore.playbackRestarted() PlayerCore.swift:1270 (IINA:arm64+0x100577dcc)
    #3 MPVController.handleEvent(_:) MPVController.swift:780 (IINA:arm64+0x1005dab7c)
    #4 closure #1 in MPVController.readEvents() MPVController.swift:701 (IINA:arm64+0x1005d7f84)
    #5 partial apply for closure #1 in MPVController.readEvents() <compiler-generated> (IINA:arm64+0x1005f2420)
    #6 thunk for @escaping @callee_guaranteed () -> () <compiler-generated> (IINA:arm64+0x1000421f8)
    #7 __tsan::invoke_and_release_block(void*) <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7c808)
    #8 _dispatch_client_callout <null>:34125124 (libdispatch.dylib:arm64e+0x63a4)

  Previous read of size 1 at 0x00010a7f6a81 by thread T6 (mutexes: write M18114):
    #0 ViewLayer.forceRender.getter ViewLayer.swift (IINA:arm64+0x100473170)
    #1 ViewLayer.canDraw(inCGLContext:pixelFormat:forLayerTime:displayTime:) ViewLayer.swift:90 (IINA:arm64+0x10047507c)
    #2 @objc ViewLayer.canDraw(inCGLContext:pixelFormat:forLayerTime:displayTime:) <compiler-generated> (IINA:arm64+0x100475414)
    #3 CAOpenGLLayerDraw(CAOpenGLLayer*, double, CVTimeStamp const*, unsigned int) <null>:34125124 (QuartzCore:arm64e+0xbb384)
    #4 @objc ViewLayer.display() <compiler-generated> (IINA:arm64+0x100478bec)
    #5 ViewLayer.draw(forced:) ViewLayer.swift:148 (IINA:arm64+0x10047786c)
    #6 closure #1 in mpvUpdateCallback(_:) MPVController.swift:1277 (IINA:arm64+0x1005ed350)
    #7 partial apply for closure #1 in mpvUpdateCallback(_:) <compiler-generated> (IINA:arm64+0x1005f2cb8)
    #8 thunk for @escaping @callee_guaranteed () -> () <compiler-generated> (IINA:arm64+0x1000421f8)
    #9 __tsan::invoke_and_release_block(void*) <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x7c808)
    #10 _dispatch_client_callout <null>:34125124 (libdispatch.dylib:arm64e+0x63a4)

  Location is heap block of size 80 at 0x00010a7f6a40 allocated by main thread:
    #0 calloc <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x59514)
    #1 _objc_rootAllocWithZone <null>:34125124 (libobjc.A.dylib:arm64e+0xc8b4)
    #2 closure #1 in VideoView.videoLayer.getter VideoView.swift:18 (IINA:arm64+0x100491510)
    #3 VideoView.videoLayer.getter VideoView.swift:17 (IINA:arm64+0x1004913e8)
    #4 VideoView.init(frame:) VideoView.swift:60 (IINA:arm64+0x100494b74)
    #5 @objc VideoView.init(frame:) <compiler-generated> (IINA:arm64+0x1004952a0)
    #6 VideoView.__allocating_init(frame:player:) VideoView.swift:74 (IINA:arm64+0x1004953d0)
    #7 MainWindowController._videoView.getter MainWindowController.swift:78 (IINA:arm64+0x1001d7b78)
    #8 MainWindowController.videoView.getter MainWindowController.swift:75 (IINA:arm64+0x1001d7784)
    #9 MainWindowController.addVideoViewToWindow() MainWindowController.swift:626 (IINA:arm64+0x100206e10)
    #10 MainWindowController.windowDidLoad() MainWindowController.swift:531 (IINA:arm64+0x100203668)
    #11 @objc MainWindowController.windowDidLoad() <compiler-generated> (IINA:arm64+0x100205c00)
    #12 -[NSWindowController _windowDidLoad] <null>:34125124 (AppKit:arm64e+0x1ffa50)
    #13 PlayerCore.open(_:shouldAutoLoad:) PlayerCore.swift:168 (IINA:arm64+0x10054b3b4)
    #14 PlayerCore.openURLs(_:shouldAutoLoad:) PlayerCore.swift:206 (IINA:arm64+0x10054bf08)
    #15 PlayerCore.openURL(_:shouldAutoLoad:) PlayerCore.swift:222 (IINA:arm64+0x10054c704)
    #16 InitialWindowController.openRecentItemFromTable(_:) InitialWindowController.swift:214 (IINA:arm64+0x10001d0dc)
    #17 InitialWindowController.onTableClicked() InitialWindowController.swift:209 (IINA:arm64+0x10001ccf4)
    #18 @objc InitialWindowController.onTableClicked() <compiler-generated> (IINA:arm64+0x10001cd60)
    #19 -[NSApplication(NSResponder) sendAction:to:from:] <null>:34125124 (AppKit:arm64e+0x245840)
    #20 start <null>:34125124 (dyld:arm64e+0x5088)

  Mutex M18114 (0x00010a699ea8) created at:
    #0 pthread_mutex_init <null>:34125124 (libclang_rt.tsan_osx_dynamic.dylib:arm64e+0x2d1f4)
    #1 CGLCreateContext <null>:34125124 (OpenGL:arm64e+0x5758)
    #2 @objc ViewLayer.copyCGLContext(forPixelFormat:) <compiler-generated> (IINA:arm64+0x100474f58)
    #3 CAOpenGLLayerDraw(CAOpenGLLayer*, double, CVTimeStamp const*, unsigned int) <null>:34125124 (QuartzCore:arm64e+0xbb230)
    #4 @objc ViewLayer.display() <compiler-generated> (IINA:arm64+0x100478bec)
    #5 CA::Layer::display_if_needed(CA::Transaction*) <null>:34125124 (QuartzCore:arm64e+0x24c48)
    #6 @objc ViewLayer.display() <compiler-generated> (IINA:arm64+0x100478bec)
    #7 PlayerCore.initVideo() PlayerCore.swift:318 (IINA:arm64+0x100551c9c)
    #8 MainWindowController.windowDidLoad() MainWindowController.swift:537 (IINA:arm64+0x100203780)
    #9 @objc MainWindowController.windowDidLoad() <compiler-generated> (IINA:arm64+0x100205c00)
    #10 -[NSWindowController _windowDidLoad] <null>:34125124 (AppKit:arm64e+0x1ffa50)
    #11 PlayerCore.open(_:shouldAutoLoad:) PlayerCore.swift:168 (IINA:arm64+0x10054b3b4)
    #12 PlayerCore.openURLs(_:shouldAutoLoad:) PlayerCore.swift:206 (IINA:arm64+0x10054bf08)
    #13 PlayerCore.openURL(_:shouldAutoLoad:) PlayerCore.swift:222 (IINA:arm64+0x10054c704)
    #14 InitialWindowController.openRecentItemFromTable(_:) InitialWindowController.swift:214 (IINA:arm64+0x10001d0dc)
    #15 InitialWindowController.onTableClicked() InitialWindowController.swift:209 (IINA:arm64+0x10001ccf4)
    #16 @objc InitialWindowController.onTableClicked() <compiler-generated> (IINA:arm64+0x10001cd60)
    #17 -[NSApplication(NSResponder) sendAction:to:from:] <null>:34125124 (AppKit:arm64e+0x245840)
    #18 start <null>:34125124 (dyld:arm64e+0x5088)

  Thread T7 (tid=2269535, running) is a GCD worker thread

  Thread T6 (tid=2269534, running) is a GCD worker thread

SUMMARY: ThreadSanitizer: data race ViewLayer.swift in ViewLayer.forceRender.setter
==================
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.
(lldb) 

Steps to reproduce:

  • In Xcode edit the scheme and enable:
    • Thread Sanitizer
    • Undefined Behavior Sanitizer
  • Build and run IINA
  • Play a video
  • Maybe the issue will be detected
  • MPV does not have this problem.

This is failing in IINA code.

How often does this happen?
Rarely.

@low-batt low-batt self-assigned this Jun 13, 2022
@low-batt low-batt changed the title ThreadSanitizer: data race ViewLayer.swift in ViewLayer.forceRender.setter ThreadSanitizer: data race in ViewLayer.forceRender.setter Jun 14, 2022
low-batt added a commit that referenced this issue Oct 12, 2022
This commit will:

- Change VideoLaye.draw to queue a task to the mpvGLQueue queue
- Change MPVController.mpvUpdateCallback to call draw directly
- Change MainWindowController.enterInteractiveMode  to call draw
  directly
- Change mpvGLQueue to be a private constant

These changes cause all drawing to occur from tasks submitted to
mpvGLQueue . Restricting all drawing to a single serial dispatch queue
eliminates the data race with these two properties.
@low-batt
Copy link
Contributor Author

Analysis

This issue is focused on access to these two VideoLayer properties from threads:

private var needsMPVRender = false
private var forceRender = false

These properties are used by the VideoLayer method draw(forced:). That method is used by the methods listed in the follow table:

Method Dispatch Queue
MainWindowController.windowWillOpen com.apple.main-thread
MainWindowController.doneExitingPIP com.apple.main-thread
MainWindowController.enterInteractiveMode com.apple.main-thread
MiniPlayerWindowController.windowDidResize com.apple.main-thread
MPVController.mpvUpdateCallback com.colliderli.iina.mpvgl
PlayerCore.playbackRestarted com.colliderli.iina.controller
PlayerCore.switchToMiniPlayer com.apple.main-thread
VideoLayer.resume com.apple.main-thread
VideoView.layout com.apple.main-thread

The method MPVController.mpvUpdateCallback is the primary user of the draw(forced:) method.

Calling the draw method from different dispatch queues is causing the data race with these properties that are used by the method.

Fixing

The proposed fix in the PR restricts all drawing to a single serial dispatch queue, com.colliderli.iina.mpvgl (mpvGLQueue). Using a single queue eliminates the data race with these two properties.

@low-batt low-batt linked a pull request Oct 17, 2022 that will close this issue
2 tasks
uiryuu pushed a commit that referenced this issue Oct 25, 2022
This commit will:

- Change VideoLaye.draw to queue a task to the mpvGLQueue queue
- Change MPVController.mpvUpdateCallback to call draw directly
- Change MainWindowController.enterInteractiveMode  to call draw
  directly
- Change mpvGLQueue to be a private constant

These changes cause all drawing to occur from tasks submitted to
mpvGLQueue . Restricting all drawing to a single serial dispatch queue
eliminates the data race with these two properties.
CarterLi pushed a commit to CarterLi/iina that referenced this issue Jan 14, 2023
This commit will:

- Change VideoLaye.draw to queue a task to the mpvGLQueue queue
- Change MPVController.mpvUpdateCallback to call draw directly
- Change MainWindowController.enterInteractiveMode  to call draw
  directly
- Change mpvGLQueue to be a private constant

These changes cause all drawing to occur from tasks submitted to
mpvGLQueue . Restricting all drawing to a single serial dispatch queue
eliminates the data race with these two properties.
low-batt added a commit that referenced this issue Mar 5, 2023
This commit will:

- Effectively revert the changes made in commit f8811b6 that attempted
  to always draw using the mpvGLQueue queue
- Add an Atomic property wrapper to protect a property with a lock
- Add locking to the VideoLayer properties blocked, forceRender and
  needsMPVRender

The commit f8811b6 attempted to standardize drawing to always use the
mpvGLQueue queue to resolve TSan detected data races reported in
issue #3827 without using locks. However as discussed in issue #4055
drawing can still occur on the main thread. This commit resolves the
TSan data races using locks.
MikeWang000000 pushed a commit to MikeWang000000/iina that referenced this issue Mar 8, 2023
This commit will:

- Effectively revert the changes made in commit f8811b6 that attempted
  to always draw using the mpvGLQueue queue
- Add an Atomic property wrapper to protect a property with a lock
- Add locking to the VideoLayer properties blocked, forceRender and
  needsMPVRender

The commit f8811b6 attempted to standardize drawing to always use the
mpvGLQueue queue to resolve TSan detected data races reported in
issue iina#3827 without using locks. However as discussed in issue iina#4055
drawing can still occur on the main thread. This commit resolves the
TSan data races using locks.
svobs pushed a commit to svobs/iina-advance that referenced this issue Mar 13, 2023
This commit will:

- Effectively revert the changes made in commit f8811b6 that attempted
  to always draw using the mpvGLQueue queue
- Add an Atomic property wrapper to protect a property with a lock
- Add locking to the VideoLayer properties blocked, forceRender and
  needsMPVRender

The commit f8811b6 attempted to standardize drawing to always use the
mpvGLQueue queue to resolve TSan detected data races reported in
issue iina#3827 without using locks. However as discussed in issue iina#4055
drawing can still occur on the main thread. This commit resolves the
TSan data races using locks.
uiryuu pushed a commit that referenced this issue Mar 25, 2023
This commit will:

- Effectively revert the changes made in commit f8811b6 that attempted
  to always draw using the mpvGLQueue queue
- Add an Atomic property wrapper to protect a property with a lock
- Add locking to the VideoLayer properties blocked, forceRender and
  needsMPVRender

The commit f8811b6 attempted to standardize drawing to always use the
mpvGLQueue queue to resolve TSan detected data races reported in
issue #3827 without using locks. However as discussed in issue #4055
drawing can still occur on the main thread. This commit resolves the
TSan data races using locks.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant