summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2019-05-09 23:48:53 +0000
committerJeff Carr <[email protected]>2019-05-09 23:48:53 +0000
commitf1d7a816bed5798334b0ed67c768613e098941de (patch)
treecb73afe69dd6c49ec5fe3984060520a7abc21061
parent026c59bc5c23630c1f918167e5237f315dc5895b (diff)
add total byte counts to track accurate flushing of buffers
Signed-off-by: Jeff Carr <[email protected]>
-rw-r--r--shell.go41
1 files changed, 29 insertions, 12 deletions
diff --git a/shell.go b/shell.go
index caed428..f6d0a84 100644
--- a/shell.go
+++ b/shell.go
@@ -72,25 +72,42 @@ func Run(cmdline string) int {
newerrreader := bufio.NewReader(pstderr)
nbrerr := nbreader.NewNBReader(newerrreader, 1024)
+ totalCount := 0
+
for {
time.Sleep(2 * time.Millisecond) // only check the buffer 500 times a second
// log.Println("sleep done")
- oneByte := make([]byte, 1024)
- count, err := nbr.Read(oneByte)
+ // tight loop that reads 1K at a time until buffer is empty
+ for {
+ oneByte := make([]byte, 1024)
+ count, err := nbr.Read(oneByte)
+ totalCount += count
- if (err != nil) {
- // log.Println("Read() count = ", count, "err = ", err)
- oneByte = make([]byte, 1024)
- count, err = nbr.Read(oneByte)
+ if (err != nil) {
+ // log.Println("Read() count = ", count, "err = ", err)
+ oneByte = make([]byte, 1024)
+ count, err = nbr.Read(oneByte)
+ f.Write([]byte(string(oneByte)))
+ f.Flush()
+ }
f.Write([]byte(string(oneByte)))
f.Flush()
+ if (count == 0) {
+ break
+ }
+ }
+
+ if (totalCount != 0) {
+ log.Println("totalCount = ", totalCount)
}
- f.Write([]byte(string(oneByte)))
- f.Flush()
- oneByte = make([]byte, 1024)
- count, err = nbrerr.Read(oneByte)
+ //
+ // HANDLE STDERR
+ // HANDLE STDERR
+ //
+ oneByte := make([]byte, 1024)
+ count, err := nbrerr.Read(oneByte)
if (err != nil) {
oneByte = make([]byte, 1024)
@@ -99,8 +116,8 @@ func Run(cmdline string) int {
f.Flush()
log.Println("Read() count = ", count, "err = ", err)
- spew.Dump(process.Process)
- spew.Dump(process.ProcessState)
+ // spew.Dump(process.Process)
+ // spew.Dump(process.ProcessState)
err := process.Wait()
if err != nil {
spew.Dump(err.(*exec.ExitError))