* Fix a crash that can occur when trying to determine if a device is an iPod [1]
* Clean up the Podcast locking code to avoid crashes [2] * Fix some warnings pertaining to time_t casts Reported by: ahze, Khairil Yusof <kaeru@inigo-tech.com> [1] Submitted by: James "Doc" Livingston [2] Obtained from: http://bugzilla.gnome.org/show_bug.cgi?id=337332 [2]
This commit is contained in:
parent
82c9809b88
commit
7f95e396ff
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=177602
@ -8,7 +8,7 @@
|
||||
|
||||
PORTNAME= rhythmbox
|
||||
PORTVERSION= 0.9.6
|
||||
PORTREVISION= 3
|
||||
PORTREVISION= 4
|
||||
CATEGORIES= audio gnome
|
||||
MASTER_SITES= ${MASTER_SITE_GNOME}
|
||||
MASTER_SITE_SUBDIR= sources/${PORTNAME}/0.9
|
||||
|
@ -1,56 +1,317 @@
|
||||
--- podcast/rb-podcast-manager.c.orig Sun Sep 24 07:03:53 2006
|
||||
+++ podcast/rb-podcast-manager.c Fri Oct 27 10:21:17 2006
|
||||
@@ -545,10 +545,12 @@ rb_podcast_manager_next_file (RBPodcastM
|
||||
size = g_list_length (pd->priv->download_list);
|
||||
g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
+++ podcast/rb-podcast-manager.c Sun Nov 19 12:31:44 2006
|
||||
@@ -85,8 +85,6 @@ struct RBPodcastManagerPrivate
|
||||
guint next_time;
|
||||
guint source_sync;
|
||||
guint update_interval_notify_id;
|
||||
- GMutex *mutex_job;
|
||||
- GMutex *download_list_mutex;
|
||||
|
||||
- if (size > 0)
|
||||
+ if (size > 0) {
|
||||
rb_podcast_manager_copy_post (pd);
|
||||
- else
|
||||
g_mutex_unlock (pd->priv->mutex_job);
|
||||
+ } else {
|
||||
+ g_mutex_unlock (pd->priv->mutex_job);
|
||||
+ }
|
||||
} else {
|
||||
rb_debug ("not start");
|
||||
gboolean remove_files;
|
||||
|
||||
@@ -102,7 +100,6 @@ typedef struct
|
||||
RBPodcastChannel *channel;
|
||||
} RBPodcastManagerEvent;
|
||||
|
||||
-/* used on donwload thread */
|
||||
typedef struct
|
||||
{
|
||||
RBPodcastManager *pd;
|
||||
@@ -111,14 +108,12 @@ typedef struct
|
||||
GnomeVFSURI *write_uri;
|
||||
GnomeVFSURI *read_uri;
|
||||
char *query_string;
|
||||
- GMutex *mutex_working;
|
||||
|
||||
guint total_size;
|
||||
guint progress;
|
||||
gboolean canceled;
|
||||
} RBPodcastManagerInfo;
|
||||
|
||||
-/* used on subscribe thread */
|
||||
typedef struct
|
||||
{
|
||||
RBPodcastManager *pd;
|
||||
@@ -175,7 +170,6 @@ static guint download_progress_update_cb
|
||||
|
||||
/* internal functions */
|
||||
static void download_info_free (RBPodcastManagerInfo *data);
|
||||
-static RBPodcastManagerInfo *download_info_new (void);
|
||||
static void start_job (RBPodcastManagerInfo *data);
|
||||
static void end_job (RBPodcastManagerInfo *data);
|
||||
static void cancel_job (RBPodcastManagerInfo *pd);
|
||||
@@ -272,8 +266,6 @@ rb_podcast_manager_init (RBPodcastManage
|
||||
pd->priv = RB_PODCAST_MANAGER_GET_PRIVATE (pd);
|
||||
|
||||
pd->priv->source_sync = 0;
|
||||
- pd->priv->mutex_job = g_mutex_new();
|
||||
- pd->priv->download_list_mutex = g_mutex_new();
|
||||
pd->priv->event_queue = g_async_queue_new ();
|
||||
pd->priv->db = NULL;
|
||||
eel_gconf_monitor_add (CONF_STATE_PODCAST_PREFIX);
|
||||
@@ -321,8 +313,6 @@ rb_podcast_manager_finalize (GObject *ob
|
||||
g_list_free (pd->priv->download_list);
|
||||
}
|
||||
@@ -635,6 +637,7 @@ rb_podcast_manager_download_file_info_cb
|
||||
|
||||
rb_debug ("got file info results for %s",
|
||||
rhythmdb_entry_get_string (data->entry, RHYTHMDB_PROP_LOCATION));
|
||||
+ g_mutex_lock (data->pd->priv->mutex_job);
|
||||
- g_mutex_free (pd->priv->mutex_job);
|
||||
- g_mutex_free (pd->priv->download_list_mutex);
|
||||
g_async_queue_unref (pd->priv->event_queue);
|
||||
|
||||
if (result->result != GNOME_VFS_OK) {
|
||||
G_OBJECT_CLASS (rb_podcast_manager_parent_class)->finalize (object);
|
||||
@@ -418,12 +408,12 @@ rb_podcast_manager_download_entry (RBPod
|
||||
g_value_unset (&status_val);
|
||||
}
|
||||
rb_debug ("Try insert entry for download.");
|
||||
- data = download_info_new();
|
||||
+
|
||||
+ data = g_new0 (RBPodcastManagerInfo, 1);
|
||||
data->pd = pd;
|
||||
data->entry = entry;
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
+
|
||||
pd->priv->download_list = g_list_append (pd->priv->download_list, data);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file , pd);
|
||||
}
|
||||
}
|
||||
@@ -535,23 +525,15 @@ rb_podcast_manager_head_query_cb (GtkTre
|
||||
static gboolean
|
||||
rb_podcast_manager_next_file (RBPodcastManager * pd)
|
||||
{
|
||||
+ gint size;
|
||||
+
|
||||
GDK_THREADS_ENTER ();
|
||||
-
|
||||
rb_debug ("try lock file_process mutex");
|
||||
- if (g_mutex_trylock (pd->priv->mutex_job) == TRUE) {
|
||||
- gint size;
|
||||
|
||||
@@ -769,6 +772,7 @@ rb_podcast_manager_abort_download (RBPod
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
- size = g_list_length (pd->priv->download_list);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
-
|
||||
- if (size > 0)
|
||||
- rb_podcast_manager_copy_post (pd);
|
||||
- else
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
- } else {
|
||||
- rb_debug ("not start");
|
||||
- }
|
||||
+ size = g_list_length (pd->priv->download_list);
|
||||
+
|
||||
+ if (size > 0)
|
||||
+ rb_podcast_manager_copy_post (pd);
|
||||
|
||||
GDK_THREADS_LEAVE ();
|
||||
return FALSE;
|
||||
@@ -565,9 +547,7 @@ rb_podcast_manager_copy_post (RBPodcastM
|
||||
char *query_string;
|
||||
|
||||
/* get first element of list */
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
data = (RBPodcastManagerInfo *) g_list_first (pd->priv->download_list)->data;
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
g_assert (data != NULL);
|
||||
g_assert (data->entry != NULL);
|
||||
@@ -765,13 +745,9 @@ rb_podcast_manager_abort_download (RBPod
|
||||
{
|
||||
RBPodcastManager *mgr = data->pd;
|
||||
|
||||
- g_mutex_lock (mgr->priv->download_list_mutex);
|
||||
mgr->priv->download_list = g_list_remove (mgr->priv->download_list, (gconstpointer) data);
|
||||
g_mutex_unlock (mgr->priv->download_list_mutex);
|
||||
|
||||
+ g_mutex_unlock (data->mutex_working);
|
||||
- g_mutex_unlock (mgr->priv->download_list_mutex);
|
||||
-
|
||||
download_info_free (data);
|
||||
|
||||
g_mutex_unlock (mgr->priv->mutex_job);
|
||||
@@ -1085,6 +1089,10 @@ start_job (RBPodcastManagerInfo *data)
|
||||
(GnomeVFSXferProgressCallback ) download_progress_cb,
|
||||
data);
|
||||
|
||||
+ g_mutex_unlock (data->mutex_working);
|
||||
+
|
||||
+ g_mutex_unlock (data->pd->priv->mutex_job);
|
||||
+
|
||||
- g_mutex_unlock (mgr->priv->mutex_job);
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file, mgr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1170,6 +1178,11 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
@@ -1021,6 +997,8 @@ write_job_data (RBPodcastManagerInfo *da
|
||||
gnome_vfs_uri_to_string (data->write_uri, GNOME_VFS_URI_HIDE_NONE));
|
||||
|
||||
if (data == NULL) {
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_ABORT;
|
||||
+ }
|
||||
rhythmdb_commit (db);
|
||||
+
|
||||
+ if (info->phase == GNOME_VFS_XFER_PHASE_INITIAL) {
|
||||
+ g_mutex_lock (data->mutex_working);
|
||||
+ g_mutex_lock (data->pd->priv->mutex_job);
|
||||
+ end_job (data);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1040,19 +1018,9 @@ download_info_free (RBPodcastManagerInfo
|
||||
data->query_string = NULL;
|
||||
}
|
||||
|
||||
- g_mutex_free (data->mutex_working);
|
||||
-
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
-static RBPodcastManagerInfo*
|
||||
-download_info_new (void)
|
||||
-{
|
||||
- RBPodcastManagerInfo *data = g_new0 (RBPodcastManagerInfo, 1);
|
||||
- data->mutex_working = g_mutex_new ();
|
||||
- return data;
|
||||
-}
|
||||
-
|
||||
static void
|
||||
start_job (RBPodcastManagerInfo *data)
|
||||
{
|
||||
@@ -1070,8 +1038,6 @@ start_job (RBPodcastManagerInfo *data)
|
||||
source_uri_list = g_list_prepend (source_uri_list, data->read_uri);
|
||||
target_uri_list = g_list_prepend (target_uri_list, data->write_uri);
|
||||
|
||||
- g_mutex_lock (data->mutex_working);
|
||||
-
|
||||
rb_debug ("start async copy");
|
||||
gnome_vfs_async_xfer ( &data->read_handle,
|
||||
source_uri_list,
|
||||
@@ -1094,9 +1060,7 @@ rb_podcast_manager_cancel_all (RBPodcast
|
||||
guint lst_len;
|
||||
GList *lst;
|
||||
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
lst = g_list_reverse (pd->priv->download_list);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
rb_debug ("cancel all job %d", g_list_length (lst));
|
||||
lst_len = g_list_length (lst);
|
||||
@@ -1107,11 +1071,6 @@ rb_podcast_manager_cancel_all (RBPodcast
|
||||
cancel_job (data);
|
||||
rb_debug ("cancel next job");
|
||||
}
|
||||
-
|
||||
- if (lst_len > 0) {
|
||||
- g_mutex_lock (pd->priv->mutex_job);
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
- }
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1120,12 +1079,7 @@ end_job (RBPodcastManagerInfo *data)
|
||||
RBPodcastManager *pd = data->pd;
|
||||
|
||||
rb_debug ("end_job");
|
||||
-
|
||||
- g_mutex_lock (data->pd->priv->download_list_mutex);
|
||||
data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer) data);
|
||||
- g_mutex_unlock (data->pd->priv->download_list_mutex);
|
||||
-
|
||||
- g_mutex_unlock (data->mutex_working);
|
||||
|
||||
if (data->canceled != TRUE) {
|
||||
GDK_THREADS_ENTER ();
|
||||
@@ -1137,7 +1091,6 @@ end_job (RBPodcastManagerInfo *data)
|
||||
}
|
||||
|
||||
download_info_free (data);
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file, pd);
|
||||
}
|
||||
@@ -1145,22 +1098,12 @@ end_job (RBPodcastManagerInfo *data)
|
||||
static void
|
||||
cancel_job (RBPodcastManagerInfo *data)
|
||||
{
|
||||
- if (g_mutex_trylock (data->mutex_working) == FALSE) {
|
||||
- rb_debug ("async cancel");
|
||||
- data->canceled = TRUE;
|
||||
- }
|
||||
- else {
|
||||
- rb_debug ("job cancel");
|
||||
-
|
||||
- g_mutex_lock (data->pd->priv->download_list_mutex);
|
||||
- data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer ) data);
|
||||
- g_mutex_unlock (data->pd->priv->download_list_mutex);
|
||||
+ rb_debug ("job cancel");
|
||||
|
||||
- g_mutex_unlock (data->mutex_working);
|
||||
+ data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer ) data);
|
||||
|
||||
- download_info_free (data);
|
||||
- data = NULL;
|
||||
- }
|
||||
+ download_info_free (data);
|
||||
+ data = NULL;
|
||||
}
|
||||
|
||||
static guint
|
||||
@@ -1175,16 +1118,16 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
if (info->status != GNOME_VFS_XFER_PROGRESS_STATUS_OK ||
|
||||
((info->phase == GNOME_VFS_XFER_PHASE_COMPLETED) && (info->file_size == 0))) {
|
||||
GValue val = {0, };
|
||||
+
|
||||
rb_debug ("error on download");
|
||||
+
|
||||
g_value_init (&val, G_TYPE_ULONG);
|
||||
g_value_set_ulong (&val, RHYTHMDB_PODCAST_STATUS_ERROR);
|
||||
- GDK_THREADS_ENTER ();
|
||||
rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_STATUS, &val);
|
||||
rhythmdb_commit (data->pd->priv->db);
|
||||
- GDK_THREADS_LEAVE ();
|
||||
g_value_unset (&val);
|
||||
- end_job (data);
|
||||
- data = NULL;
|
||||
+
|
||||
+ g_idle_add ((GSourceFunc)end_job, data);
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_ABORT;
|
||||
}
|
||||
|
||||
@@ -1208,9 +1151,9 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
rb_debug ("download completed");
|
||||
data->total_size = info->file_size;
|
||||
write_job_data (data);
|
||||
+ } else {
|
||||
+ g_idle_add ((GSourceFunc)end_job, data);
|
||||
}
|
||||
- end_job (data);
|
||||
- data = NULL;
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_SKIP;
|
||||
}
|
||||
|
||||
@@ -1226,7 +1169,6 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
static guint
|
||||
download_progress_update_cb (GnomeVFSAsyncHandle *handle, GnomeVFSXferProgressInfo *info, gpointer cb_data)
|
||||
{
|
||||
-
|
||||
RBPodcastManagerInfo *data = (RBPodcastManagerInfo *) cb_data;
|
||||
|
||||
if (data == NULL) {
|
||||
@@ -1243,17 +1185,18 @@ download_progress_update_cb (GnomeVFSAsy
|
||||
if (local_progress != data->progress) {
|
||||
GValue val = {0,};
|
||||
|
||||
+ GDK_THREADS_ENTER ();
|
||||
+
|
||||
g_value_init (&val, G_TYPE_ULONG);
|
||||
g_value_set_ulong (&val, local_progress);
|
||||
rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_STATUS, &val);
|
||||
g_value_unset (&val);
|
||||
|
||||
- GDK_THREADS_ENTER ();
|
||||
-
|
||||
g_signal_emit (data->pd, rb_podcast_manager_signals[STATUS_CHANGED],
|
||||
0, data->entry, local_progress);
|
||||
|
||||
GDK_THREADS_LEAVE ();
|
||||
+
|
||||
data->progress = local_progress;
|
||||
}
|
||||
}
|
||||
@@ -1368,8 +1311,6 @@ rb_podcast_manager_cancel_download (RBPo
|
||||
{
|
||||
GList *lst;
|
||||
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
-
|
||||
lst = pd->priv->download_list;
|
||||
while (lst) {
|
||||
RBPodcastManagerInfo *data = (RBPodcastManagerInfo *) lst->data;
|
||||
@@ -1379,7 +1320,6 @@ rb_podcast_manager_cancel_download (RBPo
|
||||
}
|
||||
lst = lst->next;
|
||||
}
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
if (lst)
|
||||
cancel_job (lst->data);
|
||||
|
29
audio/rhythmbox-devel/files/patch-rhythmdb_rhythmdb.c
Normal file
29
audio/rhythmbox-devel/files/patch-rhythmdb_rhythmdb.c
Normal file
@ -0,0 +1,29 @@
|
||||
--- rhythmdb/rhythmdb.c.orig Sun Nov 19 12:40:07 2006
|
||||
+++ rhythmdb/rhythmdb.c Sun Nov 19 12:40:26 2006
|
||||
@@ -2817,7 +2817,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
if (entry->last_played == 0) {
|
||||
new = rb_refstring_new (never);
|
||||
} else {
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->last_played));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->last_played));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
}
|
||||
@@ -2840,7 +2840,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
break;
|
||||
|
||||
old = g_atomic_pointer_get (&entry->first_seen_str);
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->first_seen));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->first_seen));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
|
||||
@@ -2864,7 +2864,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
old = g_atomic_pointer_get (&entry->last_seen_str);
|
||||
/* only store last seen time as a string for hidden entries */
|
||||
if (entry->flags & RHYTHMDB_ENTRY_HIDDEN) {
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->last_seen));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->last_seen));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
} else {
|
51
audio/rhythmbox-devel/files/patch-sources_rb-ipod-source.c
Normal file
51
audio/rhythmbox-devel/files/patch-sources_rb-ipod-source.c
Normal file
@ -0,0 +1,51 @@
|
||||
--- sources/rb-ipod-source.c.orig Sun Nov 19 12:12:33 2006
|
||||
+++ sources/rb-ipod-source.c Sun Nov 19 12:28:50 2006
|
||||
@@ -695,33 +695,36 @@ hal_udi_is_ipod (const char *udi)
|
||||
char *spider_udi;
|
||||
int vnd_id = 0;
|
||||
int product_id = 0;
|
||||
+ DBusError phone_error;
|
||||
+
|
||||
+ dbus_error_init (&phone_error);
|
||||
|
||||
spider_udi = g_strdup(parent_udi);
|
||||
while (vnd_id == 0 && product_id == 0 && spider_udi != NULL) {
|
||||
char *old_udi = spider_udi;
|
||||
spider_udi = libhal_device_get_property_string (ctx, spider_udi,
|
||||
- "info.parent", &error);
|
||||
- if (dbus_error_is_set (&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "info.parent", &phone_error);
|
||||
+ if (dbus_error_is_set (&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
spider_udi = NULL;
|
||||
break;
|
||||
}
|
||||
g_free(old_udi);
|
||||
|
||||
vnd_id = libhal_device_get_property_int (ctx, spider_udi,
|
||||
- "usb.vendor_id", &error);
|
||||
- if (dbus_error_is_set(&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "usb.vendor_id", &phone_error);
|
||||
+ if (dbus_error_is_set(&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
vnd_id = 0;
|
||||
}
|
||||
|
||||
product_id = libhal_device_get_property_int (ctx, spider_udi,
|
||||
- "usb.product_id", &error);
|
||||
- if (dbus_error_is_set(&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "usb.product_id", &phone_error);
|
||||
+ if (dbus_error_is_set(&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
product_id = 0;
|
||||
}
|
||||
}
|
@ -8,7 +8,7 @@
|
||||
|
||||
PORTNAME= rhythmbox
|
||||
PORTVERSION= 0.9.6
|
||||
PORTREVISION= 3
|
||||
PORTREVISION= 4
|
||||
CATEGORIES= audio gnome
|
||||
MASTER_SITES= ${MASTER_SITE_GNOME}
|
||||
MASTER_SITE_SUBDIR= sources/${PORTNAME}/0.9
|
||||
|
@ -1,56 +1,317 @@
|
||||
--- podcast/rb-podcast-manager.c.orig Sun Sep 24 07:03:53 2006
|
||||
+++ podcast/rb-podcast-manager.c Fri Oct 27 10:21:17 2006
|
||||
@@ -545,10 +545,12 @@ rb_podcast_manager_next_file (RBPodcastM
|
||||
size = g_list_length (pd->priv->download_list);
|
||||
g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
+++ podcast/rb-podcast-manager.c Sun Nov 19 12:31:44 2006
|
||||
@@ -85,8 +85,6 @@ struct RBPodcastManagerPrivate
|
||||
guint next_time;
|
||||
guint source_sync;
|
||||
guint update_interval_notify_id;
|
||||
- GMutex *mutex_job;
|
||||
- GMutex *download_list_mutex;
|
||||
|
||||
- if (size > 0)
|
||||
+ if (size > 0) {
|
||||
rb_podcast_manager_copy_post (pd);
|
||||
- else
|
||||
g_mutex_unlock (pd->priv->mutex_job);
|
||||
+ } else {
|
||||
+ g_mutex_unlock (pd->priv->mutex_job);
|
||||
+ }
|
||||
} else {
|
||||
rb_debug ("not start");
|
||||
gboolean remove_files;
|
||||
|
||||
@@ -102,7 +100,6 @@ typedef struct
|
||||
RBPodcastChannel *channel;
|
||||
} RBPodcastManagerEvent;
|
||||
|
||||
-/* used on donwload thread */
|
||||
typedef struct
|
||||
{
|
||||
RBPodcastManager *pd;
|
||||
@@ -111,14 +108,12 @@ typedef struct
|
||||
GnomeVFSURI *write_uri;
|
||||
GnomeVFSURI *read_uri;
|
||||
char *query_string;
|
||||
- GMutex *mutex_working;
|
||||
|
||||
guint total_size;
|
||||
guint progress;
|
||||
gboolean canceled;
|
||||
} RBPodcastManagerInfo;
|
||||
|
||||
-/* used on subscribe thread */
|
||||
typedef struct
|
||||
{
|
||||
RBPodcastManager *pd;
|
||||
@@ -175,7 +170,6 @@ static guint download_progress_update_cb
|
||||
|
||||
/* internal functions */
|
||||
static void download_info_free (RBPodcastManagerInfo *data);
|
||||
-static RBPodcastManagerInfo *download_info_new (void);
|
||||
static void start_job (RBPodcastManagerInfo *data);
|
||||
static void end_job (RBPodcastManagerInfo *data);
|
||||
static void cancel_job (RBPodcastManagerInfo *pd);
|
||||
@@ -272,8 +266,6 @@ rb_podcast_manager_init (RBPodcastManage
|
||||
pd->priv = RB_PODCAST_MANAGER_GET_PRIVATE (pd);
|
||||
|
||||
pd->priv->source_sync = 0;
|
||||
- pd->priv->mutex_job = g_mutex_new();
|
||||
- pd->priv->download_list_mutex = g_mutex_new();
|
||||
pd->priv->event_queue = g_async_queue_new ();
|
||||
pd->priv->db = NULL;
|
||||
eel_gconf_monitor_add (CONF_STATE_PODCAST_PREFIX);
|
||||
@@ -321,8 +313,6 @@ rb_podcast_manager_finalize (GObject *ob
|
||||
g_list_free (pd->priv->download_list);
|
||||
}
|
||||
@@ -635,6 +637,7 @@ rb_podcast_manager_download_file_info_cb
|
||||
|
||||
rb_debug ("got file info results for %s",
|
||||
rhythmdb_entry_get_string (data->entry, RHYTHMDB_PROP_LOCATION));
|
||||
+ g_mutex_lock (data->pd->priv->mutex_job);
|
||||
- g_mutex_free (pd->priv->mutex_job);
|
||||
- g_mutex_free (pd->priv->download_list_mutex);
|
||||
g_async_queue_unref (pd->priv->event_queue);
|
||||
|
||||
if (result->result != GNOME_VFS_OK) {
|
||||
G_OBJECT_CLASS (rb_podcast_manager_parent_class)->finalize (object);
|
||||
@@ -418,12 +408,12 @@ rb_podcast_manager_download_entry (RBPod
|
||||
g_value_unset (&status_val);
|
||||
}
|
||||
rb_debug ("Try insert entry for download.");
|
||||
- data = download_info_new();
|
||||
+
|
||||
+ data = g_new0 (RBPodcastManagerInfo, 1);
|
||||
data->pd = pd;
|
||||
data->entry = entry;
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
+
|
||||
pd->priv->download_list = g_list_append (pd->priv->download_list, data);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file , pd);
|
||||
}
|
||||
}
|
||||
@@ -535,23 +525,15 @@ rb_podcast_manager_head_query_cb (GtkTre
|
||||
static gboolean
|
||||
rb_podcast_manager_next_file (RBPodcastManager * pd)
|
||||
{
|
||||
+ gint size;
|
||||
+
|
||||
GDK_THREADS_ENTER ();
|
||||
-
|
||||
rb_debug ("try lock file_process mutex");
|
||||
- if (g_mutex_trylock (pd->priv->mutex_job) == TRUE) {
|
||||
- gint size;
|
||||
|
||||
@@ -769,6 +772,7 @@ rb_podcast_manager_abort_download (RBPod
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
- size = g_list_length (pd->priv->download_list);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
-
|
||||
- if (size > 0)
|
||||
- rb_podcast_manager_copy_post (pd);
|
||||
- else
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
- } else {
|
||||
- rb_debug ("not start");
|
||||
- }
|
||||
+ size = g_list_length (pd->priv->download_list);
|
||||
+
|
||||
+ if (size > 0)
|
||||
+ rb_podcast_manager_copy_post (pd);
|
||||
|
||||
GDK_THREADS_LEAVE ();
|
||||
return FALSE;
|
||||
@@ -565,9 +547,7 @@ rb_podcast_manager_copy_post (RBPodcastM
|
||||
char *query_string;
|
||||
|
||||
/* get first element of list */
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
data = (RBPodcastManagerInfo *) g_list_first (pd->priv->download_list)->data;
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
g_assert (data != NULL);
|
||||
g_assert (data->entry != NULL);
|
||||
@@ -765,13 +745,9 @@ rb_podcast_manager_abort_download (RBPod
|
||||
{
|
||||
RBPodcastManager *mgr = data->pd;
|
||||
|
||||
- g_mutex_lock (mgr->priv->download_list_mutex);
|
||||
mgr->priv->download_list = g_list_remove (mgr->priv->download_list, (gconstpointer) data);
|
||||
g_mutex_unlock (mgr->priv->download_list_mutex);
|
||||
|
||||
+ g_mutex_unlock (data->mutex_working);
|
||||
- g_mutex_unlock (mgr->priv->download_list_mutex);
|
||||
-
|
||||
download_info_free (data);
|
||||
|
||||
g_mutex_unlock (mgr->priv->mutex_job);
|
||||
@@ -1085,6 +1089,10 @@ start_job (RBPodcastManagerInfo *data)
|
||||
(GnomeVFSXferProgressCallback ) download_progress_cb,
|
||||
data);
|
||||
|
||||
+ g_mutex_unlock (data->mutex_working);
|
||||
+
|
||||
+ g_mutex_unlock (data->pd->priv->mutex_job);
|
||||
+
|
||||
- g_mutex_unlock (mgr->priv->mutex_job);
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file, mgr);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1170,6 +1178,11 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
@@ -1021,6 +997,8 @@ write_job_data (RBPodcastManagerInfo *da
|
||||
gnome_vfs_uri_to_string (data->write_uri, GNOME_VFS_URI_HIDE_NONE));
|
||||
|
||||
if (data == NULL) {
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_ABORT;
|
||||
+ }
|
||||
rhythmdb_commit (db);
|
||||
+
|
||||
+ if (info->phase == GNOME_VFS_XFER_PHASE_INITIAL) {
|
||||
+ g_mutex_lock (data->mutex_working);
|
||||
+ g_mutex_lock (data->pd->priv->mutex_job);
|
||||
+ end_job (data);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1040,19 +1018,9 @@ download_info_free (RBPodcastManagerInfo
|
||||
data->query_string = NULL;
|
||||
}
|
||||
|
||||
- g_mutex_free (data->mutex_working);
|
||||
-
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
-static RBPodcastManagerInfo*
|
||||
-download_info_new (void)
|
||||
-{
|
||||
- RBPodcastManagerInfo *data = g_new0 (RBPodcastManagerInfo, 1);
|
||||
- data->mutex_working = g_mutex_new ();
|
||||
- return data;
|
||||
-}
|
||||
-
|
||||
static void
|
||||
start_job (RBPodcastManagerInfo *data)
|
||||
{
|
||||
@@ -1070,8 +1038,6 @@ start_job (RBPodcastManagerInfo *data)
|
||||
source_uri_list = g_list_prepend (source_uri_list, data->read_uri);
|
||||
target_uri_list = g_list_prepend (target_uri_list, data->write_uri);
|
||||
|
||||
- g_mutex_lock (data->mutex_working);
|
||||
-
|
||||
rb_debug ("start async copy");
|
||||
gnome_vfs_async_xfer ( &data->read_handle,
|
||||
source_uri_list,
|
||||
@@ -1094,9 +1060,7 @@ rb_podcast_manager_cancel_all (RBPodcast
|
||||
guint lst_len;
|
||||
GList *lst;
|
||||
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
lst = g_list_reverse (pd->priv->download_list);
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
rb_debug ("cancel all job %d", g_list_length (lst));
|
||||
lst_len = g_list_length (lst);
|
||||
@@ -1107,11 +1071,6 @@ rb_podcast_manager_cancel_all (RBPodcast
|
||||
cancel_job (data);
|
||||
rb_debug ("cancel next job");
|
||||
}
|
||||
-
|
||||
- if (lst_len > 0) {
|
||||
- g_mutex_lock (pd->priv->mutex_job);
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
- }
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1120,12 +1079,7 @@ end_job (RBPodcastManagerInfo *data)
|
||||
RBPodcastManager *pd = data->pd;
|
||||
|
||||
rb_debug ("end_job");
|
||||
-
|
||||
- g_mutex_lock (data->pd->priv->download_list_mutex);
|
||||
data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer) data);
|
||||
- g_mutex_unlock (data->pd->priv->download_list_mutex);
|
||||
-
|
||||
- g_mutex_unlock (data->mutex_working);
|
||||
|
||||
if (data->canceled != TRUE) {
|
||||
GDK_THREADS_ENTER ();
|
||||
@@ -1137,7 +1091,6 @@ end_job (RBPodcastManagerInfo *data)
|
||||
}
|
||||
|
||||
download_info_free (data);
|
||||
- g_mutex_unlock (pd->priv->mutex_job);
|
||||
|
||||
g_idle_add ((GtkFunction) rb_podcast_manager_next_file, pd);
|
||||
}
|
||||
@@ -1145,22 +1098,12 @@ end_job (RBPodcastManagerInfo *data)
|
||||
static void
|
||||
cancel_job (RBPodcastManagerInfo *data)
|
||||
{
|
||||
- if (g_mutex_trylock (data->mutex_working) == FALSE) {
|
||||
- rb_debug ("async cancel");
|
||||
- data->canceled = TRUE;
|
||||
- }
|
||||
- else {
|
||||
- rb_debug ("job cancel");
|
||||
-
|
||||
- g_mutex_lock (data->pd->priv->download_list_mutex);
|
||||
- data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer ) data);
|
||||
- g_mutex_unlock (data->pd->priv->download_list_mutex);
|
||||
+ rb_debug ("job cancel");
|
||||
|
||||
- g_mutex_unlock (data->mutex_working);
|
||||
+ data->pd->priv->download_list = g_list_remove (data->pd->priv->download_list, (gconstpointer ) data);
|
||||
|
||||
- download_info_free (data);
|
||||
- data = NULL;
|
||||
- }
|
||||
+ download_info_free (data);
|
||||
+ data = NULL;
|
||||
}
|
||||
|
||||
static guint
|
||||
@@ -1175,16 +1118,16 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
if (info->status != GNOME_VFS_XFER_PROGRESS_STATUS_OK ||
|
||||
((info->phase == GNOME_VFS_XFER_PHASE_COMPLETED) && (info->file_size == 0))) {
|
||||
GValue val = {0, };
|
||||
+
|
||||
rb_debug ("error on download");
|
||||
+
|
||||
g_value_init (&val, G_TYPE_ULONG);
|
||||
g_value_set_ulong (&val, RHYTHMDB_PODCAST_STATUS_ERROR);
|
||||
- GDK_THREADS_ENTER ();
|
||||
rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_STATUS, &val);
|
||||
rhythmdb_commit (data->pd->priv->db);
|
||||
- GDK_THREADS_LEAVE ();
|
||||
g_value_unset (&val);
|
||||
- end_job (data);
|
||||
- data = NULL;
|
||||
+
|
||||
+ g_idle_add ((GSourceFunc)end_job, data);
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_ABORT;
|
||||
}
|
||||
|
||||
@@ -1208,9 +1151,9 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
rb_debug ("download completed");
|
||||
data->total_size = info->file_size;
|
||||
write_job_data (data);
|
||||
+ } else {
|
||||
+ g_idle_add ((GSourceFunc)end_job, data);
|
||||
}
|
||||
- end_job (data);
|
||||
- data = NULL;
|
||||
return GNOME_VFS_XFER_ERROR_ACTION_SKIP;
|
||||
}
|
||||
|
||||
@@ -1226,7 +1169,6 @@ download_progress_cb (GnomeVFSXferProgre
|
||||
static guint
|
||||
download_progress_update_cb (GnomeVFSAsyncHandle *handle, GnomeVFSXferProgressInfo *info, gpointer cb_data)
|
||||
{
|
||||
-
|
||||
RBPodcastManagerInfo *data = (RBPodcastManagerInfo *) cb_data;
|
||||
|
||||
if (data == NULL) {
|
||||
@@ -1243,17 +1185,18 @@ download_progress_update_cb (GnomeVFSAsy
|
||||
if (local_progress != data->progress) {
|
||||
GValue val = {0,};
|
||||
|
||||
+ GDK_THREADS_ENTER ();
|
||||
+
|
||||
g_value_init (&val, G_TYPE_ULONG);
|
||||
g_value_set_ulong (&val, local_progress);
|
||||
rhythmdb_entry_set (data->pd->priv->db, data->entry, RHYTHMDB_PROP_STATUS, &val);
|
||||
g_value_unset (&val);
|
||||
|
||||
- GDK_THREADS_ENTER ();
|
||||
-
|
||||
g_signal_emit (data->pd, rb_podcast_manager_signals[STATUS_CHANGED],
|
||||
0, data->entry, local_progress);
|
||||
|
||||
GDK_THREADS_LEAVE ();
|
||||
+
|
||||
data->progress = local_progress;
|
||||
}
|
||||
}
|
||||
@@ -1368,8 +1311,6 @@ rb_podcast_manager_cancel_download (RBPo
|
||||
{
|
||||
GList *lst;
|
||||
|
||||
- g_mutex_lock (pd->priv->download_list_mutex);
|
||||
-
|
||||
lst = pd->priv->download_list;
|
||||
while (lst) {
|
||||
RBPodcastManagerInfo *data = (RBPodcastManagerInfo *) lst->data;
|
||||
@@ -1379,7 +1320,6 @@ rb_podcast_manager_cancel_download (RBPo
|
||||
}
|
||||
lst = lst->next;
|
||||
}
|
||||
- g_mutex_unlock (pd->priv->download_list_mutex);
|
||||
|
||||
if (lst)
|
||||
cancel_job (lst->data);
|
||||
|
29
audio/rhythmbox/files/patch-rhythmdb_rhythmdb.c
Normal file
29
audio/rhythmbox/files/patch-rhythmdb_rhythmdb.c
Normal file
@ -0,0 +1,29 @@
|
||||
--- rhythmdb/rhythmdb.c.orig Sun Nov 19 12:40:07 2006
|
||||
+++ rhythmdb/rhythmdb.c Sun Nov 19 12:40:26 2006
|
||||
@@ -2817,7 +2817,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
if (entry->last_played == 0) {
|
||||
new = rb_refstring_new (never);
|
||||
} else {
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->last_played));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->last_played));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
}
|
||||
@@ -2840,7 +2840,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
break;
|
||||
|
||||
old = g_atomic_pointer_get (&entry->first_seen_str);
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->first_seen));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->first_seen));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
|
||||
@@ -2864,7 +2864,7 @@ rhythmdb_entry_sync_mirrored (RhythmDBEn
|
||||
old = g_atomic_pointer_get (&entry->last_seen_str);
|
||||
/* only store last seen time as a string for hidden entries */
|
||||
if (entry->flags & RHYTHMDB_ENTRY_HIDDEN) {
|
||||
- val = eel_strdup_strftime (format, localtime ((glong*)&entry->last_seen));
|
||||
+ val = eel_strdup_strftime (format, localtime ((time_t*)&entry->last_seen));
|
||||
new = rb_refstring_new (val);
|
||||
g_free (val);
|
||||
} else {
|
51
audio/rhythmbox/files/patch-sources_rb-ipod-source.c
Normal file
51
audio/rhythmbox/files/patch-sources_rb-ipod-source.c
Normal file
@ -0,0 +1,51 @@
|
||||
--- sources/rb-ipod-source.c.orig Sun Nov 19 12:12:33 2006
|
||||
+++ sources/rb-ipod-source.c Sun Nov 19 12:28:50 2006
|
||||
@@ -695,33 +695,36 @@ hal_udi_is_ipod (const char *udi)
|
||||
char *spider_udi;
|
||||
int vnd_id = 0;
|
||||
int product_id = 0;
|
||||
+ DBusError phone_error;
|
||||
+
|
||||
+ dbus_error_init (&phone_error);
|
||||
|
||||
spider_udi = g_strdup(parent_udi);
|
||||
while (vnd_id == 0 && product_id == 0 && spider_udi != NULL) {
|
||||
char *old_udi = spider_udi;
|
||||
spider_udi = libhal_device_get_property_string (ctx, spider_udi,
|
||||
- "info.parent", &error);
|
||||
- if (dbus_error_is_set (&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "info.parent", &phone_error);
|
||||
+ if (dbus_error_is_set (&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
spider_udi = NULL;
|
||||
break;
|
||||
}
|
||||
g_free(old_udi);
|
||||
|
||||
vnd_id = libhal_device_get_property_int (ctx, spider_udi,
|
||||
- "usb.vendor_id", &error);
|
||||
- if (dbus_error_is_set(&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "usb.vendor_id", &phone_error);
|
||||
+ if (dbus_error_is_set(&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
vnd_id = 0;
|
||||
}
|
||||
|
||||
product_id = libhal_device_get_property_int (ctx, spider_udi,
|
||||
- "usb.product_id", &error);
|
||||
- if (dbus_error_is_set(&error)) {
|
||||
- dbus_error_free (&error);
|
||||
- dbus_error_init (&error);
|
||||
+ "usb.product_id", &phone_error);
|
||||
+ if (dbus_error_is_set(&phone_error)) {
|
||||
+ dbus_error_free (&phone_error);
|
||||
+ dbus_error_init (&phone_error);
|
||||
product_id = 0;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user