/
FifoReader.go
47 lines (37 loc) · 869 Bytes
/
FifoReader.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main
import (
"sync"
)
type FifoReader struct {
internalBuffer []byte
cond *sync.Cond
}
func MakeFifoReader() *FifoReader {
return &FifoReader{
internalBuffer: make([]byte, 0),
cond: sync.NewCond(&sync.Mutex{}),
}
}
func (fr *FifoReader) Len() int {
fr.cond.L.Lock()
defer fr.cond.L.Unlock()
return len(fr.internalBuffer)
}
func (fr *FifoReader) Read(p []byte) (n int, err error) {
fr.cond.L.Lock()
// Wait until enough data is available
for len(fr.internalBuffer) < len(p) {
fr.cond.Wait()
}
// Here we should have enough data.
copy(p, fr.internalBuffer[:len(p)])
fr.internalBuffer = fr.internalBuffer[len(p):]
fr.cond.L.Unlock()
return len(p), nil
}
func (fr *FifoReader) PutData(d []byte) {
fr.cond.L.Lock()
fr.internalBuffer = append(fr.internalBuffer, d...)
fr.cond.Broadcast()
fr.cond.L.Unlock()
}