// Copyright 2015 The Vanadium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package modules | |
import ( | |
"bytes" | |
"io" | |
"sync" | |
) | |
// queueRW implements a ReadWriteCloser backed by an unbounded in-memory | |
// buffer. | |
type queueRW struct { | |
mu sync.Mutex | |
cond *sync.Cond | |
buf bytes.Buffer | |
closed bool | |
} | |
func newRW() io.ReadWriteCloser { | |
q := &queueRW{} | |
q.cond = sync.NewCond(&q.mu) | |
return q | |
} | |
func (q *queueRW) Close() error { | |
q.mu.Lock() | |
defer q.mu.Unlock() | |
defer q.cond.Broadcast() | |
q.closed = true | |
return nil | |
} | |
func (q *queueRW) Read(p []byte) (n int, err error) { | |
q.mu.Lock() | |
defer q.mu.Unlock() | |
for q.buf.Len() == 0 && !q.closed { | |
q.cond.Wait() | |
} | |
return q.buf.Read(p) | |
} | |
func (q *queueRW) Write(p []byte) (n int, err error) { | |
q.mu.Lock() | |
defer q.mu.Unlock() | |
defer q.cond.Broadcast() | |
return q.buf.Write(p) | |
} |