Skip to content

Commit

Permalink
Bug when calling TransactionManager.closeAndUnregister from a differe…
Browse files Browse the repository at this point in the history
…nt Thread. #1387
  • Loading branch information
Tapac committed Nov 27, 2021
1 parent 6b51837 commit 6bdf063
Showing 1 changed file with 5 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,22 +58,22 @@ interface TransactionManager {
internal val currentDefaultDatabase = AtomicReference<Database>()

var defaultDatabase: Database?
get() = currentDefaultDatabase.get() ?: databases.firstOrNull()
set(value) { currentDefaultDatabase.set(value) }
@Synchronized get() = currentDefaultDatabase.get() ?: databases.firstOrNull()
@Synchronized set(value) { currentDefaultDatabase.set(value) }

private val databases = ConcurrentLinkedDeque<Database>()

private val registeredDatabases = ConcurrentHashMap<Database, TransactionManager>()

fun registerManager(database: Database, manager: TransactionManager) {
@Synchronized fun registerManager(database: Database, manager: TransactionManager) {
if (defaultDatabase == null) {
currentThreadManager.remove()
}
registeredDatabases[database] = manager
databases.push(database)
}

fun closeAndUnregister(database: Database) {
@Synchronized fun closeAndUnregister(database: Database) {
val manager = registeredDatabases[database]
manager?.let {
registeredDatabases.remove(database)
Expand All @@ -87,7 +87,7 @@ interface TransactionManager {

fun managerFor(database: Database?) = if (database != null) registeredDatabases[database] else manager

internal val currentThreadManager = object : ThreadLocal<TransactionManager>() {
private val currentThreadManager = object : ThreadLocal<TransactionManager>() {
override fun initialValue(): TransactionManager {
return defaultDatabase?.let { registeredDatabases.getValue(it) } ?: NotInitializedManager
}
Expand Down

0 comments on commit 6bdf063

Please sign in to comment.