--- /dev/null
+///////////////////////////////////////////////////////////////////////////////
+// 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;
+};