Skip to content

Commit b744044

Browse files
Decrement rust ADM refcount in PCF destructor
1 parent f1bb946 commit b744044

2 files changed

Lines changed: 25 additions & 3 deletions

File tree

ringrtc/rffi/api/peer_connection_factory.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ typedef struct {
8888
bool agc_enabled;
8989
void* rust_adm_borrowed;
9090
AudioDeviceCallbacks* rust_audio_device_callbacks;
91+
void (*free_adm_cb)(const void*);
9192
} RffiAudioConfig;
9293

9394
typedef struct {

ringrtc/rffi/src/peer_connection_factory.cc

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ class RingRTCVideoEncoderFactory : public VideoEncoderFactory {
8181
factory_;
8282
};
8383

84+
// Cleanup class for ADM. Will drop a reference on the rust side, potentially
85+
// invoking the destructor.
86+
class AudioDeviceModuleCleanup {
87+
public:
88+
AudioDeviceModuleCleanup(void (*free_adm_cb)(const void*), void* rust_adm)
89+
: free_adm_cb_(free_adm_cb), adm_(rust_adm) {}
90+
91+
~AudioDeviceModuleCleanup() { free_adm_cb_(adm_); }
92+
93+
private:
94+
void (*free_adm_cb_)(const void*);
95+
void* adm_;
96+
};
97+
8498
class PeerConnectionFactoryWithOwnedThreads
8599
: public PeerConnectionFactoryOwner {
86100
public:
@@ -165,7 +179,9 @@ class PeerConnectionFactoryWithOwnedThreads
165179
auto factory = CreateModularPeerConnectionFactory(std::move(dependencies));
166180
return make_ref_counted<PeerConnectionFactoryWithOwnedThreads>(
167181
std::move(factory), std::move(network_thread), std::move(worker_thread),
168-
std::move(signaling_thread), std::move(injectable_network), adm.get());
182+
std::move(signaling_thread), std::move(injectable_network), adm.get(),
183+
audio_config_borrowed->free_adm_cb,
184+
audio_config_borrowed->rust_adm_borrowed);
169185
}
170186

171187
~PeerConnectionFactoryWithOwnedThreads() override {
@@ -268,8 +284,11 @@ class PeerConnectionFactoryWithOwnedThreads
268284
std::unique_ptr<Thread> owned_worker_thread,
269285
std::unique_ptr<Thread> owned_signaling_thread,
270286
std::unique_ptr<rffi::InjectableNetwork> injectable_network,
271-
AudioDeviceModule* audio_device_module)
272-
: owned_network_thread_(std::move(owned_network_thread)),
287+
AudioDeviceModule* audio_device_module,
288+
void (*free_adm_cb)(const void*),
289+
void* rust_adm_borrowed)
290+
: adm_cleanup_(free_adm_cb, rust_adm_borrowed),
291+
owned_network_thread_(std::move(owned_network_thread)),
273292
owned_worker_thread_(std::move(owned_worker_thread)),
274293
owned_signaling_thread_(std::move(owned_signaling_thread)),
275294
injectable_network_(std::move(injectable_network)),
@@ -292,6 +311,8 @@ class PeerConnectionFactoryWithOwnedThreads
292311
return thread;
293312
}
294313

314+
// This must be destroyed last.
315+
AudioDeviceModuleCleanup adm_cleanup_;
295316
const std::unique_ptr<Thread> owned_network_thread_;
296317
const std::unique_ptr<Thread> owned_worker_thread_;
297318
const std::unique_ptr<Thread> owned_signaling_thread_;

0 commit comments

Comments
 (0)