summaryrefslogtreecommitdiff
path: root/plmeta.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 /plmeta.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 'plmeta.c')
-rw-r--r--plmeta.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/plmeta.c b/plmeta.c
index cf17f341..4b8e9a8a 100644
--- a/plmeta.c
+++ b/plmeta.c
@@ -190,14 +190,13 @@ pl_delete_meta (playItem_t *it, const char *key) {
const char *
pl_find_meta (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
if (key && key[0] == ':') {
// try to find an override
while (m) {
if (m->key[0] == '!' && !strcasecmp (key+1, m->key+1)) {
- pl_unlock ();
return m->value;
}
m = m->next;
@@ -207,27 +206,23 @@ pl_find_meta (playItem_t *it, const char *key) {
m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
const char *
pl_find_meta_raw (playItem_t *it, const char *key) {
- pl_lock ();
+ pl_ensure_lock ();
DB_metaInfo_t *m = it->meta;
while (m) {
if (!strcasecmp (key, m->key)) {
- pl_unlock ();
return m->value;
}
m = m->next;
}
- pl_unlock ();
return NULL;
}
@@ -303,3 +298,39 @@ pl_delete_all_meta (playItem_t *it) {
}
UNLOCK;
}
+
+int
+pl_get_meta (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ if (!val) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_get_meta_raw (playItem_t *it, const char *key, char *val, int size) {
+ *val = 0;
+ pl_lock ();
+ const char *v = pl_find_meta_raw (it, key);
+ if (!val) {
+ pl_unlock ();
+ return 0;
+ }
+ strncpy (val, v, size);
+ pl_unlock ();
+ return 1;
+}
+
+int
+pl_meta_exists (playItem_t *it, const char *key) {
+ pl_lock ();
+ const char *v = pl_find_meta (it, key);
+ pl_unlock ();
+ return v ? 1 : 0;
+}