Skip to content

[Bug]: data race: QSLibrarian firstEntryContainingObject #3028

@n8henrie

Description

@n8henrie

Before submitting your bug report, please confirm you have completed the following steps

Bug description

QS has occasional crashes that I think are related to data races, so I'd like to eliminate as many data races as possible. I'm not very familiar with the dispatch APIs, so this is a bit of a task.

If I enable thread sanitizer, open QS, and pull up a few random results, the first data race that usually comes up is in QSLibrarian firstEntryContainingObject, specifically at

return [entry.contents containsObject:object];

I've tried placing mutexes (mutices?) all over -- self, entries, entry, you name it -- the only think I've found that eliminates the data races is disabling concurrent enumeration (NSEnumerationConcurrent).

Is this a data race that we can eliminate?

/Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:363 Data race in __42-[QSLibrarian firstEntryContainingObject:]_block_invoke at 0x121a9ec40

Location is a 40-byte heap object at 0x121a9ec40
Read of size 8 by thread 17
#0	0x0000000106cc2c68 in __42-[QSLibrarian firstEntryContainingObject:]_block_invoke at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSLibrarian.m:363
#1	0x000000019330c0d0 in __NSARRAY_IS_CALLING_OUT_TO_A_BOOL_BLOCK__ ()
#2	0x0000000104ca2864 in _dispatch_client_callout2 ()
Write of size 8 by thread 1
#0	0x0000000106ca0010 in __copy_helper_block_e8_32s ()
#1	0x0000000192f1a030 in _call_copy_helpers_excp ()
#2	0x000000019330c050 in __NSArrayGetIndexesPassingTest ()
#3	0x0000000124f48ad4 in -[QSObjectActions validActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/PlugIns-Main/QSCorePlugIn/Code/QSObjectActions.m:44
#4	0x0000000106cb31b8 in -[QSExecutor validActionsForDirectObject:indirectObject:fromSource:types:fileType:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:353
#5	0x0000000106cb3e00 in -[QSExecutor validActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:405
#6	0x0000000106cb2948 in -[QSExecutor rankedActionsForDirectObject:indirectObject:shouldBypass:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:317
#7	0x0000000106cb250c in -[QSExecutor rankedActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:298
#8	0x0000000106af7804 in -[QSInterfaceController rankedActions] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepInterface/QSInterfaceController.m:326
#9	0x0000000106af7d08 in -[QSInterfaceController updateActionsNow] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepInterface/QSInterfaceController.m:343
#10	0x000000019450d90c in __NSFireTimer ()
#11	0x0000000192e9c274 in start ()
Heap block allocated by thread 1
#0	0x0000000104e35fb8 in wrap_malloc ()
#1	0x00000001930403a8 in _malloc_type_malloc_outlined ()
#2	0x000000019330c050 in __NSArrayGetIndexesPassingTest ()
#3	0x0000000124f48ad4 in -[QSObjectActions validActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/PlugIns-Main/QSCorePlugIn/Code/QSObjectActions.m:44
#4	0x0000000106cb31b8 in -[QSExecutor validActionsForDirectObject:indirectObject:fromSource:types:fileType:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:353
#5	0x0000000106cb3e00 in -[QSExecutor validActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:405
#6	0x0000000106cb2948 in -[QSExecutor rankedActionsForDirectObject:indirectObject:shouldBypass:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:317
#7	0x0000000106cb250c in -[QSExecutor rankedActionsForDirectObject:indirectObject:] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepCore/QSExecutor.m:298
#8	0x0000000106af7804 in -[QSInterfaceController rankedActions] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepInterface/QSInterfaceController.m:326
#9	0x0000000106af7d08 in -[QSInterfaceController updateActionsNow] at /Users/n8henrie/git/qs/quicksilver/Quicksilver/Code-QuickStepInterface/QSInterfaceController.m:343
#10	0x000000019450d90c in __NSFireTimer ()
#11	0x0000000192e9c274 in start ()

Steps to reproduce

As above

Expected behavior

Clean tsan without data races

MacOS Version

macos15

Quicksilver Version

2.4.3

Relevant Plugins

No response

Crash Logs or Spindump

No response

Screenshots

Image

Additional info

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions