Skip to content

Commit d9bbef4

Browse files
committed
wexec: updates from apptron for recent fixes to tasks/pipes
1 parent 1d58f37 commit d9bbef4

File tree

1 file changed

+35
-12
lines changed

1 file changed

+35
-12
lines changed

shell/wexec/main.go

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package main
22

33
import (
44
"fmt"
5+
"io"
56
"log"
67
"os"
78
"path/filepath"
@@ -13,13 +14,18 @@ import (
1314
)
1415

1516
func debug(format string, a ...any) {
16-
// log.Printf(format+"\n", a...)
17+
if os.Getenv("DEBUG") == "1" {
18+
log.Printf(format+"\n", a...)
19+
}
1720
}
1821

1922
func main() {
23+
log.SetFlags(log.Lshortfile)
2024
if len(os.Args) < 2 {
2125
log.Fatal("usage: wexec <wasm> [args...]")
2226
}
27+
28+
// fake /env program to print environment for debugging
2329
if os.Args[1] == "/env" {
2430
fmt.Println(os.Environ())
2531
fmt.Println("---")
@@ -62,32 +68,46 @@ func main() {
6268
go func() {
6369
defer wg.Done()
6470
debug("polling fd/1 => stdout")
71+
f, err := os.Open(fmt.Sprintf("/task/%s/fd/1", pid))
72+
if err != nil {
73+
log.Fatal(err)
74+
}
75+
defer f.Close()
76+
b := make([]byte, 4096)
6577
for {
66-
b, err := os.ReadFile(fmt.Sprintf("/task/%s/fd/1", pid))
67-
if err != nil {
78+
n, err := f.Read(b)
79+
if err != nil && err != io.EOF {
6880
log.Fatal(err)
6981
}
70-
if done.Load() == 1 && len(b) == 0 {
82+
if done.Load() == 1 && n == 0 {
83+
debug("stdout thread done")
7184
return
7285
}
73-
os.Stdout.Write(b)
74-
time.Sleep(200 * time.Millisecond)
86+
os.Stdout.Write(b[:n])
87+
time.Sleep(30 * time.Millisecond)
7588
}
7689
}()
7790
wg.Add(1)
7891
go func() {
7992
defer wg.Done()
8093
debug("polling fd/2 => stderr")
94+
f, err := os.Open(fmt.Sprintf("/task/%s/fd/2", pid))
95+
if err != nil {
96+
log.Fatal(err)
97+
}
98+
defer f.Close()
99+
b := make([]byte, 4096)
81100
for {
82-
b, err := os.ReadFile(fmt.Sprintf("/task/%s/fd/2", pid))
83-
if err != nil {
101+
n, err := f.Read(b)
102+
if err != nil && err != io.EOF {
84103
log.Fatal(err)
85104
}
86-
if done.Load() == 1 && len(b) == 0 {
105+
if done.Load() == 1 && n == 0 {
106+
debug("stderr thread done")
87107
return
88108
}
89-
os.Stderr.Write(b)
90-
time.Sleep(200 * time.Millisecond)
109+
os.Stderr.Write(b[:n])
110+
time.Sleep(30 * time.Millisecond)
91111
}
92112
}()
93113

@@ -104,15 +124,18 @@ func main() {
104124
}
105125
out := strings.TrimSpace(string(b))
106126
if out != "" {
127+
debug("exit code: %s", out)
107128
code, err := strconv.Atoi(out)
108129
if err != nil {
109130
log.Fatal(err)
110131
}
111132
done.Store(1)
133+
debug("waiting for threads to finish")
112134
wg.Wait()
135+
debug("exiting with code %d", code)
113136
os.Exit(code)
114137
}
115-
time.Sleep(200 * time.Millisecond)
138+
time.Sleep(100 * time.Millisecond)
116139
}
117140
}
118141

0 commit comments

Comments
 (0)