aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2008-09-05 00:29:30 -0700
committerEric Wong <normalperson@yhbt.net>2008-09-05 00:29:30 -0700
commit117ed71c73b643cccfaf57d3b480c158c190f4e0 (patch)
tree3380fd00129c615b0efb6c591b2ee043c8a582f1
parent3f29cbaf360c5e9542c7b9e6648626d6e0ea8b1e (diff)
parentf0a68935f9da6a77cd4688fc5836b2ce8f058041 (diff)
downloadmpd-117ed71c73b643cccfaf57d3b480c158c190f4e0.tar.gz
mpd-117ed71c73b643cccfaf57d3b480c158c190f4e0.tar.xz
mpd-117ed71c73b643cccfaf57d3b480c158c190f4e0.zip
Merge branch 'ew/tag-threadsafe'
* ew/tag-threadsafe: tag: lock all accesses to tag_pool tag: introduce handy items_size() function
-rw-r--r--src/tag.c39
-rw-r--r--src/tag_pool.c2
-rw-r--r--src/tag_pool.h3
3 files changed, 27 insertions, 17 deletions
diff --git a/src/tag.c b/src/tag.c
index 0e0ff1ab7..8208eb965 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -55,6 +55,11 @@ const char *mpdTagItemKeys[TAG_NUM_OF_ITEM_TYPES] = {
static mpd_sint8 ignoreTagItems[TAG_NUM_OF_ITEM_TYPES];
+static size_t items_size(const struct mpd_tag *tag)
+{
+ return (tag->numOfItems * sizeof(struct tag_item));
+}
+
void tag_lib_init(void)
{
int quit = 0;
@@ -262,8 +267,9 @@ static void deleteItem(struct mpd_tag *tag, int idx)
assert(idx < tag->numOfItems);
tag->numOfItems--;
+ pthread_mutex_lock(&tag_pool_lock);
tag_pool_put_item(tag->items[idx]);
- /* free(tag->items[idx].value); */
+ pthread_mutex_unlock(&tag_pool_lock);
if (tag->numOfItems - idx > 0) {
memmove(tag->items + idx, tag->items + idx + 1,
@@ -271,8 +277,7 @@ static void deleteItem(struct mpd_tag *tag, int idx)
}
if (tag->numOfItems > 0) {
- tag->items = xrealloc(tag->items,
- tag->numOfItems * sizeof(*tag->items));
+ tag->items = xrealloc(tag->items, items_size(tag));
} else {
free(tag->items);
tag->items = NULL;
@@ -296,10 +301,10 @@ static void clearMpdTag(struct mpd_tag *tag)
{
int i;
- for (i = 0; i < tag->numOfItems; i++) {
- /* free(tag->items[i].value); */
+ pthread_mutex_lock(&tag_pool_lock);
+ for (i = 0; i < tag->numOfItems; i++)
tag_pool_put_item(tag->items[i]);
- }
+ pthread_mutex_unlock(&tag_pool_lock);
if (tag->items == bulk.items) {
#ifndef NDEBUG
@@ -334,11 +339,12 @@ struct mpd_tag *tag_dup(const struct mpd_tag *tag)
ret = tag_new();
ret->time = tag->time;
ret->numOfItems = tag->numOfItems;
- ret->items = xmalloc(ret->numOfItems * sizeof(ret->items[0]));
+ ret->items = ret->numOfItems > 0 ? xmalloc(items_size(tag)) : NULL;
- for (i = 0; i < tag->numOfItems; i++) {
+ pthread_mutex_lock(&tag_pool_lock);
+ for (i = 0; i < tag->numOfItems; i++)
ret->items[i] = tag_pool_dup_item(tag->items[i]);
- }
+ pthread_mutex_unlock(&tag_pool_lock);
return ret;
}
@@ -404,10 +410,8 @@ void tag_end_add(struct mpd_tag *tag)
if (tag->numOfItems > 0) {
/* copy the tag items from the bulk list over
to a new list (which fits exactly) */
- tag->items = xmalloc(tag->numOfItems *
- sizeof(tag->items[0]));
- memcpy(tag->items, bulk.items,
- tag->numOfItems * sizeof(tag->items[0]));
+ tag->items = xmalloc(items_size(tag));
+ memcpy(tag->items, bulk.items, items_size(tag));
} else
tag->items = NULL;
}
@@ -439,18 +443,19 @@ static void appendToTagItems(struct mpd_tag *tag, enum tag_type type,
if (tag->items != bulk.items)
/* bulk mode disabled */
- tag->items = xrealloc(tag->items,
- tag->numOfItems * sizeof(*tag->items));
+ tag->items = xrealloc(tag->items, items_size(tag));
else if (tag->numOfItems >= BULK_MAX) {
/* bulk list already full - switch back to non-bulk */
assert(bulk.busy);
- tag->items = xmalloc(tag->numOfItems * sizeof(tag->items[0]));
+ tag->items = xmalloc(items_size(tag));
memcpy(tag->items, bulk.items,
- (tag->numOfItems - 1) * sizeof(tag->items[0]));
+ items_size(tag) - sizeof(struct tag_item));
}
+ pthread_mutex_lock(&tag_pool_lock);
tag->items[i] = tag_pool_get_item(type, p, len);
+ pthread_mutex_unlock(&tag_pool_lock);
if (p != value)
free(deconst_ptr(p));
diff --git a/src/tag_pool.c b/src/tag_pool.c
index 89efef1fc..d227a2988 100644
--- a/src/tag_pool.c
+++ b/src/tag_pool.c
@@ -19,6 +19,8 @@
#include "tag_pool.h"
#include "utils.h"
+pthread_mutex_t tag_pool_lock = PTHREAD_MUTEX_INITIALIZER;
+
#define NUM_SLOTS 4096
struct slot {
diff --git a/src/tag_pool.h b/src/tag_pool.h
index e19b2f4b4..d837d4446 100644
--- a/src/tag_pool.h
+++ b/src/tag_pool.h
@@ -20,6 +20,9 @@
#define TAG_POOL_H
#include "tag.h"
+#include "os_compat.h"
+
+extern pthread_mutex_t tag_pool_lock;
struct tag_item;