X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fthread.h;h=73e9beb806f44d8effc6dd8e3a3bec3f82adf23f;hb=e8fd1ce62331146fae0e98ce4a94d3720f308abf;hp=faa5869ca8981bc5aa44e0e1964fead235abe71a;hpb=29dda9f356042c403b3b7da1d717d32b45c9b6de;p=oweals%2Fminetest.git diff --git a/src/util/thread.h b/src/util/thread.h index faa5869ca..73e9beb80 100644 --- a/src/util/thread.h +++ b/src/util/thread.h @@ -17,56 +17,46 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef UTIL_THREAD_HEADER -#define UTIL_THREAD_HEADER +#pragma once -#include "../irrlichttypes.h" -#include "../jthread/jthread.h" -#include "../jthread/jmutex.h" -#include "../jthread/jmutexautolock.h" +#include "irrlichttypes.h" +#include "threading/thread.h" +#include "threading/mutex_auto_lock.h" #include "porting.h" #include "log.h" +#include "container.h" template class MutexedVariable { public: - MutexedVariable(T value): + MutexedVariable(const T &value): m_value(value) - { - } + {} T get() { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); return m_value; } - void set(T value) + void set(const T &value) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); m_value = value; } - - // You'll want to grab this in a SharedPtr - JMutexAutoLock * getLock() - { - return new JMutexAutoLock(m_mutex); - } - + // You pretty surely want to grab the lock when accessing this T m_value; - private: - JMutex m_mutex; + std::mutex m_mutex; }; /* A single worker thread - multiple client threads queue framework. */ template -class GetResult -{ +class GetResult { public: Key key; T item; @@ -74,34 +64,27 @@ public: }; template -class ResultQueue: public MutexedQueue< GetResult > -{ +class ResultQueue : public MutexedQueue > { }; template -class CallerInfo -{ +class CallerInfo { public: Caller caller; Data data; - ResultQueue< Key, T, Caller, Data>* dest; + ResultQueue *dest; }; template -class GetRequest -{ +class GetRequest { public: - GetRequest() - { - } - GetRequest(Key a_key) - { - key = a_key; - } - ~GetRequest() + GetRequest() = default; + ~GetRequest() = default; + + GetRequest(const Key &a_key): key(a_key) { } - + Key key; std::list > callers; }; @@ -114,49 +97,44 @@ public: * @param CallerData data passed back to caller */ template -class RequestQueue -{ +class RequestQueue { public: bool empty() { return m_queue.empty(); } - void add(Key key, Caller caller, CallerData callerdata, - ResultQueue *dest) + void add(const Key &key, Caller caller, CallerData callerdata, + ResultQueue *dest) { + typename std::deque >::iterator i; + typename std::list >::iterator j; + { - JMutexAutoLock lock(m_queue.getMutex()); + MutexAutoLock lock(m_queue.getMutex()); /* If the caller is already on the list, only update CallerData */ - for(typename std::deque< GetRequest >::iterator - i = m_queue.getQueue().begin(); - i != m_queue.getQueue().end(); ++i) - { + for (i = m_queue.getQueue().begin(); i != m_queue.getQueue().end(); ++i) { GetRequest &request = *i; - - if(request.key == key) - { - for(typename std::list< CallerInfo >::iterator - i = request.callers.begin(); - i != request.callers.end(); ++i) - { - CallerInfo &ca = *i; - if(ca.caller == caller) - { - ca.data = callerdata; - return; - } + if (request.key != key) + continue; + + for (j = request.callers.begin(); j != request.callers.end(); ++j) { + CallerInfo &ca = *j; + if (ca.caller == caller) { + ca.data = callerdata; + return; } - CallerInfo ca; - ca.caller = caller; - ca.data = callerdata; - ca.dest = dest; - request.callers.push_back(ca); - return; } + + CallerInfo ca; + ca.caller = caller; + ca.data = callerdata; + ca.dest = dest; + request.callers.push_back(ca); + return; } } @@ -171,7 +149,7 @@ public: ca.data = callerdata; ca.dest = dest; request.callers.push_back(ca); - + m_queue.push_back(request); } @@ -185,13 +163,11 @@ public: return m_queue.pop_frontNoEx(); } - void pushResult(GetRequest req, - T res) { - - for(typename std::list< CallerInfo >::iterator + void pushResult(GetRequest req, T res) + { + for (typename std::list >::iterator i = req.callers.begin(); - i != req.callers.end(); ++i) - { + i != req.callers.end(); ++i) { CallerInfo &ca = *i; GetResult result; @@ -206,68 +182,47 @@ public: } private: - MutexedQueue< GetRequest > m_queue; + MutexedQueue > m_queue; }; -class UpdateThread : public JThread +class UpdateThread : public Thread { -private: - JSemaphore m_update_sem; - -protected: - virtual void doUpdate() = 0; - virtual const char *getName() = 0; - public: - UpdateThread() - { - } - ~UpdateThread() - {} + UpdateThread(const std::string &name) : Thread(name + "Update") {} + ~UpdateThread() = default; - void deferUpdate() - { - m_update_sem.Post(); - } + void deferUpdate() { m_update_sem.post(); } - void Stop() + void stop() { - JThread::Stop(); + Thread::stop(); // give us a nudge - m_update_sem.Post(); + m_update_sem.post(); } - void *Thread() + void *run() { - ThreadStarted(); - - const char *thread_name = getName(); - - log_register_thread(thread_name); - - DSTACK(__FUNCTION_NAME); - BEGIN_DEBUG_EXCEPTION_HANDLER - porting::setThreadName(thread_name); - - while (!StopRequested()) { - - m_update_sem.Wait(); - - // Empty the queue, just in case doUpdate() is expensive - while (m_update_sem.GetValue()) m_update_sem.Wait(); + while (!stopRequested()) { + m_update_sem.wait(); + // Set semaphore to 0 + while (m_update_sem.wait(0)); - if (StopRequested()) break; + if (stopRequested()) break; doUpdate(); } - END_DEBUG_EXCEPTION_HANDLER(errorstream) + + END_DEBUG_EXCEPTION_HANDLER return NULL; } -}; -#endif +protected: + virtual void doUpdate() = 0; +private: + Semaphore m_update_sem; +};