vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Thu Feb 20 
22:01:42 2014 +0100| [9c8e23547069a5390afadbd374a33e5521c1f0d0] | committer: 
Francois Cartegnie

addons: Retrieve: narrow lock

allows UI updates while downloading

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9c8e23547069a5390afadbd374a33e5521c1f0d0
---

 modules/misc/addons/fsstorage.c    |    5 +++--
 modules/misc/addons/vorepository.c |   22 ++++++++++++++++++----
 2 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/modules/misc/addons/fsstorage.c b/modules/misc/addons/fsstorage.c
index 6db9077..6bdcacb 100644
--- a/modules/misc/addons/fsstorage.c
+++ b/modules/misc/addons/fsstorage.c
@@ -498,14 +498,15 @@ static int Install( addons_storage_t *p_storage, 
addon_entry_t *p_entry )
                                       p_entry->psz_source_module, true );
     if( p_module )
     {
-        vlc_mutex_lock( &p_entry->lock );
         if ( p_finder->pf_retrieve( p_finder, p_entry ) == VLC_SUCCESS )
         {
             /* Do things while retrieved data is here */
+            vlc_mutex_lock( &p_entry->lock );
             i_ret = InstallAllFiles( p_storage, p_entry );
+            vlc_mutex_unlock( &p_entry->lock );
             /* !Do things while retrieved data is here */
         }
-        vlc_mutex_unlock( &p_entry->lock );
+
         module_unneed( p_finder, p_module );
     }
 
diff --git a/modules/misc/addons/vorepository.c 
b/modules/misc/addons/vorepository.c
index 93a7065..4ca010e 100644
--- a/modules/misc/addons/vorepository.c
+++ b/modules/misc/addons/vorepository.c
@@ -347,27 +347,39 @@ static int Find( addons_finder_t *p_finder )
 
 static int Retrieve( addons_finder_t *p_finder, addon_entry_t *p_entry )
 {
+    vlc_mutex_lock( &p_entry->lock );
     if ( !p_entry->psz_archive_uri )
+    {
+        vlc_mutex_unlock( &p_entry->lock );
         return VLC_EGENERIC;
+    }
+    char *psz_archive_uri = strdup( p_entry->psz_archive_uri );
+    vlc_mutex_unlock( &p_entry->lock );
+    if ( !psz_archive_uri )
+        return VLC_ENOMEM;
 
     /* get archive and parse manifest */
     stream_t *p_stream;
 
-    if ( p_entry->psz_archive_uri[0] == '/' )
+    if ( psz_archive_uri[0] == '/' )
     {
         /* Relative path */
         char *psz_uri;
-        if ( ! asprintf( &psz_uri, ADDONS_REPO_SCHEMEHOST"%s", 
p_entry->psz_archive_uri ) )
+        if ( ! asprintf( &psz_uri, ADDONS_REPO_SCHEMEHOST"%s", psz_archive_uri 
) )
+        {
+            free( psz_archive_uri );
             return VLC_ENOMEM;
+        }
         p_stream = stream_UrlNew( p_finder, psz_uri );
         free( psz_uri );
     }
     else
     {
-        p_stream = stream_UrlNew( p_finder, p_entry->psz_archive_uri );
+        p_stream = stream_UrlNew( p_finder, psz_archive_uri );
     }
 
-    msg_Dbg( p_finder, "downloading archive %s", p_entry->psz_archive_uri );
+    msg_Dbg( p_finder, "downloading archive %s", psz_archive_uri );
+    free ( psz_archive_uri );
     if ( !p_stream ) return VLC_EGENERIC;
 
     /* In case of pf_ reuse */
@@ -430,8 +442,10 @@ static int Retrieve( addons_finder_t *p_finder, 
addon_entry_t *p_entry )
         return VLC_EGENERIC;
     }
 
+    vlc_mutex_lock( &p_entry->lock );
     int i_ret = ( ParseManifest( p_finder, p_entry, psz_tempfileuri, p_stream 
) > 0 )
                     ? VLC_SUCCESS : VLC_EGENERIC;
+    vlc_mutex_unlock( &p_entry->lock );
     free( psz_tempfileuri );
     stream_Delete( p_stream );
 

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to