@@ -104,6 +104,7 @@ void FlushUnneededASanShadowMemory(uptr p, uptr size) {
104104// dispatch_group_async_f()
105105// dispatch_group_async()
106106// dispatch_apply()
107+ // dispatch_apply_f()
107108// TODO(glider): libdispatch API contains other functions that we don't support
108109// yet.
109110//
@@ -244,7 +245,24 @@ INTERCEPTOR(void, dispatch_group_async_f, dispatch_group_t group,
244245 asan_dispatch_call_block_and_release);
245246}
246247
247- #if !defined(MISSING_BLOCKS_SUPPORT)
248+ extern " C" void asan_dispatch_apply_f_block (void *context, size_t iteration) {
249+ GET_STACK_TRACE_THREAD;
250+ asan_block_context_t *asan_ctxt = (asan_block_context_t *)context;
251+ asan_register_worker_thread (asan_ctxt->parent_tid , &stack);
252+ ((void (*)(void *, size_t ))asan_ctxt->func )(asan_ctxt->block , iteration);
253+ }
254+
255+ INTERCEPTOR (void , dispatch_apply_f, size_t iterations, dispatch_queue_t queue,
256+ void *ctxt, void (*work)(void *, size_t )) {
257+ GET_STACK_TRACE_THREAD;
258+ asan_block_context_t *asan_ctxt =
259+ alloc_asan_context (ctxt, (dispatch_function_t )work, &stack);
260+
261+ REAL (dispatch_apply_f)
262+ (iterations, queue, (void *)asan_ctxt, asan_dispatch_apply_f_block);
263+ }
264+
265+ # if !defined(MISSING_BLOCKS_SUPPORT)
248266extern " C" {
249267void dispatch_async (dispatch_queue_t dq, void (^work)(void ));
250268void dispatch_group_async (dispatch_group_t dg, dispatch_queue_t dq,
0 commit comments