diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-10-13 01:55:44 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-10-13 01:55:44 +0900 |
| commit | a14b6535a66cb7ac0fc4827f767ffaee0ce04b57 (patch) | |
| tree | b46728ef4e6f8a4b96faacc12761ea566c68df41 /helper | |
| parent | 763ab27e09b481dbe38099385ec6dd423d8d8ad3 (diff) | |
helper/stub: write ready byte late
Hopefully eliminates spurious failures.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper')
| -rw-r--r-- | helper/stub.go | 52 |
1 files changed, 24 insertions, 28 deletions
diff --git a/helper/stub.go b/helper/stub.go index 852930fb..c1f97e63 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 + } } } |
