@@ -2,6 +2,7 @@ package main
22
33import (
44 "fmt"
5+ "io"
56 "log"
67 "os"
78 "path/filepath"
@@ -13,13 +14,18 @@ import (
1314)
1415
1516func 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
1922func 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