Skip to content

Commit 606cd45

Browse files
committed
Updates for 1121 release for Windows
Make the 1121 release build on Windows. This is sufficient for getting a basic Hello World dispatch program to run under swift again.
1 parent aac4452 commit 606cd45

16 files changed

+169
-45
lines changed

src/event/event_windows.c

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,20 @@
2424
#pragma mark dispatch_unote_t
2525

2626
bool
27-
_dispatch_unote_register(dispatch_unote_t du DISPATCH_UNUSED,
28-
dispatch_wlh_t wlh DISPATCH_UNUSED,
29-
dispatch_priority_t pri DISPATCH_UNUSED)
27+
_dispatch_unote_register_muxed(dispatch_unote_t du DISPATCH_UNUSED)
3028
{
3129
WIN_PORT_ERROR();
3230
return false;
3331
}
3432

3533
void
36-
_dispatch_unote_resume(dispatch_unote_t du DISPATCH_UNUSED)
34+
_dispatch_unote_resume_muxed(dispatch_unote_t du DISPATCH_UNUSED)
3735
{
3836
WIN_PORT_ERROR();
3937
}
4038

4139
bool
42-
_dispatch_unote_unregister(dispatch_unote_t du DISPATCH_UNUSED,
43-
uint32_t flags DISPATCH_UNUSED)
40+
_dispatch_unote_unregister_muxed(dispatch_unote_t du DISPATCH_UNUSED)
4441
{
4542
WIN_PORT_ERROR();
4643
return false;
@@ -49,31 +46,65 @@ _dispatch_unote_unregister(dispatch_unote_t du DISPATCH_UNUSED,
4946
#pragma mark timers
5047

5148
void
52-
_dispatch_event_loop_timer_arm(uint32_t tidx DISPATCH_UNUSED,
49+
_dispatch_event_loop_timer_arm(dispatch_timer_heap_t dth DISPATCH_UNUSED,
50+
uint32_t tidx DISPATCH_UNUSED,
5351
dispatch_timer_delay_s range DISPATCH_UNUSED,
5452
dispatch_clock_now_cache_t nows DISPATCH_UNUSED)
5553
{
5654
WIN_PORT_ERROR();
5755
}
5856

5957
void
60-
_dispatch_event_loop_timer_delete(uint32_t tidx DISPATCH_UNUSED)
58+
_dispatch_event_loop_timer_delete(dispatch_timer_heap_t dth DISPATCH_UNUSED,
59+
uint32_t tidx DISPATCH_UNUSED)
6160
{
6261
WIN_PORT_ERROR();
6362
}
6463

6564
#pragma mark dispatch_loop
6665

66+
static HANDLE hSomething = INVALID_HANDLE_VALUE;
67+
68+
static void
69+
_dispatch_something_init(void *context DISPATCH_UNUSED)
70+
{
71+
hSomething = CreateEventW(NULL, /*bManualReset=*/TRUE,
72+
/*bInitialState=*/FALSE, NULL);
73+
if (hSomething == NULL) {
74+
DISPATCH_INTERNAL_CRASH(GetLastError(), "CreateEventW");
75+
}
76+
}
77+
6778
void
6879
_dispatch_event_loop_poke(dispatch_wlh_t wlh DISPATCH_UNUSED,
6980
uint64_t dq_state DISPATCH_UNUSED, uint32_t flags DISPATCH_UNUSED)
7081
{
71-
WIN_PORT_ERROR();
82+
static dispatch_once_t _something_pred;
83+
dispatch_once_f(&_something_pred, NULL, _dispatch_something_init);
84+
BOOL bResult = SetEvent(hSomething);
85+
(void)dispatch_assume_zero(!bResult);
7286
}
7387

7488
DISPATCH_NOINLINE
7589
void
76-
_dispatch_event_loop_drain(uint32_t flags DISPATCH_UNUSED)
90+
_dispatch_event_loop_drain(uint32_t flags)
91+
{
92+
DWORD dwWait = WaitForSingleObject(hSomething,
93+
(flags & KEVENT_FLAG_IMMEDIATE) ? 0 : INFINITE);
94+
if (dwWait == WAIT_FAILED) {
95+
DISPATCH_CLIENT_CRASH(GetLastError(), "WaitForSingleObject");
96+
}
97+
98+
if (dwWait == WAIT_OBJECT_0) {
99+
BOOL bResult = ResetEvent(hSomething);
100+
if (!bResult) {
101+
DISPATCH_INTERNAL_CRASH(GetLastError(), "ResetEvent");
102+
}
103+
}
104+
}
105+
106+
void
107+
_dispatch_event_loop_cancel_waiter(dispatch_sync_context_t dsc DISPATCH_UNUSED)
77108
{
78109
WIN_PORT_ERROR();
79110
}
@@ -109,9 +140,9 @@ _dispatch_event_loop_assert_not_owned(dispatch_wlh_t wlh)
109140
#endif
110141

111142
void
112-
_dispatch_event_loop_leave_immediate(dispatch_wlh_t wlh, uint64_t dq_state)
143+
_dispatch_event_loop_leave_immediate(uint64_t dq_state)
113144
{
114-
(void)wlh; (void)dq_state;
145+
(void)dq_state;
115146
}
116147

117148
#endif // DISPATCH_EVENT_BACKEND_WINDOWS

src/event/workqueue.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ _dispatch_workq_worker_register(dispatch_queue_global_t root_q)
9797
_dispatch_unfair_lock_unlock(&mon->registered_tid_lock);
9898
#else
9999
(void)root_q;
100-
(void)cls;
101100
#endif // HAVE_DISPATCH_WORKQ_MONITORING
102101
}
103102

@@ -124,7 +123,6 @@ _dispatch_workq_worker_unregister(dispatch_queue_global_t root_q)
124123
_dispatch_unfair_lock_unlock(&mon->registered_tid_lock);
125124
#else
126125
(void)root_q;
127-
(void)cls;
128126
#endif // HAVE_DISPATCH_WORKQ_MONITORING
129127
}
130128

src/init.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_main, lane,
739739
.dq_push = _dispatch_main_queue_push,
740740
);
741741

742-
#if DISPATCH_COCOA_COMPAT
742+
#if DISPATCH_COCOA_COMPAT || defined(_WIN32)
743743
DISPATCH_VTABLE_SUBCLASS_INSTANCE(queue_runloop, lane,
744744
.do_type = DISPATCH_QUEUE_RUNLOOP_TYPE,
745745
.do_dispose = _dispatch_runloop_queue_dispose,

src/inline_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1294,7 +1294,7 @@ _dispatch_queue_drain_try_lock_wlh(dispatch_queue_t dq, uint64_t *dq_state)
12941294
if (unlikely(!_dq_state_is_base_wlh(old_state) ||
12951295
!_dq_state_is_enqueued_on_target(old_state) ||
12961296
_dq_state_is_enqueued_on_manager(old_state))) {
1297-
#if !__LP64__
1297+
#if DISPATCH_SIZEOF_PTR == 4
12981298
old_state >>= 32;
12991299
#endif
13001300
DISPATCH_INTERNAL_CRASH(old_state, "Invalid wlh state");

src/io.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,11 +1399,11 @@ _dispatch_fd_entry_create_with_fd(dispatch_fd_t fd, uintptr_t hash)
13991399
int result = ioctlsocket((SOCKET)fd, (long)FIONBIO, &value);
14001400
(void)dispatch_assume_zero(result);
14011401
_dispatch_stream_init(fd_entry,
1402-
_dispatch_get_root_queue(DISPATCH_QOS_DEFAULT, false));
1402+
_dispatch_get_default_queue(false));
14031403
} else {
14041404
dispatch_suspend(fd_entry->barrier_queue);
1405-
dispatch_once_f(&_dispatch_io_devs_lockq_pred, NULL,
1406-
_dispatch_io_devs_lockq_init);
1405+
dispatch_once_f(&_dispatch_io_init_pred, NULL,
1406+
_dispatch_io_queues_init);
14071407
dispatch_async(_dispatch_io_devs_lockq, ^{
14081408
_dispatch_disk_init(fd_entry, 0);
14091409
dispatch_resume(fd_entry->barrier_queue);

src/object.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,9 @@ _dispatch_xref_dispose(dispatch_object_t dou)
203203
break;
204204
#endif
205205
case DISPATCH_QUEUE_RUNLOOP_TYPE:
206+
#if DISPATCH_COCOA_COMPAT
206207
_dispatch_runloop_queue_xref_dispose(dou._dl);
208+
#endif
207209
break;
208210
}
209211
return _dispatch_release_tailcall(dou._os_obj);

0 commit comments

Comments
 (0)