Skip to content

Commit 75ae076

Browse files
committed
Linux port of libdispatch-685 merge
Minimal set of changes to get sources merged from libdispatch-685 to compile and run on Linux.
1 parent 9e480f1 commit 75ae076

18 files changed

+280
-183
lines changed

configure.ac

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,6 @@ AC_MSG_CHECKING([what semaphore type to use]);
295295
AS_IF([test "x$have_mach" = "xtrue"],
296296
[AC_DEFINE(USE_MACH_SEM, 1, [Define to use Mach semaphores])
297297
AC_MSG_RESULT([Mach semaphores])],
298-
[test "x$have_futex" = "xtrue"],
299-
[AC_DEFINE(USE_FUTEX_SEM, 1, [Define to use Futex semaphores])
300-
AC_MSG_RESULT([Futex semaphores])],
301298
[test "x$have_sem_init" = "xtrue"],
302299
[AC_DEFINE(USE_POSIX_SEM, 1, [Define to use POSIX semaphores])
303300
AC_MSG_RESULT([POSIX semaphores])],

dispatch/dispatch.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,37 @@
4141
#ifndef __OSX_AVAILABLE_STARTING
4242
#define __OSX_AVAILABLE_STARTING(x, y)
4343
#endif
44+
#ifndef __OSX_AVAILABLE_BUT_DEPRECATED
45+
#define __OSX_AVAILABLE_BUT_DEPRECATED(...)
46+
#endif
47+
#ifndef __OSX_AVAILABLE_BUT_DEPRECATED_MSG
48+
#define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(...)
49+
#endif
50+
51+
#ifndef __OSX_AVAILABLE
52+
#define __OSX_AVAILABLE(...)
53+
#endif
54+
#ifndef __IOS_AVAILABLE
55+
#define __IOS_AVAILABLE(...)
56+
#endif
57+
#ifndef __TVOS_AVAILABLE
58+
#define __TVOS_AVAILABLE(...)
59+
#endif
60+
#ifndef __WATCHOS_AVAILABLE
61+
#define __WATCHOS_AVAILABLE(...)
62+
#endif
63+
#ifndef __OSX_DEPRECATED
64+
#define __OSX_DEPRECATED(...)
65+
#endif
66+
#ifndef __IOS_DEPRECATED
67+
#define __IOS_DEPRECATED(...)
68+
#endif
69+
#ifndef __TVOS_DEPRECATED
70+
#define __TVOS_DEPRECATED(...)
71+
#endif
72+
#ifndef __WATCHOS_DEPRECATED
73+
#define __WATCHOS_DEPRECATED(...)
74+
#endif
4475

4576
#define DISPATCH_API_VERSION 20160612
4677

os/linux_base.h

Lines changed: 44 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -13,92 +13,60 @@
1313
#ifndef __OS_LINUX_BASE__
1414
#define __OS_LINUX_BASE__
1515

16-
// #include <sys/event.h>
1716
#include <sys/user.h>
17+
#include <sys/param.h>
1818

19-
// marker for hacks we have made to make progress
20-
#define __LINUX_PORT_HDD__ 1
21-
22-
/*
23-
* Stub out defines for some mach types and related macros
24-
*/
25-
26-
typedef uint32_t mach_port_t;
27-
28-
#define MACH_PORT_NULL (0)
29-
#define MACH_PORT_DEAD (-1)
30-
31-
#define EVFILT_MACHPORT (-8)
32-
33-
typedef uint32_t mach_error_t;
34-
35-
typedef uint32_t mach_vm_size_t;
36-
37-
typedef uint32_t mach_msg_return_t;
38-
39-
typedef uintptr_t mach_vm_address_t;
40-
41-
typedef uint32_t dispatch_mach_msg_t;
42-
43-
typedef uint32_t dispatch_mach_t;
44-
45-
typedef uint32_t dispatch_mach_reason_t;
46-
47-
typedef uint32_t voucher_activity_mode_t;
48-
49-
typedef uint32_t voucher_activity_trace_id_t;
50-
51-
typedef uint32_t voucher_activity_id_t;
52-
53-
typedef uint32_t _voucher_activity_buffer_hook_t;;
54-
55-
typedef uint32_t voucher_activity_flag_t;
56-
57-
typedef struct
58-
{
59-
} mach_msg_header_t;
60-
61-
62-
typedef void (*dispatch_mach_handler_function_t)(void*, dispatch_mach_reason_t,
63-
dispatch_mach_msg_t, mach_error_t);
64-
65-
typedef void (*dispatch_mach_msg_destructor_t)(void*);
66-
67-
// Print a warning when an unported code path executes.
68-
#define LINUX_PORT_ERROR() do { printf("LINUX_PORT_ERROR_CALLED %s:%d: %s\n",__FILE__,__LINE__,__FUNCTION__); } while (0)
69-
70-
/*
71-
* Stub out defines for other missing types
72-
*/
73-
74-
#if __linux__
75-
// we fall back to use kevent
76-
#define kevent64_s kevent
77-
#define kevent64(kq,cl,nc,el,ne,f,to) kevent(kq,cl,nc,el,ne,to)
19+
#if __GNUC__
20+
#define OS_EXPECT(x, v) __builtin_expect((x), (v))
21+
#else
22+
#define OS_EXPECT(x, v) (x)
7823
#endif
7924

80-
// SIZE_T_MAX should not be hardcoded like this here.
81-
#define SIZE_T_MAX (0x7fffffff)
25+
#ifndef os_likely
26+
#define os_likely(x) OS_EXPECT(!!(x), 1)
27+
#endif
28+
#ifndef os_unlikely
29+
#define os_unlikely(x) OS_EXPECT(!!(x), 0)
30+
#endif
8231

83-
// Define to 0 the NOTE_ values that are not present on Linux.
84-
// Revisit this...would it be better to ifdef out the uses instead??
32+
#if __has_feature(assume_nonnull)
33+
#define OS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")
34+
#define OS_ASSUME_NONNULL_END _Pragma("clang assume_nonnull end")
35+
#else
36+
#define OS_ASSUME_NONNULL_BEGIN
37+
#define OS_ASSUME_NONNULL_END
38+
#endif
8539

86-
// The following values are passed as part of the EVFILT_TIMER requests
40+
#if __has_builtin(__builtin_assume)
41+
#define OS_COMPILER_CAN_ASSUME(expr) __builtin_assume(expr)
42+
#else
43+
#define OS_COMPILER_CAN_ASSUME(expr) ((void)(expr))
44+
#endif
8745

88-
#define IGNORE_KEVENT64_EXT /* will force the kevent64_s.ext[] to not be used -> leeway ignored */
46+
#if __has_feature(attribute_availability_swift)
47+
// equivalent to __SWIFT_UNAVAILABLE from Availability.h
48+
#define OS_SWIFT_UNAVAILABLE(_msg) \
49+
__attribute__((__availability__(swift, unavailable, message=_msg)))
50+
#else
51+
#define OS_SWIFT_UNAVAILABLE(_msg)
52+
#endif
8953

90-
#define NOTE_SECONDS 0x01
91-
#define NOTE_USECONDS 0x02
92-
#define NOTE_NSECONDS 0x04
93-
#define NOTE_ABSOLUTE 0x08
94-
#define NOTE_CRITICAL 0x10
95-
#define NOTE_BACKGROUND 0x20
96-
#define NOTE_LEEWAY 0x40
54+
#if __has_attribute(swift_private)
55+
# define OS_REFINED_FOR_SWIFT __attribute__((__swift_private__))
56+
#else
57+
# define OS_REFINED_FOR_SWIFT
58+
#endif
9759

98-
// need to catch the following usage if it happens ..
99-
// we simply return '0' as a value probably not correct
60+
#if __has_attribute(swift_name)
61+
# define OS_SWIFT_NAME(_name) __attribute__((__swift_name__(#_name)))
62+
#else
63+
# define OS_SWIFT_NAME(_name)
64+
#endif
10065

101-
#define NOTE_VM_PRESSURE ({LINUX_PORT_ERROR(); 0;})
66+
#define __OS_STRINGIFY(s) #s
67+
#define OS_STRINGIFY(s) __OS_STRINGIFY(s)
68+
#define __OS_CONCAT(x, y) x ## y
69+
#define OS_CONCAT(x, y) __OS_CONCAT(x, y)
10270

10371
/*
10472
* Stub out misc linking and compilation attributes
@@ -123,12 +91,4 @@ typedef void (*dispatch_mach_msg_destructor_t)(void*);
12391
#endif
12492
#define OS_NOTHROW
12593

126-
127-
// These and similar macros come from Availabilty.h on OS X
128-
// Need a better way to do this long term.
129-
#define __OSX_AVAILABLE_BUT_DEPRECATED(a,b,c,d) //
130-
#define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(a,b,c,d,msg) //
131-
132-
133-
13494
#endif /* __OS_LINUX_BASE__ */

os/voucher_private.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -416,6 +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__
419420
/*!
420421
* @group Voucher Mach SPI
421422
* SPI intended for clients that need to interact with mach messages or mach
@@ -444,7 +445,6 @@ OS_VOUCHER_EXPORT OS_OBJECT_RETURNS_RETAINED OS_WARN_RESULT OS_NOTHROW
444445
voucher_t _Nullable
445446
voucher_create_with_mach_msg(mach_msg_header_t *msg);
446447

447-
#ifdef __APPLE__
448448
/*!
449449
* @group Voucher Persona SPI
450450
* SPI intended for clients that need to interact with personas.

src/firehose/firehose_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#ifndef __FIREHOSE_INTERNAL__
2222
#define __FIREHOSE_INTERNAL__
2323

24+
#if OS_FIREHOSE_SPI
25+
2426
// make sure this is defined so that we get MIG_SERVER_DIED when a send once
2527
// notification is sent back because of a crashed server
2628
#ifndef __MigTypeCheck
@@ -44,4 +46,6 @@
4446
#endif
4547
#include "firehose_inline_internal.h"
4648

49+
#endif // OS_FIREHOSE_SPI
50+
4751
#endif // __FIREHOSE_INTERNAL__

src/init.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ const struct dispatch_continuation_vtable_s _dispatch_continuation_vtables[] = {
486486
DC_VTABLE_ENTRY(ASYNC_REDIRECT,
487487
.do_kind = "dc-redirect",
488488
.do_invoke = _dispatch_async_redirect_invoke),
489+
#if HAVE_MACH
489490
DC_VTABLE_ENTRY(MACH_SEND_BARRRIER_DRAIN,
490491
.do_kind = "dc-mach-send-drain",
491492
.do_invoke = _dispatch_mach_send_barrier_drain_invoke),
@@ -495,6 +496,7 @@ const struct dispatch_continuation_vtable_s _dispatch_continuation_vtables[] = {
495496
DC_VTABLE_ENTRY(MACH_RECV_BARRIER,
496497
.do_kind = "dc-mach-recv-barrier",
497498
.do_invoke = _dispatch_mach_barrier_invoke),
499+
#endif
498500
#if HAVE_PTHREAD_WORKQUEUE_QOS
499501
DC_VTABLE_ENTRY(OVERRIDE_STEALING,
500502
.do_kind = "dc-override-stealing",
@@ -1195,7 +1197,9 @@ dispatch_source_type_readwrite_init(dispatch_source_t ds,
11951197
{
11961198
ds->ds_is_level = true;
11971199
// bypass kernel check for device kqueue support rdar://19004921
1200+
#ifdef NOTE_LOWAT
11981201
ds->ds_dkev->dk_kevent.fflags = NOTE_LOWAT;
1202+
#endif
11991203
ds->ds_dkev->dk_kevent.data = 1;
12001204
}
12011205

src/inline_internal.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -977,7 +977,7 @@ _dispatch_queue_drain_try_lock(dispatch_queue_t dq,
977977
uint64_t pending_barrier_width =
978978
(dq->dq_width - 1) * DISPATCH_QUEUE_WIDTH_INTERVAL;
979979
uint64_t xor_owner_and_set_full_width =
980-
_dispatch_thread_port() | DISPATCH_QUEUE_WIDTH_FULL_BIT;
980+
_dispatch_tid_self() | DISPATCH_QUEUE_WIDTH_FULL_BIT;
981981
uint64_t clear_enqueued_bit, old_state, new_state;
982982

983983
if (flags & DISPATCH_INVOKE_STEALING) {
@@ -1041,7 +1041,7 @@ static inline bool
10411041
_dispatch_queue_try_acquire_barrier_sync(dispatch_queue_t dq)
10421042
{
10431043
uint64_t value = DISPATCH_QUEUE_WIDTH_FULL_BIT | DISPATCH_QUEUE_IN_BARRIER;
1044-
value |= _dispatch_thread_port();
1044+
value |= _dispatch_tid_self();
10451045

10461046
return os_atomic_cmpxchg2o(dq, dq_state,
10471047
DISPATCH_QUEUE_STATE_INIT_VALUE(dq->dq_width), value, acquire);
@@ -1577,7 +1577,7 @@ _dispatch_root_queue_identity_assume(struct _dispatch_identity_s *di,
15771577
if (!pp) pp = di->old_pri;
15781578
if ((pp & _PTHREAD_PRIORITY_QOS_CLASS_MASK) >
15791579
(assumed_rq->dq_priority & _PTHREAD_PRIORITY_QOS_CLASS_MASK)) {
1580-
_dispatch_wqthread_override_start(_dispatch_thread_port(), pp);
1580+
_dispatch_wqthread_override_start(_dispatch_tid_self(), pp);
15811581
// Ensure that the root queue sees that this thread was overridden.
15821582
_dispatch_set_defaultpriority_override();
15831583
}
@@ -1630,7 +1630,7 @@ _dispatch_queue_class_invoke(dispatch_object_t dou,
16301630
drain_pending_barrier:
16311631
if (overriding) {
16321632
_dispatch_object_debug(dq, "stolen onto thread 0x%x, 0x%lx",
1633-
_dispatch_thread_port(), _dispatch_get_defaultpriority());
1633+
_dispatch_tid_self(), _dispatch_get_defaultpriority());
16341634
_dispatch_root_queue_identity_assume(&di, 0, 0);
16351635
}
16361636

@@ -1640,7 +1640,7 @@ _dispatch_queue_class_invoke(dispatch_object_t dou,
16401640
old_dp = _dispatch_set_defaultpriority(dq->dq_priority, &dp);
16411641
op = dq->dq_override;
16421642
if (op > (dp & _PTHREAD_PRIORITY_QOS_CLASS_MASK)) {
1643-
_dispatch_wqthread_override_start(_dispatch_thread_port(), op);
1643+
_dispatch_wqthread_override_start(_dispatch_tid_self(), op);
16441644
// Ensure that the root queue sees that this thread was overridden.
16451645
_dispatch_set_defaultpriority_override();
16461646
}
@@ -1825,7 +1825,7 @@ _dispatch_queue_set_bound_thread(dispatch_queue_t dq)
18251825
{
18261826
// Tag thread-bound queues with the owning thread
18271827
dispatch_assert(_dispatch_queue_is_thread_bound(dq));
1828-
mach_port_t old_owner, self = _dispatch_thread_port();
1828+
mach_port_t old_owner, self = _dispatch_tid_self();
18291829
uint64_t dq_state = os_atomic_or_orig2o(dq, dq_state, self, relaxed);
18301830
if (unlikely(old_owner = _dq_state_drain_owner(dq_state))) {
18311831
DISPATCH_INTERNAL_CRASH(old_owner, "Queue bound twice");
@@ -1888,7 +1888,7 @@ _dispatch_reset_defaultpriority(pthread_priority_t pp)
18881888
pp |= old_pp & _PTHREAD_PRIORITY_OVERRIDE_FLAG;
18891889
_dispatch_thread_setspecific(dispatch_defaultpriority_key, (void*)pp);
18901890
#else
1891-
(void)priority;
1891+
(void)pp;
18921892
#endif
18931893
}
18941894

@@ -1994,7 +1994,7 @@ _dispatch_priority_adopt(pthread_priority_t pp, unsigned long flags)
19941994
return defaultpri;
19951995
}
19961996
#else
1997-
(void)priority; (void)flags;
1997+
(void)pp; (void)flags;
19981998
return 0;
19991999
#endif
20002000
}
@@ -2037,6 +2037,7 @@ static inline pthread_priority_t
20372037
_dispatch_priority_compute_update(pthread_priority_t pp,
20382038
_dispatch_thread_set_self_t flags)
20392039
{
2040+
#if HAVE_PTHREAD_WORKQUEUE_QOS
20402041
dispatch_assert(pp != DISPATCH_NO_PRIORITY);
20412042
if (!_dispatch_set_qos_class_enabled) return 0;
20422043
// the priority in _dispatch_get_priority() only tracks manager-ness
@@ -2047,7 +2048,6 @@ _dispatch_priority_compute_update(pthread_priority_t pp,
20472048
// the manager bit is invalid input, but we keep it to get meaningful
20482049
// assertions in _dispatch_set_priority_and_voucher_slow()
20492050
pp &= _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG | ~_PTHREAD_PRIORITY_FLAGS_MASK;
2050-
#if HAVE_PTHREAD_WORKQUEUE_QOS
20512051
pthread_priority_t cur_priority = _dispatch_get_priority();
20522052
pthread_priority_t unbind = _PTHREAD_PRIORITY_NEEDS_UNBIND_FLAG;
20532053
pthread_priority_t overcommit = _PTHREAD_PRIORITY_OVERCOMMIT_FLAG;
@@ -2064,6 +2064,8 @@ _dispatch_priority_compute_update(pthread_priority_t pp,
20642064
cur_priority &= ~overcommit;
20652065
}
20662066
if (unlikely(pp != cur_priority)) return pp;
2067+
#else
2068+
(void)pp; (void)flags;
20672069
#endif
20682070
return 0;
20692071
}

src/internal.h

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@
144144
#include <dispatch/io.h>
145145
#endif
146146

147-
#define DISPATCH_PURE_C (!defined(__OBJC__) && !defined(__cplusplus))
147+
#if defined(__OBJC__) || defined(__cplusplus)
148+
#define DISPATCH_PURE_C 0
149+
#else
150+
#define DISPATCH_PURE_C 1
151+
#endif
148152

149153
/* private.h must be included last to avoid picking up installed headers. */
150154
#include "os/object_private.h"
@@ -256,10 +260,6 @@ DISPATCH_EXPORT DISPATCH_NOTHROW void dispatch_atfork_child(void);
256260
#endif
257261
#include <limits.h>
258262
#include <search.h>
259-
#if USE_FUTEX_SEM
260-
#include <sys/syscall.h>
261-
#include <linux/futex.h>
262-
#endif
263263
#if USE_POSIX_SEM
264264
#include <semaphore.h>
265265
#endif
@@ -939,6 +939,16 @@ _dispatch_ktrace_impl(uint32_t code, uint64_t a, uint64_t b,
939939
#define VOUCHER_USE_BANK_AUTOREDEEM 1
940940
#endif
941941

942+
#if OS_FIREHOSE_SPI
943+
#include <firehose/private.h>
944+
#else
945+
typedef uint64_t firehose_activity_id_t;
946+
typedef uint64_t firehose_tracepoint_id_t;
947+
typedef unsigned long firehose_activity_flags_t;
948+
typedef uint8_t firehose_stream_t;
949+
typedef void * voucher_activity_hooks_t;
950+
#endif
951+
942952
#if !VOUCHER_USE_MACH_VOUCHER || \
943953
!__has_include(<voucher/ipc_pthread_priority_types.h>) || \
944954
!DISPATCH_HOST_SUPPORTS_OSX(101200)

0 commit comments

Comments
 (0)