@@ -75,9 +75,9 @@ type ADNL struct {
75
75
76
76
activeQueries map [string ]chan tl.Serializable
77
77
78
- customMessageHandler CustomMessageHandler
79
- queryHandler QueryHandler
80
- onDisconnect DisconnectHandler
78
+ customMessageHandler unsafe. Pointer // CustomMessageHandler
79
+ queryHandler unsafe. Pointer // QueryHandler
80
+ onDisconnect unsafe. Pointer // DisconnectHandler
81
81
onChannel func (ch * Channel )
82
82
83
83
mx sync.RWMutex
@@ -120,8 +120,8 @@ func (a *ADNL) Close() {
120
120
}
121
121
a .mx .Unlock ()
122
122
123
- if disc := a .onDisconnect ; trigger && disc != nil {
124
- disc (a .addr , a .peerKey )
123
+ if d := a .GetDisconnectHandler () ; trigger && d != nil {
124
+ d (a .addr , a .peerKey )
125
125
}
126
126
}
127
127
@@ -231,8 +231,10 @@ func (a *ADNL) processMessage(message any) error {
231
231
return fmt .Errorf ("failed to send pong: %w" , err )
232
232
}
233
233
case MessageQuery :
234
- if a .queryHandler != nil {
235
- if err := a .queryHandler (& ms ); err != nil {
234
+ qh := atomic .LoadPointer (& a .queryHandler )
235
+ if qh != nil {
236
+ h := * (* QueryHandler )(qh )
237
+ if err := h (& ms ); err != nil {
236
238
return fmt .Errorf ("failed to handle query: %w" , err )
237
239
}
238
240
}
@@ -348,8 +350,10 @@ func (a *ADNL) processMessage(message any) error {
348
350
}
349
351
}
350
352
case MessageCustom :
351
- if a .customMessageHandler != nil {
352
- if err := a .customMessageHandler (& ms ); err != nil {
353
+ ch := atomic .LoadPointer (& a .customMessageHandler )
354
+ if ch != nil {
355
+ h := * (* CustomMessageHandler )(ch )
356
+ if err := h (& ms ); err != nil {
353
357
return fmt .Errorf ("failed to handle custom message: %w" , err )
354
358
}
355
359
}
@@ -362,23 +366,31 @@ func (a *ADNL) processMessage(message any) error {
362
366
}
363
367
364
368
func (a * ADNL ) SetCustomMessageHandler (handler func (msg * MessageCustom ) error ) {
365
- a .customMessageHandler = handler
369
+ atomic . StorePointer ( & a .customMessageHandler , unsafe . Pointer ( & handler ))
366
370
}
367
371
368
372
func (a * ADNL ) SetQueryHandler (handler func (msg * MessageQuery ) error ) {
369
- a .queryHandler = handler
373
+ atomic . StorePointer ( & a .queryHandler , unsafe . Pointer ( & handler ))
370
374
}
371
375
372
376
func (a * ADNL ) GetQueryHandler () func (msg * MessageQuery ) error {
373
- return a .queryHandler
377
+ h := atomic .LoadPointer (& a .queryHandler )
378
+ if h == nil {
379
+ return nil
380
+ }
381
+ return * (* QueryHandler )(h )
374
382
}
375
383
376
384
func (a * ADNL ) SetDisconnectHandler (handler func (addr string , key ed25519.PublicKey )) {
377
- a .onDisconnect = handler
385
+ atomic . StorePointer ( & a .onDisconnect , unsafe . Pointer ( & handler ))
378
386
}
379
387
380
388
func (a * ADNL ) GetDisconnectHandler () func (addr string , key ed25519.PublicKey ) {
381
- return a .onDisconnect
389
+ d := (* DisconnectHandler )(atomic .LoadPointer (& a .onDisconnect ))
390
+ if d == nil {
391
+ return nil
392
+ }
393
+ return * d
382
394
}
383
395
384
396
func (a * ADNL ) SetChannelReadyHandler (handler func (ch * Channel )) {
0 commit comments