Skip to content

Commit c2ae180

Browse files
committed
cloudlibc & libpreopen: changes for tagged unions
we decided to abandon the upstream code guarded by #ifdef __wasilibc_unmodified_upstream // non-anonymous unions because these changes are sprawling and those guards are of diminishing importance
1 parent 852d093 commit c2ae180

5 files changed

Lines changed: 42 additions & 94 deletions

File tree

libc-bottom-half/cloudlibc/src/libc/poll/poll.c

Lines changed: 20 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,17 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
2121
__wasi_subscription_t *subscription = &subscriptions[nevents++];
2222
*subscription = (__wasi_subscription_t){
2323
.userdata = (uintptr_t)pollfd,
24-
.type = __WASI_EVENTTYPE_FD_READ,
25-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
26-
.fd_readwrite.fd = pollfd->fd,
27-
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
28-
#else
29-
.u.fd_readwrite.file_descriptor = pollfd->fd,
30-
#endif
24+
.u.tag = __WASI_EVENTTYPE_FD_READ,
25+
.u.u.fd_read.file_descriptor = pollfd->fd,
3126
};
3227
created_events = true;
3328
}
3429
if ((pollfd->events & POLLWRNORM) != 0) {
3530
__wasi_subscription_t *subscription = &subscriptions[nevents++];
3631
*subscription = (__wasi_subscription_t){
3732
.userdata = (uintptr_t)pollfd,
38-
.type = __WASI_EVENTTYPE_FD_WRITE,
39-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
40-
.fd_readwrite.fd = pollfd->fd,
41-
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
42-
#else
43-
.u.fd_readwrite.file_descriptor = pollfd->fd,
44-
#endif
33+
.u.tag = __WASI_EVENTTYPE_FD_WRITE,
34+
.u.u.fd_write.file_descriptor = pollfd->fd,
4535
};
4636
created_events = true;
4737
}
@@ -59,14 +49,9 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
5949
if (timeout >= 0) {
6050
__wasi_subscription_t *subscription = &subscriptions[nevents++];
6151
*subscription = (__wasi_subscription_t){
62-
.type = __WASI_EVENTTYPE_CLOCK,
63-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
64-
.clock.clock_id = __WASI_CLOCK_REALTIME,
65-
.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
66-
#else
67-
.u.clock.id = __WASI_CLOCKID_REALTIME,
68-
.u.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
69-
#endif
52+
.u.tag = __WASI_EVENTTYPE_CLOCK,
53+
.u.u.clock.id = __WASI_CLOCKID_REALTIME,
54+
.u.u.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
7055
};
7156
}
7257

@@ -92,8 +77,8 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
9277
// Set revents fields.
9378
for (size_t i = 0; i < nevents; ++i) {
9479
const __wasi_event_t *event = &events[i];
95-
if (event->type == __WASI_EVENTTYPE_FD_READ ||
96-
event->type == __WASI_EVENTTYPE_FD_WRITE) {
80+
if (event->u.tag == __WASI_EVENTTYPE_FD_READ ||
81+
event->u.tag == __WASI_EVENTTYPE_FD_WRITE) {
9782
struct pollfd *pollfd = (struct pollfd *)(uintptr_t)event->userdata;
9883
#ifdef __wasilibc_unmodified_upstream // generated constant names
9984
if (event->error == __WASI_EBADF) {
@@ -114,14 +99,17 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
11499
pollfd->revents |= POLLERR;
115100
} else {
116101
// Data can be read or written.
117-
pollfd->revents |=
118-
event->type == __WASI_EVENTTYPE_FD_READ ? POLLRDNORM : POLLWRNORM;
119-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
120-
if (event->fd_readwrite.flags & __WASI_EVENT_FD_READWRITE_HANGUP)
121-
#else
122-
if (event->u.fd_readwrite.flags & __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP)
123-
#endif
124-
pollfd->revents |= POLLHUP;
102+
if (event->u.tag == __WASI_EVENTTYPE_FD_READ) {
103+
pollfd->revents |= POLLRDNORM;
104+
if (event->u.u.fd_read.flags & __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP) {
105+
pollfd->revents |= POLLHUP;
106+
}
107+
} else if (event->u.tag == __WASI_EVENTTYPE_FD_WRITE) {
108+
pollfd->revents |= POLLWRNORM;
109+
if (event->u.u.fd_write.flags & __WASI_EVENTRWFLAGS_FD_READWRITE_HANGUP) {
110+
pollfd->revents |= POLLHUP;
111+
}
112+
}
125113
}
126114
}
127115
}

libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,12 @@ int ioctl(int fildes, int request, ...) {
1414
// Poll the file descriptor to determine how many bytes can be read.
1515
__wasi_subscription_t subscriptions[2] = {
1616
{
17-
.type = __WASI_EVENTTYPE_FD_READ,
18-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
19-
.fd_readwrite.fd = fildes,
20-
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
21-
#else
22-
.u.fd_readwrite.file_descriptor = fildes,
23-
#endif
17+
.u.tag = __WASI_EVENTTYPE_FD_READ,
18+
.u.u.fd_read.file_descriptor = fildes,
2419
},
2520
{
26-
.type = __WASI_EVENTTYPE_CLOCK,
27-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
28-
.clock.clock_id = __WASI_CLOCK_MONOTONIC,
29-
#else
30-
.u.clock.id = __WASI_CLOCKID_MONOTONIC,
31-
#endif
21+
.u.tag = __WASI_EVENTTYPE_CLOCK,
22+
.u.u.clock.id = __WASI_CLOCKID_MONOTONIC,
3223
},
3324
};
3425
__wasi_event_t events[__arraycount(subscriptions)];
@@ -57,12 +48,8 @@ int ioctl(int fildes, int request, ...) {
5748
errno = event->error;
5849
return -1;
5950
}
60-
if (event->type == __WASI_EVENTTYPE_FD_READ) {
61-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
62-
*result = event->fd_readwrite.nbytes;
63-
#else
64-
*result = event->u.fd_readwrite.nbytes;
65-
#endif
51+
if (event->u.tag == __WASI_EVENTTYPE_FD_READ) {
52+
*result = event->u.u.fd_read.nbytes;
6653
return 0;
6754
}
6855
}

libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,8 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
4949
__wasi_subscription_t *subscription = &subscriptions[nevents++];
5050
*subscription = (__wasi_subscription_t){
5151
.userdata = fd,
52-
.type = __WASI_EVENTTYPE_FD_READ,
53-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
54-
.fd_readwrite.fd = fd,
55-
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
56-
#else
57-
.u.fd_readwrite.file_descriptor = fd,
58-
#endif
52+
.u.tag = __WASI_EVENTTYPE_FD_READ,
53+
.u.u.fd_read.file_descriptor = fd,
5954
};
6055
}
6156
}
@@ -67,13 +62,8 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
6762
__wasi_subscription_t *subscription = &subscriptions[nevents++];
6863
*subscription = (__wasi_subscription_t){
6964
.userdata = fd,
70-
.type = __WASI_EVENTTYPE_FD_WRITE,
71-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
72-
.fd_readwrite.fd = fd,
73-
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
74-
#else
75-
.u.fd_readwrite.file_descriptor = fd,
76-
#endif
65+
.u.tag = __WASI_EVENTTYPE_FD_WRITE,
66+
.u.u.fd_write.file_descriptor = fd,
7767
};
7868
}
7969
}
@@ -82,18 +72,10 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
8272
if (timeout != NULL) {
8373
__wasi_subscription_t *subscription = &subscriptions[nevents++];
8474
*subscription = (__wasi_subscription_t){
85-
.type = __WASI_EVENTTYPE_CLOCK,
86-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
87-
.clock.clock_id = __WASI_CLOCK_REALTIME,
88-
#else
89-
.u.clock.id = __WASI_CLOCKID_REALTIME,
90-
#endif
75+
.u.tag = __WASI_EVENTTYPE_CLOCK,
76+
.u.u.clock.id = __WASI_CLOCKID_REALTIME,
9177
};
92-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
93-
if (!timespec_to_timestamp_clamp(timeout, &subscription->clock.timeout)) {
94-
#else
95-
if (!timespec_to_timestamp_clamp(timeout, &subscription->u.clock.timeout)) {
96-
#endif
78+
if (!timespec_to_timestamp_clamp(timeout, &subscription->u.u.clock.timeout)) {
9779
errno = EINVAL;
9880
return -1;
9981
}
@@ -115,8 +97,8 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
11597
// Test for EBADF.
11698
for (size_t i = 0; i < nevents; ++i) {
11799
const __wasi_event_t *event = &events[i];
118-
if ((event->type == __WASI_EVENTTYPE_FD_READ ||
119-
event->type == __WASI_EVENTTYPE_FD_WRITE) &&
100+
if ((event->u.tag == __WASI_EVENTTYPE_FD_READ ||
101+
event->u.tag == __WASI_EVENTTYPE_FD_WRITE) &&
120102
#ifdef __wasilibc_unmodified_upstream // generated constant names
121103
event->error == __WASI_EBADF) {
122104
#else
@@ -132,9 +114,9 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
132114
FD_ZERO(writefds);
133115
for (size_t i = 0; i < nevents; ++i) {
134116
const __wasi_event_t *event = &events[i];
135-
if (event->type == __WASI_EVENTTYPE_FD_READ) {
117+
if (event->u.tag == __WASI_EVENTTYPE_FD_READ) {
136118
readfds->__fds[readfds->__nfds++] = event->userdata;
137-
} else if (event->type == __WASI_EVENTTYPE_FD_WRITE) {
119+
} else if (event->u.tag == __WASI_EVENTTYPE_FD_WRITE) {
138120
writefds->__fds[writefds->__nfds++] = event->userdata;
139121
}
140122
}

libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,11 @@ int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp,
2929

3030
// Prepare polling subscription.
3131
__wasi_subscription_t sub = {
32-
.type = __WASI_EVENTTYPE_CLOCK,
33-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
34-
.clock.clock_id = clock_id->id,
35-
.clock.flags = flags,
36-
#else
37-
.u.clock.id = clock_id->id,
38-
.u.clock.flags = flags,
39-
#endif
32+
.u.tag = __WASI_EVENTTYPE_CLOCK,
33+
.u.u.clock.id = clock_id->id,
34+
.u.u.clock.flags = flags,
4035
};
41-
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
42-
if (!timespec_to_timestamp_clamp(rqtp, &sub.clock.timeout))
43-
#else
44-
if (!timespec_to_timestamp_clamp(rqtp, &sub.u.clock.timeout))
45-
#endif
36+
if (!timespec_to_timestamp_clamp(rqtp, &sub.u.u.clock.timeout))
4637
return EINVAL;
4738

4839
// Block until polling event is triggered.

libc-bottom-half/libpreopen/libpreopen.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,7 +538,7 @@ __wasilibc_populate_libpreopen(void)
538538
break;
539539
if (ret != __WASI_ERRNO_SUCCESS)
540540
goto oserr;
541-
switch (prestat.pr_type) {
541+
switch (prestat.tag) {
542542
case __WASI_PREOPENTYPE_DIR: {
543543
char *path = malloc(prestat.u.dir.pr_name_len + 1);
544544
if (path == NULL)

0 commit comments

Comments
 (0)