diff deps/Platinum/ThirdParty/Neptune/Source/Core/NptThreads.h @ 0:3425707ddbf6

Initial import (hopefully this mercurial stuff works...)
author fraserofthenight
date Mon, 06 Jul 2009 08:06:28 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Source/Core/NptThreads.h	Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,281 @@
+/*****************************************************************
+|
+|   Neptune - Threads
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+|     * Redistributions of source code must retain the above copyright
+|       notice, this list of conditions and the following disclaimer.
+|     * Redistributions in binary form must reproduce the above copyright
+|       notice, this list of conditions and the following disclaimer in the
+|       documentation and/or other materials provided with the distribution.
+|     * Neither the name of Axiomatic Systems nor the
+|       names of its contributors may be used to endorse or promote products
+|       derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NPT_THREADS_H_
+#define _NPT_THREADS_H_
+
+/*----------------------------------------------------------------------
+|   includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptInterfaces.h"
+
+/*----------------------------------------------------------------------
+|   error codes
++---------------------------------------------------------------------*/
+const int NPT_ERROR_CALLBACK_HANDLER_SHUTDOWN = NPT_ERROR_BASE_THREADS-0;
+const int NPT_ERROR_CALLBACK_NOTHING_PENDING  = NPT_ERROR_BASE_THREADS-1;
+
+/*----------------------------------------------------------------------
+|   NPT_MutexInterface
++---------------------------------------------------------------------*/
+class NPT_MutexInterface
+{
+ public:
+    // methods
+    virtual           ~NPT_MutexInterface() {}
+    virtual NPT_Result Lock()   = 0;
+    virtual NPT_Result Unlock() = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_Mutex
++---------------------------------------------------------------------*/
+class NPT_Mutex : public NPT_MutexInterface
+{
+ public:
+    // methods
+               NPT_Mutex();
+              ~NPT_Mutex() { delete m_Delegate; }
+    NPT_Result Lock()   { return m_Delegate->Lock();   }
+    NPT_Result Unlock() { return m_Delegate->Unlock(); }
+
+ private:
+    // members
+    NPT_MutexInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_AutoLock
++---------------------------------------------------------------------*/
+class NPT_AutoLock
+{
+ public:
+    // methods
+     NPT_AutoLock(NPT_Mutex &mutex) : m_Mutex(mutex)   {
+        m_Mutex.Lock();
+    }
+    ~NPT_AutoLock() {
+        m_Mutex.Unlock(); 
+    }
+        
+ private:
+    // members
+    NPT_Mutex& m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_Lock
++---------------------------------------------------------------------*/
+template <typename T> 
+class NPT_Lock : public T,
+                 public NPT_Mutex
+{
+};
+
+/*----------------------------------------------------------------------
+|   NPT_SharedVariableInterface
++---------------------------------------------------------------------*/
+class NPT_SharedVariableInterface
+{
+ public:
+    // methods
+    virtual           ~NPT_SharedVariableInterface() {}
+    virtual void       SetValue(int value)= 0;
+    virtual int        GetValue()         = 0;
+    virtual NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+    virtual NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_SharedVariable
++---------------------------------------------------------------------*/
+class NPT_SharedVariable : public NPT_SharedVariableInterface
+{
+ public:
+    // methods
+               NPT_SharedVariable(int value = 0);
+              ~NPT_SharedVariable() { delete m_Delegate; }
+    void SetValue(int value) { 
+        m_Delegate->SetValue(value); 
+    }
+    int GetValue() { 
+        return m_Delegate->GetValue(); 
+    }
+    NPT_Result WaitUntilEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) { 
+        return m_Delegate->WaitUntilEquals(value, timeout); 
+    }
+    NPT_Result WaitWhileEquals(int value, NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) { 
+        return m_Delegate->WaitWhileEquals(value, timeout); 
+    }
+
+ private:
+    // members
+    NPT_SharedVariableInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_AtomicVariableInterface
++---------------------------------------------------------------------*/
+class NPT_AtomicVariableInterface
+{
+ public:
+    // methods
+    virtual      ~NPT_AtomicVariableInterface() {}
+    virtual  int  Increment() = 0;
+    virtual  int  Decrement() = 0;
+    virtual  int  GetValue()  = 0;
+    virtual  void SetValue(int value)  = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_AtomicVariable
++---------------------------------------------------------------------*/
+class NPT_AtomicVariable : public NPT_AtomicVariableInterface
+{
+ public:
+    // methods
+         NPT_AtomicVariable(int value = 0);
+        ~NPT_AtomicVariable() { delete m_Delegate;             }
+    int  Increment()          { return m_Delegate->Increment();}
+    int  Decrement()          { return m_Delegate->Decrement();}
+    void SetValue(int value)  { m_Delegate->SetValue(value);   }
+    int  GetValue()           { return m_Delegate->GetValue(); }
+
+ private:
+    // members
+    NPT_AtomicVariableInterface* m_Delegate;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_Runnable
++---------------------------------------------------------------------*/
+class NPT_Runnable
+{
+public:
+    virtual ~NPT_Runnable() {}  
+    virtual void Run() = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_ThreadInterface
++---------------------------------------------------------------------*/
+class NPT_ThreadInterface: public NPT_Runnable, public NPT_Interruptible
+{
+ public:
+    // methods
+    virtual           ~NPT_ThreadInterface() {}
+    virtual NPT_Result Start() = 0;
+    virtual NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE)  = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_Thread
++---------------------------------------------------------------------*/
+class NPT_Thread : public NPT_ThreadInterface
+{
+ public:
+    // types
+    typedef unsigned long ThreadId;
+
+    // class methods
+    static ThreadId GetCurrentThreadId();
+
+    // methods
+    explicit NPT_Thread(bool detached = false);
+    explicit NPT_Thread(NPT_Runnable& target, bool detached = false);
+   ~NPT_Thread() { delete m_Delegate; }
+
+    // NPT_ThreadInterface methods
+    NPT_Result Start() { 
+        return m_Delegate->Start(); 
+    } 
+    NPT_Result Wait(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE)  { 
+        return m_Delegate->Wait(timeout);  
+    }
+
+    // NPT_Runnable methods
+    virtual void Run() {}
+
+    // NPT_Interruptible methods
+    virtual NPT_Result Interrupt() { return m_Delegate->Interrupt(); }
+
+ private:
+    // members
+    NPT_ThreadInterface* m_Delegate;
+};
+
+
+/*----------------------------------------------------------------------
+|   NPT_ThreadCallbackReceiver
++---------------------------------------------------------------------*/
+class NPT_ThreadCallbackReceiver
+{
+public:
+    virtual ~NPT_ThreadCallbackReceiver() {}
+    virtual void OnCallback(void* args) = 0;
+};
+
+/*----------------------------------------------------------------------
+|   NPT_ThreadCallbackSlot
++---------------------------------------------------------------------*/
+class NPT_ThreadCallbackSlot
+{
+public:
+    // types
+    class NotificationHelper {
+    public:
+        virtual ~NotificationHelper() {};
+        virtual void Notify(void) = 0;
+    };
+
+    // constructor
+    NPT_ThreadCallbackSlot();
+
+    // methods
+    NPT_Result ReceiveCallback(NPT_ThreadCallbackReceiver& receiver, NPT_Timeout timeout = 0);
+    NPT_Result SendCallback(void* args);
+    NPT_Result SetNotificationHelper(NotificationHelper* helper);
+    NPT_Result Shutdown();
+
+protected:
+    // members
+    volatile void*      m_CallbackArgs;
+    volatile bool       m_Shutdown;
+    NPT_SharedVariable  m_Pending;
+    NPT_SharedVariable  m_Ack;
+    NPT_Mutex           m_ReadLock;
+    NPT_Mutex           m_WriteLock;
+    NotificationHelper* m_NotificationHelper;
+};
+
+#endif // _NPT_THREADS_H_