35 lines
882 B
Odin
35 lines
882 B
Odin
package main
|
|
|
|
import "base:intrinsics"
|
|
import "core:c"
|
|
import "core:c/libc"
|
|
import "core:sys/posix"
|
|
|
|
shutdown_requested: libc.sig_atomic_t
|
|
server_listener_fd: libc.sig_atomic_t = -1
|
|
|
|
shutdown_signal_handler :: proc "c" (signal: c.int) {
|
|
intrinsics.atomic_store(&shutdown_requested, 1)
|
|
fd := intrinsics.atomic_exchange(&server_listener_fd, libc.sig_atomic_t(-1))
|
|
if fd >= 0 {
|
|
_ = posix.close(posix.FD(fd))
|
|
}
|
|
}
|
|
|
|
register_server_listener :: proc(fd: posix.FD) {
|
|
intrinsics.atomic_store(&server_listener_fd, libc.sig_atomic_t(fd))
|
|
}
|
|
|
|
clear_server_listener :: proc() {
|
|
intrinsics.atomic_store(&server_listener_fd, libc.sig_atomic_t(-1))
|
|
}
|
|
|
|
install_shutdown_handlers :: proc() {
|
|
libc.signal(libc.SIGINT, shutdown_signal_handler)
|
|
libc.signal(libc.SIGTERM, shutdown_signal_handler)
|
|
}
|
|
|
|
should_shutdown :: proc() -> bool {
|
|
return intrinsics.atomic_load(&shutdown_requested) == 1
|
|
}
|