summaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-07-25 17:42:36 +1000
committerjacqueline <me@jacqueline.id.au>2023-07-25 17:43:12 +1000
commit80d7df910987db5201402fe987124f29f09344f3 (patch)
tree7e8c1e04ab40026087343efee95a771c7839b32f /src/database
parent7b72e5479ee6d11f76c49f7463ba0e7f4e5165c5 (diff)
downloadtangara-fw-80d7df910987db5201402fe987124f29f09344f3.tar.gz
fuck off
Diffstat (limited to 'src/database')
-rw-r--r--src/database/include/tag_parser.hpp2
-rw-r--r--src/database/tag_parser.cpp17
2 files changed, 14 insertions, 5 deletions
diff --git a/src/database/include/tag_parser.hpp b/src/database/include/tag_parser.hpp
index b0e9a151..dcc8aa21 100644
--- a/src/database/include/tag_parser.hpp
+++ b/src/database/include/tag_parser.hpp
@@ -26,6 +26,8 @@ class TagParserImpl : public ITagParser {
-> bool override;
private:
+ std::mutex cache_mutex_;
+
/*
* Cache of tags that have already been extracted from files. Ideally this
* cache should be slightly larger than any page sizes in the UI.
diff --git a/src/database/tag_parser.cpp b/src/database/tag_parser.cpp
index 06d8a8c9..f7e1ceec 100644
--- a/src/database/tag_parser.cpp
+++ b/src/database/tag_parser.cpp
@@ -12,6 +12,7 @@
#include <tags.h>
#include <cstdlib>
#include <iomanip>
+#include <mutex>
namespace database {
@@ -97,10 +98,13 @@ static const char* kTag = "TAGS";
auto TagParserImpl::ReadAndParseTags(const std::string& path, TrackTags* out)
-> bool {
- std::optional<TrackTags> cached = cache_.Get(path);
- if (cached) {
- *out = *cached;
- return true;
+ {
+ std::lock_guard<std::mutex> lock{cache_mutex_};
+ std::optional<TrackTags> cached = cache_.Get(path);
+ if (cached) {
+ *out = *cached;
+ return true;
+ }
}
if (path.ends_with(".m4a")) {
@@ -166,7 +170,10 @@ auto TagParserImpl::ReadAndParseTags(const std::string& path, TrackTags* out)
out->duration = ctx.duration;
}
- cache_.Put(path, *out);
+ {
+ std::lock_guard<std::mutex> lock{cache_mutex_};
+ cache_.Put(path, *out);
+ }
return true;
}