]> git.lizzy.rs Git - minetest.git/blobdiff - src/util/thread.h
Fix *BSD build with GNU iconv
[minetest.git] / src / util / thread.h
index 70d41aeb982b4c1c21e6a536cf54b8c180ecda0a..eda9c0ca2021193fe1ebdb912aabbea221311ac9 100644 (file)
@@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "../jthread/jthread.h"
 #include "../jthread/jmutex.h"
 #include "../jthread/jmutexautolock.h"
+#include "porting.h"
 
 template<typename T>
 class MutexedVariable
@@ -32,7 +33,6 @@ class MutexedVariable
        MutexedVariable(T value):
                m_value(value)
        {
-               m_mutex.Init();
        }
 
        T get()
@@ -60,54 +60,9 @@ class MutexedVariable
        JMutex m_mutex;
 };
 
-/*
-       A base class for simple background thread implementation
-*/
-
-class SimpleThread : public JThread
-{
-       bool run;
-       JMutex run_mutex;
-
-public:
-
-       SimpleThread():
-               JThread(),
-               run(true)
-       {
-               run_mutex.Init();
-       }
-
-       virtual ~SimpleThread()
-       {}
-
-       virtual void * Thread() = 0;
-
-       bool getRun()
-       {
-               JMutexAutoLock lock(run_mutex);
-               return run;
-       }
-       void setRun(bool a_run)
-       {
-               JMutexAutoLock lock(run_mutex);
-               run = a_run;
-       }
-
-       void stop()
-       {
-               setRun(false);
-               while(IsRunning())
-                       sleep_ms(100);
-       }
-};
-
 /*
        A single worker thread - multiple client threads queue framework.
 */
-
-
-
 template<typename Key, typename T, typename Caller, typename CallerData>
 class GetResult
 {
@@ -150,6 +105,13 @@ class GetRequest
        std::list<CallerInfo<Caller, CallerData, Key, T> > callers;
 };
 
+/**
+ * Notes for RequestQueue usage
+ * @param Key unique key to identify a request for a specific resource
+ * @param T ?
+ * @param Caller unique id of calling thread
+ * @param CallerData data passed back to caller
+ */
 template<typename Key, typename T, typename Caller, typename CallerData>
 class RequestQueue
 {
@@ -162,36 +124,38 @@ class RequestQueue
        void add(Key key, Caller caller, CallerData callerdata,
                        ResultQueue<Key, T, Caller, CallerData> *dest)
        {
-               JMutexAutoLock lock(m_queue.getMutex());
-               
-               /*
-                       If the caller is already on the list, only update CallerData
-               */
-               for(typename std::list< GetRequest<Key, T, Caller, CallerData> >::iterator
-                               i = m_queue.getList().begin();
-                               i != m_queue.getList().end(); ++i)
                {
-                       GetRequest<Key, T, Caller, CallerData> &request = *i;
-
-                       if(request.key == key)
+                       JMutexAutoLock lock(m_queue.getMutex());
+
+                       /*
+                               If the caller is already on the list, only update CallerData
+                       */
+                       for(typename std::deque< GetRequest<Key, T, Caller, CallerData> >::iterator
+                                       i = m_queue.getQueue().begin();
+                                       i != m_queue.getQueue().end(); ++i)
                        {
-                               for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
-                                               i = request.callers.begin();
-                                               i != request.callers.end(); ++i)
+                               GetRequest<Key, T, Caller, CallerData> &request = *i;
+
+                               if(request.key == key)
                                {
-                                       CallerInfo<Caller, CallerData, Key, T> &ca = *i;
-                                       if(ca.caller == caller)
+                                       for(typename std::list< CallerInfo<Caller, CallerData, Key, T> >::iterator
+                                                       i = request.callers.begin();
+                                                       i != request.callers.end(); ++i)
                                        {
-                                               ca.data = callerdata;
-                                               return;
+                                               CallerInfo<Caller, CallerData, Key, T> &ca = *i;
+                                               if(ca.caller == caller)
+                                               {
+                                                       ca.data = callerdata;
+                                                       return;
+                                               }
                                        }
+                                       CallerInfo<Caller, CallerData, Key, T> ca;
+                                       ca.caller = caller;
+                                       ca.data = callerdata;
+                                       ca.dest = dest;
+                                       request.callers.push_back(ca);
+                                       return;
                                }
-                               CallerInfo<Caller, CallerData, Key, T> ca;
-                               ca.caller = caller;
-                               ca.data = callerdata;
-                               ca.dest = dest;
-                               request.callers.push_back(ca);
-                               return;
                        }
                }
 
@@ -207,12 +171,17 @@ class RequestQueue
                ca.dest = dest;
                request.callers.push_back(ca);
                
-               m_queue.getList().push_back(request);
+               m_queue.push_back(request);
+       }
+
+       GetRequest<Key, T, Caller, CallerData> pop(unsigned int timeout_ms)
+       {
+               return m_queue.pop_front(timeout_ms);
        }
 
-       GetRequest<Key, T, Caller, CallerData> pop(bool wait_if_empty=false)
+       GetRequest<Key, T, Caller, CallerData> pop()
        {
-               return m_queue.pop_front(wait_if_empty);
+               return m_queue.pop_frontNoEx();
        }
 
        void pushResult(GetRequest<Key, T, Caller, CallerData> req,