OnlineLibrary
69 строк · 1.2 Кб
1package syncio
2
3import (
4"io"
5"sync"
6)
7
8type ReadSeeker struct {
9*Reader
10*Seeker
11}
12
13func NewReadSeeker(rs io.ReadSeeker, l sync.Locker) *ReadSeeker {
14return &ReadSeeker{Reader: NewReader(rs, l), Seeker: NewSeeker(rs, l)}
15}
16
17type ReadWriter struct {
18*Reader
19*Writer
20}
21
22func NewReadWriter(rw io.ReadWriter, l sync.Locker) *ReadWriter {
23return &ReadWriter{Reader: NewReader(rw, l), Writer: NewWriter(rw, l)}
24}
25
26type Reader struct {
27locker sync.Locker
28reader io.Reader
29}
30
31func NewReader(r io.Reader, l sync.Locker) *Reader {
32return &Reader{locker: l, reader: r}
33}
34
35func (r *Reader) Read(p []byte) (int, error) {
36r.locker.Lock()
37defer r.locker.Unlock()
38return r.reader.Read(p)
39}
40
41type Writer struct {
42locker sync.Locker
43writer io.Writer
44}
45
46func NewWriter(w io.Writer, l sync.Locker) *Writer {
47return &Writer{locker: l, writer: w}
48}
49
50func (w *Writer) Write(p []byte) (int, error) {
51w.locker.Lock()
52defer w.locker.Unlock()
53return w.writer.Write(p)
54}
55
56type Seeker struct {
57locker sync.Locker
58seeker io.Seeker
59}
60
61func NewSeeker(s io.Seeker, l sync.Locker) *Seeker {
62return &Seeker{locker: l, seeker: s}
63}
64
65func (s *Seeker) Seek(offset int64, whence int) (int64, error) {
66s.locker.Lock()
67defer s.locker.Unlock()
68return s.seeker.Seek(offset, whence)
69}
70