Browse Source

Make mutex locks slightly more safe in some places (and correct in another...)

Bart van Strien 12 years ago
parent
commit
1602c6de7a
2 changed files with 11 additions and 17 deletions
  1. 6 13
      src/modules/thread/Channel.cpp
  2. 5 4
      src/modules/thread/sdl/Thread.cpp

+ 6 - 13
src/modules/thread/Channel.cpp

@@ -125,13 +125,11 @@ void Channel::supply(Variant *var)
 	if (!var)
 		return;
 
-	mutex->lock();
+	Lock l(mutex);
 	unsigned long id = push(var);
 
 	while (!past(id, received))
 		cond->wait(mutex);
-
-	mutex->unlock();
 }
 
 Variant *Channel::pop()
@@ -157,11 +155,10 @@ Variant *Channel::pop()
 Variant *Channel::demand()
 {
 	Variant *var;
-	mutex->lock();
+	Lock l(mutex);
 	while (!(var = pop()))
 		cond->wait(mutex);
 
-	mutex->unlock();
 	return var;
 }
 
@@ -218,24 +215,20 @@ void Channel::unlockMutex()
 
 void Channel::retain()
 {
+	EmptyLock l;
 	if (named)
-		namedChannelMutex->lock();
+		l.setLock(namedChannelMutex);
 
 	Object::retain();
-
-	if (named)
-		namedChannelMutex->unlock();
 }
 
 void Channel::release()
 {
+	EmptyLock l;
 	if (named)
-		namedChannelMutex->lock();
+		l.setLock(namedChannelMutex);
 
 	Object::release();
-
-	if (named)
-		namedChannelMutex->unlock();
 }
 } // thread
 } // love

+ 5 - 4
src/modules/thread/sdl/Thread.cpp

@@ -58,10 +58,11 @@ bool Thread::start()
 
 void Thread::wait()
 {
-	mutex.lock();
-	if (!thread)
-		return;
-	mutex.unlock();
+	{
+		Lock l(mutex);
+		if (!thread)
+			return;
+	}
 	SDL_WaitThread(thread, 0);
 	Lock l(mutex);
 	running = false;