@@ -160,50 +160,51 @@ func (k *Kick) keepAliveLoop(
160160func (k * Kick ) initChatHandler (
161161 ctx context.Context ,
162162) error {
163- if ! k .ChatHandlerLocker .Lock (ctx ) {
164- return ctx .Err ()
165- }
163+ return xsync .DoA1R1 (ctx , & k .ChatHandlerLocker , k .initChatHandlerNoLock , ctx )
164+ }
166165
166+ func (k * Kick ) initChatHandlerNoLock (
167+ ctx context.Context ,
168+ ) error {
167169 chatHandler , err := k .newChatHandlerOBSOLETE (ctx , k .CurrentConfig .Config .Channel , k .onChatHandlerClose )
168170 if err == nil {
169- k .ChatHandlerLocker .Unlock ()
170171 k .ChatHandler = chatHandler
171172 return nil
172173 }
173174
174- go func () {
175- defer k .ChatHandlerLocker .Unlock ()
176- defer logger .Debugf (ctx , "/initChatHandler" )
177- for {
178- logger .Errorf (ctx , "unable to initialize chat handler: %v" , err )
179- time .Sleep (time .Second )
180- select {
181- case <- k .CloseCtx .Done ():
182- logger .Debugf (ctx , "initChatHandler: cancelled (case #1)" )
183- return
184- case <- ctx .Done ():
185- logger .Debugf (ctx , "initChatHandler: cancelled (case #2)" )
186- return
187- default :
188- }
189- chatHandler , err = k .newChatHandlerOBSOLETE (ctx , k .CurrentConfig .Config .Channel , k .onChatHandlerClose )
190- if err == nil {
191- break
192- }
175+ for {
176+ logger .Errorf (ctx , "unable to initialize chat handler: %v" , err )
177+ time .Sleep (time .Second )
178+ select {
179+ case <- k .CloseCtx .Done ():
180+ logger .Debugf (ctx , "initChatHandler: cancelled (case #1)" )
181+ return fmt .Errorf ("k.CloseCtx is closed: %w" , k .CloseCtx .Err ())
182+ case <- ctx .Done ():
183+ logger .Debugf (ctx , "initChatHandler: cancelled (case #2)" )
184+ return fmt .Errorf ("ctx is closed: %w" , ctx .Err ())
185+ default :
186+ }
187+ chatHandler , err = k .newChatHandlerOBSOLETE (ctx , k .CurrentConfig .Config .Channel , k .onChatHandlerClose )
188+ if err != nil {
189+ logger .Debugf (ctx , "initChatHandler: unable to create a new chat handler: %v" , err )
190+ continue
193191 }
194192 k .ChatHandler = chatHandler
195- }()
196- return nil
193+ return nil
194+ }
197195}
198196
199197func (k * Kick ) onChatHandlerClose (
200198 ctx context.Context ,
201199 h * ChatHandlerOBSOLETE ,
202200) {
203- if ! k .ChatHandlerLocker .Lock (ctx ) {
204- return
205- }
206- defer k .ChatHandlerLocker .Unlock ()
201+ xsync .DoA2 (ctx , & k .ChatHandlerLocker , k .onChatHandlerCloseNoLock , ctx , h )
202+ }
203+
204+ func (k * Kick ) onChatHandlerCloseNoLock (
205+ ctx context.Context ,
206+ h * ChatHandlerOBSOLETE ,
207+ ) {
207208 if h != k .ChatHandler {
208209 logger .Errorf (ctx , "chat handler was already replaced" )
209210 return
@@ -550,11 +551,9 @@ func (k *Kick) GetAllCategories(
550551func (k * Kick ) tryGetChatHandler (
551552 ctx context.Context ,
552553) * ChatHandlerOBSOLETE {
553- if ! k .ChatHandlerLocker .Lock (ctx ) {
554- return nil
555- }
556- defer k .ChatHandlerLocker .Unlock ()
557- return k .ChatHandler
554+ return xsync .DoR1 (ctx , & k .ChatHandlerLocker , func () * ChatHandlerOBSOLETE {
555+ return k .ChatHandler
556+ })
558557}
559558
560559func (k * Kick ) getChatHandler (
@@ -761,10 +760,11 @@ func (k *Kick) prepareNoLock(ctx context.Context) error {
761760 err = fmt .Errorf ("initChannelInfo: %w" , err )
762761 return
763762 }
764- if err = k .initChatHandler (ctx ); err != nil {
765- err = fmt .Errorf ("initChatHandler: %w" , err )
766- return
767- }
763+ observability .Go (ctx , func (ctx context.Context ) {
764+ if err = k .initChatHandler (ctx ); err != nil {
765+ logger .Errorf (ctx , "initChatHandler: %v" , err )
766+ }
767+ })
768768 })
769769 return err
770770}
@@ -846,7 +846,7 @@ func (k *Kick) refreshAccessToken(
846846
847847 err = k .setToken (ctx , resp , time .Now ())
848848 if err != nil {
849- return fmt .Errorf ("unable to set access token: %w" )
849+ return fmt .Errorf ("unable to set access token: %w" , err )
850850 }
851851
852852 return nil
0 commit comments