commit 319ac5263b2d8571568fc7a42ced515c62b0577a
Author: phantomjinx <[email protected]>
Date: Sun Feb 6 17:21:56 2011 +0000
Tidy up and fix the converter
* Fixes perceived deadlock when saving files that need converting.
Conversion scheduler being killed by a return value of FALSE. My mistake!!
* file_convert.c
* Collect up all lock/unlock calls into 2 functions so easier to debug
* When trying the mutex in converter_scheduler, avoid returning FALSE since
this kills the timeout function, which in turn leaves the saving in an
infinite loop as the converted tracks cannot be moved into the finished
list.
* file_itunesdb.c
* Improve the status messages
* core_prefs.c
* gtkpod.glade
* Get the conversion log to display if converting
* playlist_display_action.c
* file.c
* Improve the incremental saving routines when adding files
data/glade/gtkpod.glade | 83 +------
libgtkpod/file.c | 71 +++--
libgtkpod/file_convert.c | 289 ++++++++++---------
libgtkpod/file_itunesdb.c | 8 +-
plugins/core_preferences/core_prefs.c | 3 +-
.../playlist_display/playlist_display_actions.c | 7 +-
6 files changed, 212 insertions(+), 249 deletions(-)
---
diff --git a/data/glade/gtkpod.glade b/data/glade/gtkpod.glade
index 18a2ef9..cd3dae3 100644
--- a/data/glade/gtkpod.glade
+++ b/data/glade/gtkpod.glade
@@ -4,12 +4,12 @@
<!-- interface-naming-policy toplevel-contextual -->
<widget class="GtkDialog" id="confirm_dialog">
<property name="border_width">6</property>
- <property name="title"></property>
<property name="type_hint">dialog</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<widget class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<property name="spacing">1</property>
<child>
<widget class="GtkHBox" id="hbox169">
@@ -34,6 +34,7 @@
<child>
<widget class="GtkVBox" id="vbox6">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<widget class="GtkLabel" id="label">
@@ -80,6 +81,7 @@
<child>
<widget class="GtkVBox" id="option_vbox">
<property name="visible">True</property>
+ <property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
@@ -583,7 +585,6 @@ Ignore rules</property>
<widget class="GtkDialog" id="input_box">
<property name="events">GDK_POINTER_MOTION_MASK |
GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK</property>
<property name="border_width">5</property>
- <property name="title"></property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
@@ -711,82 +712,6 @@ The quick brown fox jumps over the lazy dog.</property>
</widget>
</child>
</widget>
- <widget class="GtkWindow" id="file_transfer_information_dialog">
- <property name="border_width">2</property>
- <property name="title" translatable="yes">Progress Information</property>
- <property name="skip_taskbar_hint">True</property>
- <child>
- <widget class="GtkVBox" id="vbox180">
- <property name="visible">True</property>
- <property name="border_width">5</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <widget class="GtkLabel" id="textlabel">
- <property name="visible">True</property>
- <property name="xalign">0</property>
- <property name="label">Some placeholder text to assure reasonable
size.</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <widget class="GtkProgressBar" id="progressbar">
- <property name="visible">True</property>
- <property name="pulse_step">0.10000000149</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <widget class="GtkHSeparator" id="hseparator59">
- <property name="visible">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <widget class="GtkHButtonBox" id="hbuttonbox17">
- <property name="visible">True</property>
- <child>
- <widget class="GtkButton" id="abortbutton">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="can_default">True</property>
- <property name="receives_default">False</property>
- <property name="tooltip" translatable="yes">Export can be
continued at a later time if canceled.</property>
- <property name="border_width">2</property>
- <property name="use_stock">True</property>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">4</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="GtkWindow" id="conversion_log">
<property name="border_width">4</property>
<property name="title" translatable="yes">Conversion Progress
Display</property>
@@ -800,6 +725,8 @@ The quick brown fox jumps over the lazy dog.</property>
<property name="visible">True</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">The output of the
background conversion scripts is copied below. Each page of the notebook
corresponds to one background thread.</property>
+ <property name="use_markup">True</property>
+ <property name="justify">center</property>
<property name="wrap">True</property>
</widget>
<packing>
diff --git a/libgtkpod/file.c b/libgtkpod/file.c
index c54b84c..2a49fcc 100644
--- a/libgtkpod/file.c
+++ b/libgtkpod/file.c
@@ -87,6 +87,14 @@ FileType *determine_filetype(const gchar *path) {
return type;
}
+static void save_if_needed(gint count, iTunesDB *itdb) {
+ /* save every 10 files but do at least 10 first*/
+ if (count >= 10 && count % 10 == 0) {
+ gp_save_itdb(itdb);
+ gtkpod_tracks_statusbar_update();
+ }
+}
+
/** check a filename against the "excludes file mask" from the preferences
* and return TRUE if it should be excluded based on the mask
*/
@@ -255,7 +263,7 @@ add_playlist_by_filename(iTunesDB *itdb, gchar *plfile,
Playlist *plitem, gint p
gtkpod_warning(_("Skipping '%s' to avoid adding playlist file
recursively\n"), filename);
}
else if (add_track_by_filename(itdb, filename, plitem,
prefs_get_int("add_recursively"), addtrackfunc, data)) {
- ++tracks;
+ save_if_needed(tracks, itdb);
}
g_free(filename);
}
@@ -278,57 +286,66 @@ add_playlist_by_filename(iTunesDB *itdb, gchar *plfile,
Playlist *plitem, gint p
* *
\*------------------------------------------------------------------*/
-/* Add all files in directory and subdirectories.
- If @name is a regular file, just add that.
- If @plitem != NULL, add tracks also to Playlist @plitem
- @descend: TRUE: add recursively
- FALSE: don't enter subdirectories */
-/* Not nice: the return value has not much meaning. TRUE: all files
- * were added successfully. FALSE: some files could not be
- added (e.g: duplicates) */
-/* @addtrackfunc: if != NULL this will be called instead of
- "add_track_to_playlist () -- used for dropping tracks at a specific
- position in the track view */
-gboolean add_directory_by_name(iTunesDB *itdb, gchar *name, Playlist *plitem,
gboolean descend, AddTrackFunc addtrackfunc, gpointer data) {
- gboolean result = TRUE;
- g_return_val_if_fail (itdb, FALSE);
- g_return_val_if_fail (name, FALSE);
+static gint add_directory_by_name_internal(iTunesDB *itdb, gchar *name,
Playlist *plitem, gboolean descend, gint *filecount, AddTrackFunc addtrackfunc,
gpointer data) {
+ gint result = 0;
+
+ g_return_val_if_fail (itdb, 0);
+ g_return_val_if_fail (name, 0);
if (g_file_test(name, G_FILE_TEST_IS_DIR)) {
GDir *dir = g_dir_open(name, 0, NULL);
block_widgets();
if (dir != NULL) {
G_CONST_RETURN gchar *next;
- gint count = 0;
do {
next = g_dir_read_name(dir);
if (next != NULL) {
gchar *nextfull = g_build_filename(name, next, NULL);
- if (descend || !g_file_test(nextfull, G_FILE_TEST_IS_DIR))
- result &= add_directory_by_name(itdb, nextfull,
plitem, descend, addtrackfunc, data);
+ if (descend || !g_file_test(nextfull, G_FILE_TEST_IS_DIR))
{
+ result += add_directory_by_name_internal(itdb,
nextfull, plitem, descend, filecount, addtrackfunc, data);
+ }
g_free(nextfull);
}
- count++;
- if (count == 10) { /* update and save every ten tracks added */
- gp_save_itdb(itdb);
- gtkpod_tracks_statusbar_update();
- count = 0;
- }
}
while (next != NULL);
- gp_save_itdb(itdb);
g_dir_close(dir);
}
release_widgets();
}
else {
- result = add_track_by_filename(itdb, name, plitem, descend,
addtrackfunc, data);
+ if (add_track_by_filename(itdb, name, plitem, descend, addtrackfunc,
data)) {
+ *filecount = *filecount + 1;
+ save_if_needed(*filecount, itdb);
+ }
+ result += *filecount;
}
return result;
}
+/*
+ * Add all files in directory and subdirectories.
+ *
+ * If @name is a regular file, just add that.
+ * If @plitem != NULL, add tracks also to Playlist @plitem
+ * @descend: TRUE: add recursively
+ * FALSE: don't enter subdirectories
+ * @addtrackfunc:
+ * if != NULL this will be called instead of
+ * "add_track_to_playlist () -- used for dropping
+ * tracks at a specific position in the track view
+ *
+ * return:
+ * value indicating number of added tracks.
+ */
+/* */
+gint add_directory_by_name(iTunesDB *itdb, gchar *name, Playlist *plitem,
gboolean descend, AddTrackFunc addtrackfunc, gpointer data) {
+ /* Uses internal method so that a count parameter can be added for saving
purposes. */
+ gint filecount = 0;
+ return add_directory_by_name_internal(itdb, name, plitem, descend,
&filecount, addtrackfunc, data);
+}
+
/*------------------------------------------------------------------*\
* *
* Fill in track struct with data from file *
diff --git a/libgtkpod/file_convert.c b/libgtkpod/file_convert.c
index 5f81ddb..adf9662 100644
--- a/libgtkpod/file_convert.c
+++ b/libgtkpod/file_convert.c
@@ -326,6 +326,16 @@ void file_convert_shutdown() {
/* in other words: not sure how we can shut this down... */
}
+static void file_convert_lock(Conversion *conv) {
+ debug ("Locking conversion");
+ g_mutex_lock(conv->mutex);
+}
+
+static void file_convert_unlock(Conversion *conv) {
+ debug("Unlocking conversion");
+ g_mutex_unlock(conv->mutex);
+}
+
/* This is called just before gtkpod closes down */
void file_convert_update_default_sizes() {
file_convert_init();
@@ -438,17 +448,17 @@ static void conversion_update_default_sizes(Conversion
*conv) {
g_return_if_fail (conv && conv->log_window);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
gtk_window_get_size(GTK_WINDOW (conv->log_window), &defx, &defy);
prefs_set_int(FILE_CONVERT_LOG_SIZE_X, defx);
prefs_set_int(FILE_CONVERT_LOG_SIZE_Y, defy);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* used to show/hide the log window and adjust the View->menu
- items. g_mutex_lock(conv->mutex) before calling. Used in
+ items. file_convert_lock(conv) before calling. Used in
conversion_log_window_delete() and conversion_prefs_changed(). */
static void conversion_display_hide_log_window(Conversion *conv) {
/* show display log if it was previously hidden and should be
@@ -479,19 +489,19 @@ static void conversion_display_hide_log_window(Conversion
*conv) {
static gboolean conversion_log_window_delete(Conversion *conv) {
g_return_val_if_fail (conv, TRUE);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
prefs_set_int(FILE_CONVERT_DISPLAY_LOG, FALSE);
conversion_display_hide_log_window(conv);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return TRUE; /* don't close window -- it will be hidden instead by
* conversion_display_hid_log_window() */
}
/* set the labels of the notebook of the log window. If required
- * 'g_mutex_lock (conv->mutex)' before calling this function. */
+ * 'file_convert_lock(conv)' before calling this function. */
static void conversion_log_set_status(Conversion *conv) {
GList *glpage, *glthread;
gchar *buf;
@@ -536,7 +546,7 @@ static void conversion_log_set_status(Conversion *conv) {
}
/* adds pages to the notebook if the number of pages is less than the
- * number of threads. If required 'g_mutex_lock (conv->mutex)' before
+ * number of threads. If required 'file_convert_lock(conv)' before
* calling this function. */
static void conversion_log_add_pages(Conversion *conv, gint threads) {
g_return_if_fail (conv);
@@ -567,7 +577,7 @@ static void conversion_prefs_changed(Conversion *conv) {
g_return_if_fail (conv);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (prefs_get_double_value(FILE_CONVERT_MAXDIRSIZE, &maxsize)) {
conv->max_dirsize = 1024 * 1024 * 1024 * maxsize;
@@ -608,7 +618,7 @@ static void conversion_prefs_changed(Conversion *conv) {
for (gl = conv->transfer_itdbs; gl; gl = gl->next) {
TransferItdb *tri = gl->data;
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
tri->transfer = background_transfer;
@@ -616,7 +626,7 @@ static void conversion_prefs_changed(Conversion *conv) {
conversion_display_hide_log_window(conv);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* Reorder the scheduled list so that tracks in @itdb are converted first */
@@ -628,13 +638,13 @@ static void conversion_itdb_first(Conversion *conv,
iTunesDB *itdb) {
g_return_if_fail (conv);
g_return_if_fail (itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
/* start from the end to keep the same order overall (we're
prepending to the list for performance reasons */
for (gl = g_list_last(conv->scheduled); gl; gl = gl->prev) {
ConvTrack *ctr = gl->data;
if (!ctr || !ctr->track) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
g_return_if_fail (ctr);
@@ -648,11 +658,11 @@ static void conversion_itdb_first(Conversion *conv,
iTunesDB *itdb) {
}
g_list_free(conv->scheduled);
conv->scheduled = g_list_concat(gl_other, gl_itdb);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* adds @text to the textview on page @threadnum of the log window. If
- * required 'g_mutex_lock (conv->mutex)' before calling this
+ * required 'file_convert_lock(conv)' before calling this
* function. */
static void conversion_log_append(Conversion *conv, const gchar *text, gint
threadnum) {
GtkWidget *textview;
@@ -806,7 +816,7 @@ static void conversion_cancel_itdb(Conversion *conv,
iTunesDB *itdb) {
g_return_if_fail (conv);
g_return_if_fail (itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
g_list_foreach(conv->scheduled, conversion_cancel_itdb_fe, itdb);
g_list_foreach(conv->processing, conversion_cancel_itdb_fe, itdb);
@@ -821,7 +831,7 @@ static void conversion_cancel_itdb(Conversion *conv,
iTunesDB *itdb) {
conversion_cancel_itdb_sub(&itr->failed, TRUE);
itr->valid = FALSE;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* called by conversion_cancel_track to mark nodes invalid that refer
@@ -866,7 +876,7 @@ static void conversion_cancel_track(Conversion *conv, Track
*track) {
g_return_if_fail (conv);
g_return_if_fail (track);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conversion_cancel_track_sub(&conv->scheduled, track, FALSE);
conversion_cancel_track_sub(&conv->processing, track, FALSE);
@@ -881,7 +891,7 @@ static void conversion_cancel_track(Conversion *conv, Track
*track) {
conversion_cancel_track_sub(&itr->finished, track, TRUE);
conversion_cancel_track_sub(&itr->failed, track, TRUE);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* Force the conversion process to continue even if the allocated
@@ -889,12 +899,12 @@ static void conversion_cancel_track(Conversion *conv,
Track *track) {
static void conversion_continue(Conversion *conv) {
g_return_if_fail (conv);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (conv->threads_num == 0) { /* make sure at least one conversion is
started even if
directory is full */
conv->conversion_force = TRUE;
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* Add @track to the list of tracks to be converted if conversion is
@@ -952,9 +962,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
etr->conversion_status = FILE_CONVERT_FAILED;
/* add to failed list */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->failed = g_list_prepend(conv->failed, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("added track to failed %p\n", track);
return FALSE;
}
@@ -968,9 +978,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
etr->conversion_status = FILE_CONVERT_FAILED;
/* add to failed list */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->failed = g_list_prepend(conv->failed, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("added track to failed %p\n", track);
return FALSE;
}
@@ -980,9 +990,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
/* we don't convert these (yet) */
etr->conversion_status = FILE_CONVERT_INACTIVE;
/* add to finished */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->finished = g_list_prepend(conv->finished, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("added track to finished %p\n", track);
return TRUE;
}
@@ -997,18 +1007,18 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
if (convert) {
gchar *template;
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
template = g_strdup(conv->template);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
ctr->fname_root = get_string_from_template(track, template, TRUE,
TRUE);
ctr->fname_extension = conversion_get_fname_extension(NULL, ctr);
if (ctr->fname_extension) {
etr->conversion_status = FILE_CONVERT_SCHEDULED;
/* add to scheduled list */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->scheduled = g_list_prepend(conv->scheduled, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = TRUE;
debug ("added track %p\n", track);
@@ -1026,9 +1036,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
else
etr->conversion_status = FILE_CONVERT_FAILED;
/* add to failed list */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->failed = g_list_prepend(conv->failed, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = FALSE;
debug ("added track to failed %p\n", track);
}
@@ -1042,9 +1052,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
etr->conversion_status = FILE_CONVERT_REQUIRED;
/* add to failed list */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->failed = g_list_prepend(conv->failed, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = FALSE;
debug ("added track to failed %p\n", track);
}
@@ -1056,9 +1066,9 @@ static gboolean conversion_add_track(Conversion *conv,
Track *track) {
g_free(ctr->converted_file);
ctr->converted_file = NULL;
/* add to finished */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->finished = g_list_prepend(conv->finished, ctr);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("added track to finished %p\n", track);
}
g_free(conversion_cmd);
@@ -1124,7 +1134,7 @@ static gchar *conversion_get_track_info(ConvTrack *ctr) {
static gboolean conversion_setup_cachedir(Conversion *conv) {
g_return_val_if_fail (conv, FALSE);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
g_free(conv->cachedir);
conv->cachedir = NULL;
@@ -1150,7 +1160,7 @@ static gboolean conversion_setup_cachedir(Conversion
*conv) {
prefs_set_string(FILE_CONVERT_CACHEDIR, conv->cachedir);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
if (conv->cachedir)
return TRUE;
@@ -1177,8 +1187,13 @@ static void conversion_free_resources(ConvTrack *ctr) {
}
}
-/* the scheduler code without the locking mechanism -- has to be
- called with conv->mutex locked */
+/*
+ * The scheduler code without the locking mechanism -- has to be
+ * called with conv->mutex locked.
+ *
+ * Should always return TRUE to avoid killing the timeout function.
+ * If the timeout function dies then saving itdb will produce a deadlock.
+ */
static gboolean conversion_scheduler_unlocked(Conversion *conv) {
GList *gli, *nextgli;
@@ -1186,8 +1201,8 @@ static gboolean conversion_scheduler_unlocked(Conversion
*conv) {
debug("Conversion scheduler unlocked\n");
if (!conv->cachedir) {
- /* Cachedir is not available. Not good! Remove the timeout function. */
- g_return_val_if_reached (FALSE);
+ /* Cachedir is not available. Not good! */
+ g_return_val_if_reached (TRUE);
}
if (conv->dirsize == CONV_DIRSIZE_INVALID) { /* dirsize has not been set
up. Wait until that has been done. */
@@ -1489,15 +1504,16 @@ static gboolean conversion_scheduler(gpointer data) {
gdk_threads_enter();
if (!g_mutex_trylock(conv->mutex)) {
gdk_threads_leave();
- return FALSE;
+ /* Do not destroy the timeout function by returning FALSE */
+ return TRUE;
}
result = conversion_scheduler_unlocked(conv);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
gdk_threads_leave();
-// debug ("conversion_scheduler exit\n");
+ debug ("conversion_scheduler exit\n");
return result;
}
@@ -1512,17 +1528,17 @@ static gpointer conversion_update_dirsize(gpointer
data) {
debug ("%p update_dirsize enter\n", g_thread_self ());
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (conv->dirsize_in_progress) { /* another thread is already working on
the directory
size. We'll wait until it has finished and just return. */
g_cond_wait (conv->dirsize_cond, conv->mutex);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p update_dirsize concurrent exit\n", g_thread_self ());
return NULL;
}
conv->dirsize_in_progress = TRUE;
dir = g_strdup(conv->cachedir);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
if (dir) {
debug ("%p update_dirsize getting size of dir (%s)\n",
@@ -1533,7 +1549,7 @@ static gpointer conversion_update_dirsize(gpointer data) {
dir = NULL;
}
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
/* Even in case of an error get_size_of_directory() will return
0. This means setting the dirsize here will not block the
conversion process even if there is a problem determining the
@@ -1543,7 +1559,7 @@ static gpointer conversion_update_dirsize(gpointer data) {
broadcast to all threads waiting to wake them up. */
conv->dirsize_in_progress = FALSE;
g_cond_broadcast (conv->dirsize_cond);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p update_dirsize exit\n", g_thread_self ());
return NULL;
@@ -1638,16 +1654,16 @@ static gpointer conversion_prune_dir(gpointer data) {
debug ("%p prune_dir enter\n", g_thread_self ());
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (conv->prune_in_progress) { /* another thread is already working on the
directory
prune. We'll wait until it has finished and just return. */
g_cond_wait (conv->prune_cond, conv->mutex);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return NULL;
}
conv->prune_in_progress = TRUE;
dir = g_strdup(conv->cachedir);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
if (dir) {
GHashTable *hash_needed_files;
@@ -1663,7 +1679,7 @@ static gpointer conversion_prune_dir(gpointer data) {
/* make a hash of all the files still needed */
hash_needed_files = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, NULL);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
/* add needed files to hash */
conversion_prune_needed_add(hash_needed_files, conv->scheduled);
@@ -1674,14 +1690,14 @@ static gpointer conversion_prune_dir(gpointer data) {
TransferItdb *tri = gl->data;
g_return_val_if_fail (tri, (conv->prune_in_progress = FALSE,
g_cond_broadcast (conv->prune_cond),
- g_mutex_unlock(conv->mutex),
+ file_convert_unlock(conv),
NULL));
conversion_prune_needed_add(hash_needed_files, tri->scheduled);
conversion_prune_needed_add(hash_needed_files, tri->processing);
conversion_prune_needed_add(hash_needed_files, tri->failed);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
/* sort the list so that the oldest files are first */
files = g_list_sort(files, conversion_prune_compfunc);
@@ -1689,10 +1705,10 @@ static gpointer conversion_prune_dir(gpointer data) {
/* get an up-to-date count of the directory size */
conversion_update_dirsize(conv);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
dirsize = conv->dirsize;
maxsize = conv->max_dirsize;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p prune_dir removing files (%lld/%lld)\n",
g_thread_self (), (long long int)dirsize, (long long
int)maxsize);
@@ -1726,10 +1742,10 @@ static gpointer conversion_prune_dir(gpointer data) {
dir = NULL;
}
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
conv->prune_in_progress = FALSE;
g_cond_broadcast (conv->prune_cond);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p prune_dir exit\n", g_thread_self ());
@@ -1754,10 +1770,10 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
/* get filename extension */
if (conv)
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
argv = build_argv_from_strings(ctr->conversion_cmd, "-x", NULL);
if (conv)
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = g_spawn_sync(NULL, /* working dir */
argv, /* argv */
@@ -1769,7 +1785,7 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
if (result == FALSE) {
if (conv)
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->valid) {
gchar *buf = conversion_get_track_info(ctr);
ctr->errormessage = g_strdup_printf(_("Conversion of '%s' failed:
'%s'.\n\n"), buf, error->message);
@@ -1777,13 +1793,13 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
g_free(buf);
}
if (conv)
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_error_free(error);
}
else if (
WEXITSTATUS (exit_status) != 0) {
if (conv)
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->valid) {
gchar *buf = conversion_get_track_info(ctr);
ctr->errormessage
@@ -1793,7 +1809,7 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
g_free(buf);
}
if (conv)
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = FALSE;
}
@@ -1809,7 +1825,7 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
if (!fname_extension || (strlen(fname_extension) == 0)) { /* no a valid
filename extension */
if (conv)
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->valid) {
gchar *buf = conversion_get_track_info(ctr);
ctr->errormessage
@@ -1818,7 +1834,7 @@ static gchar *conversion_get_fname_extension(Conversion
*conv, ConvTrack *ctr) {
g_free(buf);
}
if (conv)
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
result = FALSE;
}
@@ -1848,7 +1864,7 @@ static gboolean conversion_set_valid_filename(Conversion
*conv, ConvTrack *ctr)
g_return_val_if_fail (conv, FALSE);
g_return_val_if_fail (ctr, FALSE);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->valid) {
gint i;
gchar *rootdir;
@@ -1868,7 +1884,7 @@ static gboolean conversion_set_valid_filename(Conversion
*conv, ConvTrack *ctr)
if (stat(ctr->orig_file, &orig_stat) == 0) {
if (conv_stat.st_mtime > orig_stat.st_mtime) { /*
converted file is newer than
* original file */
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return TRUE;
}
else { /* converted file is older than original
file */
@@ -1881,7 +1897,7 @@ static gboolean conversion_set_valid_filename(Conversion
*conv, ConvTrack *ctr)
= g_strdup_printf(_("Conversion of '%s'
failed: Could not access original file '%s' (%s).\n\n"), buf, ctr->orig_file,
strerror(errno));
debug("Conversion error: %s\n", ctr->errormessage);
g_free(buf);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return FALSE;
}
}
@@ -1898,13 +1914,13 @@ static gboolean
conversion_set_valid_filename(Conversion *conv, ConvTrack *ctr)
}
if (!conv->cachedir) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_val_if_reached (FALSE);
}
basename = g_build_filename(conv->cachedir, ctr->fname_root, NULL);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
i = 0;
do {
@@ -1916,7 +1932,7 @@ static gboolean conversion_set_valid_filename(Conversion
*conv, ConvTrack *ctr)
rootdir = g_path_get_dirname(fname);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
result = mkdirhier(rootdir, TRUE);
if (result == FALSE) {
if (ctr->valid) {
@@ -1934,7 +1950,7 @@ static gboolean conversion_set_valid_filename(Conversion
*conv, ConvTrack *ctr)
g_free(rootdir);
g_free(fname);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return result;
}
@@ -1969,11 +1985,11 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
return FALSE;
}
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->converted_file && ctr->valid) {
if (g_file_test(ctr->converted_file, G_FILE_TEST_EXISTS)) { /* a valid
converted file already exists. */
result = TRUE;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
else { /* start conversion */
gchar **argv;
@@ -2016,11 +2032,11 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
g_io_channel_set_flags(ctr->gio_channel, G_IO_FLAG_NONBLOCK,
NULL);
g_io_channel_set_close_on_unref(ctr->gio_channel, TRUE);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
waitpid(child_pid, &status, 0);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
ctr->pid = 0;
@@ -2051,12 +2067,12 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
result = FALSE;
}
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
}
if (result == TRUE) { /* determine size of new file */
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
struct stat statbuf;
if (g_stat(ctr->converted_file, &statbuf) == 0) {
ctr->converted_size = statbuf.st_size;
@@ -2071,7 +2087,7 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
ctr->converted_file = NULL;
result = FALSE;
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* Fill in additional info (currently only gapless info for MP3s */
@@ -2081,7 +2097,7 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
filetype = determine_filetype(ctr->converted_file);
if (filetype) {
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
track = gp_track_new();
retval = filetype_read_gapless(filetype, ctr->converted_file,
track);
@@ -2094,7 +2110,7 @@ static gboolean conversion_convert_track(Conversion
*conv, ConvTrack *ctr) {
}
itdb_track_free(track);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
}
@@ -2115,7 +2131,7 @@ static gpointer conversion_thread(gpointer data) {
g_return_val_if_fail (conv, NULL);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
debug ("%p thread entered\n", g_thread_self ());
@@ -2128,10 +2144,10 @@ static gpointer conversion_thread(gpointer data) {
/* remove first scheduled entry and add it to processing */
gl = g_list_last(conv->scheduled);
- g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (gl, (file_convert_unlock(conv), NULL));
ctr = gl->data;
conv->scheduled = g_list_remove_link(conv->scheduled, gl);
- g_return_val_if_fail (ctr, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (ctr, (file_convert_unlock(conv), NULL));
if (ctr->valid) { /* attach to processing queue */
conv->processing = g_list_concat(gl, conv->processing);
/* indicate thread number processing this track */
@@ -2148,7 +2164,7 @@ static gpointer conversion_thread(gpointer data) {
conv->conversion_force = FALSE;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p thread converting\n", g_thread_self ());
@@ -2160,11 +2176,11 @@ static gpointer conversion_thread(gpointer data) {
conversion_ok,
ctr->converted_file);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
/* remove from processing queue */
gl = g_list_find(conv->processing, ctr);
- g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (gl, (file_convert_unlock(conv), NULL));
conv->processing = g_list_remove_link(conv->processing, gl);
if (ctr->valid) { /* track is still valid */
@@ -2185,12 +2201,12 @@ static gpointer conversion_thread(gpointer data) {
conversion_convtrack_free(ctr);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
/* clean up directory and recalculate dirsize */
conversion_prune_dir(conv);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
}
while (((conv->dirsize <= conv->max_dirsize) ||
conv->conversion_force) && (conv->threads_num
@@ -2214,7 +2230,7 @@ static gpointer conversion_thread(gpointer data) {
/* reduce count of running threads */
--conv->threads_num;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p thread exit\n", g_thread_self ());
@@ -2249,15 +2265,14 @@ static FileTransferStatus
transfer_get_status(Conversion *conv, iTunesDB *itdb,
g_return_val_if_fail (conv && itdb, -1);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
- g_return_val_if_fail (tri, (g_mutex_unlock (conv->mutex), -1));
+ g_return_val_if_fail (tri, (file_convert_unlock(conv), -1));
status = tri->status;
if (to_convert_num) {
- *to_convert_num = transfer_get_status_count(itdb, conv->scheduled)
- + transfer_get_status_count(itdb, conv->processing);
+ *to_convert_num = transfer_get_status_count(itdb, conv->scheduled);
}
if (converting_num) {
@@ -2277,7 +2292,7 @@ static FileTransferStatus transfer_get_status(Conversion
*conv, iTunesDB *itdb,
for (gl = tri->finished; gl; gl = gl->next) {
ConvTrack *ctr = gl->data;
- g_return_val_if_fail (ctr, (g_mutex_unlock (conv->mutex), -1));
+ g_return_val_if_fail (ctr, (file_convert_unlock(conv), -1));
if (ctr->valid) {
if (ctr->track->transferred)
@@ -2297,7 +2312,7 @@ static FileTransferStatus transfer_get_status(Conversion
*conv, iTunesDB *itdb,
}
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return status;
}
@@ -2312,11 +2327,11 @@ static void transfer_ack_itdb(Conversion *conv,
iTunesDB *itdb) {
g_return_if_fail (conv && itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
@@ -2327,7 +2342,7 @@ static void transfer_ack_itdb(Conversion *conv, iTunesDB
*itdb) {
for (gl = tri->finished; gl; gl = gl->next) {
ConvTrack *ctr = gl->data;
if (!ctr) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
conversion_convtrack_free(ctr);
@@ -2335,7 +2350,7 @@ static void transfer_ack_itdb(Conversion *conv, iTunesDB
*itdb) {
g_list_free(tri->finished);
tri->finished = NULL;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* Get a list of all failed tracks. Examine etr->conversion_status to
@@ -2350,17 +2365,17 @@ static GList *transfer_get_failed_tracks(Conversion
*conv, iTunesDB *itdb) {
g_return_val_if_fail (conv && itdb, NULL);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
- g_return_val_if_fail (tri, (g_mutex_unlock (conv->mutex), NULL));
+ g_return_val_if_fail (tri, (file_convert_unlock(conv), NULL));
/* Make sure all failed tracks are forwarded to tri->finished */
conversion_scheduler_unlocked(conv);
for (gl = tri->finished; gl; gl = gl->next) {
ConvTrack *ctr = gl->data;
- g_return_val_if_fail (ctr, (g_mutex_unlock (conv->mutex), NULL));
+ g_return_val_if_fail (ctr, (file_convert_unlock(conv), NULL));
if (ctr->valid) {
if (!ctr->dest_filename) {
@@ -2369,7 +2384,7 @@ static GList *transfer_get_failed_tracks(Conversion
*conv, iTunesDB *itdb) {
}
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return tracks;
}
@@ -2381,11 +2396,11 @@ static void transfer_reschedule(Conversion *conv,
iTunesDB *itdb) {
g_return_if_fail (conv && itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
@@ -2398,7 +2413,7 @@ static void transfer_reschedule(Conversion *conv,
iTunesDB *itdb) {
ConvTrack *ctr = gl->data;
next = gl->next;
if (!ctr) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
@@ -2406,7 +2421,7 @@ static void transfer_reschedule(Conversion *conv,
iTunesDB *itdb) {
if (!ctr->dest_filename) {
ExtraTrackData *etr;
if (!ctr->track || !ctr->track->userdata) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
etr = ctr->track->userdata;
@@ -2428,7 +2443,7 @@ static void transfer_reschedule(Conversion *conv,
iTunesDB *itdb) {
}
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
/* reschedule all failed conversion tracks */
for (gl = tracks; gl; gl = gl->next) {
@@ -2447,11 +2462,11 @@ static void transfer_continue(Conversion *conv,
iTunesDB *itdb) {
g_return_if_fail (conv && itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
@@ -2465,7 +2480,7 @@ static void transfer_continue(Conversion *conv, iTunesDB
*itdb) {
if (conv->threads_num == 0)
conv->conversion_force = TRUE;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* set the tri->transfer flag to TRUE */
@@ -2477,18 +2492,18 @@ static void transfer_activate(Conversion *conv,
iTunesDB *itdb, gboolean active)
// Initialise Conversion infrastructure is not already initialised.
file_convert_init();
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
/* signal to continue transfer even if disk was full previously */
tri->transfer = active;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* set the tri->transfer flag to whatever the preferences settings are */
@@ -2497,18 +2512,18 @@ static void transfer_reset(Conversion *conv, iTunesDB
*itdb) {
g_return_if_fail (conv && itdb);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
tri = transfer_get_tri(conv, itdb);
if (!tri) {
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_if_reached ();
}
/* signal to continue transfer even if disk was full previously */
tri->transfer = prefs_get_int(FILE_CONVERT_BACKGROUND_TRANSFER);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
}
/* You must free the GLists before calling this function. */
@@ -2576,12 +2591,12 @@ static TransferItdb *transfer_get_tri(Conversion *conv,
iTunesDB *itdb) {
static gpointer transfer_force_prune_dir(gpointer data) {
Conversion *conv = data;
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (conv->prune_in_progress) { /* wait until current prune process is
finished before calling
conversion_prune_dir() again */
if (conv->force_prune_in_progress) { /* we already have another
process waiting */
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return NULL;
}
conv->force_prune_in_progress = TRUE;
@@ -2589,7 +2604,7 @@ static gpointer transfer_force_prune_dir(gpointer data) {
conv->force_prune_in_progress = FALSE;
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return conversion_prune_dir(conv);
}
@@ -2614,7 +2629,7 @@ static FileTransferStatus
transfer_transfer_track(TransferItdb *tri, ConvTrack *
conv = tri->conv;
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (ctr->converted_file) {
source_file = ctr->converted_file;
@@ -2625,7 +2640,7 @@ static FileTransferStatus
transfer_transfer_track(TransferItdb *tri, ConvTrack *
mountpoint = g_strdup(ctr->mountpoint);
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
g_return_val_if_fail (source_file && mountpoint, FALSE);
@@ -2633,19 +2648,19 @@ static FileTransferStatus
transfer_transfer_track(TransferItdb *tri, ConvTrack *
/* an error occurred */
if (!dest_file) {
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (error) {
ctr->errormessage = g_strdup_printf("%s\n", error->message);
debug("Conversion error: %s\n", ctr->errormessage);
g_error_free(error);
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
return result;
}
copy_success = itdb_cp(source_file, dest_file, &error);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
if (!copy_success) {
if (error && (error->code == G_FILE_ERROR_NOSPC)) { /* no space left
on device */
@@ -2675,7 +2690,7 @@ static FileTransferStatus
transfer_transfer_track(TransferItdb *tri, ConvTrack *
}
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
if (dest_file) { /* unsuccessful -- remove destination file if exists */
if (g_file_test(dest_file, G_FILE_TEST_EXISTS)) {
@@ -2696,7 +2711,7 @@ static gpointer transfer_thread(gpointer data) {
g_return_val_if_fail (tri && tri->conv, NULL);
conv = tri->conv;
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
debug ("%p transfer thread enter\n", tri->itdb);
@@ -2710,11 +2725,11 @@ static gpointer transfer_thread(gpointer data) {
/* remove first scheduled entry and add it to processing */
gl = g_list_last(tri->scheduled);
- g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (gl, (file_convert_unlock(conv), NULL));
ctr = gl->data;
tri->scheduled = g_list_remove_link(tri->scheduled, gl);
- g_return_val_if_fail (ctr, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (ctr, (file_convert_unlock(conv), NULL));
if (tri->valid && ctr->valid) { /* attach to processing queue */
tri->processing = g_list_concat(gl, tri->processing);
/* indicate thread number processing this track */
@@ -2728,7 +2743,7 @@ static gpointer transfer_thread(gpointer data) {
continue;
}
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p thread transfer\n", ctr->itdb);
@@ -2739,11 +2754,11 @@ static gpointer transfer_thread(gpointer data) {
status,
ctr->dest_filename);
- g_mutex_lock (conv->mutex);
+ file_convert_lock(conv);
/* remove from processing queue */
gl = g_list_find(tri->processing, ctr);
- g_return_val_if_fail (gl, (g_mutex_unlock(conv->mutex), NULL));
+ g_return_val_if_fail (gl, (file_convert_unlock(conv), NULL));
tri->processing = g_list_remove_link(tri->processing, gl);
if (ctr->valid) { /* track is still valid */
@@ -2782,7 +2797,7 @@ static gpointer transfer_thread(gpointer data) {
if (tri->status != FILE_TRANSFER_DISK_FULL)
tri->status = FILE_TRANSFER_IDLE;
- g_mutex_unlock (conv->mutex);
+ file_convert_unlock(conv);
debug ("%p transfer thread exit\n", tri->itdb);
diff --git a/libgtkpod/file_itunesdb.c b/libgtkpod/file_itunesdb.c
index 29e7445..710a918 100644
--- a/libgtkpod/file_itunesdb.c
+++ b/libgtkpod/file_itunesdb.c
@@ -1477,18 +1477,18 @@ static gboolean transfer_tracks(iTunesDB *itdb,
TransferData *td) {
= file_transfer_get_status(itdb, &to_convert_num,
&converting_num, &to_transfer_num, &transferred_num, &failed_num);
if (to_transfer_num > 0) {
- buf = g_strdup_printf(_("Copying track"));
+ buf = g_strdup_printf(_("Saving: waiting for %d tracks to be
copied"), to_transfer_num);
}
else {
if ((to_convert_num + converting_num) > 0) {
- buf = g_strdup_printf(_("Waiting for conversion to complete"));
+ buf = g_strdup_printf(_("Saving: waiting for %d tracks to
convert"), (to_convert_num + converting_num));
}
else {
- buf = g_strdup_printf(_("Finished transfer"));
+ buf = g_strdup_printf(_("Saving: finished track transfer"));
}
}
- td->current_progress = set_progress(start, to_convert_num +
to_transfer_num + failed_num + transferred_num, transferred_num
+ td->current_progress = set_progress(start, to_convert_num +
converting_num + to_transfer_num + failed_num + transferred_num, transferred_num
+ failed_num, transferred_init, td->current_progress,
buf);
if ((to_convert_num != 0) && (converting_num == 0)) { /* Force the
conversion to continue. Not sure if this scenario
diff --git a/plugins/core_preferences/core_prefs.c
b/plugins/core_preferences/core_prefs.c
index 530cfdd..aa03ee6 100644
--- a/plugins/core_preferences/core_prefs.c
+++ b/plugins/core_preferences/core_prefs.c
@@ -93,7 +93,8 @@ const gchar *conv_checkbox_map[][3] =
{ "convert_mp3", "convert_mp3", NULL },
{ "convert_aac", "convert_m4a", NULL },
{ "convert_wav", "convert_wav", NULL },
- { "display_conversion_log", "", NULL }, };
+ { "display_conversion_log", "file_convert_display_log", NULL }
+ };
ind_string tag_checkbox_map[] =
{
diff --git a/plugins/playlist_display/playlist_display_actions.c
b/plugins/playlist_display/playlist_display_actions.c
index 5387c41..6895f26 100644
--- a/plugins/playlist_display/playlist_display_actions.c
+++ b/plugins/playlist_display/playlist_display_actions.c
@@ -60,6 +60,8 @@ static void add_selected_dirs(GSList *names, Playlist
*db_active_pl) {
&= add_directory_by_name(db_active_pl->itdb,
currentnode->data, db_active_pl, prefs_get_int("add_recursively"), NULL, NULL);
}
+ /* Final save of itdb */
+ gp_save_itdb(db_active_pl->itdb);
/* clear log of non-updated tracks */
display_non_updated((void *) -1, NULL);
/* display log of updated tracks */
@@ -247,13 +249,14 @@ static void fileselection_add_files(GSList* names,
Playlist *playlist) {
result
&= add_track_by_filename(playlist->itdb, gsl->data, playlist,
prefs_get_int("add_recursively"), NULL, NULL);
count++;
- if (count == 10) { /* update and save every ten tracks added */
+ if (count % 10 == 0) { /* update and save every ten tracks added */
gp_save_itdb(playlist->itdb);
gtkpod_tracks_statusbar_update();
- count = 0;
}
}
+ /* Final save of remaining added tracks */
+ gp_save_itdb(playlist->itdb);
/* clear log of non-updated tracks */
display_non_updated((void *) -1, NULL);
------------------------------------------------------------------------------
The modern datacenter depends on network connectivity to access resources
and provide services. The best practices for maximizing a physical server's
connectivity to a physical network are well understood - see how these
rules translate into the virtual world?
http://p.sf.net/sfu/oracle-sfdevnlfb
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2