@@ -1,11 +1,13 @@ | |||
// | |||
// Lol Engine - Fractal tutorial | |||
// Lol Engine - Fractal tutorial | |||
// | |||
// Copyright: (c) 2011-2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2011—2015 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// This program is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#if HAVE_CONFIG_H | |||
@@ -125,9 +127,9 @@ public: | |||
#if LOL_FEATURE_THREADS | |||
/* Spawn worker threads and wait for their readiness. */ | |||
for (int i = 0; i < MAX_THREADS; i++) | |||
m_threads[i] = new Thread(DoWorkHelper, this); | |||
m_threads[i] = new thread(std::bind(&Fractal::DoWorkHelper, this)); | |||
for (int i = 0; i < MAX_THREADS; i++) | |||
m_spawnqueue.Pop(); | |||
m_spawnqueue.pop(); | |||
#endif | |||
} | |||
@@ -137,9 +139,9 @@ public: | |||
/* Signal worker threads for completion and wait for | |||
* them to quit. */ | |||
for (int i = 0; i < MAX_THREADS; i++) | |||
m_jobqueue.Push(-1); | |||
m_jobqueue.push(-1); | |||
for (int i = 0; i < MAX_THREADS; i++) | |||
m_donequeue.Pop(); | |||
m_donequeue.pop(); | |||
#endif | |||
//Input::UntrackMouse(this); | |||
@@ -310,7 +312,7 @@ public: | |||
for (int i = 0; i < m_size.y; i += MAX_LINES * 2) | |||
{ | |||
#if LOL_FEATURE_THREADS | |||
m_jobqueue.Push(i); | |||
m_jobqueue.push(i); | |||
#else | |||
DoWork(i); | |||
#endif | |||
@@ -319,20 +321,18 @@ public: | |||
} | |||
#if LOL_FEATURE_THREADS | |||
static void *DoWorkHelper(void *data) | |||
void DoWorkHelper() | |||
{ | |||
Fractal *that = (Fractal *)data; | |||
that->m_spawnqueue.Push(0); | |||
m_spawnqueue.push(0); | |||
for ( ; ; ) | |||
{ | |||
int line = that->m_jobqueue.Pop(); | |||
int line = m_jobqueue.pop(); | |||
if (line == -1) | |||
break; | |||
that->DoWork(line); | |||
that->m_donequeue.Push(0); | |||
DoWork(line); | |||
m_donequeue.push(0); | |||
} | |||
that->m_donequeue.Push(0); | |||
return NULL; | |||
m_donequeue.push(0); | |||
}; | |||
#endif | |||
@@ -497,7 +497,7 @@ public: | |||
{ | |||
#if LOL_FEATURE_THREADS | |||
for (int i = 0; i < m_size.y; i += MAX_LINES * 2) | |||
m_donequeue.Pop(); | |||
m_donequeue.pop(); | |||
#endif | |||
m_dirty[m_frame]--; | |||
@@ -556,8 +556,8 @@ private: | |||
#if LOL_FEATURE_THREADS | |||
/* Worker threads */ | |||
Thread *m_threads[MAX_THREADS]; | |||
Queue<int> m_spawnqueue, m_jobqueue, m_donequeue; | |||
thread *m_threads[MAX_THREADS]; | |||
queue<int> m_spawnqueue, m_jobqueue, m_donequeue; | |||
#endif | |||
#if !defined __native_client__ | |||
@@ -1,11 +1,14 @@ | |||
// | |||
// Lol Engine | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2011 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
// © 2013—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// | |||
// This library is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#pragma once | |||
@@ -23,27 +26,29 @@ | |||
#include "entity.h" | |||
#include <functional> | |||
namespace lol | |||
{ | |||
class Mutex : public MutexBase | |||
class mutex : public mutex_base | |||
{ | |||
public: | |||
Mutex() : MutexBase() {} | |||
mutex() : mutex_base() {} | |||
}; | |||
template<typename T, int N = 128> class Queue : public QueueBase<T, N> | |||
template<typename T, int N = 128> class queue : public queue_base<T, N> | |||
{ | |||
public: | |||
Queue() : QueueBase<T, N>() {} | |||
queue() : queue_base<T, N>() {} | |||
}; | |||
#if LOL_FEATURE_THREADS | |||
class Thread : ThreadBase | |||
class thread : thread_base | |||
{ | |||
public: | |||
Thread(void *(*fn)(void *), void *data) : ThreadBase(fn, data) {} | |||
virtual ~Thread() {} | |||
thread(std::function<void(void)> fn) : thread_base(fn) {} | |||
virtual ~thread() {} | |||
}; | |||
struct ThreadStatus | |||
@@ -104,18 +109,19 @@ protected: | |||
//Fetch Results | |||
bool FetchResult(array<ThreadJob*>& results); | |||
//Base thread work function | |||
static void *BaseThreadWork(void* data); | |||
void BaseThreadWork(); | |||
virtual void TickGame(float seconds); | |||
//Default behaviour : delete the job result | |||
virtual void TreatResult(ThreadJob* result) { delete(result); } | |||
/* Worker threads */ | |||
int m_thread_count; | |||
array<Thread*> m_threads; | |||
Queue<ThreadStatus> m_spawnqueue, m_donequeue; | |||
Queue<ThreadJob*> m_jobqueue; | |||
Queue<ThreadJob*> m_resultqueue; | |||
array<ThreadJob*> m_job_dispatch; | |||
int m_thread_count; | |||
array<thread*> m_threads; | |||
queue<ThreadStatus> m_spawnqueue, m_donequeue; | |||
queue<ThreadJob*> m_jobqueue; | |||
queue<ThreadJob*> m_resultqueue; | |||
array<ThreadJob*> m_job_dispatch; | |||
}; | |||
//Generic class for thread manager, executes work and store results, for you to use | |||
@@ -69,8 +69,8 @@ void NaClInstance::TickCallback(void* data, int32_t result) | |||
instance->m_input_data->Tick(DELTA_MS); | |||
} | |||
Mutex NaClInstance::main_mutex; | |||
Queue<NaClInstance::Args *, 1> NaClInstance::main_queue; | |||
mutex NaClInstance::main_mutex; | |||
queue<NaClInstance::Args *, 1> NaClInstance::main_queue; | |||
bool NaClInstance::Init(uint32_t argc, | |||
const char* /* argn */[], | |||
@@ -81,7 +81,7 @@ bool NaClInstance::Init(uint32_t argc, | |||
char *env[] = { nullptr }; | |||
Args arglist(argc, const_cast<char **>(argv), const_cast<char **>(env)); | |||
main_queue.Push(&arglist); | |||
m_main_thread = new Thread(MainRun, nullptr); | |||
m_main_thread = new thread(MainRun, nullptr); | |||
/* Push so that only MainSignal() can unblock us */ | |||
main_queue.Push(nullptr); | |||
main_queue.Push(nullptr); | |||
@@ -96,8 +96,8 @@ private: | |||
char **m_argv; | |||
char **m_env; | |||
}; | |||
static Mutex main_mutex; | |||
static Queue<Args *, 1> main_queue; | |||
static mutex main_mutex; | |||
static queue<Args *, 1> main_queue; | |||
Thread *m_main_thread; | |||
}; | |||
@@ -1,12 +1,14 @@ | |||
// | |||
// Lol Engine | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// 2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
// © 2014—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// | |||
// This library is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
@@ -34,9 +36,10 @@ bool BaseThreadManager::Start() | |||
/* Spawn worker threads and wait for their readiness. */ | |||
m_threads.Resize(m_thread_count); | |||
for (int i = 0; i < m_thread_count; i++) | |||
m_threads[i] = new Thread(BaseThreadWork, this); | |||
m_threads[i] = new thread(std::bind(&BaseThreadManager::BaseThreadWork, | |||
this)); | |||
for (int i = 0; i < m_thread_count; i++) | |||
m_spawnqueue.Pop(); | |||
m_spawnqueue.pop(); | |||
return true; | |||
} | |||
@@ -51,9 +54,9 @@ bool BaseThreadManager::Stop() | |||
* them to quit. */ | |||
ThreadJob stop_job(ThreadJobType::THREAD_STOP); | |||
for (int i = 0; i < m_thread_count; i++) | |||
m_jobqueue.Push(&stop_job); | |||
m_jobqueue.push(&stop_job); | |||
for (int i = 0; i < m_thread_count; i++) | |||
m_donequeue.Pop(); | |||
m_donequeue.pop(); | |||
return true; | |||
} | |||
@@ -61,7 +64,7 @@ bool BaseThreadManager::Stop() | |||
//Work stuff | |||
bool BaseThreadManager::AddWork(ThreadJob* job) | |||
{ | |||
if (m_jobqueue.TryPush(job)) | |||
if (m_jobqueue.try_push(job)) | |||
return true; | |||
return false; | |||
} | |||
@@ -69,19 +72,18 @@ bool BaseThreadManager::AddWork(ThreadJob* job) | |||
bool BaseThreadManager::FetchResult(array<ThreadJob*>& results) | |||
{ | |||
ThreadJob* result; | |||
while (m_resultqueue.TryPop(result)) | |||
while (m_resultqueue.try_pop(result)) | |||
results << result; | |||
return results.Count() > 0; | |||
} | |||
//Base thread work function | |||
void *BaseThreadManager::BaseThreadWork(void* data) | |||
void BaseThreadManager::BaseThreadWork() | |||
{ | |||
BaseThreadManager *that = (BaseThreadManager *)data; | |||
that->m_spawnqueue.Push(ThreadStatus::THREAD_STARTED); | |||
m_spawnqueue.push(ThreadStatus::THREAD_STARTED); | |||
for ( ; ; ) | |||
{ | |||
ThreadJob* job = that->m_jobqueue.Pop(); | |||
ThreadJob* job = m_jobqueue.pop(); | |||
if (job->GetJobType() == ThreadJobType::THREAD_STOP) | |||
break; | |||
else if (*job == ThreadJobType::WORK_TODO) | |||
@@ -90,11 +92,10 @@ void *BaseThreadManager::BaseThreadWork(void* data) | |||
job->SetJobType(ThreadJobType::WORK_DONE); | |||
else | |||
job->SetJobType(ThreadJobType::WORK_FAILED); | |||
that->m_resultqueue.Push(job); | |||
m_resultqueue.push(job); | |||
} | |||
} | |||
that->m_donequeue.Push(ThreadStatus::THREAD_STOPPED); | |||
return nullptr; | |||
m_donequeue.push(ThreadStatus::THREAD_STOPPED); | |||
} | |||
void BaseThreadManager::TickGame(float seconds) | |||
@@ -106,7 +107,7 @@ void BaseThreadManager::TickGame(float seconds) | |||
//Dispatch work task | |||
while (m_job_dispatch.Count() > 0 && AddWork(m_job_dispatch.Last())) | |||
m_job_dispatch.Pop(); | |||
m_job_dispatch.pop(); | |||
array<ThreadJob*> result; | |||
//Fetch and treat results | |||
@@ -1,18 +1,21 @@ | |||
// | |||
// Lol Engine | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
// © 2014—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// | |||
// This library is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#pragma once | |||
// | |||
// The ThreadBase class | |||
// -------------------- | |||
// The base classes for multithreading | |||
// ----------------------------------- | |||
// | |||
#if defined HAVE_PTHREAD_H | |||
@@ -32,10 +35,10 @@ | |||
namespace lol | |||
{ | |||
class MutexBase | |||
class mutex_base | |||
{ | |||
public: | |||
MutexBase() | |||
mutex_base() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_init(&m_mutex, nullptr); | |||
@@ -44,7 +47,7 @@ public: | |||
#endif | |||
} | |||
~MutexBase() | |||
~mutex_base() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_destroy(&m_mutex); | |||
@@ -53,7 +56,7 @@ public: | |||
#endif | |||
} | |||
void Lock() | |||
void lock() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_lock(&m_mutex); | |||
@@ -62,7 +65,7 @@ public: | |||
#endif | |||
} | |||
void Unlock() | |||
void unlock() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_unlock(&m_mutex); | |||
@@ -79,10 +82,11 @@ private: | |||
#endif | |||
}; | |||
template<typename T, int N> class QueueBase | |||
template<typename T, int N> | |||
class queue_base | |||
{ | |||
public: | |||
QueueBase() | |||
queue_base() | |||
{ | |||
m_start = m_count = 0; | |||
#if defined HAVE_PTHREAD_H | |||
@@ -97,7 +101,7 @@ public: | |||
#endif | |||
} | |||
~QueueBase() | |||
~queue_base() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_cond_destroy(&m_empty_cond); | |||
@@ -110,7 +114,7 @@ public: | |||
#endif | |||
} | |||
void Push(T value) | |||
void push(T value) | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_lock(&m_mutex); | |||
@@ -139,7 +143,7 @@ public: | |||
#endif | |||
} | |||
bool TryPush(T value) | |||
bool try_push(T value) | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_lock(&m_mutex); | |||
@@ -173,7 +177,7 @@ public: | |||
return true; | |||
} | |||
T Pop() | |||
T pop() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_lock(&m_mutex); | |||
@@ -207,7 +211,7 @@ public: | |||
return ret; | |||
} | |||
bool TryPop(T &ret) | |||
bool try_pop(T &ret) | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_mutex_lock(&m_mutex); | |||
@@ -255,24 +259,24 @@ private: | |||
#endif | |||
}; | |||
class ThreadBase | |||
class thread_base | |||
{ | |||
public: | |||
ThreadBase(void *(*fn)(void *), void *data) | |||
thread_base(std::function<void(void)>) | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
/* Set the joinable attribute for systems who don't play nice */ | |||
pthread_attr_t attr; | |||
pthread_attr_init(&attr); | |||
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); | |||
pthread_create(&m_thread, &attr, fn, data); | |||
pthread_create(&m_thread, &attr, trampoline, this); | |||
#elif defined _WIN32 | |||
m_thread = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)fn, | |||
data, 0, &m_tid); | |||
m_thread = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)trampoline, | |||
this, 0, &m_tid); | |||
#endif | |||
} | |||
virtual ~ThreadBase() | |||
virtual ~thread_base() | |||
{ | |||
#if defined HAVE_PTHREAD_H | |||
pthread_join(m_thread, nullptr); | |||
@@ -282,6 +286,15 @@ public: | |||
} | |||
private: | |||
static void *trampoline(void *data) | |||
{ | |||
thread_base *that = (thread_base *)data; | |||
that->m_function(); | |||
return nullptr; | |||
} | |||
std::function<void(void)> m_function; | |||
#if defined HAVE_PTHREAD_H | |||
pthread_t m_thread; | |||
#elif defined _WIN32 | |||
@@ -1,11 +1,14 @@ | |||
// | |||
// Lol Engine | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
// © 2014—2015 Benjamin "Touky" Huet <huet.benjamin@gmail.com> | |||
// | |||
// This program is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
@@ -15,35 +18,35 @@ | |||
namespace lol | |||
{ | |||
lolunit_declare_fixture(ThreadTest) | |||
lolunit_declare_fixture(thread_test) | |||
{ | |||
void SetUp() {} | |||
void TearDown() {} | |||
lolunit_declare_test(QueueTryPush) | |||
lolunit_declare_test(queue_try_push) | |||
{ | |||
Queue<int, 1> q; | |||
queue<int, 1> q; | |||
bool b1 = q.TryPush(0); | |||
bool b1 = q.try_push(0); | |||
lolunit_assert_equal(true, b1); | |||
bool b2 = q.TryPush(1); | |||
bool b2 = q.try_push(1); | |||
lolunit_assert_equal(false, b2); | |||
} | |||
lolunit_declare_test(QueueTryPop) | |||
lolunit_declare_test(queue_try_pop) | |||
{ | |||
Queue<int, 1> q; | |||
queue<int, 1> q; | |||
int tmp; | |||
q.Push(42); | |||
q.push(42); | |||
bool b1 = q.TryPop(tmp); | |||
bool b1 = q.try_pop(tmp); | |||
lolunit_assert_equal(true, b1); | |||
lolunit_assert_equal(42, tmp); | |||
bool b2 = q.TryPop(tmp); | |||
bool b2 = q.try_pop(tmp); | |||
lolunit_assert_equal(false, b2); | |||
lolunit_assert_equal(42, tmp); | |||
} | |||
@@ -1,17 +1,20 @@ | |||
// | |||
// Lol Engine | |||
// Lol Engine | |||
// | |||
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net> | |||
// This program is free software; you can redistribute it and/or | |||
// modify it under the terms of the Do What The Fuck You Want To | |||
// Public License, Version 2, as published by Sam Hocevar. See | |||
// http://www.wtfpl.net/ for more details. | |||
// Copyright © 2010—2015 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// This library is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
#include <cstdlib> | |||
#include <stdint.h> | |||
#include <functional> | |||
namespace lol | |||
{ | |||
@@ -44,8 +47,8 @@ public: | |||
Log::Debug("%d frames required to quit\n", frame - quitframe); | |||
#if LOL_FEATURE_THREADS | |||
gametick.Push(0); | |||
disktick.Push(0); | |||
gametick.push(0); | |||
disktick.push(0); | |||
delete gamethread; | |||
delete diskthread; | |||
#endif | |||
@@ -72,11 +75,11 @@ private: | |||
#if LOL_FEATURE_THREADS | |||
/* The associated background threads */ | |||
static void *GameThreadMain(void *p); | |||
static void *DrawThreadMain(void *p); /* unused */ | |||
static void *DiskThreadMain(void *p); | |||
Thread *gamethread, *drawthread, *diskthread; | |||
Queue<int> gametick, drawtick, disktick; | |||
void GameThreadMain(); | |||
void DrawThreadMain(); /* unused */ | |||
void DiskThreadMain(); | |||
thread *gamethread, *drawthread, *diskthread; | |||
queue<int> gametick, drawtick, disktick; | |||
#endif | |||
/* Shutdown management */ | |||
@@ -95,10 +98,10 @@ void Ticker::Register(Entity *entity) | |||
/* If we are called from its constructor, the object's vtable is not | |||
* ready yet, so we do not know which group this entity belongs to. Wait | |||
* until the first tick. */ | |||
data->m_todolist.Push(entity); | |||
data->m_todolist.push(entity); | |||
/* Objects are autoreleased by default. Put them in a list. */ | |||
data->m_autolist.Push(entity); | |||
data->m_autolist.push(entity); | |||
entity->m_autorelease = 1; | |||
entity->m_ref = 1; | |||
@@ -143,7 +146,7 @@ int Ticker::Unref(Entity *entity) | |||
} | |||
#if LOL_FEATURE_THREADS | |||
void *TickerData::GameThreadMain(void * /* p */) | |||
void TickerData::GameThreadMain() | |||
{ | |||
#if LOL_BUILD_DEBUG | |||
Log::Info("ticker game thread initialised\n"); | |||
@@ -151,27 +154,25 @@ void *TickerData::GameThreadMain(void * /* p */) | |||
for (;;) | |||
{ | |||
int tick = data->gametick.Pop(); | |||
int tick = gametick.pop(); | |||
if (!tick) | |||
break; | |||
GameThreadTick(); | |||
data->drawtick.Push(1); | |||
drawtick.push(1); | |||
} | |||
data->drawtick.Push(0); | |||
drawtick.push(0); | |||
#if LOL_BUILD_DEBUG | |||
Log::Info("ticker game thread terminated\n"); | |||
#endif | |||
return nullptr; | |||
} | |||
#endif /* LOL_FEATURE_THREADS */ | |||
#if LOL_FEATURE_THREADS | |||
void *TickerData::DrawThreadMain(void * /* p */) | |||
void TickerData::DrawThreadMain() | |||
{ | |||
#if LOL_BUILD_DEBUG | |||
Log::Info("ticker draw thread initialised\n"); | |||
@@ -179,30 +180,26 @@ void *TickerData::DrawThreadMain(void * /* p */) | |||
for (;;) | |||
{ | |||
int tick = data->drawtick.Pop(); | |||
int tick = drawtick.pop(); | |||
if (!tick) | |||
break; | |||
DrawThreadTick(); | |||
data->gametick.Push(1); | |||
gametick.push(1); | |||
} | |||
#if LOL_BUILD_DEBUG | |||
Log::Info("ticker draw thread terminated\n"); | |||
#endif | |||
return nullptr; | |||
} | |||
#endif /* LOL_FEATURE_THREADS */ | |||
#if LOL_FEATURE_THREADS | |||
void *TickerData::DiskThreadMain(void * /* p */) | |||
void TickerData::DiskThreadMain() | |||
{ | |||
/* FIXME: temporary hack to avoid crashes on the PS3 */ | |||
data->disktick.Pop(); | |||
return nullptr; | |||
disktick.pop(); | |||
} | |||
#endif /* LOL_FEATURE_THREADS */ | |||
@@ -437,17 +434,17 @@ void Ticker::Setup(float fps) | |||
data->fps = fps; | |||
#if LOL_FEATURE_THREADS | |||
data->gamethread = new Thread(TickerData::GameThreadMain, nullptr); | |||
data->gametick.Push(1); | |||
data->gamethread = new thread(std::bind(&TickerData::GameThreadMain, data)); | |||
data->gametick.push(1); | |||
data->diskthread = new Thread(TickerData::DiskThreadMain, nullptr); | |||
data->diskthread = new thread(std::bind(&TickerData::DiskThreadMain, data)); | |||
#endif | |||
} | |||
void Ticker::TickDraw() | |||
{ | |||
#if LOL_FEATURE_THREADS | |||
data->drawtick.Pop(); | |||
data->drawtick.pop(); | |||
#else | |||
TickerData::GameThreadTick(); | |||
#endif | |||
@@ -458,7 +455,7 @@ void Ticker::TickDraw() | |||
/* Signal game thread that it can carry on */ | |||
#if LOL_FEATURE_THREADS | |||
data->gametick.Push(1); | |||
data->gametick.push(1); | |||
#else | |||
TickerData::DiskThreadTick(); | |||
#endif | |||