diff --git a/src/data.cpp b/src/data.cpp index a7a6ef7a..d9855888 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -30,6 +30,7 @@ namespace pipy { List Data::Producer::s_all_producers; +std::mutex Data::Producer::s_all_producers_mutex; Data::Producer Data::s_unknown_producer("Unknown"); auto Data::Producer::unknown() -> Producer* { diff --git a/src/data.hpp b/src/data.hpp index 3bdb5ca4..a511d016 100644 --- a/src/data.hpp +++ b/src/data.hpp @@ -35,6 +35,7 @@ #include #include #include +#include namespace pipy { @@ -74,16 +75,18 @@ class Data : public EventTemplate { static auto unknown() -> Producer*; static void for_each(const std::function &cb) { + std::lock_guard lock(s_all_producers_mutex); for (auto p = s_all_producers.head(); p; p = p->next()) { cb(p); } } - Producer(const std::string &name) : m_name(pjs::Str::make(name)), m_count(0) { + Producer(const std::string &name) : m_name(name), m_count(0) { + std::lock_guard lock(s_all_producers_mutex); s_all_producers.push(this); } - auto name() const -> pjs::Str::CharData* { return m_name->data(); } + auto name() const -> const std::string& { return m_name; } auto count() const -> size_t { return m_count.load(std::memory_order_relaxed); } Data* make(int size) { return Data::make(size, this); } @@ -103,13 +106,14 @@ class Data : public EventTemplate { void pack(Data *data, const Data *appendant, double vacancy = 0.5) { data->pack(*appendant, this, vacancy); } private: - pjs::Ref m_name; + std::string m_name; std::atomic m_count; void increase() { m_count.fetch_add(1, std::memory_order_relaxed); } void decrease() { m_count.fetch_sub(1, std::memory_order_relaxed); } static List s_all_producers; + static std::mutex s_all_producers_mutex; friend struct Chunk; }; diff --git a/src/status.cpp b/src/status.cpp index ded0e72d..efbb6e0a 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -351,7 +351,7 @@ void Status::update_local() { if (WorkerThread::current()->index() == 0) { Data::Producer::for_each([&](Data::Producer *producer) { chunks.insert({ - producer->name()->str(), + producer->name(), producer->count(), }); });