Skip to content

Commit 4100b20

Browse files
authored
Merge 87fbe0d into a69e6af
2 parents a69e6af + 87fbe0d commit 4100b20

File tree

22 files changed

+1367
-658
lines changed

22 files changed

+1367
-658
lines changed

.github/workflows/go.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Build
2424
run: go build -v ./...
2525

26-
- uses: actions/cache@v2
26+
- uses: actions/cache@v4
2727
with:
2828
path: ~/go/pkg/mod
2929
key: ${{ runner.os }}-2go-${{ hashFiles('**/go.sum') }}

adnl/adnl.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ type ADNL struct {
7575

7676
activeQueries map[string]chan tl.Serializable
7777

78-
customMessageHandler CustomMessageHandler
79-
queryHandler QueryHandler
80-
onDisconnect DisconnectHandler
78+
customMessageHandler unsafe.Pointer // CustomMessageHandler
79+
queryHandler unsafe.Pointer // QueryHandler
80+
onDisconnect unsafe.Pointer // DisconnectHandler
8181
onChannel func(ch *Channel)
8282

8383
mx sync.RWMutex
@@ -120,8 +120,8 @@ func (a *ADNL) Close() {
120120
}
121121
a.mx.Unlock()
122122

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)
125125
}
126126
}
127127

@@ -231,8 +231,10 @@ func (a *ADNL) processMessage(message any) error {
231231
return fmt.Errorf("failed to send pong: %w", err)
232232
}
233233
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 {
236238
return fmt.Errorf("failed to handle query: %w", err)
237239
}
238240
}
@@ -348,8 +350,10 @@ func (a *ADNL) processMessage(message any) error {
348350
}
349351
}
350352
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 {
353357
return fmt.Errorf("failed to handle custom message: %w", err)
354358
}
355359
}
@@ -362,23 +366,31 @@ func (a *ADNL) processMessage(message any) error {
362366
}
363367

364368
func (a *ADNL) SetCustomMessageHandler(handler func(msg *MessageCustom) error) {
365-
a.customMessageHandler = handler
369+
atomic.StorePointer(&a.customMessageHandler, unsafe.Pointer(&handler))
366370
}
367371

368372
func (a *ADNL) SetQueryHandler(handler func(msg *MessageQuery) error) {
369-
a.queryHandler = handler
373+
atomic.StorePointer(&a.queryHandler, unsafe.Pointer(&handler))
370374
}
371375

372376
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)
374382
}
375383

376384
func (a *ADNL) SetDisconnectHandler(handler func(addr string, key ed25519.PublicKey)) {
377-
a.onDisconnect = handler
385+
atomic.StorePointer(&a.onDisconnect, unsafe.Pointer(&handler))
378386
}
379387

380388
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
382394
}
383395

384396
func (a *ADNL) SetChannelReadyHandler(handler func(ch *Channel)) {

0 commit comments

Comments
 (0)