~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
49 lines · 890 B Raw History
package main

import (
	"errors"
	"time"

	"golang.org/x/sys/unix"
)

func awaitExit(pids []int, timeout time.Duration) {
	deadline := time.Now().Add(timeout)
	var fds []unix.PollFd
	for _, pid := range pids {
		if pid <= 0 {
			continue
		}
		fd, err := unix.PidfdOpen(pid, 0)
		if err != nil {
			continue
		}
		fds = append(fds, unix.PollFd{Fd: int32(fd), Events: unix.POLLIN})
	}
	defer func() {
		for _, p := range fds {
			unix.Close(int(p.Fd))
		}
	}()
	open := fds
	for len(open) > 0 {
		left := time.Until(deadline)
		if left <= 0 {
			return
		}
		_, err := unix.Poll(open, int((left+time.Millisecond-1)/time.Millisecond))
		if errors.Is(err, unix.EINTR) {
			continue
		}
		if err != nil {
			return
		}
		var still []unix.PollFd
		for _, p := range open {
			if p.Revents == 0 {
				still = append(still, unix.PollFd{Fd: p.Fd, Events: unix.POLLIN})
			}
		}
		open = still
	}
}