Skip to content

Commit 2260c33

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 2260c33

File tree

13 files changed

+170
-54
lines changed

13 files changed

+170
-54
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])],

os/linux_base.h

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ typedef uint32_t mach_msg_return_t;
3838

3939
typedef uintptr_t mach_vm_address_t;
4040

41+
typedef uint32_t mach_msg_bits_t;
42+
4143
typedef uint32_t dispatch_mach_msg_t;
4244

4345
typedef uint32_t dispatch_mach_t;
@@ -48,12 +50,25 @@ typedef uint32_t voucher_activity_mode_t;
4850

4951
typedef uint32_t voucher_activity_trace_id_t;
5052

53+
typedef uint32_t voucher_activity_hooks_t;
54+
5155
typedef uint32_t voucher_activity_id_t;
5256

5357
typedef uint32_t _voucher_activity_buffer_hook_t;;
5458

5559
typedef uint32_t voucher_activity_flag_t;
5660

61+
typedef uint32_t firehose_activity_id_t;
62+
63+
typedef uint32_t firehose_activity_flags_t;
64+
65+
typedef uint32_t firehose_activity_mode_t;
66+
67+
typedef uint32_t firehose_tracepoint_id_t;
68+
69+
typedef uint32_t firehose_stream_t;
70+
71+
5772
typedef struct
5873
{
5974
} mach_msg_header_t;
@@ -123,12 +138,67 @@ typedef void (*dispatch_mach_msg_destructor_t)(void*);
123138
#endif
124139
#define OS_NOTHROW
125140

141+
#ifdef OS_ASSUME_NONNULL_BEGIN
142+
#undef OS_ASSUME_NONNULL_BEGIN
143+
#endif
144+
#define OS_ASSUME_NONNULL_BEGIN
145+
146+
#ifdef OS_ASSUME_NONNULL_END
147+
#undef OS_ASSUME_NONNULL_END
148+
#endif
149+
#define OS_ASSUME_NONNULL_END
150+
151+
#ifdef OS_SWIFT_UNAVAILABLE
152+
#undef OS_SWIFT_UNAVAILABLE
153+
#endif
154+
#define OS_SWIFT_UNAVAILABLE(errstring)
155+
126156

127157
// These and similar macros come from Availabilty.h on OS X
128158
// Need a better way to do this long term.
129159
#define __OSX_AVAILABLE_BUT_DEPRECATED(a,b,c,d) //
130160
#define __OSX_AVAILABLE_BUT_DEPRECATED_MSG(a,b,c,d,msg) //
161+
#define __OSX_DEPRECATED(a,b,c) //
162+
#define __IOS_DEPRECATED(a,b,c) //
163+
#define __TVOS_DEPRECATED(a,b,c) //
164+
#define __WATCHOS_DEPRECATED(a,b,c) //
165+
166+
167+
#ifdef __OSX_AVAILABLE
168+
#undef __OSX_AVAILABLE
169+
#endif
170+
#define __OSX_AVAILABLE(version)
171+
172+
#ifdef __IOS_AVAILABLE
173+
#undef __IOS_AVAILABLE
174+
#endif
175+
#define __IOS_AVAILABLE(version)
176+
177+
#ifdef __TVOS_AVAILABLE
178+
#undef __TVOS_AVAILABLE
179+
#endif
180+
#define __TVOS_AVAILABLE(version)
181+
182+
#ifdef __WATCHOS_AVAILABLE
183+
#undef __WATCHOS_AVAILABLE
184+
#endif
185+
#define __WATCHOS_AVAILABLE(version)
186+
187+
#ifndef os_likely
188+
#define os_likely(cond) (cond)
189+
#endif
190+
191+
#ifndef os_unlikely
192+
#define os_unlikely(cond) (cond)
193+
#endif
194+
195+
#define __OS_STRINGIFY(s) #s
196+
#define OS_STRINGIFY(s) __OS_STRINGIFY(s)
131197

198+
#define __OS_CONCAT(x,y) x ## y
199+
#define OS_CONCAT(x,y) __OS_CONCAT(x,y)
132200

201+
int
202+
_pthread_qos_class_decode(int prio, int*, void*);
133203

134204
#endif /* __OS_LINUX_BASE__ */

src/firehose/firehose_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#define __MigTypeCheck 1
2828
#endif
2929

30+
#ifdef OS_FIREHOSE_SPI
3031
#include <limits.h>
3132
#include <machine/endian.h>
3233
#include <mach/mach_types.h>
@@ -43,5 +44,6 @@
4344
#include "firehose_server_internal.h"
4445
#endif
4546
#include "firehose_inline_internal.h"
47+
#endif // OS_FIREHOSE_SPI
4648

4749
#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: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
@@ -2038,6 +2038,7 @@ _dispatch_priority_compute_update(pthread_priority_t pp,
20382038
_dispatch_thread_set_self_t flags)
20392039
{
20402040
dispatch_assert(pp != DISPATCH_NO_PRIORITY);
2041+
#if HAVE_PTHREAD_WORKQUEUE_QOS
20412042
if (!_dispatch_set_qos_class_enabled) return 0;
20422043
// the priority in _dispatch_get_priority() only tracks manager-ness
20432044
// and overcommit, which is inherited from the current value for each update
@@ -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;

src/internal.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ DISPATCH_EXPORT DISPATCH_NOTHROW void dispatch_atfork_child(void);
232232
#endif // __has_include(<malloc_private.h)
233233

234234
#include <sys/stat.h>
235+
#include <sys/param.h>
235236

236237
#if !TARGET_OS_WIN32
237238
#include <sys/event.h>
@@ -402,8 +403,8 @@ DISPATCH_EXPORT DISPATCH_NOINLINE __attribute__((__format__(__printf__,1,2)))
402403
void _dispatch_log(const char *msg, ...);
403404
#endif // DISPATCH_USE_OS_DEBUG_LOG
404405

405-
#define dsnprintf(...) \
406-
({ int _r = snprintf(__VA_ARGS__); _r < 0 ? 0u : (size_t)_r; })
406+
#define dsnprintf(buf,sz,fmt, ...) \
407+
({ int _r = snprintf(buf,sz,fmt, ## __VA_ARGS__); _r < 0 ? 0u : (size_t)_r; })
407408

408409
#if __GNUC__
409410
#define dispatch_static_assert(e) ({ \

src/object.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ dispatch_set_target_queue(dispatch_object_t dou, dispatch_queue_t tq)
240240
} else if (dou._do->do_ref_cnt != DISPATCH_OBJECT_GLOBAL_REFCNT &&
241241
!slowpath(dx_hastypeflag(dou._do, QUEUE_ROOT))) {
242242
if (slowpath(!tq)) {
243-
tq = _dispatch_get_root_queue(QOS_CLASS_DEFAULT, false);
243+
tq = _dispatch_get_root_queue(_DISPATCH_QOS_CLASS_DEFAULT, false);
244244
}
245245
_dispatch_object_set_target_queue_inline(dou._do, tq);
246246
}

src/queue.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -909,10 +909,10 @@ libdispatch_init(void)
909909
#if DISPATCH_PERF_MON && !DISPATCH_INTROSPECTION
910910
_dispatch_thread_key_create(&dispatch_bcounter_key, NULL);
911911
#endif
912-
if (DISPATCH_LOCK_USE_SEMAPHORE_FALLBACK) {
913-
_dispatch_thread_key_create(&dispatch_sema4_key,
912+
#if DISPATCH_LOCK_USE_SEMAPHORE_FALLBACK
913+
_dispatch_thread_key_create(&dispatch_sema4_key,
914914
_dispatch_thread_semaphore_dispose);
915-
}
915+
#endif
916916

917917
#if DISPATCH_USE_RESOLVERS // rdar://problem/8541707
918918
_dispatch_main_q.do_targetq = &_dispatch_root_queues[
@@ -1076,7 +1076,7 @@ _dispatch_get_queue_attr(qos_class_t qos, int prio,
10761076
dispatch_queue_attr_t
10771077
_dispatch_get_default_queue_attr(void)
10781078
{
1079-
return _dispatch_get_queue_attr(QOS_CLASS_UNSPECIFIED, 0,
1079+
return _dispatch_get_queue_attr(_DISPATCH_QOS_CLASS_UNSPECIFIED, 0,
10801080
_dispatch_queue_attr_overcommit_unspecified,
10811081
DISPATCH_AUTORELEASE_FREQUENCY_INHERIT, false, false);
10821082
}
@@ -2655,13 +2655,15 @@ _dispatch_block_create_with_voucher_and_priority(dispatch_block_flags_t flags,
26552655
flags = _dispatch_block_normalize_flags(flags);
26562656
bool assign = (flags & DISPATCH_BLOCK_ASSIGN_CURRENT);
26572657

2658+
#if HAVE_MACH
26582659
if (assign && !(flags & DISPATCH_BLOCK_HAS_VOUCHER)) {
26592660
voucher = VOUCHER_CURRENT;
26602661
flags |= DISPATCH_BLOCK_HAS_VOUCHER;
26612662
}
26622663
if (voucher == VOUCHER_CURRENT) {
26632664
voucher = _voucher_get();
26642665
}
2666+
#endif
26652667
if (assign && !(flags & DISPATCH_BLOCK_HAS_PRIORITY)) {
26662668
pri = _dispatch_priority_propagate();
26672669
flags |= DISPATCH_BLOCK_HAS_PRIORITY;
@@ -4023,6 +4025,13 @@ _dispatch_runloop_queue_wakeup(dispatch_queue_t dq, pthread_priority_t pp,
40234025
return _dispatch_release_tailcall(dq);
40244026
}
40254027
}
4028+
#else
4029+
void
4030+
_dispatch_runloop_queue_wakeup(dispatch_queue_t dq, pthread_priority_t pp,
4031+
dispatch_wakeup_flags_t flags)
4032+
{
4033+
LINUX_PORT_ERROR();
4034+
}
40264035
#endif
40274036

40284037
void
@@ -5750,3 +5759,15 @@ _dispatch_context_cleanup(void *ctxt)
57505759
DISPATCH_INTERNAL_CRASH(ctxt,
57515760
"Premature thread exit while a dispatch context is set");
57525761
}
5762+
5763+
#if !DISPATCH_COCOA_COMPAT
5764+
// FIXME: Need real implementation of this + related functions for Linux
5765+
DISPATCH_NOINLINE
5766+
void
5767+
_dispatch_queue_class_override_drainer(dispatch_queue_t dq,
5768+
pthread_priority_t pp, dispatch_wakeup_flags_t flags)
5769+
{
5770+
(void)dq; (void)pp; (void)flags;
5771+
LINUX_PORT_ERROR();
5772+
}
5773+
#endif

src/shims/linux_stubs.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,12 @@ unsigned short dispatch_callout__return_semaphore;
6363
unsigned short dispatch_queue__push_semaphore;
6464
void (*_dispatch_block_special_invoke)(void*);
6565
struct dispatch_queue_attr_s _dispatch_queue_attr_concurrent;
66+
67+
68+
int
69+
_pthread_qos_class_decode(int prio, int* what, void* ever)
70+
{
71+
(void)what; (void)ever;
72+
return prio;
73+
}
74+

0 commit comments

Comments
 (0)