Skip to content

Commit 2ad7567

Browse files
committed
Fix potential crash after failed Zenoh.open()
1 parent d3f7f59 commit 2ad7567

File tree

4 files changed

+31
-35
lines changed

4 files changed

+31
-35
lines changed

zenoh-java/src/commonMain/kotlin/io/zenoh/Session.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ import java.util.concurrent.LinkedBlockingDeque
5252
*/
5353
class Session private constructor(private val config: Config) : AutoCloseable {
5454

55-
internal var jniSession: JNISession? = JNISession()
55+
internal var jniSession: JNISession? = null
5656

5757
private var declarations = mutableListOf<SessionDeclaration>()
5858

@@ -681,7 +681,7 @@ class Session private constructor(private val config: Config) : AutoCloseable {
681681
/** Launches the session through the jni session, returning the [Session] on success. */
682682
@Throws(ZError::class)
683683
private fun launch(): Session {
684-
jniSession!!.open(config)
684+
this.jniSession = JNISession.open(config)
685685
return this
686686
}
687687
}

zenoh-java/src/commonMain/kotlin/io/zenoh/jni/JNILiveliness.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ internal object JNILiveliness {
8484
callback.run(reply)
8585
}
8686
getViaJNI(
87-
jniSession.sessionPtr.get(),
87+
jniSession.sessionPtr,
8888
keyExpr.jniKeyExpr?.ptr ?: 0,
8989
keyExpr.keyExpr,
9090
getCallback,
@@ -95,7 +95,7 @@ internal object JNILiveliness {
9595
}
9696

9797
fun declareToken(jniSession: JNISession, keyExpr: KeyExpr): LivelinessToken {
98-
val ptr = declareTokenViaJNI(jniSession.sessionPtr.get(), keyExpr.jniKeyExpr?.ptr ?: 0, keyExpr.keyExpr)
98+
val ptr = declareTokenViaJNI(jniSession.sessionPtr, keyExpr.jniKeyExpr?.ptr ?: 0, keyExpr.keyExpr)
9999
return LivelinessToken(JNILivelinessToken(ptr))
100100
}
101101

@@ -121,7 +121,7 @@ internal object JNILiveliness {
121121
callback.run(sample)
122122
}
123123
val ptr = declareSubscriberViaJNI(
124-
jniSession.sessionPtr.get(),
124+
jniSession.sessionPtr,
125125
keyExpr.jniKeyExpr?.ptr ?: 0,
126126
keyExpr.keyExpr,
127127
subCallback,
@@ -154,7 +154,7 @@ internal object JNILiveliness {
154154
callback.run(sample)
155155
}
156156
val ptr = declareSubscriberViaJNI(
157-
jniSession.sessionPtr.get(),
157+
jniSession.sessionPtr,
158158
keyExpr.jniKeyExpr?.ptr ?: 0,
159159
keyExpr.keyExpr,
160160
subCallback,

zenoh-java/src/commonMain/kotlin/io/zenoh/jni/JNISession.kt

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,36 +37,35 @@ import io.zenoh.query.*
3737
import io.zenoh.sample.Sample
3838
import io.zenoh.sample.SampleKind
3939
import org.apache.commons.net.ntp.TimeStamp
40-
import java.util.concurrent.atomic.AtomicLong
4140

4241
/** Adapter class to handle the communication with the Zenoh JNI code for a [Session]. */
43-
internal class JNISession {
42+
internal class JNISession(val sessionPtr: Long) {
4443

4544
companion object {
4645
init {
4746
ZenohLoad
4847
}
49-
}
5048

51-
/* Pointer to the underlying Rust zenoh session. */
52-
internal var sessionPtr: AtomicLong = AtomicLong(0)
49+
@Throws(ZError::class)
50+
fun open(config: Config): JNISession {
51+
val sessionPtr = openSessionViaJNI(config.jniConfig.ptr)
52+
return JNISession(sessionPtr)
53+
}
5354

54-
@Throws(ZError::class)
55-
fun open(config: Config) {
56-
val session = openSessionViaJNI(config.jniConfig.ptr)
57-
sessionPtr.set(session)
55+
@Throws(ZError::class)
56+
private external fun openSessionViaJNI(configPtr: Long): Long
5857
}
5958

6059
fun close() {
61-
closeSessionViaJNI(sessionPtr.get())
60+
closeSessionViaJNI(sessionPtr)
6261
}
6362

6463
@Throws(ZError::class)
6564
fun declarePublisher(keyExpr: KeyExpr, publisherOptions: PublisherOptions): Publisher {
6665
val publisherRawPtr = declarePublisherViaJNI(
6766
keyExpr.jniKeyExpr?.ptr ?: 0,
6867
keyExpr.keyExpr,
69-
sessionPtr.get(),
68+
sessionPtr,
7069
publisherOptions.congestionControl.value,
7170
publisherOptions.priority.value,
7271
publisherOptions.express,
@@ -100,7 +99,7 @@ internal class JNISession {
10099
handler.handle(sample)
101100
}
102101
val subscriberRawPtr = declareSubscriberViaJNI(
103-
keyExpr.jniKeyExpr?.ptr ?: 0, keyExpr.keyExpr, sessionPtr.get(), subCallback, handler::onClose
102+
keyExpr.jniKeyExpr?.ptr ?: 0, keyExpr.keyExpr, sessionPtr, subCallback, handler::onClose
104103
)
105104
return HandlerSubscriber(keyExpr, JNISubscriber(subscriberRawPtr), handler.receiver())
106105
}
@@ -126,7 +125,7 @@ internal class JNISession {
126125
val subscriberRawPtr = declareSubscriberViaJNI(
127126
keyExpr.jniKeyExpr?.ptr ?: 0,
128127
keyExpr.keyExpr,
129-
sessionPtr.get(),
128+
sessionPtr,
130129
subCallback,
131130
fun() {}
132131
)
@@ -159,7 +158,7 @@ internal class JNISession {
159158
val queryableRawPtr = declareQueryableViaJNI(
160159
keyExpr.jniKeyExpr?.ptr ?: 0,
161160
keyExpr.keyExpr,
162-
sessionPtr.get(),
161+
sessionPtr,
163162
queryCallback,
164163
fun() {},
165164
config.complete
@@ -193,7 +192,7 @@ internal class JNISession {
193192
val queryableRawPtr = declareQueryableViaJNI(
194193
keyExpr.jniKeyExpr?.ptr ?: 0,
195194
keyExpr.keyExpr,
196-
sessionPtr.get(),
195+
sessionPtr,
197196
queryCallback,
198197
handler::onClose,
199198
config.complete
@@ -209,7 +208,7 @@ internal class JNISession {
209208
val querierRawPtr = declareQuerierViaJNI(
210209
keyExpr.jniKeyExpr?.ptr ?: 0,
211210
keyExpr.keyExpr,
212-
sessionPtr.get(),
211+
sessionPtr,
213212
options.target.ordinal,
214213
options.consolidationMode.ordinal,
215214
options.congestionControl.ordinal,
@@ -277,7 +276,7 @@ internal class JNISession {
277276
selector.keyExpr.jniKeyExpr?.ptr ?: 0,
278277
selector.keyExpr.keyExpr,
279278
selector.parameters?.toString(),
280-
sessionPtr.get(),
279+
sessionPtr,
281280
getCallback,
282281
fun() {},
283282
options.timeout.toMillis(),
@@ -342,7 +341,7 @@ internal class JNISession {
342341
selector.keyExpr.jniKeyExpr?.ptr ?: 0,
343342
selector.keyExpr.keyExpr,
344343
selector.parameters?.toString(),
345-
sessionPtr.get(),
344+
sessionPtr,
346345
getCallback,
347346
handler::onClose,
348347
options.timeout.toMillis(),
@@ -361,14 +360,14 @@ internal class JNISession {
361360

362361
@Throws(ZError::class)
363362
fun declareKeyExpr(keyExpr: String): KeyExpr {
364-
val ptr = declareKeyExprViaJNI(sessionPtr.get(), keyExpr)
363+
val ptr = declareKeyExprViaJNI(sessionPtr, keyExpr)
365364
return KeyExpr(keyExpr, JNIKeyExpr(ptr))
366365
}
367366

368367
@Throws(ZError::class)
369368
fun undeclareKeyExpr(keyExpr: KeyExpr) {
370369
keyExpr.jniKeyExpr?.run {
371-
undeclareKeyExprViaJNI(sessionPtr.get(), this.ptr)
370+
undeclareKeyExprViaJNI(sessionPtr, this.ptr)
372371
keyExpr.jniKeyExpr = null
373372
} ?: throw ZError("Attempting to undeclare a non declared key expression.")
374373
}
@@ -383,7 +382,7 @@ internal class JNISession {
383382
putViaJNI(
384383
keyExpr.jniKeyExpr?.ptr ?: 0,
385384
keyExpr.keyExpr,
386-
sessionPtr.get(),
385+
sessionPtr,
387386
payload.into().bytes,
388387
encoding.id,
389388
encoding.schema,
@@ -403,7 +402,7 @@ internal class JNISession {
403402
deleteViaJNI(
404403
keyExpr.jniKeyExpr?.ptr ?: 0,
405404
keyExpr.keyExpr,
406-
sessionPtr.get(),
405+
sessionPtr,
407406
options.congestionControl.value,
408407
options.priority.value,
409408
options.express,
@@ -414,17 +413,17 @@ internal class JNISession {
414413

415414
@Throws(ZError::class)
416415
fun zid(): ZenohId {
417-
return ZenohId(getZidViaJNI(sessionPtr.get()))
416+
return ZenohId(getZidViaJNI(sessionPtr))
418417
}
419418

420419
@Throws(ZError::class)
421420
fun peersZid(): List<ZenohId> {
422-
return getPeersZidViaJNI(sessionPtr.get()).map { ZenohId(it) }
421+
return getPeersZidViaJNI(sessionPtr).map { ZenohId(it) }
423422
}
424423

425424
@Throws(ZError::class)
426425
fun routersZid(): List<ZenohId> {
427-
return getRoutersZidViaJNI(sessionPtr.get()).map { ZenohId(it) }
426+
return getRoutersZidViaJNI(sessionPtr).map { ZenohId(it) }
428427
}
429428

430429
@Throws(ZError::class)
@@ -436,9 +435,6 @@ internal class JNISession {
436435
@Throws(ZError::class)
437436
private external fun getRoutersZidViaJNI(ptr: Long): List<ByteArray>
438437

439-
@Throws(ZError::class)
440-
private external fun openSessionViaJNI(configPtr: Long): Long
441-
442438
@Throws(ZError::class)
443439
private external fun closeSessionViaJNI(ptr: Long)
444440

zenoh-jni/src/session.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use crate::{
4848
///
4949
#[no_mangle]
5050
#[allow(non_snake_case)]
51-
pub unsafe extern "C" fn Java_io_zenoh_jni_JNISession_openSessionViaJNI(
51+
pub unsafe extern "C" fn Java_io_zenoh_jni_JNISession_00024Companion_openSessionViaJNI(
5252
mut env: JNIEnv,
5353
_class: JClass,
5454
config_ptr: *const Config,

0 commit comments

Comments
 (0)