diff options
author | waker <wakeroid@gmail.com> | 2012-05-17 20:50:47 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2012-05-17 20:50:47 +0200 |
commit | 816d87e1d38dc0fecbe1fa47794b2d7a18d2e321 (patch) | |
tree | 6753620029a94976bf27d474156723dd2f403813 /plmeta.c | |
parent | af55e42f2422f8734bc80fb8a58eba80b29937ef (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.c | 45 |
1 files changed, 38 insertions, 7 deletions
@@ -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; +} |