@@ -3,6 +3,7 @@ package backend
33import (
44 "fmt"
55
6+ "github.com/status-im/status-go/pkg/backend/node"
67 "github.com/status-im/status-go/protocol"
78)
89
@@ -18,9 +19,11 @@ const (
1819
1920func (s AppLifecycleState ) String () string { return string (s ) }
2021
22+ // LifecycleState returns the current backend lifecycle state.
23+ // Requires lifecycleMu since lifecycleState is written by pause/resumeLocked.
2124func (b * StatusBackend ) LifecycleState () AppLifecycleState {
22- b .mu .Lock ()
23- defer b .mu .Unlock ()
25+ b .lifecycleMu .Lock ()
26+ defer b .lifecycleMu .Unlock ()
2427 return b .lifecycleState
2528}
2629
@@ -31,14 +34,19 @@ func (b *StatusBackend) pauseLocked() error {
3134 if b .lifecycleState == AppLifecyclePausedBackground {
3235 return nil
3336 }
34- if b .statusNode == nil || ! b .statusNode .IsRunning () {
37+ // Snapshot statusNode pointer under b.mu to avoid data race with Logout.
38+ b .mu .Lock ()
39+ sn := b .statusNode
40+ b .mu .Unlock ()
41+
42+ if sn == nil || ! sn .IsRunning () {
3543 b .lifecycleState = AppLifecycleStopped
3644 return nil
3745 }
38- if messenger := b .currentMessengerLocked ( ); messenger != nil {
46+ if messenger := b .currentMessenger ( sn ); messenger != nil {
3947 messenger .ToBackground ()
4048 }
41- if err := b . statusNode .PauseBackground (); err != nil {
49+ if err := sn .PauseBackground (); err != nil {
4250 return fmt .Errorf ("pause background: %w" , err )
4351 }
4452 b .lifecycleState = AppLifecyclePausedBackground
@@ -52,25 +60,30 @@ func (b *StatusBackend) resumeLocked() error {
5260 if b .lifecycleState == AppLifecycleRunning {
5361 return nil
5462 }
55- if b .statusNode == nil || ! b .statusNode .IsRunning () {
63+ // Snapshot statusNode pointer under b.mu to avoid data race with Logout.
64+ b .mu .Lock ()
65+ sn := b .statusNode
66+ b .mu .Unlock ()
67+
68+ if sn == nil || ! sn .IsRunning () {
5669 b .lifecycleState = AppLifecycleStopped
5770 return nil
5871 }
59- if messenger := b .currentMessengerLocked ( ); messenger != nil {
72+ if messenger := b .currentMessenger ( sn ); messenger != nil {
6073 messenger .ToForeground ()
6174 }
6275
6376 b .lifecycleState = AppLifecycleResumingForeground
64- if err := b . statusNode .ResumeForeground (); err != nil {
77+ if err := sn .ResumeForeground (); err != nil {
6578 return fmt .Errorf ("resume foreground: %w" , err )
6679 }
6780 b .lifecycleState = AppLifecycleRunning
6881 return nil
6982}
7083
71- func (b * StatusBackend ) currentMessengerLocked ( ) * protocol.Messenger {
72- if b . statusNode == nil || b . statusNode .WakuV2ExtService () == nil {
84+ func (b * StatusBackend ) currentMessenger ( sn * node. StatusNode ) * protocol.Messenger {
85+ if sn == nil || sn .WakuV2ExtService () == nil {
7386 return nil
7487 }
75- return b . statusNode .WakuV2ExtService ().Messenger ()
88+ return sn .WakuV2ExtService ().Messenger ()
7689}
0 commit comments