diff src/modules/thread/Channel.cpp @ 1104:fc7143cc0818 minor

Also mutex lock in Channel::retain
author Bart van Strien <bart.bes+projects@gmail.com>
date Thu, 05 Jul 2012 17:25:41 +0200
parents 025c67973ad4
children 1a59c21cd2f3
line wrap: on
line diff
--- a/src/modules/thread/Channel.cpp	Wed Jul 04 20:22:54 2012 +0200
+++ b/src/modules/thread/Channel.cpp	Thu Jul 05 17:25:41 2012 +0200
@@ -26,136 +26,147 @@
 {
 namespace thread
 {
-	static std::map<std::string, Channel*> namedChannels;
-	static Mutex *namedChannelMutex;
-	Channel *Channel::getChannel(const std::string &name)
-	{
-		if (!namedChannelMutex)
-			namedChannelMutex = newMutex();
-		Lock l(namedChannelMutex);
-		if (!namedChannels.count(name))
-			namedChannels[name] = new Channel(name);
-		else
-			namedChannels[name]->retain();
-		return namedChannels[name];
-	}
+static std::map<std::string, Channel*> namedChannels;
+static Mutex *namedChannelMutex;
+Channel *Channel::getChannel(const std::string &name)
+{
+	if (!namedChannelMutex)
+		namedChannelMutex = newMutex();
+	Lock l(namedChannelMutex);
+	if (!namedChannels.count(name))
+		namedChannels[name] = new Channel(name);
+	else
+		namedChannels[name]->retain();
+	return namedChannels[name];
+}
 
-	Channel::Channel()
-		: named(false)
-	{
-		mutex = newMutex();
-		cond = newConditional();
-	}
+Channel::Channel()
+	: named(false)
+{
+	mutex = newMutex();
+	cond = newConditional();
+}
 
-	Channel::Channel(const std::string &name)
-		: named(true), name(name)
+Channel::Channel(const std::string &name)
+	: named(true), name(name)
+{
+	mutex = newMutex();
+	cond = newConditional();
+}
+
+Channel::~Channel()
+{
+	while (!queue.empty())
 	{
-		mutex = newMutex();
-		cond = newConditional();
-	}
-
-	Channel::~Channel()
-	{
-		while (!queue.empty())
-		{
-			queue.front()->release();
-			queue.pop();
-		}
-
-		delete mutex;
-		delete cond;
-		if (named)
-			namedChannels.erase(name);
-	}
-
-	void Channel::push(Variant *var)
-	{
-		if (!var)
-			return;
-		Lock l(mutex);
-		var->retain();
-		// Keep a reference to ourselves
-		// if we're non-empty and named.
-		if (named && queue.empty())
-			retain();
-		queue.push(var);
-		cond->signal();
+		queue.front()->release();
+		queue.pop();
 	}
 
-	Variant *Channel::pop()
-	{
-		Lock l(mutex);
-		if (queue.empty())
-			return 0;
+	delete mutex;
+	delete cond;
+	if (named)
+		namedChannels.erase(name);
+}
 
-		Variant *var = queue.front();
-		queue.pop();
+void Channel::push(Variant *var)
+{
+	if (!var)
+		return;
+	Lock l(mutex);
+	var->retain();
+	// Keep a reference to ourselves
+	// if we're non-empty and named.
+	if (named && queue.empty())
+		retain();
+	queue.push(var);
+	cond->signal();
+}
 
-		// Release our reference to ourselves
-		// if we're empty and named.
-		if (named && queue.empty())
-			release();
-		return var;
-	} // NOTE: Returns a retained Variant
+Variant *Channel::pop()
+{
+	Lock l(mutex);
+	if (queue.empty())
+		return 0;
+
+	Variant *var = queue.front();
+	queue.pop();
 
-	Variant *Channel::demand()
+	// Release our reference to ourselves
+	// if we're empty and named.
+	if (named && queue.empty())
+		release();
+	return var;
+} // NOTE: Returns a retained Variant
+
+Variant *Channel::demand()
+{
+	Variant *var;
+	while (!(var = pop()))
 	{
-		Variant *var;
-		while (!(var = pop()))
-		{
-			mutex->lock();
-			cond->wait(mutex);
-			mutex->unlock();
-		}
-		return var;
+		mutex->lock();
+		cond->wait(mutex);
+		mutex->unlock();
 	}
+	return var;
+}
+
+Variant *Channel::peek()
+{
+	Lock l(mutex);
+	if (queue.empty())
+		return 0;
+
+	Variant *var = queue.front();
+	var->retain();
+	return var;
+}
 
-	Variant *Channel::peek()
+int Channel::count()
+{
+	Lock l(mutex);
+	return queue.size();
+}
+
+void Channel::clear()
+{
+	Lock l(mutex);
+
+	// We're already empty.
+	if (queue.empty())
+		return;
+
+	while (!queue.empty())
 	{
-		Lock l(mutex);
-		if (queue.empty())
-			return 0;
-
-		Variant *var = queue.front();
-		var->retain();
-		return var;
+		queue.front()->release();
+		queue.pop();
 	}
 
-	int Channel::count()
-	{
-		Lock l(mutex);
-		return queue.size();
-	}
+	// Once again, release our own
+	// reference if we're named.
+	if (named)
+		release();
+}
 
-	void Channel::clear()
-	{
-		Lock l(mutex);
+void Channel::retain()
+{
+	if (named)
+		namedChannelMutex->lock();
 
-		// We're already empty.
-		if (queue.empty())
-			return;
+	Object::retain();
 
-		while (!queue.empty())
-		{
-			queue.front()->release();
-			queue.pop();
-		}
+	if (named)
+		namedChannelMutex->unlock();
+}
 
-		// Once again, release our own
-		// reference if we're named.
-		if (named)
-			release();
-	}
+void Channel::release()
+{
+	if (named)
+		namedChannelMutex->lock();
 
-	void Channel::release()
-	{
-		if (named)
-			namedChannelMutex->lock();
+	Object::release();
 
-		Object::release();
-
-		if (named)
-			namedChannelMutex->unlock();
-	}
+	if (named)
+		namedChannelMutex->unlock();
+}
 } // thread
 } // love