Skip to content

Commit 5904a7a

Browse files
chore(internal): add async lock helper
1 parent 3d46fc5 commit 5904a7a

1 file changed

Lines changed: 23 additions & 0 deletions

File tree

  • braintrust-java-core/src/main/kotlin/com/braintrustdata/api/core

braintrust-java-core/src/main/kotlin/com/braintrustdata/api/core/Utils.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ package com.braintrustdata.api.core
55
import com.braintrustdata.api.errors.BraintrustInvalidDataException
66
import java.util.Collections
77
import java.util.SortedMap
8+
import java.util.concurrent.CompletableFuture
9+
import java.util.concurrent.locks.Lock
810

911
@JvmSynthetic
1012
internal fun <T : Any> T?.getOrThrow(name: String): T =
@@ -90,3 +92,24 @@ internal fun Any?.contentToString(): String {
9092
}
9193

9294
internal interface Enum
95+
96+
/**
97+
* Executes the given [action] while holding the lock, returning a [CompletableFuture] with the
98+
* result.
99+
*
100+
* @param action The asynchronous action to execute while holding the lock
101+
* @return A [CompletableFuture] that completes with the result of the action
102+
*/
103+
@JvmSynthetic
104+
internal fun <T> Lock.withLockAsync(action: () -> CompletableFuture<T>): CompletableFuture<T> {
105+
lock()
106+
val future =
107+
try {
108+
action()
109+
} catch (e: Throwable) {
110+
unlock()
111+
throw e
112+
}
113+
future.whenComplete { _, _ -> unlock() }
114+
return future
115+
}

0 commit comments

Comments
 (0)