From 19890a65c36b8abf94c0077edbf7526c505cde10 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Mon, 31 Dec 2018 22:36:36 -0400 Subject: [PATCH] Move named channel code to the thread module instead of having a static map. Fixes issue #1464. --- src/modules/thread/Channel.cpp | 53 +----------------------- src/modules/thread/Channel.h | 6 --- src/modules/thread/ThreadModule.cpp | 10 ++++- src/modules/thread/ThreadModule.h | 6 +++ src/modules/thread/wrap_ThreadModule.cpp | 1 - 5 files changed, 16 insertions(+), 60 deletions(-) diff --git a/src/modules/thread/Channel.cpp b/src/modules/thread/Channel.cpp index 8b2cba28c..c12175115 100644 --- a/src/modules/thread/Channel.cpp +++ b/src/modules/thread/Channel.cpp @@ -19,8 +19,6 @@ **/ #include "Channel.h" -#include -#include #include @@ -30,60 +28,21 @@ namespace thread { love::Type Channel::type("Channel", &Object::type); -static std::map namedChannels; -static Mutex *namedChannelMutex; - -Channel *Channel::getChannel(const std::string &name) -{ - if (!namedChannelMutex) - namedChannelMutex = newMutex(); - - Lock lock(namedChannelMutex); - - auto it = namedChannels.find(name); - if (it != namedChannels.end()) - { - it->second->retain(); - return it->second; - } - - namedChannels[name] = new Channel(name); - return namedChannels[name]; -} Channel::Channel() - : named(false) - , sent(0) - , received(0) -{ -} - -Channel::Channel(const std::string &name) - : named(true) - , name(name) - , sent(0) + : sent(0) , received(0) { } Channel::~Channel() { - if (named) - { - Lock l(namedChannelMutex); - namedChannels.erase(name); - } } uint64 Channel::push(const Variant &var) { Lock l(mutex); - // Keep a reference to ourselves - // if we're non-empty and named. - if (named && queue.empty()) - retain(); - queue.push(var); cond->broadcast(); @@ -134,11 +93,6 @@ bool Channel::pop(Variant *var) received++; cond->broadcast(); - // Release our reference to ourselves - // if we're empty and named. - if (named && queue.empty()) - release(); - return true; } @@ -208,11 +162,6 @@ void Channel::clear() // Finish all the supply waits received = sent; cond->broadcast(); - - // Once again, release our own - // reference if we're named. - if (named) - release(); } void Channel::lockMutex() diff --git a/src/modules/thread/Channel.h b/src/modules/thread/Channel.h index 0d95fe5a9..78dd1dc3d 100644 --- a/src/modules/thread/Channel.h +++ b/src/modules/thread/Channel.h @@ -23,7 +23,6 @@ // STL #include -#include // LOVE #include "common/Variant.h" @@ -47,8 +46,6 @@ public: Channel(); ~Channel(); - static Channel *getChannel(const std::string &name); - uint64 push(const Variant &var); bool supply(const Variant &var); // blocking push bool supply(const Variant &var, double timeout); @@ -62,15 +59,12 @@ public: private: - Channel(const std::string &name); void lockMutex(); void unlockMutex(); MutexRef mutex; ConditionalRef cond; std::queue queue; - bool named; - std::string name; uint64 sent; uint64 received; diff --git a/src/modules/thread/ThreadModule.cpp b/src/modules/thread/ThreadModule.cpp index b7f70e799..e8a085379 100644 --- a/src/modules/thread/ThreadModule.cpp +++ b/src/modules/thread/ThreadModule.cpp @@ -37,7 +37,15 @@ Channel *ThreadModule::newChannel() Channel *ThreadModule::getChannel(const std::string &name) { - return Channel::getChannel(name); + Lock lock(namedChannelMutex); + + auto it = namedChannels.find(name); + if (it != namedChannels.end()) + return it->second; + + Channel *c = new Channel(); + namedChannels[name].set(c, Acquire::NORETAIN); + return c; } const char *ThreadModule::getName() const diff --git a/src/modules/thread/ThreadModule.h b/src/modules/thread/ThreadModule.h index 13193c958..78ba6d834 100644 --- a/src/modules/thread/ThreadModule.h +++ b/src/modules/thread/ThreadModule.h @@ -23,6 +23,7 @@ // STL #include +#include // LOVE #include "common/Data.h" @@ -51,6 +52,11 @@ public: virtual const char *getName() const; virtual ModuleType getModuleType() const { return M_THREAD; } +private: + + std::map> namedChannels; + MutexRef namedChannelMutex; + }; // ThreadModule } // thread diff --git a/src/modules/thread/wrap_ThreadModule.cpp b/src/modules/thread/wrap_ThreadModule.cpp index 5ea591d8f..6994b0d6b 100644 --- a/src/modules/thread/wrap_ThreadModule.cpp +++ b/src/modules/thread/wrap_ThreadModule.cpp @@ -94,7 +94,6 @@ int w_getChannel(lua_State *L) std::string name = luax_checkstring(L, 1); Channel *c = instance()->getChannel(name); luax_pushtype(L, c); - c->release(); return 1; }