Browse Source

Move named channel code to the thread module instead of having a static map. Fixes issue #1464.

Alex Szpakowski 6 years ago
parent
commit
19890a65c3

+ 1 - 52
src/modules/thread/Channel.cpp

@@ -19,8 +19,6 @@
  **/
  **/
 
 
 #include "Channel.h"
 #include "Channel.h"
-#include <map>
-#include <string>
 
 
 #include <timer/Timer.h>
 #include <timer/Timer.h>
 
 
@@ -30,60 +28,21 @@ namespace thread
 {
 {
 
 
 love::Type Channel::type("Channel", &Object::type);
 love::Type Channel::type("Channel", &Object::type);
-static std::map<std::string, Channel *> 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()
 Channel::Channel()
-	: named(false)
-	, sent(0)
-	, received(0)
-{
-}
-
-Channel::Channel(const std::string &name)
-	: named(true)
-	, name(name)
-	, sent(0)
+	: sent(0)
 	, received(0)
 	, received(0)
 {
 {
 }
 }
 
 
 Channel::~Channel()
 Channel::~Channel()
 {
 {
-	if (named)
-	{
-		Lock l(namedChannelMutex);
-		namedChannels.erase(name);
-	}
 }
 }
 
 
 uint64 Channel::push(const Variant &var)
 uint64 Channel::push(const Variant &var)
 {
 {
 	Lock l(mutex);
 	Lock l(mutex);
 
 
-	// Keep a reference to ourselves
-	// if we're non-empty and named.
-	if (named && queue.empty())
-		retain();
-
 	queue.push(var);
 	queue.push(var);
 	cond->broadcast();
 	cond->broadcast();
 
 
@@ -134,11 +93,6 @@ bool Channel::pop(Variant *var)
 	received++;
 	received++;
 	cond->broadcast();
 	cond->broadcast();
 
 
-	// Release our reference to ourselves
-	// if we're empty and named.
-	if (named && queue.empty())
-		release();
-
 	return true;
 	return true;
 }
 }
 
 
@@ -208,11 +162,6 @@ void Channel::clear()
 	// Finish all the supply waits
 	// Finish all the supply waits
 	received = sent;
 	received = sent;
 	cond->broadcast();
 	cond->broadcast();
-
-	// Once again, release our own
-	// reference if we're named.
-	if (named)
-		release();
 }
 }
 
 
 void Channel::lockMutex()
 void Channel::lockMutex()

+ 0 - 6
src/modules/thread/Channel.h

@@ -23,7 +23,6 @@
 
 
 // STL
 // STL
 #include <queue>
 #include <queue>
-#include <string>
 
 
 // LOVE
 // LOVE
 #include "common/Variant.h"
 #include "common/Variant.h"
@@ -47,8 +46,6 @@ public:
 	Channel();
 	Channel();
 	~Channel();
 	~Channel();
 
 
-	static Channel *getChannel(const std::string &name);
-
 	uint64 push(const Variant &var);
 	uint64 push(const Variant &var);
 	bool supply(const Variant &var); // blocking push
 	bool supply(const Variant &var); // blocking push
 	bool supply(const Variant &var, double timeout);
 	bool supply(const Variant &var, double timeout);
@@ -62,15 +59,12 @@ public:
 
 
 private:
 private:
 
 
-	Channel(const std::string &name);
 	void lockMutex();
 	void lockMutex();
 	void unlockMutex();
 	void unlockMutex();
 
 
 	MutexRef mutex;
 	MutexRef mutex;
 	ConditionalRef cond;
 	ConditionalRef cond;
 	std::queue<Variant> queue;
 	std::queue<Variant> queue;
-	bool named;
-	std::string name;
 
 
 	uint64 sent;
 	uint64 sent;
 	uint64 received;
 	uint64 received;

+ 9 - 1
src/modules/thread/ThreadModule.cpp

@@ -37,7 +37,15 @@ Channel *ThreadModule::newChannel()
 
 
 Channel *ThreadModule::getChannel(const std::string &name)
 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
 const char *ThreadModule::getName() const

+ 6 - 0
src/modules/thread/ThreadModule.h

@@ -23,6 +23,7 @@
 
 
 // STL
 // STL
 #include <string>
 #include <string>
+#include <map>
 
 
 // LOVE
 // LOVE
 #include "common/Data.h"
 #include "common/Data.h"
@@ -51,6 +52,11 @@ public:
 	virtual const char *getName() const;
 	virtual const char *getName() const;
 	virtual ModuleType getModuleType() const { return M_THREAD; }
 	virtual ModuleType getModuleType() const { return M_THREAD; }
 
 
+private:
+
+	std::map<std::string, StrongRef<Channel>> namedChannels;
+	MutexRef namedChannelMutex;
+
 }; // ThreadModule
 }; // ThreadModule
 
 
 } // thread
 } // thread

+ 0 - 1
src/modules/thread/wrap_ThreadModule.cpp

@@ -94,7 +94,6 @@ int w_getChannel(lua_State *L)
 	std::string name = luax_checkstring(L, 1);
 	std::string name = luax_checkstring(L, 1);
 	Channel *c = instance()->getChannel(name);
 	Channel *c = instance()->getChannel(name);
 	luax_pushtype(L, c);
 	luax_pushtype(L, c);
-	c->release();
 	return 1;
 	return 1;
 }
 }