1/*
  2 * Copyright (c) 2008-2012 Apple Inc. All rights reserved.
  3 *
  4 * @APPLE_APACHE_LICENSE_HEADER_START@
  5 *
  6 * Licensed under the Apache License, Version 2.0 (the "License");
  7 * you may not use this file except in compliance with the License.
  8 * You may obtain a copy of the License at
  9 *
 10 *     http://www.apache.org/licenses/LICENSE-2.0
 11 *
 12 * Unless required by applicable law or agreed to in writing, software
 13 * distributed under the License is distributed on an "AS IS" BASIS,
 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 15 * See the License for the specific language governing permissions and
 16 * limitations under the License.
 17 *
 18 * @APPLE_APACHE_LICENSE_HEADER_END@
 19 */
 20
 21#ifndef __DISPATCH_BASE__
 22#define __DISPATCH_BASE__
 23
 24#ifndef __DISPATCH_INDIRECT__
 25#error "Please #include <dispatch/dispatch.h> instead of this file directly."
 26#endif
 27
 28#ifndef __has_builtin
 29#define __has_builtin(x) 0
 30#endif
 31#ifndef __has_include
 32#define __has_include(x) 0
 33#endif
 34#ifndef __has_feature
 35#define __has_feature(x) 0
 36#endif
 37#ifndef __has_attribute
 38#define __has_attribute(x) 0
 39#endif
 40#ifndef __has_extension
 41#define __has_extension(x) 0
 42#endif
 43
 44#if __GNUC__
 45#define DISPATCH_NORETURN __attribute__((__noreturn__))
 46#define DISPATCH_NOTHROW __attribute__((__nothrow__))
 47#define DISPATCH_NONNULL1 __attribute__((__nonnull__(1)))
 48#define DISPATCH_NONNULL2 __attribute__((__nonnull__(2)))
 49#define DISPATCH_NONNULL3 __attribute__((__nonnull__(3)))
 50#define DISPATCH_NONNULL4 __attribute__((__nonnull__(4)))
 51#define DISPATCH_NONNULL5 __attribute__((__nonnull__(5)))
 52#define DISPATCH_NONNULL6 __attribute__((__nonnull__(6)))
 53#define DISPATCH_NONNULL7 __attribute__((__nonnull__(7)))
 54#if __clang__ && __clang_major__ < 3
 55// rdar://problem/6857843
 56#define DISPATCH_NONNULL_ALL
 57#else
 58#define DISPATCH_NONNULL_ALL __attribute__((__nonnull__))
 59#endif
 60#define DISPATCH_SENTINEL __attribute__((__sentinel__))
 61#define DISPATCH_PURE __attribute__((__pure__))
 62#define DISPATCH_CONST __attribute__((__const__))
 63#define DISPATCH_WARN_RESULT __attribute__((__warn_unused_result__))
 64#define DISPATCH_MALLOC __attribute__((__malloc__))
 65#define DISPATCH_ALWAYS_INLINE __attribute__((__always_inline__))
 66#define DISPATCH_UNAVAILABLE __attribute__((__unavailable__))
 67#define DISPATCH_UNAVAILABLE_MSG(msg) __attribute__((__unavailable__(msg)))
 68#elif defined(_MSC_VER)
 69#define DISPATCH_NORETURN __declspec(noreturn)
 70#define DISPATCH_NOTHROW __declspec(nothrow)
 71#define DISPATCH_NONNULL1
 72#define DISPATCH_NONNULL2
 73#define DISPATCH_NONNULL3
 74#define DISPATCH_NONNULL4
 75#define DISPATCH_NONNULL5
 76#define DISPATCH_NONNULL6
 77#define DISPATCH_NONNULL7
 78#define DISPATCH_NONNULL_ALL
 79#define DISPATCH_SENTINEL
 80#define DISPATCH_PURE
 81#define DISPATCH_CONST
 82#if (_MSC_VER >= 1700)
 83#define DISPATCH_WARN_RESULT _Check_return_
 84#else
 85#define DISPATCH_WARN_RESULT
 86#endif
 87#define DISPATCH_MALLOC
 88#define DISPATCH_ALWAYS_INLINE __forceinline
 89#define DISPATCH_UNAVAILABLE
 90#define DISPATCH_UNAVAILABLE_MSG(msg)
 91#else
 92/*! @parseOnly */
 93#define DISPATCH_NORETURN
 94/*! @parseOnly */
 95#define DISPATCH_NOTHROW
 96/*! @parseOnly */
 97#define DISPATCH_NONNULL1
 98/*! @parseOnly */
 99#define DISPATCH_NONNULL2
100/*! @parseOnly */
101#define DISPATCH_NONNULL3
102/*! @parseOnly */
103#define DISPATCH_NONNULL4
104/*! @parseOnly */
105#define DISPATCH_NONNULL5
106/*! @parseOnly */
107#define DISPATCH_NONNULL6
108/*! @parseOnly */
109#define DISPATCH_NONNULL7
110/*! @parseOnly */
111#define DISPATCH_NONNULL_ALL
112/*! @parseOnly */
113#define DISPATCH_SENTINEL
114/*! @parseOnly */
115#define DISPATCH_PURE
116/*! @parseOnly */
117#define DISPATCH_CONST
118/*! @parseOnly */
119#define DISPATCH_WARN_RESULT
120/*! @parseOnly */
121#define DISPATCH_MALLOC
122/*! @parseOnly */
123#define DISPATCH_ALWAYS_INLINE
124/*! @parseOnly */
125#define DISPATCH_UNAVAILABLE
126/*! @parseOnly */
127#define DISPATCH_UNAVAILABLE_MSG(msg)
128#endif
129
130#if defined(__cplusplus)
131# if __cplusplus >= 201703L
132#  define DISPATCH_FALLTHROUGH [[fallthrough]]
133# elif __cplusplus >= 201103L
134#  if defined(__clang__)
135#   define DISPATCH_FALLTHROUGH [[clang::fallthrough]]
136#  elif defined(__GNUC__) && __GNUC__ >= 7
137#   define DISPATCH_FALLTHROUGH [[gnu::fallthrough]]
138#  else
139#   define DISPATCH_FALLTHROUGH
140#  endif
141# else
142#  define DISPATCH_FALLTHROUGH
143# endif
144#elif defined(__GNUC__) && __GNUC__ >= 7
145# define DISPATCH_FALLTHROUGH __attribute__((__fallthrough__))
146#elif defined(__clang__)
147# if __has_attribute(fallthrough) && __clang_major__ >= 5
148#  define DISPATCH_FALLTHROUGH __attribute__((__fallthrough__))
149# else
150#  define DISPATCH_FALLTHROUGH
151# endif
152#else
153# define DISPATCH_FALLTHROUGH
154#endif
155
156
157#define DISPATCH_LINUX_UNAVAILABLE()
158
159#ifdef __FreeBSD__
160#define DISPATCH_FREEBSD_UNAVAILABLE() \
161		DISPATCH_UNAVAILABLE_MSG( \
162		"This interface is unavailable on FreeBSD systems")
163#else
164#define DISPATCH_FREEBSD_UNAVAILABLE()
165#endif
166
167#ifndef DISPATCH_ALIAS_V2
168#if TARGET_OS_MAC
169#define DISPATCH_ALIAS_V2(sym)	 __asm__("_" #sym "$V2")
170#else
171#define DISPATCH_ALIAS_V2(sym)
172#endif
173#endif
174
175#if defined(_WIN32)
176#if defined(__cplusplus)
177#define DISPATCH_EXPORT extern "C" __declspec(dllimport)
178#else
179#define DISPATCH_EXPORT extern __declspec(dllimport)
180#endif
181#elif __GNUC__
182#define DISPATCH_EXPORT extern __attribute__((visibility("default")))
183#else
184#define DISPATCH_EXPORT extern
185#endif
186
187#if __GNUC__
188#define DISPATCH_INLINE static __inline__
189#else
190#define DISPATCH_INLINE static inline
191#endif
192
193#if __GNUC__
194#define DISPATCH_EXPECT(x, v) __builtin_expect((x), (v))
195#define dispatch_compiler_barrier()  __asm__ __volatile__("" ::: "memory")
196#else
197#define DISPATCH_EXPECT(x, v) (x)
198#define dispatch_compiler_barrier()  do { } while (0)
199#endif
200
201#if __has_attribute(not_tail_called)
202#define DISPATCH_NOT_TAIL_CALLED __attribute__((__not_tail_called__))
203#else
204#define DISPATCH_NOT_TAIL_CALLED
205#endif
206
207#if __has_builtin(__builtin_assume)
208#define DISPATCH_COMPILER_CAN_ASSUME(expr) __builtin_assume(expr)
209#else
210#define DISPATCH_COMPILER_CAN_ASSUME(expr) ((void)(expr))
211#endif
212
213#if __has_attribute(noescape)
214#define DISPATCH_NOESCAPE __attribute__((__noescape__))
215#else
216#define DISPATCH_NOESCAPE
217#endif
218
219#if __has_attribute(cold)
220#define DISPATCH_COLD __attribute__((__cold__))
221#else
222#define DISPATCH_COLD
223#endif
224
225#if __has_feature(assume_nonnull)
226#define DISPATCH_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
227#define DISPATCH_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")
228#else
229#define DISPATCH_ASSUME_NONNULL_BEGIN
230#define DISPATCH_ASSUME_NONNULL_END
231#endif
232
233#if __has_feature(bounds_attributes)
234#define DISPATCH_ASSUME_ABI_SINGLE_BEGIN	_Pragma("clang abi_ptr_attr set(single)")
235#define DISPATCH_ASSUME_ABI_SINGLE_END		_Pragma("clang abi_ptr_attr set(unsafe_indexable)")
236#define DISPATCH_UNSAFE_INDEXABLE __attribute__((__unsafe_indexable__))
237#define DISPATCH_COUNTED_BY(X) __attribute__((__counted_by__(X)))
238#define DISPATCH_SIZED_BY(X) __attribute__((__sized_by__(X)))
239#else
240#define DISPATCH_ASSUME_ABI_SINGLE_BEGIN
241#define DISPATCH_ASSUME_ABI_SINGLE_END
242#define DISPATCH_UNSAFE_INDEXABLE
243#define DISPATCH_COUNTED_BY(X)
244#define DISPATCH_SIZED_BY(X)
245#endif
246
247#define DISPATCH_OSX_SUPPORTS_AT_LEAST(macos, ios, tvos, watchos, bridgeos, visionos) \
248	 (	(defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= macos) \
249	||	(defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= ios) \
250	||	(defined(__TV_OS_VERSION_MIN_REQUIRED) && __TV_OS_VERSION_MIN_REQUIRED >= tvos) \
251	||	(defined(__WATCH_OS_VERSION_MIN_REQUIRED) && __WATCH_OS_VERSION_MIN_REQUIRED >= watchos) \
252	||	(defined(__BRIDGE_OS_VERSION_MIN_REQUIRED) && __BRIDGE_OS_VERSION_MIN_REQUIRED >= bridgeos) \
253	||	(defined(__VISION_OS_VERSION_MIN_REQUIRED) && __VISION_OS_VERSION_MIN_REQUIRED >= visionos) \
254	)
255
256#if !__has_feature(nullability)
257#ifndef _Nullable
258#define _Nullable
259#endif
260#ifndef _Nonnull
261#define _Nonnull
262#endif
263#ifndef _Null_unspecified
264#define _Null_unspecified
265#endif
266#endif
267
268#ifndef DISPATCH_RETURNS_RETAINED_BLOCK
269#if __has_attribute(ns_returns_retained)
270#define DISPATCH_RETURNS_RETAINED_BLOCK __attribute__((__ns_returns_retained__))
271#else
272#define DISPATCH_RETURNS_RETAINED_BLOCK
273#endif
274#endif
275
276#if __has_attribute(enum_extensibility)
277#define __DISPATCH_ENUM_ATTR __attribute__((__enum_extensibility__(open)))
278#define __DISPATCH_ENUM_ATTR_CLOSED __attribute__((__enum_extensibility__(closed)))
279#else
280#define __DISPATCH_ENUM_ATTR
281#define __DISPATCH_ENUM_ATTR_CLOSED
282#endif // __has_attribute(enum_extensibility)
283
284#if __has_attribute(flag_enum)
285#define __DISPATCH_OPTIONS_ATTR __attribute__((__flag_enum__))
286#else
287#define __DISPATCH_OPTIONS_ATTR
288#endif // __has_attribute(flag_enum)
289
290
291#if __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums) || \
292		__has_extension(cxx_fixed_enum) || defined(_WIN32)
293#define DISPATCH_ENUM(name, type, ...) \
294		typedef enum : type { __VA_ARGS__ } __DISPATCH_ENUM_ATTR name##_t
295#define DISPATCH_OPTIONS(name, type, ...) \
296		typedef enum : type { __VA_ARGS__ } __DISPATCH_OPTIONS_ATTR __DISPATCH_ENUM_ATTR name##_t
297#else
298#define DISPATCH_ENUM(name, type, ...) \
299		enum { __VA_ARGS__ } __DISPATCH_ENUM_ATTR; typedef type name##_t
300#define DISPATCH_OPTIONS(name, type, ...) \
301		enum { __VA_ARGS__ } __DISPATCH_OPTIONS_ATTR __DISPATCH_ENUM_ATTR; typedef type name##_t
302#endif // __has_feature(objc_fixed_enum) ...
303
304
305
306#if __has_feature(enumerator_attributes)
307#define DISPATCH_ENUM_API_AVAILABLE(...) API_AVAILABLE(__VA_ARGS__)
308#define DISPATCH_ENUM_API_DEPRECATED(...) API_DEPRECATED(__VA_ARGS__)
309#define DISPATCH_ENUM_API_DEPRECATED_WITH_REPLACEMENT(...) \
310		API_DEPRECATED_WITH_REPLACEMENT(__VA_ARGS__)
311#else
312#define DISPATCH_ENUM_API_AVAILABLE(...)
313#define DISPATCH_ENUM_API_DEPRECATED(...)
314#define DISPATCH_ENUM_API_DEPRECATED_WITH_REPLACEMENT(...)
315#endif
316
317#ifdef __swift__
318#define DISPATCH_SWIFT3_OVERLAY 1
319#else // __swift__
320#define DISPATCH_SWIFT3_OVERLAY 0
321#endif // __swift__
322
323#if __has_feature(attribute_availability_swift)
324#define DISPATCH_SWIFT_UNAVAILABLE(_msg) \
325		__attribute__((__availability__(swift, unavailable, message=_msg)))
326#else
327#define DISPATCH_SWIFT_UNAVAILABLE(_msg)
328#endif
329
330#if DISPATCH_SWIFT3_OVERLAY
331#define DISPATCH_SWIFT3_UNAVAILABLE(_msg) DISPATCH_SWIFT_UNAVAILABLE(_msg)
332#else
333#define DISPATCH_SWIFT3_UNAVAILABLE(_msg)
334#endif
335
336#if __has_attribute(swift_private)
337#define DISPATCH_REFINED_FOR_SWIFT __attribute__((__swift_private__))
338#else
339#define DISPATCH_REFINED_FOR_SWIFT
340#endif
341
342#if __has_attribute(swift_name)
343#define DISPATCH_SWIFT_NAME(_name) __attribute__((__swift_name__(#_name)))
344#else
345#define DISPATCH_SWIFT_NAME(_name)
346#endif
347
348#ifndef __cplusplus
349#define DISPATCH_TRANSPARENT_UNION __attribute__((__transparent_union__))
350#else
351#define DISPATCH_TRANSPARENT_UNION
352#endif
353
354DISPATCH_ASSUME_ABI_SINGLE_BEGIN
355
356DISPATCH_SWIFT_UNAVAILABLE("Unavailable in Swift")
357typedef void (*dispatch_function_t)(void *_Nullable);
358
359DISPATCH_ASSUME_ABI_SINGLE_END
360
361#endif