Merge in channels from love-experiments

Rewritten love.thread and changed communication
method from weird system before, to channels.

--HG--
branch : minor
This commit is contained in:
Bart van Strien
2012-07-04 17:15:16 +02:00
parent e8ee7671c3
commit 399a6a6614
41 changed files with 1192 additions and 1580 deletions
+25 -86
View File
@@ -19,12 +19,14 @@
**/
#include "threads.h"
#include "Thread.h"
namespace love
{
namespace thread
{
namespace sdl
{
Mutex::Mutex()
{
mutex = SDL_CreateMutex();
@@ -45,90 +47,6 @@ void Mutex::unlock()
SDL_mutexV(mutex);
}
int ThreadBase::thread_runner(void *param)
{
ThreadBase *thread = (ThreadBase *)param;
thread->main();
return 0;
}
ThreadBase::ThreadBase()
: running(false)
{
}
ThreadBase::~ThreadBase()
{
if (running)
{
wait();
}
}
bool ThreadBase::start()
{
thread = SDL_CreateThread(thread_runner, this);
if (thread == NULL)
return false;
else
return (running = true);
}
void ThreadBase::wait()
{
SDL_WaitThread(thread, NULL);
running = false;
}
void ThreadBase::kill()
{
SDL_KillThread(thread);
running = false;
}
unsigned int ThreadBase::threadId()
{
return (unsigned int)SDL_ThreadID();
}
Semaphore::Semaphore(unsigned int initial_value)
{
semaphore = SDL_CreateSemaphore(initial_value);
}
Semaphore::~Semaphore()
{
SDL_DestroySemaphore(semaphore);
}
unsigned int Semaphore::value()
{
return SDL_SemValue(semaphore);
}
void Semaphore::post()
{
SDL_SemPost(semaphore);
}
bool Semaphore::wait(int timeout)
{
if (timeout < 0)
return SDL_SemWait(semaphore) ? false : true;
else if (timeout == 0)
return SDL_SemTryWait(semaphore) ? false : true;
else
{
int ret = SDL_SemWaitTimeout(semaphore, timeout);
return (ret == 0);
}
}
bool Semaphore::tryWait()
{
return SDL_SemTryWait(semaphore) ? false : true;
}
Conditional::Conditional()
{
cond = SDL_CreateCond();
@@ -149,13 +67,34 @@ void Conditional::broadcast()
SDL_CondBroadcast(cond);
}
bool Conditional::wait(Mutex *mutex, int timeout)
bool Conditional::wait(thread::Mutex *_mutex, int timeout)
{
// Yes, I realise this can be dangerous,
// however, you're asking for it if you're
// mixing thread implementations.
Mutex *mutex = (Mutex*) _mutex;
if (timeout < 0)
return !SDL_CondWait(cond, mutex->mutex);
else
return (SDL_CondWaitTimeout(cond, mutex->mutex, timeout) == 0);
}
} // sdl
thread::Mutex *newMutex()
{
return new sdl::Mutex();
}
thread::Conditional *newConditional()
{
return new sdl::Conditional();
}
thread::Thread *newThread(Threadable *t)
{
return new sdl::Thread(t);
}
} // thread
} // love