Merge pull request 'doc: add godoc format documentation' (#3) from dev-docs into master
Reviewed-on: #3
This commit is contained in:
commit
098860e3c4
|
@ -1,3 +1,4 @@
|
||||||
|
//Package multireader provides capability for single writer to multiple reader
|
||||||
package multireader
|
package multireader
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -33,6 +34,7 @@ type Reader struct {
|
||||||
closed bool
|
closed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MultiReader initialize new MultiReader object. The object also implements WriteCloser.
|
||||||
func NewMultiReader(len int) *MultiReader {
|
func NewMultiReader(len int) *MultiReader {
|
||||||
if len < 0 {
|
if len < 0 {
|
||||||
len = 0
|
len = 0
|
||||||
|
@ -51,6 +53,7 @@ func NewMultiReader(len int) *MultiReader {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Write implements Writer interface. The function will not return error. Error return only satisfy the interface.
|
||||||
func (m *MultiReader) Write(data []byte) (int, error) {
|
func (m *MultiReader) Write(data []byte) (int, error) {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
@ -116,6 +119,7 @@ func (m *MultiReader) removeReader(id int) {
|
||||||
m.pos = nb
|
m.pos = nb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close will not return error. The error return only satisfy the interface signature.
|
||||||
func (m *MultiReader) Close() error {
|
func (m *MultiReader) Close() error {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
@ -123,6 +127,7 @@ func (m *MultiReader) Close() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewReader initialize new Reader object. The object implements ReadCloser and Seeker interface.
|
||||||
func (m *MultiReader) NewReader() *Reader {
|
func (m *MultiReader) NewReader() *Reader {
|
||||||
m.mtx.Lock()
|
m.mtx.Lock()
|
||||||
defer m.mtx.Unlock()
|
defer m.mtx.Unlock()
|
||||||
|
@ -141,6 +146,8 @@ func (m *MultiReader) NewReader() *Reader {
|
||||||
return reader
|
return reader
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Read implements Reader interface. If the reader reached the same position with the writer. It will wait.
|
||||||
|
// Calling Read() is the same with calling WaitAvailable(), ReadAhead(), and Seek()
|
||||||
func (r *Reader) Read(data []byte) (int, error) {
|
func (r *Reader) Read(data []byte) (int, error) {
|
||||||
r.mtx.Lock()
|
r.mtx.Lock()
|
||||||
defer r.mtx.Unlock()
|
defer r.mtx.Unlock()
|
||||||
|
@ -184,6 +191,8 @@ func (r *Reader) seek(offset int, whence int) (int, error) {
|
||||||
return r.readPos, nil
|
return r.readPos, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Seek implements Seeker interface. The underlying function will move the reader position.
|
||||||
|
// It only returns error when the whence parameter is not in io.SeekStart, io.SeekCurrent, io.SeekEnd
|
||||||
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
|
func (r *Reader) Seek(offset int64, whence int) (int64, error) {
|
||||||
n, err := r.seek(int(offset), whence)
|
n, err := r.seek(int(offset), whence)
|
||||||
return int64(n), err
|
return int64(n), err
|
||||||
|
@ -203,6 +212,7 @@ func (r *Reader) readAhead(data []byte) (int, error) {
|
||||||
return len(data), nil
|
return len(data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReadAhead reads buffer ahead of current position without moving the reader position.
|
||||||
func (r *Reader) ReadAhead(data []byte) (int, error) {
|
func (r *Reader) ReadAhead(data []byte) (int, error) {
|
||||||
r.mtx.Lock()
|
r.mtx.Lock()
|
||||||
defer r.mtx.Unlock()
|
defer r.mtx.Unlock()
|
||||||
|
@ -227,12 +237,14 @@ func (r *Reader) waitAvailable() (int, error) {
|
||||||
return r.multiReader.lastWritePos - r.readPos, nil
|
return r.multiReader.lastWritePos - r.readPos, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WaitAvailable will only wait when Reader position reached Writer position.
|
||||||
func (r *Reader) WaitAvailable() (int, error) {
|
func (r *Reader) WaitAvailable() (int, error) {
|
||||||
r.mtx.Lock()
|
r.mtx.Lock()
|
||||||
defer r.mtx.Unlock()
|
defer r.mtx.Unlock()
|
||||||
return r.waitAvailable()
|
return r.waitAvailable()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close implements ReadCloser interface. It will not return error.
|
||||||
func (r *Reader) Close() error {
|
func (r *Reader) Close() error {
|
||||||
r.mtx.Lock()
|
r.mtx.Lock()
|
||||||
defer r.mtx.Unlock()
|
defer r.mtx.Unlock()
|
||||||
|
|
Loading…
Reference in New Issue