Skip to content

Commit b8f5310

Browse files
committed
use mutex to synchronize
1 parent cfb8080 commit b8f5310

3 files changed

Lines changed: 30 additions & 10 deletions

File tree

encoder.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,13 @@ func (enc *Encoder) Stream() chan<- interface{} {
117117
value interface{}
118118
)
119119

120+
enc.mutex.Lock()
120121
for value = range enc.s {
121122
if enc.err = enc.write(value); enc.err != nil {
122123
continue
123124
}
124125
}
126+
enc.mutex.Unlock()
125127
}()
126128
})
127129

@@ -141,12 +143,14 @@ func (enc *Encoder) Close() {
141143
time.Sleep(100 * time.Microsecond)
142144
}
143145
close(enc.s)
146+
enc.mutex.Lock()
144147

145148
enc.buf.Flush()
146149

147150
if _, ok = enc.w.(io.Closer); ok {
148151
enc.w.(io.Closer).Close()
149152
}
153+
enc.mutex.Unlock()
150154
})
151155

152156
}

linebuf.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type LinebufJSONConverter struct {
2727
r *bufio.Reader
2828
err error
2929
finished bool
30+
mutex sync.Mutex
3031
}
3132

3233
/*
@@ -43,6 +44,7 @@ type Encoder struct {
4344
closeOnce sync.Once
4445
unbuffered bool
4546
bufBytes uint64
47+
mutex sync.Mutex
4648
}
4749

4850
/*

linebuf2json.go

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package linebuf
33
import (
44
"bufio"
55
"io"
6-
"time"
76
)
87

98
/*
@@ -12,9 +11,15 @@ NewLinebufJSONConverter returns a writer that converts line-buffered JSON back t
1211
func NewLinebufJSONConverter(w io.WriteCloser) *LinebufJSONConverter {
1312
var (
1413
r, pipeWriter = io.Pipe()
15-
bufReader = bufio.NewReaderSize(r, 4096)
16-
bufWriter = bufio.NewWriterSize(pipeWriter, 4096)
17-
sanitizedWriter = &LinebufJSONConverter{bufWriter, w, pipeWriter, bufReader, nil, false}
14+
bufReader = bufio.NewReaderSize(r, 16)
15+
bufWriter = bufio.NewWriterSize(pipeWriter, 16)
16+
sanitizedWriter = &LinebufJSONConverter{
17+
Writer: bufWriter,
18+
w: w,
19+
pipeWriter: pipeWriter,
20+
r: bufReader,
21+
err: nil,
22+
}
1823
)
1924

2025
go func() {
@@ -24,8 +29,9 @@ func NewLinebufJSONConverter(w io.WriteCloser) *LinebufJSONConverter {
2429
isArray = false
2530
)
2631

32+
sanitizedWriter.mutex.Lock()
2733
defer func() {
28-
sanitizedWriter.finished = true
34+
sanitizedWriter.mutex.Unlock()
2935
}()
3036

3137
if firstline, sanitizedWriter.err = sanitizedWriter.r.ReadBytes('\n'); sanitizedWriter.err != nil {
@@ -68,12 +74,20 @@ func NewLinebufJSONConverter(w io.WriteCloser) *LinebufJSONConverter {
6874
Close waits until the last writes have finished and gracefully closes the underlaying writers
6975
*/
7076
func (l *LinebufJSONConverter) Close() error {
71-
l.Writer.Flush()
72-
l.pipeWriter.Close()
73-
for !l.finished {
74-
time.Sleep(100 * time.Microsecond)
77+
var (
78+
err error
79+
)
80+
81+
if err = l.Writer.Flush(); err != nil {
82+
return err
83+
}
84+
if err = l.pipeWriter.Close(); err != nil {
85+
return err
7586
}
76-
return l.w.Close()
87+
l.mutex.Lock()
88+
err = l.w.Close()
89+
l.mutex.Unlock()
90+
return err
7791
}
7892

7993
/*

0 commit comments

Comments
 (0)