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
1 changed files with 39 additions and 30 deletions

View File

@ -9,6 +9,8 @@ import android.util.Log
import im.angry.openeuicc.OpenEuiccApplication
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
@ -23,6 +25,8 @@ class EuiccChannelManager(private val context: Context) {
private var seService: SEService? = null
private val lock = Mutex()
private val tm by lazy {
(context.applicationContext as OpenEuiccApplication).telephonyManager
}
@ -43,38 +47,43 @@ class EuiccChannelManager(private val context: Context) {
}
private suspend fun tryOpenEuiccChannel(uiccInfo: UiccCardInfo): EuiccChannel? {
ensureSEService()
val existing = channels.find { it.slotId == uiccInfo.slotIndex }
if (existing != null) {
if (existing.valid) {
return existing
} else {
existing.close()
channels.remove(existing)
lock.withLock {
ensureSEService()
val existing = channels.find { it.slotId == uiccInfo.slotIndex }
if (existing != null) {
if (existing.valid) {
return existing
} else {
existing.close()
channels.remove(existing)
}
}
val channelInfo = EuiccChannelInfo(
uiccInfo.slotIndex,
uiccInfo.cardId,
"SIM ${uiccInfo.slotIndex}",
uiccInfo.isRemovable
)
var euiccChannel: EuiccChannel? = null
if (uiccInfo.isEuicc && !uiccInfo.isRemovable) {
Log.d(TAG, "Using TelephonyManager for slot ${uiccInfo.slotIndex}")
// TODO: On Tiramisu, we should also connect all available "ports" for MEP support
euiccChannel = TelephonyManagerChannel.tryConnect(tm, channelInfo)
}
if (euiccChannel == null) {
euiccChannel = OmapiChannel.tryConnect(seService!!, channelInfo)
}
if (euiccChannel != null) {
channels.add(euiccChannel)
}
return euiccChannel
}
val channelInfo = EuiccChannelInfo(
uiccInfo.slotIndex, uiccInfo.cardId, "SIM ${uiccInfo.slotIndex}", uiccInfo.isRemovable
)
var euiccChannel: EuiccChannel? = null
if (uiccInfo.isEuicc && !uiccInfo.isRemovable) {
Log.d(TAG, "Using TelephonyManager for slot ${uiccInfo.slotIndex}")
// TODO: On Tiramisu, we should also connect all available "ports" for MEP support
euiccChannel = TelephonyManagerChannel.tryConnect(tm, channelInfo)
}
if (euiccChannel == null) {
euiccChannel = OmapiChannel.tryConnect(seService!!, channelInfo)
}
if (euiccChannel != null) {
channels.add(euiccChannel)
}
return euiccChannel
}
private suspend fun findEuiccChannelBySlot(slotId: Int): EuiccChannel? {