1351282Sdim//===-- tsan_dispatch_defs.h ------------------------------------*- C++ -*-===//
2351282Sdim//
3351282Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4351282Sdim// See https://llvm.org/LICENSE.txt for license information.
5351282Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6351282Sdim//
7351282Sdim//===----------------------------------------------------------------------===//
8351282Sdim//
9351282Sdim// This file is a part of ThreadSanitizer (TSan), a race detector.
10351282Sdim//
11351282Sdim//===----------------------------------------------------------------------===//
12351282Sdim#ifndef TSAN_DISPATCH_DEFS_H
13351282Sdim#define TSAN_DISPATCH_DEFS_H
14351282Sdim
15351282Sdim#include "sanitizer_common/sanitizer_internal_defs.h"
16351282Sdim
17351282Sdimtypedef struct dispatch_object_s {} *dispatch_object_t;
18351282Sdim
19351282Sdim#define DISPATCH_DECL(name) \
20351282Sdim  typedef struct name##_s : public dispatch_object_s {} *name##_t
21351282Sdim
22351282SdimDISPATCH_DECL(dispatch_queue);
23351282SdimDISPATCH_DECL(dispatch_source);
24351282SdimDISPATCH_DECL(dispatch_group);
25351282SdimDISPATCH_DECL(dispatch_data);
26351282SdimDISPATCH_DECL(dispatch_semaphore);
27351282SdimDISPATCH_DECL(dispatch_io);
28351282Sdim
29351282Sdimtypedef void (*dispatch_function_t)(void *arg);
30351282Sdimtypedef void (^dispatch_block_t)(void);
31351282Sdimtypedef void (^dispatch_io_handler_t)(bool done, dispatch_data_t data,
32351282Sdim                                      int error);
33351282Sdim
34360784Sdimtypedef long dispatch_once_t;
35351282Sdimtypedef __sanitizer::u64 dispatch_time_t;
36360784Sdimtypedef int dispatch_fd_t;
37360784Sdimtypedef unsigned long dispatch_io_type_t;
38360784Sdimtypedef unsigned long dispatch_io_close_flags_t;
39351282Sdim
40351282Sdimextern "C" {
41351282Sdimvoid *dispatch_get_context(dispatch_object_t object);
42351282Sdimvoid dispatch_retain(dispatch_object_t object);
43351282Sdimvoid dispatch_release(dispatch_object_t object);
44351282Sdim
45351282Sdimextern const dispatch_block_t _dispatch_data_destructor_free;
46351282Sdimextern const dispatch_block_t _dispatch_data_destructor_munmap;
47351282Sdim} // extern "C"
48351282Sdim
49351282Sdim#define DISPATCH_DATA_DESTRUCTOR_DEFAULT nullptr
50351282Sdim#define DISPATCH_DATA_DESTRUCTOR_FREE    _dispatch_data_destructor_free
51351282Sdim#define DISPATCH_DATA_DESTRUCTOR_MUNMAP  _dispatch_data_destructor_munmap
52351282Sdim
53351282Sdim#if __has_attribute(noescape)
54351282Sdim  #define DISPATCH_NOESCAPE __attribute__((__noescape__))
55351282Sdim#else
56351282Sdim  #define DISPATCH_NOESCAPE
57351282Sdim#endif
58351282Sdim
59351282Sdim// Data types used in dispatch APIs
60360784Sdimtypedef unsigned long size_t;
61360784Sdimtypedef unsigned long uintptr_t;
62351282Sdimtypedef __sanitizer::s64 off_t;
63351282Sdimtypedef __sanitizer::u16 mode_t;
64360784Sdimtypedef long long_t;
65351282Sdim
66351282Sdim#endif  // TSAN_DISPATCH_DEFS_H
67