package me.eater.hefbrug.executor import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import me.eater.hefbrug.access.AccessSkeleton import me.eater.hefbrug.access.NoopAccess import me.eater.hefbrug.access.Wrapper import me.eater.hefbrug.node.Node import me.eater.hefbrug.platform_utils.`package`.PackageManager import me.eater.hefbrug.platform_utils.service.ServiceManager class ExecutionContext(access: AccessSkeleton, val node: Node, val noop: Boolean = true) { private var packageManager: PackageManager? = null private var packageManagerLock = Mutex() private var serviceManager: ServiceManager? = null private var serviceManagerLock = Mutex() val roAccess: AccessSkeleton = Wrapper(access, false) val rwAccess: AccessSkeleton = Wrapper(if (noop) NoopAccess() else access) suspend fun getPackageManager(): PackageManager { if (packageManager == null) { packageManagerLock.withLock { if (packageManager == null) { packageManager = PackageManager.getManager(this@ExecutionContext) } } } return packageManager!! } suspend fun getServiceManager(): ServiceManager { if (serviceManager == null) { serviceManagerLock.withLock { if (serviceManager == null) { serviceManager = ServiceManager.getManager(this) } } } return serviceManager!! } }