OSDN Git Service

Implemented fatal_exit() and exception handler macros.
[mutilities/MUtilities.git] / src / CriticalSection_Win32.h
diff --git a/src/CriticalSection_Win32.h b/src/CriticalSection_Win32.h
new file mode 100644 (file)
index 0000000..e6f7b84
--- /dev/null
@@ -0,0 +1,98 @@
+///////////////////////////////////////////////////////////////////////////////
+// MuldeR's Utilities for Qt
+// Copyright (C) 2004-2014 LoRd_MuldeR <MuldeR2@GMX.de>
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//
+// http://www.gnu.org/licenses/lgpl-2.1.txt
+//////////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+//Win32 API
+#define WIN32_LEAN_AND_MEAN 1
+#include <Windows.h>
+
+///////////////////////////////////////////////////////////////////////////////
+// CRITICAL SECTION
+///////////////////////////////////////////////////////////////////////////////
+
+/*
+ * wrapper for native Win32 critical sections
+ */
+class CriticalSection
+{
+public:
+       inline CriticalSection(void)
+       {
+               InitializeCriticalSection(&m_win32criticalSection);
+       }
+
+       inline ~CriticalSection(void)
+       {
+               DeleteCriticalSection(&m_win32criticalSection);
+       }
+
+       inline void enter(void)
+       {
+               EnterCriticalSection(&m_win32criticalSection);
+       }
+
+       inline bool tryEnter(void)
+       {
+               return TryEnterCriticalSection(&m_win32criticalSection);
+       }
+
+       inline void leave(void)
+       {
+               LeaveCriticalSection(&m_win32criticalSection);
+       }
+
+protected:
+       CRITICAL_SECTION m_win32criticalSection;
+};
+
+/*
+ * RAII-style critical section locker
+ */
+class CSLocker
+{
+public:
+       inline CSLocker(CriticalSection &criticalSection)
+       :
+               m_locked(false),
+               m_criticalSection(criticalSection)
+       {
+               m_criticalSection.enter();
+               m_locked = true;
+       }
+
+       inline ~CSLocker(void)
+       {
+               forceUnlock();
+       }
+
+       inline void forceUnlock(void)
+       {
+               if(m_locked)
+               {
+                       m_criticalSection.leave();
+                       m_locked = false;
+               }
+       }
+protected:
+       volatile bool m_locked;
+       CriticalSection &m_criticalSection;
+};