OnlineLibrary

Форк
0
69 строк · 1.2 Кб
1
package syncio
2

3
import (
4
	"io"
5
	"sync"
6
)
7

8
type ReadSeeker struct {
9
	*Reader
10
	*Seeker
11
}
12

13
func NewReadSeeker(rs io.ReadSeeker, l sync.Locker) *ReadSeeker {
14
	return &ReadSeeker{Reader: NewReader(rs, l), Seeker: NewSeeker(rs, l)}
15
}
16

17
type ReadWriter struct {
18
	*Reader
19
	*Writer
20
}
21

22
func NewReadWriter(rw io.ReadWriter, l sync.Locker) *ReadWriter {
23
	return &ReadWriter{Reader: NewReader(rw, l), Writer: NewWriter(rw, l)}
24
}
25

26
type Reader struct {
27
	locker sync.Locker
28
	reader io.Reader
29
}
30

31
func NewReader(r io.Reader, l sync.Locker) *Reader {
32
	return &Reader{locker: l, reader: r}
33
}
34

35
func (r *Reader) Read(p []byte) (int, error) {
36
	r.locker.Lock()
37
	defer r.locker.Unlock()
38
	return r.reader.Read(p)
39
}
40

41
type Writer struct {
42
	locker sync.Locker
43
	writer io.Writer
44
}
45

46
func NewWriter(w io.Writer, l sync.Locker) *Writer {
47
	return &Writer{locker: l, writer: w}
48
}
49

50
func (w *Writer) Write(p []byte) (int, error) {
51
	w.locker.Lock()
52
	defer w.locker.Unlock()
53
	return w.writer.Write(p)
54
}
55

56
type Seeker struct {
57
	locker sync.Locker
58
	seeker io.Seeker
59
}
60

61
func NewSeeker(s io.Seeker, l sync.Locker) *Seeker {
62
	return &Seeker{locker: l, seeker: s}
63
}
64

65
func (s *Seeker) Seek(offset int64, whence int) (int64, error) {
66
	s.locker.Lock()
67
	defer s.locker.Unlock()
68
	return s.seeker.Seek(offset, whence)
69
}
70

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.