@@ -243,6 +243,59 @@ TSAN_INTERCEPTOR(void, os_lock_unlock, void *lock) {
243243 REAL (os_lock_unlock)(lock);
244244}
245245
246+ extern " C" {
247+ #define _LOCK_AVAILABILITY \
248+ __OSX_AVAILABLE (10.12 ) __IOS_AVAILABLE(10.0 ) \
249+ __TVOS_AVAILABLE(10.0 ) __WATCHOS_AVAILABLE(3.0 )
250+
251+ _LOCK_AVAILABILITY void os_unfair_lock_lock(void *lock);
252+ // NOTE: `options` actually has type `os_unfair_lock_options_t` but this
253+ // should be ABI compatible.
254+ _LOCK_AVAILABILITY void os_unfair_lock_lock_with_options (void *lock,
255+ u32 options);
256+ _LOCK_AVAILABILITY bool os_unfair_lock_trylock (void *lock);
257+ _LOCK_AVAILABILITY void os_unfair_lock_unlock (void *lock);
258+ }
259+
260+ TSAN_INTERCEPTOR (void , os_unfair_lock_lock, void *lock) {
261+ if (!cur_thread ()->is_inited || cur_thread ()->is_dead ) {
262+ return REAL (os_unfair_lock_lock)(lock);
263+ }
264+ SCOPED_TSAN_INTERCEPTOR (os_unfair_lock_lock, lock);
265+ REAL (os_unfair_lock_lock)(lock);
266+ Acquire (thr, pc, (uptr)lock);
267+ }
268+
269+ TSAN_INTERCEPTOR (void , os_unfair_lock_lock_with_options, void *lock,
270+ u32 options) {
271+ if (!cur_thread ()->is_inited || cur_thread ()->is_dead ) {
272+ return REAL (os_unfair_lock_lock_with_options)(lock, options);
273+ }
274+ SCOPED_TSAN_INTERCEPTOR (os_unfair_lock_lock_with_options, lock, options);
275+ REAL (os_unfair_lock_lock_with_options)(lock, options);
276+ Acquire (thr, pc, (uptr)lock);
277+ }
278+
279+ TSAN_INTERCEPTOR (bool , os_unfair_lock_trylock, void *lock) {
280+ if (!cur_thread ()->is_inited || cur_thread ()->is_dead ) {
281+ return REAL (os_unfair_lock_trylock)(lock);
282+ }
283+ SCOPED_TSAN_INTERCEPTOR (os_unfair_lock_trylock, lock);
284+ bool result = REAL (os_unfair_lock_trylock)(lock);
285+ if (result)
286+ Acquire (thr, pc, (uptr)lock);
287+ return result;
288+ }
289+
290+ TSAN_INTERCEPTOR (void , os_unfair_lock_unlock, void *lock) {
291+ if (!cur_thread ()->is_inited || cur_thread ()->is_dead ) {
292+ return REAL (os_unfair_lock_unlock)(lock);
293+ }
294+ SCOPED_TSAN_INTERCEPTOR (os_unfair_lock_unlock, lock);
295+ Release (thr, pc, (uptr)lock);
296+ REAL (os_unfair_lock_unlock)(lock);
297+ }
298+
246299TSAN_INTERCEPTOR (void , xpc_connection_set_event_handler,
247300 xpc_connection_t connection, xpc_handler_t handler) {
248301 SCOPED_TSAN_INTERCEPTOR (xpc_connection_set_event_handler, connection,
0 commit comments