From e4bff8be94c0db4f94e63ad448d0eeb869ccdbbd Mon Sep 17 00:00:00 2001 From: ShadowNinja Date: Tue, 7 Apr 2015 06:13:12 -0400 Subject: Clean up threading * Rename everything. * Strip J prefix. * Change UpperCamelCase functions to lowerCamelCase. * Remove global (!) semaphore count mutex on OSX. * Remove semaphore count getter (unused, unsafe, depended on internal API functions on Windows, and used a hack on OSX). * Add `Atomic`. * Make `Thread` handle thread names. * Add support for C++11 multi-threading. * Combine pthread and win32 sources. * Remove `ThreadStarted` (unused, unneeded). * Move some includes from the headers to the sources. * Move all of `Event` into its header (allows inlining with no new includes). * Make `Event` use `Semaphore` (except on Windows). * Move some porting functions into `Thread`. * Integrate logging with `Thread`. * Add threading test. --- src/jthread/win32/jevent.cpp | 43 ------------ src/jthread/win32/jmutex.cpp | 68 ------------------ src/jthread/win32/jsemaphore.cpp | 104 ---------------------------- src/jthread/win32/jthread.cpp | 146 --------------------------------------- 4 files changed, 361 deletions(-) delete mode 100644 src/jthread/win32/jevent.cpp delete mode 100644 src/jthread/win32/jmutex.cpp delete mode 100644 src/jthread/win32/jsemaphore.cpp delete mode 100755 src/jthread/win32/jthread.cpp (limited to 'src/jthread/win32') diff --git a/src/jthread/win32/jevent.cpp b/src/jthread/win32/jevent.cpp deleted file mode 100644 index 67b468f01..000000000 --- a/src/jthread/win32/jevent.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - - This file is a part of the JThread package, which contains some object- - oriented thread wrappers for different thread implementations. - - Copyright (c) 2000-2006 Jori Liesenborgs (jori.liesenborgs@gmail.com) - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -*/ -#include "jthread/jevent.h" - -Event::Event() { - hEvent = CreateEvent(NULL, 0, 0, NULL); -} - -Event::~Event() { - CloseHandle(hEvent); -} - -void Event::wait() { - WaitForSingleObject(hEvent, INFINITE); -} - -void Event::signal() { - SetEvent(hEvent); -} diff --git a/src/jthread/win32/jmutex.cpp b/src/jthread/win32/jmutex.cpp deleted file mode 100644 index b9f5e0e73..000000000 --- a/src/jthread/win32/jmutex.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - - This file is a part of the JThread package, which contains some object- - oriented thread wrappers for different thread implementations. - - Copyright (c) 2000-2006 Jori Liesenborgs (jori.liesenborgs@gmail.com) - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -*/ -#include -#include "jthread/jmutex.h" - -JMutex::JMutex() -{ -#ifdef JMUTEX_CRITICALSECTION - InitializeCriticalSection(&mutex); -#else - mutex = CreateMutex(NULL,FALSE,NULL); - assert(mutex != NULL); -#endif // JMUTEX_CRITICALSECTION -} - -JMutex::~JMutex() -{ -#ifdef JMUTEX_CRITICALSECTION - DeleteCriticalSection(&mutex); -#else - CloseHandle(mutex); -#endif // JMUTEX_CRITICALSECTION -} - -int JMutex::Lock() -{ -#ifdef JMUTEX_CRITICALSECTION - EnterCriticalSection(&mutex); -#else - WaitForSingleObject(mutex,INFINITE); -#endif // JMUTEX_CRITICALSECTION - return 0; -} - -int JMutex::Unlock() -{ -#ifdef JMUTEX_CRITICALSECTION - LeaveCriticalSection(&mutex); -#else - ReleaseMutex(mutex); -#endif // JMUTEX_CRITICALSECTION - return 0; -} - diff --git a/src/jthread/win32/jsemaphore.cpp b/src/jthread/win32/jsemaphore.cpp deleted file mode 100644 index 27a11e819..000000000 --- a/src/jthread/win32/jsemaphore.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* -Minetest -Copyright (C) 2013 sapier, < sapier AT gmx DOT net > - -This program 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 program 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 program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include "jthread/jsemaphore.h" - -JSemaphore::JSemaphore() { - m_hSemaphore = CreateSemaphore( - 0, - 0, - MAX_SEMAPHORE_COUNT, - 0); -} - -JSemaphore::~JSemaphore() { - CloseHandle(m_hSemaphore); -} - -JSemaphore::JSemaphore(int initval) { - m_hSemaphore = CreateSemaphore( - 0, - initval, - MAX_SEMAPHORE_COUNT, - 0); -} - -void JSemaphore::Post() { - ReleaseSemaphore( - m_hSemaphore, - 1, - 0); -} - -void JSemaphore::Wait() { - WaitForSingleObject( - m_hSemaphore, - INFINITE); -} - -bool JSemaphore::Wait(unsigned int time_ms) { - unsigned int retval = WaitForSingleObject( - m_hSemaphore, - time_ms); - - if (retval == WAIT_OBJECT_0) - { - return true; - } - else { - assert(retval == WAIT_TIMEOUT); - return false; - } -} - -typedef LONG (NTAPI *_NtQuerySemaphore)( - HANDLE SemaphoreHandle, - DWORD SemaphoreInformationClass, - PVOID SemaphoreInformation, - ULONG SemaphoreInformationLength, - PULONG ReturnLength OPTIONAL -); - -typedef struct _SEMAPHORE_BASIC_INFORMATION { - ULONG CurrentCount; - ULONG MaximumCount; -} SEMAPHORE_BASIC_INFORMATION; - -/* Note: this will only work as long as jthread is directly linked to application */ -/* it's gonna fail if someone tries to build jthread as dll */ -static _NtQuerySemaphore NtQuerySemaphore = - (_NtQuerySemaphore) - GetProcAddress - (GetModuleHandle ("ntdll.dll"), "NtQuerySemaphore"); - -int JSemaphore::GetValue() { - SEMAPHORE_BASIC_INFORMATION BasicInfo; - LONG retval; - - assert(NtQuerySemaphore); - - retval = NtQuerySemaphore (m_hSemaphore, 0, - &BasicInfo, sizeof (SEMAPHORE_BASIC_INFORMATION), NULL); - - if (retval == ERROR_SUCCESS) - return BasicInfo.CurrentCount; - - assert("unable to read semaphore count" == 0); - return 0; -} - diff --git a/src/jthread/win32/jthread.cpp b/src/jthread/win32/jthread.cpp deleted file mode 100755 index b523d664c..000000000 --- a/src/jthread/win32/jthread.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - - This file is a part of the JThread package, which contains some object- - oriented thread wrappers for different thread implementations. - - Copyright (c) 2000-2006 Jori Liesenborgs (jori.liesenborgs@gmail.com) - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -*/ - -#include "jthread/jthread.h" -#include -#define UNUSED(expr) do { (void)(expr); } while (0) -#ifndef _WIN32_WCE - #include -#endif // _WIN32_WCE - -JThread::JThread() -{ - retval = NULL; - requeststop = false; - running = false; -} - -JThread::~JThread() -{ - Kill(); -} - -void JThread::Wait() { - if (running) - { - WaitForSingleObject(threadhandle, INFINITE); - } -} - -int JThread::Start() -{ - if (running) - { - return ERR_JTHREAD_ALREADYRUNNING; - } - requeststop = false; - - continuemutex.Lock(); -#ifndef _WIN32_WCE - threadhandle = (HANDLE)_beginthreadex(NULL,0,TheThread,this,0,&threadid); -#else - threadhandle = CreateThread(NULL,0,TheThread,this,0,&threadid); -#endif // _WIN32_WCE - if (threadhandle == NULL) - { - continuemutex.Unlock(); - return ERR_JTHREAD_CANTSTARTTHREAD; - } - - /* Wait until 'running' is set */ - while (!running) - { - Sleep(1); - } - - continuemutex.Unlock(); - - continuemutex2.Lock(); - continuemutex2.Unlock(); - - return 0; -} - -int JThread::Kill() -{ - if (!running) - { - return ERR_JTHREAD_NOTRUNNING; - } - TerminateThread(threadhandle,0); - CloseHandle(threadhandle); - running = false; - return 0; -} - -void *JThread::GetReturnValue() -{ - void *val; - - if (running) { - val = NULL; - } else { - val = retval; - } - return val; -} - -bool JThread::IsSameThread() -{ - return GetCurrentThreadId() == threadid; -} - -#ifndef _WIN32_WCE -UINT __stdcall JThread::TheThread(void *param) -#else -DWORD WINAPI JThread::TheThread(void *param) -#endif // _WIN32_WCE -{ - JThread *jthread; - void *ret; - - jthread = (JThread *)param; - - jthread->continuemutex2.Lock(); - jthread->running = true; - - jthread->continuemutex.Lock(); - jthread->continuemutex.Unlock(); - - ret = jthread->Thread(); - - jthread->running = false; - jthread->retval = ret; - CloseHandle(jthread->threadhandle); - return 0; -} - -void JThread::ThreadStarted() -{ - continuemutex2.Unlock(); -} - -- cgit v1.2.3