Skip to content

Commit 0de9c3c

Browse files
dgrove-ossdas
authored andcommitted
Mark dispatch_source APIs that are not available on Linux as unavailable
Define DISPATCH_UNAVAILABLE and DISPATCH_LINUX_UNAVAILABLE macros and use them to mark dispatch_source API functions that are not available on Linux. Signed-off-by: Daniel A. Steffen <dsteffen@apple.com>
1 parent 4af7cad commit 0de9c3c

File tree

8 files changed

+46
-23
lines changed

8 files changed

+46
-23
lines changed

dispatch/dispatch.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,24 @@
4747
#include <unistd.h>
4848
#include <fcntl.h>
4949

50-
#if defined(__linux__) && defined(__DISPATCH_BUILDING_SWIFT_MODULE__)
50+
#ifdef __has_attribute
51+
#if __has_attribute(unavailable)
52+
#define __DISPATCH_UNAVAILABLE(msg) __attribute__((__unavailable__(msg)))
53+
#endif
54+
#endif
55+
#ifndef __DISPATCH_UNAVAILABLE
56+
#define __DISPATCH_UNAVAILABLE(msg)
57+
#endif
58+
59+
#ifdef __linux__
60+
#ifdef __DISPATCH_BUILDING_SWIFT_MODULE__
5161
#include <stdio.h> // for off_t
5262
#endif
63+
#define DISPATCH_LINUX_UNAVAILABLE() \
64+
__DISPATCH_UNAVAILABLE("This interface is unavailable on linux systems")
65+
#else
66+
#define DISPATCH_LINUX_UNAVAILABLE()
67+
#endif
5368

5469
#define DISPATCH_API_VERSION 20160612
5570

dispatch/source.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ DISPATCH_SOURCE_TYPE_DECL(data_or);
101101
* The mask is a mask of desired events from dispatch_source_mach_send_flags_t.
102102
*/
103103
#define DISPATCH_SOURCE_TYPE_MACH_SEND (&_dispatch_source_type_mach_send)
104-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
104+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
105105
DISPATCH_SOURCE_TYPE_DECL(mach_send);
106106

107107
/*!
@@ -111,7 +111,7 @@ DISPATCH_SOURCE_TYPE_DECL(mach_send);
111111
* The mask is unused (pass zero for now).
112112
*/
113113
#define DISPATCH_SOURCE_TYPE_MACH_RECV (&_dispatch_source_type_mach_recv)
114-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
114+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
115115
DISPATCH_SOURCE_TYPE_DECL(mach_recv);
116116

117117
/*!
@@ -124,7 +124,7 @@ DISPATCH_SOURCE_TYPE_DECL(mach_recv);
124124
*/
125125
#define DISPATCH_SOURCE_TYPE_MEMORYPRESSURE \
126126
(&_dispatch_source_type_memorypressure)
127-
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_8_0)
127+
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_8_0) DISPATCH_LINUX_UNAVAILABLE()
128128
DISPATCH_SOURCE_TYPE_DECL(memorypressure);
129129

130130
/*!
@@ -135,7 +135,7 @@ DISPATCH_SOURCE_TYPE_DECL(memorypressure);
135135
* The mask is a mask of desired events from dispatch_source_proc_flags_t.
136136
*/
137137
#define DISPATCH_SOURCE_TYPE_PROC (&_dispatch_source_type_proc)
138-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
138+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
139139
DISPATCH_SOURCE_TYPE_DECL(proc);
140140

141141
/*!
@@ -178,7 +178,7 @@ DISPATCH_SOURCE_TYPE_DECL(timer);
178178
* The mask is a mask of desired events from dispatch_source_vnode_flags_t.
179179
*/
180180
#define DISPATCH_SOURCE_TYPE_VNODE (&_dispatch_source_type_vnode)
181-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
181+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
182182
DISPATCH_SOURCE_TYPE_DECL(vnode);
183183

184184
/*!

os/voucher_activity_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#define __OS_VOUCHER_ACTIVITY_PRIVATE__
2323

2424
#if OS_VOUCHER_ACTIVITY_SPI
25-
#ifdef __APPLE__
25+
#if __has_include(<mach/mach_time.h>)
2626
#include <mach/mach_time.h>
2727
#include <firehose/tracepoint_private.h>
2828
#endif

os/voucher_private.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
#ifndef __linux__
2525
#include <os/base.h>
2626
#endif
27-
#ifdef __APPLE__
27+
#if __has_include(<mach/mach.h>)
2828
#include <os/object.h>
2929
#include <mach/mach.h>
3030
#endif
@@ -416,7 +416,7 @@ dispatch_queue_create_with_accounting_override_voucher(
416416
dispatch_queue_attr_t _Nullable attr,
417417
voucher_t _Nullable voucher);
418418

419-
#ifdef __APPLE__
419+
#if __has_include(<mach/mach.h>)
420420
/*!
421421
* @group Voucher Mach SPI
422422
* SPI intended for clients that need to interact with mach messages or mach
@@ -528,7 +528,7 @@ int
528528
voucher_get_current_persona_proximate_info(
529529
struct proc_persona_info *persona_info);
530530

531-
#endif // __APPLE__
531+
#endif // __has_include(<mach/mach.h>)
532532

533533
__END_DECLS
534534

private/data_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(none);
5353
*/
5454
#define DISPATCH_DATA_DESTRUCTOR_VM_DEALLOCATE \
5555
(_dispatch_data_destructor_vm_deallocate)
56-
__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
56+
__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0) DISPATCH_LINUX_UNAVAILABLE()
5757
DISPATCH_DATA_DESTRUCTOR_TYPE_DECL(vm_deallocate);
5858

5959
/*!

private/source_private.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ DISPATCH_SOURCE_TYPE_DECL(interval);
7979
* The handle is a process identifier (pid_t).
8080
*/
8181
#define DISPATCH_SOURCE_TYPE_VFS (&_dispatch_source_type_vfs)
82-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
82+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
8383
DISPATCH_EXPORT const struct dispatch_source_type_s _dispatch_source_type_vfs;
8484

8585
/*!
@@ -91,6 +91,7 @@ DISPATCH_EXPORT const struct dispatch_source_type_s _dispatch_source_type_vfs;
9191
#define DISPATCH_SOURCE_TYPE_VM (&_dispatch_source_type_vm)
9292
__OSX_AVAILABLE_BUT_DEPRECATED_MSG(__MAC_10_7, __MAC_10_10, __IPHONE_4_3,
9393
__IPHONE_8_0, "Use DISPATCH_SOURCE_TYPE_MEMORYPRESSURE instead")
94+
DISPATCH_LINUX_UNAVAILABLE()
9495
DISPATCH_EXPORT const struct dispatch_source_type_s _dispatch_source_type_vm;
9596

9697
/*!
@@ -104,6 +105,7 @@ __OSX_DEPRECATED(10.9, 10.12, "Use DISPATCH_SOURCE_TYPE_MEMORYPRESSURE instead")
104105
__IOS_DEPRECATED(6.0, 10.0, "Use DISPATCH_SOURCE_TYPE_MEMORYPRESSURE instead")
105106
__TVOS_DEPRECATED(6.0, 10.0, "Use DISPATCH_SOURCE_TYPE_MEMORYPRESSURE instead")
106107
__WATCHOS_DEPRECATED(1.0, 3.0, "Use DISPATCH_SOURCE_TYPE_MEMORYPRESSURE instead")
108+
DISPATCH_LINUX_UNAVAILABLE()
107109
DISPATCH_EXPORT const struct dispatch_source_type_s
108110
_dispatch_source_type_memorystatus;
109111

@@ -112,7 +114,7 @@ DISPATCH_EXPORT const struct dispatch_source_type_s
112114
* @discussion A dispatch source that monitors events on socket state changes.
113115
*/
114116
#define DISPATCH_SOURCE_TYPE_SOCK (&_dispatch_source_type_sock)
115-
__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0)
117+
__OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_6_0) DISPATCH_LINUX_UNAVAILABLE()
116118
DISPATCH_EXPORT const struct dispatch_source_type_s _dispatch_source_type_sock;
117119

118120
__END_DECLS
@@ -456,7 +458,7 @@ uint64_t
456458
dispatch_timer_aggregate_get_delay(dispatch_timer_aggregate_t aggregate,
457459
uint64_t *_Nullable leeway_ptr);
458460

459-
#if TARGET_OS_MAC
461+
#if __has_include(<mach/mach.h>)
460462
/*!
461463
* @typedef dispatch_mig_callback_t
462464
*
@@ -466,7 +468,7 @@ dispatch_timer_aggregate_get_delay(dispatch_timer_aggregate_t aggregate,
466468
typedef boolean_t (*dispatch_mig_callback_t)(mach_msg_header_t *message,
467469
mach_msg_header_t *reply);
468470

469-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
471+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
470472
DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
471473
mach_msg_return_t
472474
dispatch_mig_server(dispatch_source_t ds, size_t maxmsgsz,
@@ -478,7 +480,7 @@ dispatch_mig_server(dispatch_source_t ds, size_t maxmsgsz,
478480
* @abstract
479481
* Extract the context pointer from a mach message trailer.
480482
*/
481-
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
483+
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0) DISPATCH_LINUX_UNAVAILABLE()
482484
DISPATCH_EXPORT DISPATCH_PURE DISPATCH_WARN_RESULT DISPATCH_NONNULL_ALL
483485
DISPATCH_NOTHROW
484486
void *_Nullable

src/data.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,11 @@ const dispatch_block_t _dispatch_data_destructor_none = ^{
108108
DISPATCH_INTERNAL_CRASH(0, "none destructor called");
109109
};
110110

111+
#ifndef __linux__
111112
const dispatch_block_t _dispatch_data_destructor_vm_deallocate = ^{
112113
DISPATCH_INTERNAL_CRASH(0, "vmdeallocate destructor called");
113114
};
115+
#endif
114116

115117
const dispatch_block_t _dispatch_data_destructor_inline = ^{
116118
DISPATCH_INTERNAL_CRASH(0, "inline destructor called");
@@ -247,7 +249,9 @@ dispatch_data_create_f(const void *buffer, size_t size, dispatch_queue_t queue,
247249
if (destructor != DISPATCH_DATA_DESTRUCTOR_DEFAULT &&
248250
destructor != DISPATCH_DATA_DESTRUCTOR_FREE &&
249251
destructor != DISPATCH_DATA_DESTRUCTOR_NONE &&
252+
#ifndef __linux__
250253
destructor != DISPATCH_DATA_DESTRUCTOR_VM_DEALLOCATE &&
254+
#endif
251255
destructor != DISPATCH_DATA_DESTRUCTOR_INLINE) {
252256
destructor = ^{ destructor_function((void*)buffer); };
253257
}

src/init.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,6 +1313,14 @@ const struct dispatch_source_type_s _dispatch_source_type_vm = {
13131313

13141314
#endif // DISPATCH_USE_VM_PRESSURE
13151315

1316+
const struct dispatch_source_type_s _dispatch_source_type_signal = {
1317+
.ke = {
1318+
.filter = EVFILT_SIGNAL,
1319+
.flags = EV_UDATA_SPECIFIC,
1320+
},
1321+
};
1322+
1323+
#if !defined(__linux__)
13161324
static void
13171325
dispatch_source_type_proc_init(dispatch_source_t ds,
13181326
dispatch_source_type_t type DISPATCH_UNUSED,
@@ -1339,13 +1347,6 @@ const struct dispatch_source_type_s _dispatch_source_type_proc = {
13391347
.init = dispatch_source_type_proc_init,
13401348
};
13411349

1342-
const struct dispatch_source_type_s _dispatch_source_type_signal = {
1343-
.ke = {
1344-
.filter = EVFILT_SIGNAL,
1345-
.flags = EV_UDATA_SPECIFIC,
1346-
},
1347-
};
1348-
13491350
const struct dispatch_source_type_s _dispatch_source_type_vnode = {
13501351
.ke = {
13511352
.filter = EVFILT_VNODE,
@@ -1402,6 +1403,7 @@ const struct dispatch_source_type_s _dispatch_source_type_sock = {
14021403
,
14031404
#endif // EVFILT_SOCK
14041405
};
1406+
#endif // !defined(__linux__)
14051407

14061408
static void
14071409
dispatch_source_type_data_init(dispatch_source_t ds,

0 commit comments

Comments
 (0)