Просмотр исходного кода

Merge pull request #189 from 9seconds/relay-close-racecondition

Fix race condition in closing a relay
tags/v2.0.1^2
Sergey Arkhipov 5 лет назад
Родитель
Сommit
b19f491fc8
Аккаунт пользователя с таким Email не найден
1 измененных файлов: 5 добавлений и 4 удалений
  1. 5
    4
      mtglib/internal/relay/relay.go

+ 5
- 4
mtglib/internal/relay/relay.go Просмотреть файл

68
 
68
 
69
 func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser,
69
 func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser,
70
 	buffer []byte, direction string, wg *sync.WaitGroup) {
70
 	buffer []byte, direction string, wg *sync.WaitGroup) {
71
+	defer wg.Done()
72
+
71
 	defer func() {
73
 	defer func() {
74
+		r.ctxCancel()
72
 		src.Close()
75
 		src.Close()
73
 		dst.Close()
76
 		dst.Close()
74
-		wg.Done()
75
-		r.ctxCancel()
76
 	}()
77
 	}()
77
 
78
 
78
 	if _, err := io.CopyBuffer(dst, src, buffer); err != nil {
79
 	if _, err := io.CopyBuffer(dst, src, buffer); err != nil {
92
 }
93
 }
93
 
94
 
94
 func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) {
95
 func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) {
96
+	defer wg.Done()
97
+
95
 	ticker := time.NewTicker(time.Second)
98
 	ticker := time.NewTicker(time.Second)
96
 
99
 
97
 	defer func() {
100
 	defer func() {
104
 		case <-ticker.C:
107
 		case <-ticker.C:
105
 		default:
108
 		default:
106
 		}
109
 		}
107
-
108
-		wg.Done()
109
 	}()
110
 	}()
110
 
111
 
111
 	lastTickAt := time.Now()
112
 	lastTickAt := time.Now()

Загрузка…
Отмена
Сохранить