Skip to content

Commit

Permalink
fix: handle synchronization issues between threads
Browse files Browse the repository at this point in the history
* registration of receivers
* check() function
  • Loading branch information
HashEngineering committed Jan 28, 2025
1 parent 1d04e03 commit 8ad4312
Showing 1 changed file with 23 additions and 4 deletions.
27 changes: 23 additions & 4 deletions wallet/src/de/schildbach/wallet/service/BlockchainServiceImpl.kt
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,7 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
lastPreBlockStage = stage
}
}
private var connectivityReceiverRegistered = false
private val connectivityReceiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
serviceScope.launch {
Expand Down Expand Up @@ -678,8 +679,16 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
}
}

@SuppressLint("Wakelock")
private fun check() {
serviceScope.launch {
// make sure that onCreate is finished
onCreateCompleted.await()
checkService()
}
}

@SuppressLint("Wakelock")
private fun checkService() {
log.info("check()")
val wallet = application.wallet
if (impediments.isEmpty() && peerGroup == null) {
Expand Down Expand Up @@ -907,6 +916,7 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
}
}

private var tickRecieverRegistered = false
private val tickReceiver: BroadcastReceiver = object : BroadcastReceiver() {
private var lastChainHeight = 0
private var lastHeaderHeight = 0
Expand Down Expand Up @@ -1088,6 +1098,7 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW)
intentFilter.addAction(Intent.ACTION_DEVICE_STORAGE_OK)
registerReceiver(connectivityReceiver, intentFilter) // implicitly start PeerGroup
connectivityReceiverRegistered = true
log.info("receiver register: connectivityReceiver, {}", connectivityReceiver)
}
application.wallet!!.addCoinsReceivedEventListener(
Expand All @@ -1099,6 +1110,7 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
config.registerOnSharedPreferenceChangeListener(sharedPrefsChangeListener)
withContext(Dispatchers.Main) {
registerReceiver(tickReceiver, IntentFilter(Intent.ACTION_TIME_TICK))
tickRecieverRegistered = true
log.info("receiver register: tickReceiver, {}", tickReceiver)
}
peerDiscoveryList.add(dnsDiscovery)
Expand Down Expand Up @@ -1274,9 +1286,16 @@ class BlockchainServiceImpl : LifecycleService(), BlockchainService {
override fun onDestroy() {
log.info(".onDestroy()")
super.onDestroy()
// unregister receivers on the main thread
unregisterReceiver(tickReceiver)
unregisterReceiver(connectivityReceiver)
// unregister receivers on the main thread, if they were registered
// in some cases, onDestroy is called soon after onCreate and before its coroutine finishes
if (tickRecieverRegistered) {
unregisterReceiver(tickReceiver)
tickRecieverRegistered = false
}
if (connectivityReceiverRegistered) {
unregisterReceiver(connectivityReceiver)
connectivityReceiverRegistered = false
}
cleanupDeferred = CompletableDeferred()
serviceScope.launch {
try {
Expand Down

0 comments on commit 8ad4312

Please # to comment.