Skip to content

Commit 23eeac0

Browse files
authored
fix: correctly close HTTP-related CRT resources in native sourceset (#169)
1 parent 94e6f84 commit 23eeac0

File tree

9 files changed

+69
-17
lines changed

9 files changed

+69
-17
lines changed

aws-crt-kotlin/api/aws-crt-kotlin.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,7 @@ public final class aws/sdk/kotlin/crt/io/BufferKt {
719719
}
720720

721721
public final class aws/sdk/kotlin/crt/io/ClientBootstrap : aws/sdk/kotlin/crt/AsyncShutdown, aws/sdk/kotlin/crt/Closeable {
722+
public fun <init> ()V
722723
public fun <init> (Laws/sdk/kotlin/crt/io/EventLoopGroup;Laws/sdk/kotlin/crt/io/HostResolver;)V
723724
public fun close ()V
724725
public fun waitForShutdown (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
@@ -733,6 +734,7 @@ public final class aws/sdk/kotlin/crt/io/EventLoopGroup : aws/sdk/kotlin/crt/Asy
733734
}
734735

735736
public final class aws/sdk/kotlin/crt/io/HostResolver : aws/sdk/kotlin/crt/AsyncShutdown, aws/sdk/kotlin/crt/Closeable {
737+
public fun <init> ()V
736738
public fun <init> (Laws/sdk/kotlin/crt/io/EventLoopGroup;)V
737739
public fun <init> (Laws/sdk/kotlin/crt/io/EventLoopGroup;I)V
738740
public fun close ()V

aws-crt-kotlin/common/src/aws/sdk/kotlin/crt/io/ClientBootstrap.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import aws.sdk.kotlin.crt.Closeable
1515
public expect class ClientBootstrap(elg: EventLoopGroup, hr: HostResolver) :
1616
Closeable,
1717
AsyncShutdown {
18+
public constructor()
19+
1820
override suspend fun waitForShutdown()
1921
override fun close()
2022
}

aws-crt-kotlin/common/src/aws/sdk/kotlin/crt/io/HostResolver.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public expect class HostResolver(elg: EventLoopGroup, maxEntries: Int) :
1414
Closeable,
1515
AsyncShutdown {
1616
public constructor(elg: EventLoopGroup)
17+
public constructor()
18+
1719
override fun close()
1820
override suspend fun waitForShutdown()
1921
}

aws-crt-kotlin/jvm/src/aws/sdk/kotlin/crt/io/ClientBootstrapJVM.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,27 @@ import aws.sdk.kotlin.crt.Closeable
1010
import kotlinx.coroutines.future.await
1111
import software.amazon.awssdk.crt.io.ClientBootstrap as ClientBootstrapJni
1212

13-
public actual class ClientBootstrap actual constructor(elg: EventLoopGroup, hr: HostResolver) :
14-
Closeable,
13+
public actual class ClientBootstrap private constructor(
14+
private val elg: EventLoopGroup,
15+
private val manageElg: Boolean,
16+
private val hr: HostResolver,
17+
private val manageHr: Boolean,
18+
) : Closeable,
1519
AsyncShutdown {
20+
21+
public actual constructor() : this(EventLoopGroup(), true)
22+
23+
private constructor(elg: EventLoopGroup, manageElg: Boolean) : this(elg, manageElg, HostResolver(elg), true)
24+
25+
public actual constructor(elg: EventLoopGroup, hr: HostResolver) : this(elg, false, hr, false)
26+
1627
internal val jniBootstrap = ClientBootstrapJni(elg.jniElg, hr.jniHr)
1728

1829
actual override fun close() {
1930
jniBootstrap.close()
31+
32+
if (manageHr) hr.close()
33+
if (manageElg) elg.close()
2034
}
2135

2236
actual override suspend fun waitForShutdown() {

aws-crt-kotlin/jvm/src/aws/sdk/kotlin/crt/io/HostResolverJVM.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,22 @@ import aws.sdk.kotlin.crt.AsyncShutdown
99
import aws.sdk.kotlin.crt.Closeable
1010
import software.amazon.awssdk.crt.io.HostResolver as HostResolverJni
1111

12-
public actual class HostResolver actual constructor(elg: EventLoopGroup, maxEntries: Int) :
13-
Closeable,
12+
public actual class HostResolver private constructor(
13+
private val elg: EventLoopGroup,
14+
private val manageElg: Boolean,
15+
maxEntries: Int,
16+
) : Closeable,
1417
AsyncShutdown {
1518
internal val jniHr = HostResolverJni(elg.jniElg, maxEntries)
1619

17-
public actual constructor(elg: EventLoopGroup) : this(elg, DEFAULT_MAX_ENTRIES)
20+
public actual constructor(elg: EventLoopGroup, maxEntries: Int) : this(elg, false, maxEntries)
21+
public actual constructor(elg: EventLoopGroup) : this(elg, false, DEFAULT_MAX_ENTRIES)
22+
public actual constructor() : this(EventLoopGroup(), true, DEFAULT_MAX_ENTRIES)
1823

1924
actual override fun close() {
2025
jniHr.close()
26+
27+
if (manageElg) elg.close()
2128
}
2229

2330
actual override suspend fun waitForShutdown() {

aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/io/ClientBootstrapNative.kt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
package aws.sdk.kotlin.crt.io
77

8-
import aws.sdk.kotlin.crt.*
98
import aws.sdk.kotlin.crt.Allocator
9+
import aws.sdk.kotlin.crt.AsyncShutdown
10+
import aws.sdk.kotlin.crt.Closeable
11+
import aws.sdk.kotlin.crt.NativeHandle
1012
import aws.sdk.kotlin.crt.util.ShutdownChannel
1113
import aws.sdk.kotlin.crt.util.shutdownChannel
1214
import kotlinx.cinterop.*
@@ -16,12 +18,19 @@ import libcrt.aws_client_bootstrap_options
1618
import libcrt.aws_client_bootstrap_release
1719

1820
@OptIn(ExperimentalForeignApi::class)
19-
public actual class ClientBootstrap actual constructor(
20-
elg: EventLoopGroup,
21-
hr: HostResolver,
21+
public actual class ClientBootstrap private constructor(
22+
private val elg: EventLoopGroup,
23+
private val manageElg: Boolean,
24+
private val hr: HostResolver,
25+
private val manageHr: Boolean,
2226
) : NativeHandle<aws_client_bootstrap>,
2327
Closeable,
2428
AsyncShutdown {
29+
30+
public actual constructor() : this(EventLoopGroup(), true)
31+
private constructor(elg: EventLoopGroup, manageElg: Boolean) : this(elg, manageElg, HostResolver(elg), true)
32+
public actual constructor(elg: EventLoopGroup, hr: HostResolver) : this(elg, false, hr, false)
33+
2534
private val shutdownCompleteChannel = shutdownChannel()
2635
private val channelStableRef = StableRef.create(shutdownCompleteChannel)
2736
override val ptr: CPointer<aws_client_bootstrap>
@@ -45,6 +54,9 @@ public actual class ClientBootstrap actual constructor(
4554

4655
actual override fun close() {
4756
aws_client_bootstrap_release(ptr)
57+
58+
if (manageHr) hr.close()
59+
if (manageElg) elg.close()
4860
}
4961
}
5062

aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/io/EventLoopGroupNative.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55

66
package aws.sdk.kotlin.crt.io
77

8-
import aws.sdk.kotlin.crt.*
98
import aws.sdk.kotlin.crt.Allocator
9+
import aws.sdk.kotlin.crt.AsyncShutdown
10+
import aws.sdk.kotlin.crt.Closeable
11+
import aws.sdk.kotlin.crt.NativeHandle
1012
import aws.sdk.kotlin.crt.util.ShutdownChannel
1113
import aws.sdk.kotlin.crt.util.shutdownChannel
1214
import cnames.structs.aws_event_loop_group
1315
import kotlinx.cinterop.*
14-
import libcrt.*
16+
import libcrt.aws_event_loop_group_new
17+
import libcrt.aws_event_loop_group_options
18+
import libcrt.aws_event_loop_group_release
19+
import libcrt.aws_shutdown_callback_options
1520

1621
/**
1722
* Creates a new event loop group for the I/O subsystem to use to run blocking I/O requests

aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/io/HostResolverNative.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,27 @@
55

66
package aws.sdk.kotlin.crt.io
77

8-
import aws.sdk.kotlin.crt.*
98
import aws.sdk.kotlin.crt.Allocator
9+
import aws.sdk.kotlin.crt.AsyncShutdown
10+
import aws.sdk.kotlin.crt.Closeable
11+
import aws.sdk.kotlin.crt.NativeHandle
1012
import aws.sdk.kotlin.crt.util.ShutdownChannel
1113
import aws.sdk.kotlin.crt.util.shutdownChannel
1214
import kotlinx.cinterop.*
1315
import libcrt.*
1416

1517
@OptIn(ExperimentalForeignApi::class)
16-
public actual class HostResolver actual constructor(elg: EventLoopGroup, maxEntries: Int) :
17-
NativeHandle<aws_host_resolver>,
18+
public actual class HostResolver private constructor(
19+
private val elg: EventLoopGroup,
20+
private val manageElg: Boolean,
21+
private val maxEntries: Int,
22+
) : NativeHandle<aws_host_resolver>,
1823
Closeable,
1924
AsyncShutdown {
20-
public actual constructor(elg: EventLoopGroup) : this(elg, DEFAULT_MAX_ENTRIES)
25+
26+
public actual constructor(elg: EventLoopGroup, maxEntries: Int) : this(elg, false, maxEntries)
27+
public actual constructor(elg: EventLoopGroup) : this(elg, false, DEFAULT_MAX_ENTRIES)
28+
public actual constructor() : this(EventLoopGroup(), true, DEFAULT_MAX_ENTRIES)
2129

2230
override val ptr: CPointer<aws_host_resolver>
2331

@@ -49,6 +57,8 @@ public actual class HostResolver actual constructor(elg: EventLoopGroup, maxEntr
4957

5058
actual override fun close() {
5159
aws_host_resolver_release(ptr)
60+
61+
if (manageElg) elg.close()
5262
}
5363
}
5464

aws-crt-kotlin/native/src/aws/sdk/kotlin/crt/io/TlsContextNative.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
package aws.sdk.kotlin.crt.io
77

88
import aws.sdk.kotlin.crt.*
9-
import aws.sdk.kotlin.crt.Allocator
10-
import aws.sdk.kotlin.crt.awsAssertOpSuccess
119
import aws.sdk.kotlin.crt.util.asAwsByteCursor
1210
import aws.sdk.kotlin.crt.util.free
1311
import aws.sdk.kotlin.crt.util.toAwsString

0 commit comments

Comments
 (0)