summaryrefslogtreecommitdiff
path: root/plugins/gtkui/trkproperties.c
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-05-17 20:50:47 +0200
committerGravatar waker <wakeroid@gmail.com>2012-05-17 20:50:47 +0200
commit816d87e1d38dc0fecbe1fa47794b2d7a18d2e321 (patch)
tree6753620029a94976bf27d474156723dd2f403813 /plugins/gtkui/trkproperties.c
parentaf55e42f2422f8734bc80fb8a58eba80b29937ef (diff)
fixed many calls to pl_find_meta[_raw] being called without pl_lock;
added debug pl_ensure_lock function which asserts when pl_lock is not set when it is required; added new API functions for thread-safe metadata access
Diffstat (limited to 'plugins/gtkui/trkproperties.c')
-rw-r--r--plugins/gtkui/trkproperties.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/plugins/gtkui/trkproperties.c b/plugins/gtkui/trkproperties.c
index 590bf1fa..75b1f256 100644
--- a/plugins/gtkui/trkproperties.c
+++ b/plugins/gtkui/trkproperties.c
@@ -107,6 +107,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
return 0;
}
char *p = out;
+ deadbeef->pl_lock ();
const char **prev = malloc (sizeof (const char *) * numtracks);
memset (prev, 0, sizeof (const char *) * numtracks);
for (int i = 0; i < numtracks; i++) {
@@ -142,6 +143,7 @@ get_field_value (char *out, int size, const char *key, const char *(*getter)(DB_
break;
}
}
+ deadbeef->pl_unlock ();
if (size <= 1) {
gchar *prev = g_utf8_prev_char (out-4);
strcpy (prev, "...");
@@ -491,8 +493,9 @@ static gboolean
set_progress_cb (void *ctx) {
DB_playItem_t *track = ctx;
GtkWidget *progressitem = lookup_widget (progressdlg, "progresstitle");
- const char *fname = deadbeef->pl_find_meta_raw (track, ":URI");
- gtk_entry_set_text (GTK_ENTRY (progressitem), fname);
+ deadbeef->pl_lock ();
+ gtk_entry_set_text (GTK_ENTRY (progressitem), deadbeef->pl_find_meta_raw (track, ":URI"));
+ deadbeef->pl_unlock ();
deadbeef->pl_item_unref (track);
return FALSE;
}
@@ -504,8 +507,15 @@ write_meta_worker (void *ctx) {
break;
}
DB_playItem_t *track = tracks[t];
- const char *decoder_id = deadbeef->pl_find_meta_raw (track, ":DECODER");
- if (track && decoder_id) {
+ deadbeef->pl_lock ();
+ const char *dec = deadbeef->pl_find_meta_raw (track, ":DECODER");
+ char decoder_id[100];
+ if (dec) {
+ strncpy (decoder_id, dec, sizeof (decoder_id));
+ }
+ int match = track && dec;
+ deadbeef->pl_unlock ();
+ if (match) {
int is_subtrack = deadbeef->pl_get_item_flags (track) & DDB_IS_SUBTRACK;
if (is_subtrack) {
continue;