@@ -45,92 +45,166 @@ for name in names(@__MODULE__; all=true)
4545 @eval export $ name
4646end
4747
48- const DEFAULT_AWS_EVENT_LOOP_GROUP = Ref {Ptr{aws_event_loop_group}} (C_NULL )
48+ mutable struct EventLoopGroup
49+ ptr:: Ptr{aws_event_loop_group}
50+ EventLoopGroup (ptr:: Ptr ) =
51+ finalizer (new (Ptr {aws_event_loop_group} (ptr))) do x
52+ if ptr != C_NULL
53+ aws_event_loop_group_release (ptr)
54+ # for i = 1:aws_event_loop_group_get_loop_count(ptr)
55+ # Core.println("stopping event loop $i")
56+ # el = aws_event_loop_group_get_loop_at(ptr, i - 1)
57+ # aws_event_loop_stop(el)
58+ # aws_event_loop_destroy(el)
59+ # end
60+ end
61+ end
62+ end
63+
64+ const DEFAULT_AWS_EVENT_LOOP_GROUP = Ref {EventLoopGroup} (EventLoopGroup (C_NULL ))
4965const DEFAULT_AWS_EVENT_LOOP_GROUP_LOCK = ReentrantLock ()
5066
51- function set_default_aws_event_loop_group! (group)
67+ function set_default_aws_event_loop_group! (group:: Ptr{aws_event_loop_group} )
5268 @lock DEFAULT_AWS_EVENT_LOOP_GROUP_LOCK begin
53- DEFAULT_AWS_EVENT_LOOP_GROUP[] = group
69+ DEFAULT_AWS_EVENT_LOOP_GROUP[] = EventLoopGroup ( group)
5470 return
5571 end
5672end
5773
5874function default_aws_event_loop_group ()
5975 @lock DEFAULT_AWS_EVENT_LOOP_GROUP_LOCK begin
60- if DEFAULT_AWS_EVENT_LOOP_GROUP[] == C_NULL
76+ if DEFAULT_AWS_EVENT_LOOP_GROUP[]. ptr == C_NULL
6177 init ()
6278 maxthreads = LIB_AWS_IO_MAX_THREADS[]
6379 # populate default event loop group; 0 means one event loop per non-hyperthread core
6480 set_default_aws_event_loop_group! (aws_event_loop_group_new_default (default_aws_allocator (), maxthreads, C_NULL ))
6581 end
66- return DEFAULT_AWS_EVENT_LOOP_GROUP[]
82+ return DEFAULT_AWS_EVENT_LOOP_GROUP[]. ptr
83+ end
84+ end
85+
86+ function close_default_aws_event_loop_group! ()
87+ @lock DEFAULT_AWS_EVENT_LOOP_GROUP_LOCK begin
88+ if DEFAULT_AWS_EVENT_LOOP_GROUP[]. ptr != C_NULL
89+ finalize (DEFAULT_AWS_EVENT_LOOP_GROUP[])
90+ set_default_aws_event_loop_group! (Ptr {aws_event_loop_group} (C_NULL ))
91+ end
92+ return
6793 end
6894end
6995
70- const DEFAULT_AWS_HOST_RESOLVER = Ref {Ptr{aws_host_resolver}} (C_NULL )
96+ mutable struct HostResolver
97+ ptr:: Ptr{aws_host_resolver}
98+ HostResolver (ptr:: Ptr ) =
99+ finalizer (_ -> aws_host_resolver_release (ptr), new (Ptr {aws_host_resolver} (ptr)))
100+ end
101+
102+ const DEFAULT_AWS_HOST_RESOLVER = Ref {HostResolver} (HostResolver (C_NULL ))
71103const DEFAULT_AWS_HOST_RESOLVER_LOCK = ReentrantLock ()
72104
73- function set_default_aws_host_resolver! (resolver)
105+ function set_default_aws_host_resolver! (resolver:: Ptr{aws_host_resolver} )
74106 @lock DEFAULT_AWS_HOST_RESOLVER_LOCK begin
75- DEFAULT_AWS_HOST_RESOLVER[] = resolver
107+ DEFAULT_AWS_HOST_RESOLVER[] = HostResolver ( resolver)
76108 return
77109 end
78110end
79111
80112function default_aws_host_resolver ()
81113 @lock DEFAULT_AWS_HOST_RESOLVER_LOCK begin
82- if DEFAULT_AWS_HOST_RESOLVER[] == C_NULL
114+ if DEFAULT_AWS_HOST_RESOLVER[]. ptr == C_NULL
83115 init ()
84116 resolver_options = aws_host_resolver_default_options (8 , default_aws_event_loop_group (), C_NULL , C_NULL )
85117 set_default_aws_host_resolver! (aws_host_resolver_new_default (default_aws_allocator (), Ref (resolver_options)))
86118 end
87- return DEFAULT_AWS_HOST_RESOLVER[]
119+ return DEFAULT_AWS_HOST_RESOLVER[]. ptr
120+ end
121+ end
122+
123+ function close_default_aws_host_resolver! ()
124+ @lock DEFAULT_AWS_HOST_RESOLVER_LOCK begin
125+ if DEFAULT_AWS_HOST_RESOLVER[]. ptr != C_NULL
126+ finalize (DEFAULT_AWS_HOST_RESOLVER[])
127+ set_default_aws_host_resolver! (Ptr {aws_host_resolver} (C_NULL ))
128+ end
129+ return
88130 end
89131end
90132
91133# aws_client_bootstrap
92- const DEFAULT_AWS_CLIENT_BOOTSTRAP = Ref {Ptr{aws_client_bootstrap}} (C_NULL )
134+ mutable struct ClientBootstrap
135+ ptr:: Ptr{aws_client_bootstrap}
136+ ClientBootstrap (ptr:: Ptr ) =
137+ finalizer (_ -> aws_client_bootstrap_release (ptr), new (Ptr {aws_client_bootstrap} (ptr)))
138+ end
139+
140+ const DEFAULT_AWS_CLIENT_BOOTSTRAP = Ref {ClientBootstrap} (ClientBootstrap (C_NULL ))
93141const DEFAULT_AWS_CLIENT_BOOTSTRAP_LOCK = ReentrantLock ()
94142
95- function set_default_aws_client_bootstrap! (bootstrap)
143+ function set_default_aws_client_bootstrap! (bootstrap:: Ptr{aws_client_bootstrap} )
96144 @lock DEFAULT_AWS_CLIENT_BOOTSTRAP_LOCK begin
97- DEFAULT_AWS_CLIENT_BOOTSTRAP[] = bootstrap
145+ DEFAULT_AWS_CLIENT_BOOTSTRAP[] = ClientBootstrap ( bootstrap)
98146 return
99147 end
100148end
101149
102150function default_aws_client_bootstrap ()
103151 @lock DEFAULT_AWS_CLIENT_BOOTSTRAP_LOCK begin
104- if DEFAULT_AWS_CLIENT_BOOTSTRAP[] == C_NULL
152+ if DEFAULT_AWS_CLIENT_BOOTSTRAP[]. ptr == C_NULL
105153 init ()
106154 el_group = default_aws_event_loop_group ()
107155 host_resolver = default_aws_host_resolver ()
108156 bootstrap_options = aws_client_bootstrap_options (el_group, host_resolver, C_NULL , C_NULL , C_NULL )
109157 set_default_aws_client_bootstrap! (aws_client_bootstrap_new (default_aws_allocator (), Ref (bootstrap_options)))
110158 end
111- return DEFAULT_AWS_CLIENT_BOOTSTRAP[]
159+ return DEFAULT_AWS_CLIENT_BOOTSTRAP[]. ptr
160+ end
161+ end
162+
163+ function close_default_aws_client_bootstrap! ()
164+ @lock DEFAULT_AWS_CLIENT_BOOTSTRAP_LOCK begin
165+ if DEFAULT_AWS_CLIENT_BOOTSTRAP[]. ptr != C_NULL
166+ finalize (DEFAULT_AWS_CLIENT_BOOTSTRAP[])
167+ set_default_aws_client_bootstrap! (Ptr {aws_client_bootstrap} (C_NULL ))
168+ end
169+ return
112170 end
113171end
114172
115173# aws_server_bootstrap
116- const DEFAULT_AWS_SERVER_BOOTSTRAP = Ref {Ptr{aws_server_bootstrap}} (C_NULL )
174+ mutable struct ServerBootstrap
175+ ptr:: Ptr{aws_server_bootstrap}
176+ ServerBootstrap (ptr:: Ptr ) =
177+ finalizer (_ -> aws_server_bootstrap_release (ptr), new (Ptr {aws_server_bootstrap} (ptr)))
178+ end
179+
180+ const DEFAULT_AWS_SERVER_BOOTSTRAP = Ref {ServerBootstrap} (ServerBootstrap (C_NULL ))
117181const DEFAULT_AWS_SERVER_BOOTSTRAP_LOCK = ReentrantLock ()
118182
119- function set_default_aws_server_bootstrap! (bootstrap)
183+ function set_default_aws_server_bootstrap! (bootstrap:: Ptr{aws_server_bootstrap} )
120184 @lock DEFAULT_AWS_SERVER_BOOTSTRAP_LOCK begin
121- DEFAULT_AWS_SERVER_BOOTSTRAP[] = bootstrap
185+ DEFAULT_AWS_SERVER_BOOTSTRAP[] = ServerBootstrap ( bootstrap)
122186 return
123187 end
124188end
125189
126190function default_aws_server_bootstrap ()
127191 @lock DEFAULT_AWS_SERVER_BOOTSTRAP_LOCK begin
128- if DEFAULT_AWS_SERVER_BOOTSTRAP[] == C_NULL
192+ if DEFAULT_AWS_SERVER_BOOTSTRAP[]. ptr == C_NULL
129193 init ()
130194 el_group = default_aws_event_loop_group ()
131195 set_default_aws_server_bootstrap! (aws_server_bootstrap_new (default_aws_allocator (), el_group))
132196 end
133- return DEFAULT_AWS_SERVER_BOOTSTRAP[]
197+ return DEFAULT_AWS_SERVER_BOOTSTRAP[]. ptr
198+ end
199+ end
200+
201+ function close_default_aws_server_bootstrap! ()
202+ @lock DEFAULT_AWS_SERVER_BOOTSTRAP_LOCK begin
203+ if DEFAULT_AWS_SERVER_BOOTSTRAP[]. ptr != C_NULL
204+ finalize (DEFAULT_AWS_SERVER_BOOTSTRAP[])
205+ set_default_aws_server_bootstrap! (Ptr {aws_server_bootstrap} (C_NULL ))
206+ end
207+ return
134208 end
135209end
136210
@@ -184,7 +258,10 @@ function tlsoptions(host::String;
184258 return tls_options
185259end
186260
187- export default_aws_event_loop_group, set_default_aws_event_loop_group!, default_aws_host_resolver, default_aws_client_bootstrap, set_default_aws_client_bootstrap!, default_aws_server_bootstrap, set_default_aws_server_bootstrap!, tlsoptions
261+ export default_aws_event_loop_group, set_default_aws_event_loop_group!, default_aws_host_resolver,
262+ default_aws_client_bootstrap, set_default_aws_client_bootstrap!, default_aws_server_bootstrap,
263+ set_default_aws_server_bootstrap!, tlsoptions, close_default_aws_event_loop_group!,
264+ close_default_aws_host_resolver!, close_default_aws_client_bootstrap!, close_default_aws_server_bootstrap!
188265
189266const LIB_AWS_IO_MAX_THREADS = Ref {Int} (0 )
190267
0 commit comments