aboutsummaryrefslogtreecommitdiffhomepage
path: root/helper
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-10-13 01:55:44 +0900
committerOphestra <cat@gensokyo.uk>2025-10-13 01:55:44 +0900
commita14b6535a66cb7ac0fc4827f767ffaee0ce04b57 (patch)
treeb46728ef4e6f8a4b96faacc12761ea566c68df41 /helper
parent763ab27e09b481dbe38099385ec6dd423d8d8ad3 (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.go52
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
+ }
}
}