From 816d87e1d38dc0fecbe1fa47794b2d7a18d2e321 Mon Sep 17 00:00:00 2001 From: waker Date: Thu, 17 May 2012 20:50:47 +0200 Subject: 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 --- plmeta.c | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'plmeta.c') 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; +} -- cgit v1.2.3