diff -Nur audacious-plugins-2.2-orig/src/streambrowser/gui/streambrowser_win.c audacious-plugins-2.2-streambrowser-race/src/streambrowser/gui/streambrowser_win.c
--- audacious-plugins-2.2-orig/src/streambrowser/gui/streambrowser_win.c 2009-11-22 23:49:53.000000000 +0100
+++ audacious-plugins-2.2-streambrowser-race/src/streambrowser/gui/streambrowser_win.c 2010-02-04 00:56:19.000000000 +0100
@@ -44,7 +44,7 @@
static GtkWidget* add_button;
static GtkWidget* bookmark_button;
static GtkWidget* streambrowser_window;
-static GList* streamdir_gui_list;
+static GList* streamdir_gui_list = NULL;
static GtkCellRenderer* cell_renderer_pixbuf;
static GtkCellRenderer* cell_renderer_text;
diff -Nur audacious-plugins-2.2-orig/src/streambrowser/streambrowser.c audacious-plugins-2.2-streambrowser-race/src/streambrowser/streambrowser.c
--- audacious-plugins-2.2-orig/src/streambrowser/streambrowser.c 2009-11-22 23:49:53.000000000 +0100
+++ audacious-plugins-2.2-streambrowser-race/src/streambrowser/streambrowser.c 2010-02-04 00:57:25.000000000 +0100
@@ -474,6 +474,20 @@
/* repetitively process the queue elements, until queue is empty */
while (data != NULL && g_queue_get_length(update_thread_data_queue) > 0) {
+ if (data->streamdir && !streamdir_is_valid(data->streamdir)) {
+ printf("WARNING: Skipping invalidated streambrowser queue element!\n");
+ g_free(data);
+ g_mutex_lock(update_thread_mutex);
+ /* remove the just processed data from the queue */
+ g_queue_pop_head(update_thread_data_queue);
+ /* try to get the last item in the queue */
+ if (g_queue_get_length(update_thread_data_queue) > 0)
+ data = g_queue_peek_head(update_thread_data_queue);
+ else
+ data = NULL;
+ g_mutex_unlock(update_thread_mutex);
+ continue;
+ }
/* update a streaminfo */
if (data->streaminfo != NULL) {
gdk_threads_enter();
diff -Nur audacious-plugins-2.2-orig/src/streambrowser/streamdir.c audacious-plugins-2.2-streambrowser-race/src/streambrowser/streamdir.c
--- audacious-plugins-2.2-orig/src/streambrowser/streamdir.c 2009-11-22 23:49:53.000000000 +0100
+++ audacious-plugins-2.2-streambrowser-race/src/streambrowser/streamdir.c 2010-02-04 00:57:07.000000000 +0100
@@ -23,13 +23,19 @@
#include "streambrowser.h"
#include "streamdir.h"
+static GList *all_streamdirs = NULL;
+
+gboolean streamdir_is_valid(streamdir_t *streamdir) {
+ return (NULL != g_list_find(all_streamdirs,streamdir));
+}
streamdir_t* streamdir_new(gchar *name)
{
streamdir_t *streamdir = (streamdir_t*) g_malloc(sizeof(streamdir_t));
strncpy(streamdir->name, name, DEF_STRING_LEN);
streamdir->category_list = NULL;
-
+
+ all_streamdirs = g_list_append(all_streamdirs,streamdir);
return streamdir;
}
@@ -45,6 +51,8 @@
g_list_free(streamdir->category_list);
g_free(streamdir);
+
+ all_streamdirs = g_list_remove(all_streamdirs,streamdir);
}
diff -Nur audacious-plugins-2.2-orig/src/streambrowser/streamdir.h audacious-plugins-2.2-streambrowser-race/src/streambrowser/streamdir.h
--- audacious-plugins-2.2-orig/src/streambrowser/streamdir.h 2009-11-22 23:49:53.000000000 +0100
+++ audacious-plugins-2.2-streambrowser-race/src/streambrowser/streamdir.h 2010-02-04 00:57:01.000000000 +0100
@@ -48,6 +48,7 @@
} streamdir_t;
+gboolean streamdir_is_valid(streamdir_t *streamdir);
streamdir_t* streamdir_new(gchar *name);
void streamdir_delete(streamdir_t *streamdir);