From a14b6535a66cb7ac0fc4827f767ffaee0ce04b57 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 13 Oct 2025 01:55:44 +0900 Subject: [PATCH] helper/stub: write ready byte late Hopefully eliminates spurious failures. Signed-off-by: Ophestra --- helper/stub.go | 52 +++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/helper/stub.go b/helper/stub.go index 852930f..c1f97e6 100644 --- a/helper/stub.go +++ b/helper/stub.go @@ -68,39 +68,35 @@ func genericStub(argsFile, statFile *os.File) { } } - // simulate status pipe behaviour if statFile != nil { + // simulate status pipe behaviour + var epoll int + if fd, err := syscall.EpollCreate1(0); err != nil { + panic("cannot open epoll fd: " + err.Error()) + } else { + defer func() { + if err = syscall.Close(fd); err != nil { + panic("cannot close epoll fd: " + err.Error()) + } + }() + epoll = fd + } + if err := syscall.EpollCtl(epoll, syscall.EPOLL_CTL_ADD, int(statFile.Fd()), &syscall.EpollEvent{}); err != nil { + panic("cannot add status pipe to epoll: " + err.Error()) + } + if _, err := statFile.Write([]byte{'x'}); err != nil { panic("cannot write to status pipe: " + err.Error()) } - done := make(chan struct{}) - go func() { - // wait for status pipe close - var epoll int - if fd, err := syscall.EpollCreate1(0); err != nil { - panic("cannot open epoll fd: " + err.Error()) - } else { - defer func() { - if err = syscall.Close(fd); err != nil { - panic("cannot close epoll fd: " + err.Error()) - } - }() - epoll = fd - } - if err := syscall.EpollCtl(epoll, syscall.EPOLL_CTL_ADD, int(statFile.Fd()), &syscall.EpollEvent{}); err != nil { - panic("cannot add status pipe to epoll: " + err.Error()) - } - events := make([]syscall.EpollEvent, 1) - if _, err := syscall.EpollWait(epoll, events, -1); err != nil { - panic("cannot poll status pipe: " + err.Error()) - } - if events[0].Events != syscall.EPOLLERR { - panic(strconv.Itoa(int(events[0].Events))) + // wait for status pipe close + events := make([]syscall.EpollEvent, 1) + if _, err := syscall.EpollWait(epoll, events, -1); err != nil { + panic("cannot poll status pipe: " + err.Error()) + } + if events[0].Events != syscall.EPOLLERR { + panic(strconv.Itoa(int(events[0].Events))) - } - close(done) - }() - <-done + } } }