| 22 Dec 2025 |
Randy Eckenrode | ppoll is apparently part of POSIX now. No idea if or when Apple will add it. | 15:43:07 |
Ihar Hrachyshka | they could at least maybe conditionalize it. like if it's null and the user needs some non-standard behavior, go through select. otherwise...
I think main loop for qemu doesn't pass nulls there. | 15:43:45 |
Ihar Hrachyshka | it's 2024 posix so rather new | 15:43:59 |
Randy Eckenrode | Yeah. Apple is adding newer stuff, but they still only go for UNIX03 when they certify. | 15:44:53 |
Randy Eckenrode | So no guarantee, particularly if they have alternative APIs already. | 15:45:24 |
Randy Eckenrode | Does that means it works now? | 15:46:11 |
Ihar Hrachyshka | exit(1); /* Does not work for devices -- fail */ | 15:46:34 |
Randy Eckenrode | That code is almost twenty years old. It wouldn’t be the first time Glib makes an assumption that doesn’t apply on modern Darwin. | 15:46:48 |
Randy Eckenrode | What is the expected semantics when the user provides NULL fds and nfds 0? | 15:47:44 |
Randy Eckenrode | * What are the expected semantics when the user provides NULL fds and nfds 0? | 15:47:57 |
Randy Eckenrode | Is it equivalent to passing an empty array? | 15:48:53 |
Randy Eckenrode | macOS supports pselect but not ppoll? | 15:51:13 |
Randy Eckenrode | Let’s look at the implementation. The signature takes a pointer, so NULL should be valid. | 15:52:54 |
Ihar Hrachyshka | one could probably implement g_poll conditioning to default to poll but fall back to select if a) any device fds passed or b) fds is null. then for most calls we would use poll. | 15:53:06 |
Ihar Hrachyshka | that's on nixos
(ins)[nix-shell:/tmp]$ ./a.out
poll() returned: 0
(ins)[nix-shell:/tmp]$ cat test.c
#include <stdio.h>
#include <poll.h>
#include <errno.h>
#include <string.h>
int main() {
int result = poll(NULL, 0, 1000);
printf("poll() returned: %d\n", result);
if (result == -1) {
printf("Error: %s\n", strerror(errno));
}
return 0;
}
(ins)[nix-shell:/tmp]$ clang ./test.c
(ins)[nix-shell:/tmp]$ ./a.out
poll() returned: 0
| 15:53:15 |
Ihar Hrachyshka | actuall it returns the same zero on darwin, not sure if there's more than just that they are looking for... | 15:54:09 |
Ihar Hrachyshka | maybe the original reasoning documented in the comment is no longer applicable, but tap device polling is still an issue. | 15:55:30 |
Randy Eckenrode | Maybe it only works on newer macOS? | 15:57:29 |
hexa | it's a bit surprising that nix-darwin does not have a system.autoUpgrade like option 🤔 | 15:58:04 |
hexa | what I need is to keep the machines in sync with a flake ref | 15:58:43 |
Randy Eckenrode | The test is whether it supports devices. According to POSIX:
The poll() and ppoll() functions shall support regular files, terminal and pseudo-terminal devices, FIFOs, pipes, and sockets. The behavior of poll() and ppoll() on elements of fds that refer to other types of file is unspecified.
| 16:00:23 |
Randy Eckenrode | So it doesn’t appear that it’s required to support devices other than (P)TTYs. | 16:01:03 |
Ihar Hrachyshka | it's a gnu world... | 16:01:17 |
Randy Eckenrode | If Glib does want to support that, they need emulation. | 16:01:33 |
Randy Eckenrode | It might be possible to do it with kqueue. That’s how Apple implements poll in XNU. They probably don’t support devices because it’s not required. | 16:02:58 |
Ihar Hrachyshka | qemu defines fd array as GPollFD poll_fds[1024 * 2]; /* this is probably overkill */ which AFAIU is above the limit on darwin. but then it's probably not something that would be solved by reducing the size of the array since - I assume - qemu has a good reason to listen on so many files (is it because of how nix store is overlayed into these vms?) | 16:04:40 |
Randy Eckenrode | Does it work if the fd limit is increased? | 16:05:31 |
Ihar Hrachyshka | maybe I should (somehow) map fds opened by the process to actual files and see what's in the top | 16:05:43 |
Ihar Hrachyshka | can one increas the limit? thought it's hardcoded in includes and darwin enforces it (which I think is how I get the traceback in Console in the first place) | 16:06:15 |
Ihar Hrachyshka | the traceback with enforcement
Thread 13 Crashed:
0 libsystem_kernel.dylib 0x1903409f4 os_fault_with_payload + 8
1 libsystem_kernel.dylib 0x190348964 __darwin_check_fd_set_overflow + 212
2 libglib-2.0.0.dylib 0x10790fc64 g_poll + 196
3 qemu-system-aarch64 0x104df8158 main_loop_wait + 336
4 qemu-system-aarch64 0x104750064 qemu_main_loop + 96
5 qemu-system-aarch64 0x104d2c06c qemu_default_main + 36
6 qemu-system-aarch64 0x104de5300 qemu_thread_start + 132
7 libsystem_pthread.dylib 0x190374c08 _pthread_start + 136
8 libsystem_pthread.dylib 0x19036fba8 thread_start + 8
| 16:13:33 |