[vlc-commits] input: add reference count
Rémi Denis-Courmont
git at videolan.org
Sun Mar 17 02:39:09 CET 2019
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Mar 16 10:36:13 2019 +0200| [4cd0b49ee75039ea7af2ef7ff38ea4d3678c5db5] | committer: Rémi Denis-Courmont
input: add reference count
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4cd0b49ee75039ea7af2ef7ff38ea4d3678c5db5
---
src/input/input.c | 16 ++++++++++++----
src/input/input_internal.h | 1 +
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/input/input.c b/src/input/input.c
index 9a2500735f..c562ad04a3 100644
--- a/src/input/input.c
+++ b/src/input/input.c
@@ -232,7 +232,7 @@ void input_Close( input_thread_t *p_input )
if( input_priv(p_input)->is_running )
vlc_join( input_priv(p_input)->thread, NULL );
vlc_interrupt_deinit( &input_priv(p_input)->interrupt );
- vlc_object_delete(p_input);
+ input_Release(p_input);
}
void input_SetTime( input_thread_t *p_input, vlc_tick_t i_time, bool b_fast )
@@ -513,19 +513,27 @@ static input_thread_t *Create( vlc_object_t *p_parent,
/* Set the destructor when we are sure we are initialized */
vlc_object_set_destructor( p_input, input_Destructor );
-
+ atomic_init(&priv->refs, 0);
return p_input;
}
input_thread_t *input_Hold(input_thread_t *input)
{
- (vlc_object_hold)(VLC_OBJECT(input));
+ input_thread_private_t *priv = input_priv(input);
+
+ atomic_fetch_add_explicit(&priv->refs, 1, memory_order_relaxed);
return input;
}
void input_Release(input_thread_t *input)
{
- (vlc_object_release)(VLC_OBJECT(input));
+ input_thread_private_t *priv = input_priv(input);
+
+ if (atomic_fetch_sub_explicit(&priv->refs, 1, memory_order_release))
+ return;
+
+ atomic_thread_fence(memory_order_acquire);
+ vlc_object_delete(VLC_OBJECT(input));
}
/*****************************************************************************
diff --git a/src/input/input_internal.h b/src/input/input_internal.h
index 7fd05c0d64..18495881c2 100644
--- a/src/input/input_internal.h
+++ b/src/input/input_internal.h
@@ -200,6 +200,7 @@ typedef struct input_thread_private_t
vlc_thread_t thread;
vlc_interrupt_t interrupt;
+ atomic_uintptr_t refs;
} input_thread_private_t;
static inline input_thread_private_t *input_priv(input_thread_t *input)
More information about the vlc-commits
mailing list