Skip to content

Commit ff05109

Browse files
authored
Merge pull request swiftlang#216 from dgrove-oss/das-darwin-libdispatch-806-merge-master-linux-fixes
Linux fixes for dispatch-806 merge
2 parents 763d0c7 + 7b4281e commit ff05109

14 files changed

+67
-45
lines changed

Makefile.am

-5
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,13 @@ if BUILD_OWN_PTHREAD_WORKQUEUES
88
MAYBE_PTHREAD_WORKQUEUES = libpwq
99
endif
1010

11-
if BUILD_OWN_KQUEUES
12-
MAYBE_KQUEUES = libkqueue
13-
endif
14-
1511
if BUILD_TESTS
1612
MAYBE_TESTS = tests
1713
endif
1814

1915
SUBDIRS= \
2016
dispatch \
2117
$(MAYBE_PTHREAD_WORKQUEUES) \
22-
$(MAYBE_KQUEUES) \
2318
man \
2419
os \
2520
private \

os/linux_base.h

+10
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
#if __GNUC__
1919
#define OS_EXPECT(x, v) __builtin_expect((x), (v))
20+
#define OS_UNUSED __attribute__((__unused__))
2021
#else
2122
#define OS_EXPECT(x, v) (x)
23+
#define OS_UNUSED
2224
#endif
2325

2426
#ifndef os_likely
@@ -67,6 +69,14 @@
6769
#define __OS_CONCAT(x, y) x ## y
6870
#define OS_CONCAT(x, y) __OS_CONCAT(x, y)
6971

72+
#if __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums)
73+
#define OS_ENUM(_name, _type, ...) \
74+
typedef enum : _type { __VA_ARGS__ } _name##_t
75+
#else
76+
#define OS_ENUM(_name, _type, ...) \
77+
enum { __VA_ARGS__ }; typedef _type _name##_t
78+
#endif
79+
7080
/*
7181
* Stub out misc linking and compilation attributes
7282
*/

src/Makefile.am

-5
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ AM_OBJCFLAGS=$(DISPATCH_CFLAGS) $(CBLOCKS_FLAGS)
7777
AM_CXXFLAGS=$(PTHREAD_WORKQUEUE_CFLAGS) $(DISPATCH_CFLAGS) $(CXXBLOCKS_FLAGS)
7878
AM_OBJCXXFLAGS=$(DISPATCH_CFLAGS) $(CXXBLOCKS_FLAGS)
7979

80-
if BUILD_OWN_KQUEUES
81-
KQUEUE_LIBS+=$(top_builddir)/libkqueue/libkqueue.la
82-
KQUEUE_CFLAGS+=-I$(top_srcdir)/libkqueue/include
83-
endif
84-
8580
if BUILD_OWN_PTHREAD_WORKQUEUES
8681
PTHREAD_WORKQUEUE_LIBS=$(top_builddir)/libpwq/libpthread_workqueue.la
8782
PTHREAD_WORKQUEUE_CFLAGS=-I$(top_srcdir)/libpwq/include

src/event/event_config.h

-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,6 @@
133133
# define EV_ONESHOT 0x0010
134134
# define EV_CLEAR 0x0020
135135
# define EV_DISPATCH 0x0080
136-
# define EV_UDATA_SPECIFIC 0x0100
137136

138137
# define EVFILT_READ (-1)
139138
# define EVFILT_WRITE (-2)

src/event/event_epoll.c

+33-16
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
#error unsupported configuration
3636
#endif
3737

38+
#define DISPATCH_EPOLL_MAX_EVENT_COUNT 16
39+
3840
enum {
3941
DISPATCH_EPOLL_EVENTFD = 0x0001,
4042
DISPATCH_EPOLL_CLOCK_WALL = 0x0002,
@@ -47,8 +49,8 @@ typedef struct dispatch_muxnote_s {
4749
TAILQ_HEAD(, dispatch_unote_linkage_s) dmn_writers_head;
4850
int dmn_fd;
4951
int dmn_ident;
52+
uint32_t dmn_events;
5053
int16_t dmn_filter;
51-
int16_t dmn_events;
5254
bool dmn_socket_listener;
5355
} *dispatch_muxnote_t;
5456

@@ -60,6 +62,10 @@ typedef struct dispatch_epoll_timeout_s {
6062
} *dispatch_epoll_timeout_t;
6163

6264
static int _dispatch_epfd, _dispatch_eventfd;
65+
66+
static dispatch_once_t epoll_init_pred;
67+
static void _dispatch_epoll_init(void *);
68+
6369
DISPATCH_CACHELINE_ALIGN
6470
static TAILQ_HEAD(dispatch_muxnote_bucket_s, dispatch_muxnote_s)
6571
_dispatch_sources[DSL_HASH_SIZE];
@@ -112,7 +118,7 @@ _dispatch_muxnote_dispose(dispatch_muxnote_t dmn)
112118
}
113119

114120
static dispatch_muxnote_t
115-
_dispatch_muxnote_create(dispatch_unote_t du, int16_t events)
121+
_dispatch_muxnote_create(dispatch_unote_t du, uint32_t events)
116122
{
117123
dispatch_muxnote_t dmn;
118124
struct stat sb;
@@ -173,6 +179,7 @@ _dispatch_muxnote_create(dispatch_unote_t du, int16_t events)
173179
static int
174180
_dispatch_epoll_update(dispatch_muxnote_t dmn, int op)
175181
{
182+
dispatch_once_f(&epoll_init_pred, NULL, _dispatch_epoll_init);
176183
struct epoll_event ev = {
177184
.events = dmn->dmn_events,
178185
.data = { .ptr = dmn },
@@ -181,11 +188,12 @@ _dispatch_epoll_update(dispatch_muxnote_t dmn, int op)
181188
}
182189

183190
bool
184-
_dispatch_unote_register(dispatch_unote_t du, dispatch_priority_t pri)
191+
_dispatch_unote_register(dispatch_unote_t du, dispatch_wlh_t wlh,
192+
dispatch_priority_t pri)
185193
{
186194
struct dispatch_muxnote_bucket_s *dmb;
187195
dispatch_muxnote_t dmn;
188-
int16_t events = EPOLLFREE;
196+
uint32_t events = EPOLLFREE;
189197

190198
dispatch_assert(!_dispatch_unote_registered(du));
191199
du._du->du_priority = pri;
@@ -194,7 +202,7 @@ _dispatch_unote_register(dispatch_unote_t du, dispatch_priority_t pri)
194202
case DISPATCH_EVFILT_CUSTOM_ADD:
195203
case DISPATCH_EVFILT_CUSTOM_OR:
196204
case DISPATCH_EVFILT_CUSTOM_REPLACE:
197-
du._du->du_wlh = DISPATCH_WLH_GLOBAL;
205+
du._du->du_wlh = wlh;
198206
return true;
199207
case EVFILT_WRITE:
200208
events |= EPOLLOUT;
@@ -264,7 +272,7 @@ _dispatch_unote_unregister(dispatch_unote_t du, uint32_t flags)
264272
if (_dispatch_unote_registered(du)) {
265273
dispatch_unote_linkage_t dul = _dispatch_unote_get_linkage(du);
266274
dispatch_muxnote_t dmn = dul->du_muxnote;
267-
int16_t events = dmn->dmn_events;
275+
uint32_t events = dmn->dmn_events;
268276

269277
if (du._du->du_filter == EVFILT_WRITE) {
270278
TAILQ_REMOVE(&dmn->dmn_writers_head, dul, du_link);
@@ -300,8 +308,6 @@ _dispatch_unote_unregister(dispatch_unote_t du, uint32_t flags)
300308
static void
301309
_dispatch_event_merge_timer(dispatch_clock_t clock)
302310
{
303-
int qos;
304-
305311
_dispatch_timers_expired = true;
306312
_dispatch_timers_processing_mask |= 1 << DISPATCH_TIMER_INDEX(clock, 0);
307313
#if DISPATCH_USE_DTRACE
@@ -314,7 +320,6 @@ _dispatch_event_merge_timer(dispatch_clock_t clock)
314320
static void
315321
_dispatch_timeout_program(uint32_t tidx, uint64_t target, uint64_t leeway)
316322
{
317-
uint32_t qos = DISPATCH_TIMER_QOS(tidx);
318323
dispatch_clock_t clock = DISPATCH_TIMER_CLOCK(tidx);
319324
dispatch_epoll_timeout_t timer = &_dispatch_epoll_timeout[clock];
320325
struct epoll_event ev = {
@@ -371,7 +376,7 @@ _dispatch_event_loop_timer_arm(uint32_t tidx, dispatch_timer_delay_s range,
371376
dispatch_clock_now_cache_t nows)
372377
{
373378
uint64_t target = range.delay;
374-
target += _dispatch_time_cached_now(nows, DISPATCH_TIMER_CLOCK(tidx));
379+
target += _dispatch_time_now_cached(DISPATCH_TIMER_CLOCK(tidx), nows);
375380
_dispatch_timers_heap[tidx].dth_flags |= DTH_ARMED;
376381
_dispatch_timeout_program(tidx, target, range.leeway);
377382
}
@@ -393,6 +398,13 @@ _dispatch_event_loop_atfork_child(void)
393398
void
394399
_dispatch_event_loop_init(void)
395400
{
401+
}
402+
403+
static void
404+
_dispatch_epoll_init(void *context DISPATCH_UNUSED)
405+
{
406+
_dispatch_fork_becomes_unsafe();
407+
396408
unsigned int i;
397409
for (i = 0; i < DSL_HASH_SIZE; i++) {
398410
TAILQ_INIT(&_dispatch_sources[i]);
@@ -413,15 +425,20 @@ _dispatch_event_loop_init(void)
413425
.data = { .u32 = DISPATCH_EPOLL_EVENTFD, },
414426
};
415427
unsigned long op = EPOLL_CTL_ADD;
416-
if (epoll_ctl(_dispatch_eventfd, op, _dispatch_eventfd, &ev) < 0) {
428+
if (epoll_ctl(_dispatch_epfd, op, _dispatch_eventfd, &ev) < 0) {
417429
DISPATCH_INTERNAL_CRASH(errno, "epoll_ctl() failed");
418430
}
431+
432+
#if DISPATCH_USE_MGR_THREAD
433+
dx_push(_dispatch_mgr_q.do_targetq, &_dispatch_mgr_q, 0);
434+
#endif
419435
}
420436

421437
void
422438
_dispatch_event_loop_poke(dispatch_wlh_t wlh DISPATCH_UNUSED,
423439
dispatch_priority_t pri DISPATCH_UNUSED, uint32_t flags DISPATCH_UNUSED)
424440
{
441+
dispatch_once_f(&epoll_init_pred, NULL, _dispatch_epoll_init);
425442
dispatch_assume_zero(eventfd_write(_dispatch_eventfd, 1));
426443
}
427444

@@ -435,7 +452,7 @@ _dispatch_event_merge_signal(dispatch_muxnote_t dmn)
435452

436453
TAILQ_FOREACH_SAFE(dul, &dmn->dmn_readers_head, du_link, dul_next) {
437454
dispatch_unote_t du = _dispatch_unote_linkage_get_unote(dul);
438-
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_CLEAR, 1, 0);
455+
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_CLEAR, 1, 0, 0);
439456
}
440457
}
441458

@@ -458,7 +475,7 @@ _dispatch_get_buffer_size(dispatch_muxnote_t dmn, bool writer)
458475
}
459476

460477
static void
461-
_dispatch_event_merge_fd(dispatch_muxnote_t dmn, int16_t events)
478+
_dispatch_event_merge_fd(dispatch_muxnote_t dmn, uint32_t events)
462479
{
463480
dispatch_unote_linkage_t dul, dul_next;
464481
uintptr_t data;
@@ -467,15 +484,15 @@ _dispatch_event_merge_fd(dispatch_muxnote_t dmn, int16_t events)
467484
data = _dispatch_get_buffer_size(dmn, false);
468485
TAILQ_FOREACH_SAFE(dul, &dmn->dmn_readers_head, du_link, dul_next) {
469486
dispatch_unote_t du = _dispatch_unote_linkage_get_unote(dul);
470-
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_DISPATCH, ~data, 0);
487+
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_DISPATCH, ~data, 0, 0);
471488
}
472489
}
473490

474491
if (events & EPOLLOUT) {
475492
data = _dispatch_get_buffer_size(dmn, true);
476493
TAILQ_FOREACH_SAFE(dul, &dmn->dmn_writers_head, du_link, dul_next) {
477494
dispatch_unote_t du = _dispatch_unote_linkage_get_unote(dul);
478-
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_DISPATCH, ~data, 0);
495+
dux_merge_evt(du._du, EV_ADD|EV_ENABLE|EV_DISPATCH, ~data, 0, 0);
479496
}
480497
}
481498
}
@@ -484,7 +501,7 @@ DISPATCH_NOINLINE
484501
void
485502
_dispatch_event_loop_drain(uint32_t flags)
486503
{
487-
struct epoll_event ev[DISPATCH_DEFERRED_ITEMS_EVENT_COUNT];
504+
struct epoll_event ev[DISPATCH_EPOLL_MAX_EVENT_COUNT];
488505
int i, r;
489506
int timeout = (flags & KEVENT_FLAG_IMMEDIATE) ? 0 : -1;
490507

src/object.c

+2
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,10 @@ _dispatch_xref_dispose(dispatch_object_t dou)
179179
}
180180
if (dx_type(dou._do) == DISPATCH_SOURCE_KEVENT_TYPE) {
181181
_dispatch_source_xref_dispose(dou._ds);
182+
#if HAVE_MACH
182183
} else if (dx_type(dou._do) == DISPATCH_MACH_CHANNEL_TYPE) {
183184
_dispatch_mach_xref_dispose(dou._dm);
185+
#endif
184186
} else if (dx_type(dou._do) == DISPATCH_QUEUE_RUNLOOP_TYPE) {
185187
_dispatch_runloop_queue_xref_dispose(dou._dq);
186188
}

src/shims.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ _pthread_qos_override_end_direct(mach_port_t thread, void *resource)
135135
#endif
136136

137137
#if PTHREAD_WORKQUEUE_SPI_VERSION < 20160427
138-
bool
138+
static inline bool
139139
_pthread_workqueue_should_narrow(pthread_priority_t priority)
140140
{
141141
(void)priority;

src/shims/atomic.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@
4343

4444
// This removes the _Atomic and volatile qualifiers on the type of *p
4545
#define _os_atomic_basetypeof(p) \
46-
typeof(atomic_load(_os_atomic_c11_atomic(p), memory_order_relaxed))
46+
typeof(atomic_load_explicit(_os_atomic_c11_atomic(p), memory_order_relaxed))
4747

4848
#define os_atomic_load(p, m) \
4949
atomic_load_explicit(_os_atomic_c11_atomic(p), memory_order_##m)
5050
#define os_atomic_store(p, v, m) \
51-
atomic_store_explicit(_os_atomic_c11_atomic(p), _v, memory_order_##m)
51+
atomic_store_explicit(_os_atomic_c11_atomic(p), v, memory_order_##m)
5252
#define os_atomic_xchg(p, v, m) \
53-
atomic_exchange_explicit(_os_atomic_c11_atomic(p), _v, memory_order_##m)
53+
atomic_exchange_explicit(_os_atomic_c11_atomic(p), v, memory_order_##m)
5454
#define os_atomic_cmpxchg(p, e, v, m) \
5555
({ _os_atomic_basetypeof(p) _r = (e); \
5656
atomic_compare_exchange_strong_explicit(_os_atomic_c11_atomic(p), \
@@ -69,7 +69,7 @@
6969
atomic_fetch_##o##_explicit(_os_atomic_c11_atomic(p), _v, \
7070
memory_order_##m); (typeof(*(p)))(_r op _v); })
7171
#define _os_atomic_c11_op_orig(p, v, m, o, op) \
72-
atomic_fetch_##o##_explicit(_os_atomic_c11_atomic(p), _v, \
72+
atomic_fetch_##o##_explicit(_os_atomic_c11_atomic(p), v, \
7373
memory_order_##m)
7474
#define os_atomic_add(p, v, m) \
7575
_os_atomic_c11_op((p), (v), m, add, +)

src/shims/priority.h

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ typedef unsigned long pthread_priority_t;
6666
#define _PTHREAD_PRIORITY_DEFAULTQUEUE_FLAG 0x04000000
6767
#define _PTHREAD_PRIORITY_EVENT_MANAGER_FLAG 0x02000000
6868
#define _PTHREAD_PRIORITY_NEEDS_UNBIND_FLAG 0x01000000
69+
#define _PTHREAD_PRIORITY_ENFORCE_FLAG 0x10000000
6970

7071
#endif // HAVE_PTHREAD_QOS_H
7172

src/shims/time.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,11 @@ _dispatch_approximate_time(void)
172172
#if HAVE_MACH_APPROXIMATE_TIME
173173
return mach_approximate_time();
174174
#elif HAVE_DECL_CLOCK_UPTIME_FAST && !defined(__linux__)
175-
struct timesmec ts;
175+
struct timespec ts;
176176
dispatch_assume_zero(clock_gettime(CLOCK_UPTIME_FAST, &ts));
177177
return _dispatch_timespec_to_nano(ts);
178178
#elif defined(__linux__)
179-
struct timesmec ts;
179+
struct timespec ts;
180180
dispatch_assume_zero(clock_gettime(CLOCK_REALTIME_COARSE, &ts));
181181
return _dispatch_timespec_to_nano(ts);
182182
#else

src/shims/tsd.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ struct dispatch_tsd {
118118
#endif
119119
void *dispatch_priority_key;
120120
void *dispatch_r2k_key;
121-
void *dispatch_wlh_key
121+
void *dispatch_wlh_key;
122122
void *dispatch_voucher_key;
123123
void *dispatch_deferred_items_key;
124124
};

src/source.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -134,8 +134,8 @@ dispatch_source_get_handle(dispatch_source_t ds)
134134
unsigned long
135135
dispatch_source_get_data(dispatch_source_t ds)
136136
{
137-
dispatch_source_refs_t dr = ds->ds_refs;
138137
#if DISPATCH_USE_MEMORYSTATUS
138+
dispatch_source_refs_t dr = ds->ds_refs;
139139
if (dr->du_vmpressure_override) {
140140
return NOTE_VM_PRESSURE;
141141
}
@@ -2300,7 +2300,7 @@ _dispatch_mgr_invoke(void)
23002300
#if DISPATCH_EVENT_BACKEND_KEVENT
23012301
ddi.ddi_nevents = 0;
23022302
#endif
2303-
_dispatch_set_wlh(DISPATCH_WLH_GLOBAL);
2303+
dispatch_assert(_dispatch_get_wlh() == DISPATCH_WLH_GLOBAL);
23042304
_dispatch_deferred_items_set(&ddi);
23052305

23062306
for (;;) {

tests/Makefile.am

+3-8
Original file line numberDiff line numberDiff line change
@@ -75,24 +75,19 @@ TESTS= \
7575
$(ADDITIONAL_TESTS)
7676

7777

78-
dispatch_c99_CFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CBLOCKS_FLAGS) $(KQUEUE_CFLAGS) -std=c99
78+
dispatch_c99_CFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CBLOCKS_FLAGS) -std=c99
7979
dispatch_plusplus_SOURCES=dispatch_plusplus.cpp
8080
dispatch_priority2_SOURCES=dispatch_priority.c
8181
dispatch_priority2_CPPFLAGS=$(AM_CPPFLAGS) -DUSE_SET_TARGET_QUEUE=1
8282

8383
AM_CPPFLAGS=-I$(top_builddir) -I$(top_srcdir)
8484

8585
DISPATCH_TESTS_CFLAGS=-Wall -Wno-deprecated-declarations $(MARCH_FLAGS)
86-
AM_CFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CBLOCKS_FLAGS) $(KQUEUE_CFLAGS) $(BSD_OVERLAY_CFLAGS)
86+
AM_CFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CBLOCKS_FLAGS) $(BSD_OVERLAY_CFLAGS)
8787
AM_OBJCFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CBLOCKS_FLAGS)
8888
AM_CXXFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CXXBLOCKS_FLAGS) $(BSD_OVERLAY_CFLAGS)
8989
AM_OBJCXXFLAGS=$(DISPATCH_TESTS_CFLAGS) $(CXXBLOCKS_FLAGS)
9090

91-
if BUILD_OWN_KQUEUES
92-
KQUEUE_LIBS+=$(top_builddir)/libkqueue/libkqueue.la
93-
KQUEUE_CFLAGS+=-I$(top_srcdir)/libkqueue/include
94-
endif
95-
9691
if !BUILD_OWN_PTHREAD_WORKQUEUES
9792
if HAVE_PTHREAD_WORKQUEUES
9893
PTHREAD_WORKQUEUE_LIBS=-lpthread_workqueue
@@ -109,7 +104,7 @@ if HAVE_SWIFT
109104
AM_LDFLAGS=-rpath $(SWIFT_LIBDIR)
110105
endif
111106

112-
LDADD=libbsdtests.la $(top_builddir)/src/libdispatch.la $(KQUEUE_LIBS) $(PTHREAD_WORKQUEUE_LIBS) $(BSD_OVERLAY_LIBS) $(SWIFT_LIBS)
107+
LDADD=libbsdtests.la $(top_builddir)/src/libdispatch.la $(PTHREAD_WORKQUEUE_LIBS) $(BSD_OVERLAY_LIBS) $(SWIFT_LIBS)
113108
libbsdtests_la_LDFLAGS=-avoid-version
114109

115110
bsdtestsummarize_LDADD=-lm $(BSD_OVERLAY_LIBS)

0 commit comments

Comments
 (0)