threadshare/socket: Implement Drop on the non-refcounted inner part of the socket

We don't want to run it every time a strong reference is dropped but
only at the very end. Otherwise dropping the socket stream will cause a
panic because the socket itself is still running.
This commit is contained in:
Sebastian Dröge 2020-04-08 15:26:35 +03:00
parent f6120fcf98
commit 577c980a6d

View file

@ -159,24 +159,23 @@ impl<T: SocketRead + 'static> Socket<T> {
} }
} }
impl<T: SocketRead> Drop for Socket<T> { impl<T: SocketRead> Drop for SocketInner<T> {
fn drop(&mut self) { fn drop(&mut self) {
// Ready->Null // Ready->Null
let mut inner = self.0.lock().unwrap(); assert_ne!(SocketState::Started, self.state);
assert_ne!(SocketState::Started, inner.state); if self.state == SocketState::Unprepared {
if inner.state == SocketState::Unprepared { gst_debug!(SOCKET_CAT, obj: &self.element, "Socket already unprepared");
gst_debug!(SOCKET_CAT, obj: &inner.element, "Socket already unprepared");
return; return;
} }
if let Some(create_read_handle_handle) = inner.create_read_handle.take() { if let Some(create_read_handle_handle) = self.create_read_handle.take() {
create_read_handle_handle.abort(); create_read_handle_handle.abort();
} }
if let Err(err) = inner.buffer_pool.set_active(false) { if let Err(err) = self.buffer_pool.set_active(false) {
gst_error!(SOCKET_CAT, obj: &inner.element, "Failed to unprepare socket: {}", err); gst_error!(SOCKET_CAT, obj: &self.element, "Failed to unprepare socket: {}", err);
} }
inner.state = SocketState::Unprepared; self.state = SocketState::Unprepared;
} }
} }