Fix warnings reported by clang
[oweals/minetest.git] / src / jthread / jthread.h
index 798750ebbe650868e133c6c42fe08bb919b97675..89743a3e3857eab100e739f8d63f9ab0ee14fe92 100644 (file)
 */
 
 #ifndef JTHREAD_H
-
 #define JTHREAD_H
 
+#if __cplusplus >= 201103L
+#include <atomic>
+#endif
+
 #include "jthread/jmutex.h"
 
 #define ERR_JTHREAD_CANTINITMUTEX                                              -1
@@ -43,13 +46,23 @@ public:
        JThread();
        virtual ~JThread();
        int Start();
-       void Stop();
+       inline void Stop()
+               { requeststop = true; }
        int Kill();
        virtual void *Thread() = 0;
-       bool IsRunning();
-       bool StopRequested();
+       inline bool IsRunning()
+               { return running; }
+       inline bool StopRequested()
+               { return requeststop; }
        void *GetReturnValue();
        bool IsSameThread();
+
+       /*
+        * Wait for thread to finish
+        * Note: this does not stop a thread you have to do this on your own
+        * WARNING: never ever call this on a thread not started or already killed!
+        */
+       void Wait();
 protected:
        void ThreadStarted();
 private:
@@ -67,12 +80,36 @@ private:
        static void *TheThread(void *param);
 
        pthread_t threadid;
+
+       /*
+        * reading and writing bool values is atomic on all relevant architectures
+        * ( x86 + arm ). No need to waste time for locking here.
+        * once C++11 is supported we can tell compiler to handle cpu caches correct
+        * too. This should cause additional improvement (and silence thread
+        * concurrency check tools.
+        */
+#if __cplusplus >= 201103L
+       std::atomic_bool started;
+#else
+       bool started;
+#endif
 #endif // WIN32
        void *retval;
+       /*
+        * reading and writing bool values is atomic on all relevant architectures
+        * ( x86 + arm ). No need to waste time for locking here.
+        * once C++11 is supported we can tell compiler to handle cpu caches correct
+        * too. This should cause additional improvement (and silence thread
+        * concurrency check tools.
+        */
+#if __cplusplus >= 201103L
+       std::atomic_bool running;
+       std::atomic_bool requeststop;
+#else
        bool running;
        bool requeststop;
+#endif
 
-       JMutex runningmutex;
        JMutex continuemutex,continuemutex2;
 };