changeset 3460:0fcff78c0c2c trunk

Make the shutdown procedure more sane and improve playlist clearing efficiency.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 09 Sep 2007 05:37:49 +0300
parents 2048a7c9572f
children 95a607e527f2
files src/audacious/playlist.c src/audacious/playlist.h src/audacious/ui_main.c
diffstat 3 files changed, 29 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/audacious/playlist.c	Fri Sep 07 22:26:42 2007 -0500
+++ b/src/audacious/playlist.c	Sun Sep 09 05:37:49 2007 +0300
@@ -45,11 +45,11 @@
 #include <sys/errno.h>
 
 #if defined(USE_REGEX_ONIGURUMA)
-  #include <onigposix.h>
+#  include <onigposix.h>
 #elif defined(USE_REGEX_PCRE)
-  #include <pcreposix.h>
+#  include <pcreposix.h>
 #else
-  #include <regex.h>
+#  include <regex.h>
 #endif
 
 #include "input.h"
@@ -102,11 +102,11 @@
  * January 7, 2006, William Pitcock <nenolod@nenolod.net>
  */
 
-G_LOCK_DEFINE(playlist_get_info_going);
 
 //static gchar *playlist_current_name = NULL;
 
 static gboolean playlist_get_info_scan_active = FALSE;
+GStaticRWLock playlist_get_info_rwlock = G_STATIC_RW_LOCK_INIT;
 static gboolean playlist_get_info_going = FALSE;
 static GThread *playlist_get_info_thread;
 
@@ -411,11 +411,8 @@
 }
 
 void
-playlist_clear(Playlist *playlist)
+playlist_clear_only(Playlist *playlist)
 {
-    if (!playlist)
-        return;
-
     PLAYLIST_LOCK( playlist->mutex );
 
     g_list_foreach(playlist->entries, (GFunc) playlist_entry_free, NULL);
@@ -426,7 +423,15 @@
     playlist->attribute = PLAYLIST_PLAIN;
 
     PLAYLIST_UNLOCK( playlist->mutex );
-
+}
+
+void
+playlist_clear(Playlist *playlist)
+{
+    if (!playlist)
+        return;
+
+    playlist_clear_only(playlist);
     playlist_generate_shuffle_list(playlist);
     playlistwin_update_list(playlist);
     playlist_recalc_total_time(playlist);
@@ -2505,13 +2510,14 @@
 {
     gboolean result;
 
-    G_LOCK(playlist_get_info_going);
+    g_static_rw_lock_reader_lock(&playlist_get_info_rwlock);
     result = playlist_get_info_going;
-    G_UNLOCK(playlist_get_info_going);
+    g_static_rw_lock_reader_unlock(&playlist_get_info_rwlock);
 
     return result;
 }
 
+
 static gboolean
 playlist_request_win_update(gpointer unused)
 {
@@ -2520,6 +2526,7 @@
     return FALSE; /* to be called only once */
 }
 
+
 static gpointer
 playlist_get_info_func(gpointer arg)
 {
@@ -2531,8 +2538,7 @@
         Playlist *playlist = playlist_get_active();
 
         // on_load
-        if (cfg.use_pl_metadata &&
-            cfg.get_info_on_load &&
+        if (cfg.use_pl_metadata && cfg.get_info_on_load &&
             playlist_get_info_scan_active) {
 
             for (node = playlist->entries; node; node = g_list_next(node)) {
@@ -2599,9 +2605,8 @@
                 }
             }
         } // on_demand
-        else if (cfg.get_info_on_demand && 
-			(!cfg.playlist_visible || cfg.playlist_shaded
-                	 || !cfg.use_pl_metadata))
+        else if (cfg.get_info_on_demand &&
+                 (!cfg.playlist_visible || cfg.playlist_shaded || !cfg.use_pl_metadata))
         {
             g_mutex_lock(mutex_scan);
             playlist_get_info_scan_active = FALSE;
@@ -2639,9 +2644,9 @@
 void
 playlist_start_get_info_thread(void)
 {
-    G_LOCK(playlist_get_info_going);
+    g_static_rw_lock_writer_lock(&playlist_get_info_rwlock);
     playlist_get_info_going = TRUE;
-    G_UNLOCK(playlist_get_info_going);
+    g_static_rw_lock_writer_unlock(&playlist_get_info_rwlock);
 
     playlist_get_info_thread = g_thread_create(playlist_get_info_func,
                                                NULL, TRUE, NULL);
@@ -2650,9 +2655,9 @@
 void
 playlist_stop_get_info_thread(void)
 {
-    G_LOCK(playlist_get_info_going);
+    g_static_rw_lock_writer_lock(&playlist_get_info_rwlock);
     playlist_get_info_going = FALSE;
-    G_UNLOCK(playlist_get_info_going);
+    g_static_rw_lock_writer_unlock(&playlist_get_info_rwlock);
 
     g_cond_broadcast(cond_scan);
     g_thread_join(playlist_get_info_thread);
@@ -2664,6 +2669,7 @@
     g_mutex_lock(mutex_scan);
     playlist_get_info_scan_active = TRUE;
     g_mutex_unlock(mutex_scan);
+
     g_cond_signal(cond_scan);
 }
 
@@ -3241,7 +3247,6 @@
 {
     g_mutex_free( playlist->mutex );
     g_free( playlist );
-    return;
 }
 
 Playlist *
--- a/src/audacious/playlist.h	Fri Sep 07 22:26:42 2007 -0500
+++ b/src/audacious/playlist.h	Sun Sep 09 05:37:49 2007 +0300
@@ -126,6 +126,7 @@
 void playlist_select_prev(void);
 GList * playlist_get_playlists(void);
 
+void playlist_clear_only(Playlist *playlist);
 void playlist_clear(Playlist *playlist);
 void playlist_delete(Playlist *playlist, gboolean crop);
 
--- a/src/audacious/ui_main.c	Fri Sep 07 22:26:42 2007 -0500
+++ b/src/audacious/ui_main.c	Sun Sep 09 05:37:49 2007 +0300
@@ -406,6 +406,8 @@
 {
     GList *playlists = NULL, *playlists_top = NULL;
 
+    playlist_stop_get_info_thread();
+
     gtk_widget_hide(equalizerwin);
     gtk_widget_hide(playlistwin);
     gtk_widget_hide(mainwin);
@@ -417,7 +419,6 @@
 
     plugin_system_cleanup();
 
-    playlist_stop_get_info_thread();
 
     /* free and clear each playlist */
     playlists = playlist_get_playlists();