Take a Mutex before modifying the EuiccChannel list

This commit is contained in:
Peter Cai 2022-05-11 20:36:09 -04:00
parent cc7f9a2957
commit 146b7fdc8d

View file

@ -9,6 +9,8 @@ import android.util.Log
import im.angry.openeuicc.OpenEuiccApplication import im.angry.openeuicc.OpenEuiccApplication
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine import kotlin.coroutines.suspendCoroutine
@ -23,6 +25,8 @@ class EuiccChannelManager(private val context: Context) {
private var seService: SEService? = null private var seService: SEService? = null
private val lock = Mutex()
private val tm by lazy { private val tm by lazy {
(context.applicationContext as OpenEuiccApplication).telephonyManager (context.applicationContext as OpenEuiccApplication).telephonyManager
} }
@ -43,6 +47,7 @@ class EuiccChannelManager(private val context: Context) {
} }
private suspend fun tryOpenEuiccChannel(uiccInfo: UiccCardInfo): EuiccChannel? { private suspend fun tryOpenEuiccChannel(uiccInfo: UiccCardInfo): EuiccChannel? {
lock.withLock {
ensureSEService() ensureSEService()
val existing = channels.find { it.slotId == uiccInfo.slotIndex } val existing = channels.find { it.slotId == uiccInfo.slotIndex }
if (existing != null) { if (existing != null) {
@ -55,7 +60,10 @@ class EuiccChannelManager(private val context: Context) {
} }
val channelInfo = EuiccChannelInfo( val channelInfo = EuiccChannelInfo(
uiccInfo.slotIndex, uiccInfo.cardId, "SIM ${uiccInfo.slotIndex}", uiccInfo.isRemovable uiccInfo.slotIndex,
uiccInfo.cardId,
"SIM ${uiccInfo.slotIndex}",
uiccInfo.isRemovable
) )
var euiccChannel: EuiccChannel? = null var euiccChannel: EuiccChannel? = null
@ -76,6 +84,7 @@ class EuiccChannelManager(private val context: Context) {
return euiccChannel return euiccChannel
} }
}
private suspend fun findEuiccChannelBySlot(slotId: Int): EuiccChannel? { private suspend fun findEuiccChannelBySlot(slotId: Int): EuiccChannel? {
return tm.uiccCardsInfo.find { it.slotIndex == slotId }?.let { return tm.uiccCardsInfo.find { it.slotIndex == slotId }?.let {