[vlc-commits] podcast: don't hold lock while parsing
Rémi Denis-Courmont
git at videolan.org
Sun Apr 12 09:15:57 CEST 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Apr 12 10:07:07 2020 +0300| [ac0485fbeb601b1bb6331439a4925bb24226f792] | committer: Rémi Denis-Courmont
podcast: don't hold lock while parsing
Otherwise setting the callback will block. On the downside, this means
that a new request will overwrite any pending one, but that's fixable
separately, and not as bad as freezing the calling interface.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ac0485fbeb601b1bb6331439a4925bb24226f792
---
modules/services_discovery/podcast.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/modules/services_discovery/podcast.c b/modules/services_discovery/podcast.c
index fd3dbec8af..76898b5b1f 100644
--- a/modules/services_discovery/podcast.c
+++ b/modules/services_discovery/podcast.c
@@ -97,7 +97,7 @@ typedef struct
static void *Run( void * );
static int Request( vlc_object_t *, char const *, vlc_value_t,
vlc_value_t, void * );
-static void ParseRequest( services_discovery_t *p_sd );
+static void ParseRequest( services_discovery_t *p_sd, char * );
static void ParseUrls( services_discovery_t *p_sd, char *psz_urls );
static void SaveUrls( services_discovery_t *p_sd );
@@ -175,9 +175,7 @@ noreturn static void *Run( void *data )
services_discovery_sys_t *p_sys = p_sd->p_sys;
int canc;
- vlc_mutex_lock( &p_sys->lock );
mutex_cleanup_push( &p_sys->lock );
-
canc = vlc_savecancel();
{
char *psz_urls = var_GetNonEmptyString( vlc_object_parent(p_sd),
@@ -189,12 +187,19 @@ noreturn static void *Run( void *data )
for( ;; )
{
- while( p_sys->psz_request == NULL )
+ char *request;
+
+ vlc_mutex_lock( &p_sys->lock );
+
+ while ((request = p_sys->psz_request) == NULL)
vlc_cond_wait( &p_sys->wait, &p_sys->lock );
+ p_sys->psz_request = NULL;
+ vlc_mutex_unlock( &p_sys->lock );
+
canc = vlc_savecancel();
msg_Dbg( p_sd, "Update required" );
- ParseRequest( p_sd );
+ ParseRequest(p_sd, request);
vlc_restorecancel (canc);
}
vlc_cleanup_pop();
@@ -287,12 +292,10 @@ static void ParseUrls( services_discovery_t *p_sd, char *psz_urls )
p_sys->i_items = i_new_items;
}
-static void ParseRequest( services_discovery_t *p_sd )
+static void ParseRequest( services_discovery_t *p_sd, char *psz_request )
{
services_discovery_sys_t *p_sys = p_sd->p_sys;
- char *psz_request = p_sys->psz_request;
-
int i;
char *psz_tok = strchr( psz_request, ':' );
@@ -336,7 +339,6 @@ static void ParseRequest( services_discovery_t *p_sd )
}
free( p_sys->psz_request );
- p_sys->psz_request = NULL;
}
static void SaveUrls( services_discovery_t *p_sd )
More information about the vlc-commits
mailing list