diff options
author | ShadowNinja <shadowninja@minetest.net> | 2015-04-07 06:13:12 -0400 |
---|---|---|
committer | ShadowNinja <shadowninja@minetest.net> | 2015-08-23 22:04:06 -0400 |
commit | e4bff8be94c0db4f94e63ad448d0eeb869ccdbbd (patch) | |
tree | 7935586e79da5c8c7144e345a8c0fc1cda53beed /src/jthread | |
parent | 6a1047d8c116f793890b63427d53f04ceca95d54 (diff) | |
download | minetest-e4bff8be94c0db4f94e63ad448d0eeb869ccdbbd.tar.gz minetest-e4bff8be94c0db4f94e63ad448d0eeb869ccdbbd.tar.bz2 minetest-e4bff8be94c0db4f94e63ad448d0eeb869ccdbbd.zip |
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<type>`.
* 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.
Diffstat (limited to 'src/jthread')
-rw-r--r-- | src/jthread/CMakeLists.txt | 14 | ||||
-rw-r--r-- | src/jthread/LICENSE.MIT | 20 | ||||
-rw-r--r-- | src/jthread/jevent.h | 59 | ||||
-rw-r--r-- | src/jthread/jmutex.h | 79 | ||||
-rw-r--r-- | src/jthread/jmutexautolock.h | 43 | ||||
-rw-r--r-- | src/jthread/jsemaphore.h | 64 | ||||
-rw-r--r-- | src/jthread/jthread.h | 117 | ||||
-rw-r--r-- | src/jthread/pthread/jevent.cpp | 67 | ||||
-rw-r--r-- | src/jthread/pthread/jmutex.cpp | 58 | ||||
-rw-r--r-- | src/jthread/pthread/jsemaphore.cpp | 156 | ||||
-rw-r--r-- | src/jthread/pthread/jthread.cpp | 168 | ||||
-rw-r--r-- | src/jthread/win32/jevent.cpp | 43 | ||||
-rw-r--r-- | src/jthread/win32/jmutex.cpp | 68 | ||||
-rw-r--r-- | src/jthread/win32/jsemaphore.cpp | 104 | ||||
-rwxr-xr-x | src/jthread/win32/jthread.cpp | 146 |
15 files changed, 0 insertions, 1206 deletions
diff --git a/src/jthread/CMakeLists.txt b/src/jthread/CMakeLists.txt deleted file mode 100644 index cebb35caa..000000000 --- a/src/jthread/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -if(UNIX) - set(THREAD_SYS_DIR pthread) -else() - set(THREAD_SYS_DIR win32) -endif() - -set(SRC_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/${THREAD_SYS_DIR}) -set(JTHREAD_SRCS - ${SRC_PREFIX}/jmutex.cpp - ${SRC_PREFIX}/jthread.cpp - ${SRC_PREFIX}/jsemaphore.cpp - ${SRC_PREFIX}/jevent.cpp - PARENT_SCOPE) - diff --git a/src/jthread/LICENSE.MIT b/src/jthread/LICENSE.MIT deleted file mode 100644 index 2aa4fd57b..000000000 --- a/src/jthread/LICENSE.MIT +++ /dev/null @@ -1,20 +0,0 @@ -The license of JThread: - -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. - diff --git a/src/jthread/jevent.h b/src/jthread/jevent.h deleted file mode 100644 index 9ea7ebde8..000000000 --- a/src/jthread/jevent.h +++ /dev/null @@ -1,59 +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. - -*/ - -#ifndef JEVENT_H_ -#define JEVENT_H_ - -#ifdef _WIN32 -#include <windows.h> -#elif defined(__MACH__) && defined(__APPLE__) -#include <mach/mach.h> -#include <mach/task.h> -#include <mach/semaphore.h> -#include <sys/semaphore.h> -#else -#include <semaphore.h> -#endif - - -class Event { -#ifdef _WIN32 - HANDLE hEvent; -#elif defined(__MACH__) && defined(__APPLE__) - semaphore_t sem; -#else - sem_t sem; -#endif - -public: - Event(); - ~Event(); - void wait(); - void signal(); -}; - -#endif /* JEVENT_H_ */ diff --git a/src/jthread/jmutex.h b/src/jthread/jmutex.h deleted file mode 100644 index e57cd8a43..000000000 --- a/src/jthread/jmutex.h +++ /dev/null @@ -1,79 +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. - -*/ - -#ifndef JMUTEX_H - -#define JMUTEX_H - -#if (defined(WIN32) || defined(_WIN32_WCE)) - #ifndef _WIN32_WINNT - #define _WIN32_WINNT 0x0501 - #endif - #ifndef _WIN32_WCE - #include <process.h> - #endif // _WIN32_WCE - #include <winsock2.h> - #include <windows.h> - // CriticalSection is way faster than the alternative - #define JMUTEX_CRITICALSECTION -#else // using pthread - #include <pthread.h> -#endif // WIN32 - -#define ERR_JMUTEX_ALREADYINIT -1 -#define ERR_JMUTEX_NOTINIT -2 -#define ERR_JMUTEX_CANTCREATEMUTEX -3 - -class JMutex -{ -public: - JMutex(); - ~JMutex(); - int Lock(); - int Unlock(); - -private: -#if (defined(WIN32) || defined(_WIN32_WCE)) -#ifdef JMUTEX_CRITICALSECTION - CRITICAL_SECTION mutex; -#else // Use standard mutex - HANDLE mutex; -#endif // JMUTEX_CRITICALSECTION -#else // pthread mutex - pthread_mutex_t mutex; - - bool IsLocked() { - if (pthread_mutex_trylock(&mutex)) { - pthread_mutex_unlock(&mutex); - return true; - } - return false; - } -#endif // WIN32 -}; - -#endif // JMUTEX_H diff --git a/src/jthread/jmutexautolock.h b/src/jthread/jmutexautolock.h deleted file mode 100644 index 6020a5c33..000000000 --- a/src/jthread/jmutexautolock.h +++ /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. - -*/ - -#ifndef JMUTEXAUTOLOCK_H - -#define JMUTEXAUTOLOCK_H - -#include "jmutex.h" - -class JMutexAutoLock -{ -public: - JMutexAutoLock(JMutex &m) : mutex(m) { mutex.Lock(); } - ~JMutexAutoLock() { mutex.Unlock(); } -private: - JMutex &mutex; -}; - -#endif // JMUTEXAUTOLOCK_H diff --git a/src/jthread/jsemaphore.h b/src/jthread/jsemaphore.h deleted file mode 100644 index 32e9bc2f2..000000000 --- a/src/jthread/jsemaphore.h +++ /dev/null @@ -1,64 +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. -*/ - -#ifndef JSEMAPHORE_H_ -#define JSEMAPHORE_H_ - -#if defined(WIN32) -#include <windows.h> -#include <assert.h> -#define MAX_SEMAPHORE_COUNT 1024 -#elif defined(__MACH__) && defined(__APPLE__) -#include <pthread.h> -#include <mach/mach.h> -#include <mach/task.h> -#include <mach/semaphore.h> -#include <sys/semaphore.h> -#include <errno.h> -#include <time.h> -#else -#include <pthread.h> -#include <semaphore.h> -#endif - -class JSemaphore { -public: - JSemaphore(); - ~JSemaphore(); - JSemaphore(int initval); - - void Post(); - void Wait(); - bool Wait(unsigned int time_ms); - - int GetValue(); - -private: -#if defined(WIN32) - HANDLE m_hSemaphore; -#elif defined(__MACH__) && defined(__APPLE__) - semaphore_t m_semaphore; - int semcount; -#else - sem_t m_semaphore; -#endif -}; - - -#endif /* JSEMAPHORE_H_ */ diff --git a/src/jthread/jthread.h b/src/jthread/jthread.h deleted file mode 100644 index 89743a3e3..000000000 --- a/src/jthread/jthread.h +++ /dev/null @@ -1,117 +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. - -*/ - -#ifndef JTHREAD_H -#define JTHREAD_H - -#if __cplusplus >= 201103L -#include <atomic> -#endif - -#include "jthread/jmutex.h" - -#define ERR_JTHREAD_CANTINITMUTEX -1 -#define ERR_JTHREAD_CANTSTARTTHREAD -2 -#define ERR_JTHREAD_THREADFUNCNOTSET -3 -#define ERR_JTHREAD_NOTRUNNING -4 -#define ERR_JTHREAD_ALREADYRUNNING -5 - -class JThread -{ -public: - JThread(); - virtual ~JThread(); - int Start(); - inline void Stop() - { requeststop = true; } - int Kill(); - virtual void *Thread() = 0; - 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: - -#if (defined(WIN32) || defined(_WIN32_WCE)) -#ifdef _WIN32_WCE - DWORD threadid; - static DWORD WINAPI TheThread(void *param); -#else - static UINT __stdcall TheThread(void *param); - UINT threadid; -#endif // _WIN32_WCE - HANDLE threadhandle; -#else // pthread type threads - 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 continuemutex,continuemutex2; -}; - -#endif // JTHREAD_H - diff --git a/src/jthread/pthread/jevent.cpp b/src/jthread/pthread/jevent.cpp deleted file mode 100644 index e1d40f4c1..000000000 --- a/src/jthread/pthread/jevent.cpp +++ /dev/null @@ -1,67 +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 <assert.h> -#include "jthread/jevent.h" - -#define UNUSED(expr) do { (void)(expr); } while (0) - -#if defined(__MACH__) && defined(__APPLE__) -#undef sem_t -#define sem_t semaphore_t -#undef sem_init -#define sem_init(s, p, c) semaphore_create(mach_task_self(), (s), 0, (c)) -#undef sem_wait -#define sem_wait(s) semaphore_wait(*(s)) -#undef sem_post -#define sem_post(s) semaphore_signal(*(s)) -#undef sem_destroy -#define sem_destroy(s) semaphore_destroy(mach_task_self(), *(s)) -#endif - -Event::Event() { - int sem_init_retval = sem_init(&sem, 0, 0); - assert(sem_init_retval == 0); - UNUSED(sem_init_retval); -} - -Event::~Event() { - int sem_destroy_retval = sem_destroy(&sem); - assert(sem_destroy_retval == 0); - UNUSED(sem_destroy_retval); -} - -void Event::wait() { - int sem_wait_retval = sem_wait(&sem); - assert(sem_wait_retval == 0); - UNUSED(sem_wait_retval); -} - -void Event::signal() { - int sem_post_retval = sem_post(&sem); - assert(sem_post_retval == 0); - UNUSED(sem_post_retval); -} diff --git a/src/jthread/pthread/jmutex.cpp b/src/jthread/pthread/jmutex.cpp deleted file mode 100644 index 0551b9728..000000000 --- a/src/jthread/pthread/jmutex.cpp +++ /dev/null @@ -1,58 +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 <assert.h> -#include "jthread/jmutex.h" -#define UNUSED(expr) do { (void)(expr); } while (0) -JMutex::JMutex() -{ - int mutex_init_retval = pthread_mutex_init(&mutex,NULL); - assert( mutex_init_retval == 0 ); - UNUSED(mutex_init_retval); -} - -JMutex::~JMutex() -{ - int mutex_dextroy_retval = pthread_mutex_destroy(&mutex); - assert( mutex_dextroy_retval == 0 ); - UNUSED(mutex_dextroy_retval); -} - -int JMutex::Lock() -{ - int mutex_lock_retval = pthread_mutex_lock(&mutex); - assert( mutex_lock_retval == 0 ); - return mutex_lock_retval; - UNUSED(mutex_lock_retval); -} - -int JMutex::Unlock() -{ - int mutex_unlock_retval = pthread_mutex_unlock(&mutex); - assert( mutex_unlock_retval == 0 ); - return mutex_unlock_retval; - UNUSED(mutex_unlock_retval); -} diff --git a/src/jthread/pthread/jsemaphore.cpp b/src/jthread/pthread/jsemaphore.cpp deleted file mode 100644 index 15281ba64..000000000 --- a/src/jthread/pthread/jsemaphore.cpp +++ /dev/null @@ -1,156 +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 <assert.h> -#include <errno.h> -#include <sys/time.h> -#include "jthread/jsemaphore.h" -#if defined(__MACH__) && defined(__APPLE__) -#include <unistd.h> -#endif - -#define UNUSED(expr) do { (void)(expr); } while (0) - -#if defined(__MACH__) && defined(__APPLE__) -#undef sem_t -#undef sem_init -#undef sem_wait -#undef sem_post -#undef sem_destroy -#define sem_t semaphore_t -#define sem_init(s, p, c) semaphore_create(mach_task_self(), (s), 0, (c)) -#define sem_wait(s) semaphore_wait(*(s)) -#define sem_post(s) semaphore_signal(*(s)) -#define sem_destroy(s) semaphore_destroy(mach_task_self(), *(s)) -pthread_mutex_t semcount_mutex; -#endif - -JSemaphore::JSemaphore() { - int sem_init_retval = sem_init(&m_semaphore,0,0); - assert(sem_init_retval == 0); - UNUSED(sem_init_retval); -#if defined(__MACH__) && defined(__APPLE__) - semcount = 0; -#endif -} - -JSemaphore::~JSemaphore() { - int sem_destroy_retval = sem_destroy(&m_semaphore); -#ifdef __ANDROID__ -// WORKAROUND for broken bionic semaphore implementation! - assert( - (sem_destroy_retval == 0) || - (errno == EBUSY) - ); -#else - assert(sem_destroy_retval == 0); -#endif - UNUSED(sem_destroy_retval); -} - -JSemaphore::JSemaphore(int initval) { - int sem_init_retval = sem_init(&m_semaphore,0,initval); - assert(sem_init_retval == 0); - UNUSED(sem_init_retval); -} - -void JSemaphore::Post() { - int sem_post_retval = sem_post(&m_semaphore); - assert(sem_post_retval == 0); - UNUSED(sem_post_retval); -#if defined(__MACH__) && defined(__APPLE__) - pthread_mutex_lock(&semcount_mutex); - semcount++; - pthread_mutex_unlock(&semcount_mutex); -#endif -} - -void JSemaphore::Wait() { - int sem_wait_retval = sem_wait(&m_semaphore); - assert(sem_wait_retval == 0); - UNUSED(sem_wait_retval); -#if defined(__MACH__) && defined(__APPLE__) - pthread_mutex_lock(&semcount_mutex); - semcount--; - pthread_mutex_unlock(&semcount_mutex); -#endif -} - -bool JSemaphore::Wait(unsigned int time_ms) { -#if defined(__MACH__) && defined(__APPLE__) - mach_timespec_t waittime; - waittime.tv_sec = time_ms / 1000; - waittime.tv_nsec = 1000000 * (time_ms % 1000); -#else - struct timespec waittime; -#endif - struct timeval now; - - if (gettimeofday(&now, NULL) == -1) { - assert("Unable to get time by clock_gettime!" == 0); - return false; - } - -#if !(defined(__MACH__) && defined(__APPLE__)) - waittime.tv_nsec = ((time_ms % 1000) * 1000 * 1000) + (now.tv_usec * 1000); - waittime.tv_sec = (time_ms / 1000) + (waittime.tv_nsec / (1000*1000*1000)) + now.tv_sec; - waittime.tv_nsec %= 1000*1000*1000; -#endif - - errno = 0; -#if defined(__MACH__) && defined(__APPLE__) - int sem_wait_retval = semaphore_timedwait(m_semaphore, waittime); - if (sem_wait_retval == KERN_OPERATION_TIMED_OUT) { - errno = ETIMEDOUT; - } else if (sem_wait_retval == KERN_ABORTED) { - errno = EINTR; - } else if (sem_wait_retval != 0) { - errno = EINVAL; - } -#else - int sem_wait_retval = sem_timedwait(&m_semaphore, &waittime); -#endif - - if (sem_wait_retval == 0) - { -#if defined(__MACH__) && defined(__APPLE__) - pthread_mutex_lock(&semcount_mutex); - semcount--; - pthread_mutex_unlock(&semcount_mutex); -#endif - return true; - } - else { - assert((errno == ETIMEDOUT) || (errno == EINTR)); - return false; - } - return sem_wait_retval == 0 ? true : false; -} - -int JSemaphore::GetValue() { - int retval = 0; -#if defined(__MACH__) && defined(__APPLE__) - pthread_mutex_lock(&semcount_mutex); - retval = semcount; - pthread_mutex_unlock(&semcount_mutex); -#else - sem_getvalue(&m_semaphore, &retval); -#endif - return retval; -} - diff --git a/src/jthread/pthread/jthread.cpp b/src/jthread/pthread/jthread.cpp deleted file mode 100644 index 414d8fde5..000000000 --- a/src/jthread/pthread/jthread.cpp +++ /dev/null @@ -1,168 +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 <assert.h> -#include <sys/time.h> -#include <time.h> -#include <stdlib.h> - -#define UNUSED(expr) do { (void)(expr); } while (0) - -JThread::JThread() -{ - retval = NULL; - requeststop = false; - running = false; - started = false; -} - -JThread::~JThread() -{ - Kill(); -} - -void JThread::Wait() { - void* status; - if (started) { - int pthread_join_retval = pthread_join(threadid,&status); - assert(pthread_join_retval == 0); - UNUSED(pthread_join_retval); - started = false; - } -} - -int JThread::Start() -{ - int status; - - if (running) - { - return ERR_JTHREAD_ALREADYRUNNING; - } - requeststop = false; - - pthread_attr_t attr; - pthread_attr_init(&attr); - //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); - - continuemutex.Lock(); - status = pthread_create(&threadid,&attr,TheThread,this); - pthread_attr_destroy(&attr); - if (status != 0) - { - continuemutex.Unlock(); - return ERR_JTHREAD_CANTSTARTTHREAD; - } - - /* Wait until 'running' is set */ - - while (!running) - { - struct timespec req,rem; - - req.tv_sec = 0; - req.tv_nsec = 1000000; - nanosleep(&req,&rem); - } - started = true; - - continuemutex.Unlock(); - - continuemutex2.Lock(); - continuemutex2.Unlock(); - return 0; -} - -int JThread::Kill() -{ - void* status; - if (!running) - { - if (started) { - int pthread_join_retval = pthread_join(threadid,&status); - assert(pthread_join_retval == 0); - UNUSED(pthread_join_retval); - started = false; - } - return ERR_JTHREAD_NOTRUNNING; - } -#ifdef __ANDROID__ - pthread_kill(threadid, SIGKILL); -#else - pthread_cancel(threadid); -#endif - if (started) { - int pthread_join_retval = pthread_join(threadid,&status); - assert(pthread_join_retval == 0); - UNUSED(pthread_join_retval); - started = false; - } - running = false; - return 0; -} - -void *JThread::GetReturnValue() -{ - void *val; - - if (running) { - val = NULL; - } else { - val = retval; - } - - return val; -} - -bool JThread::IsSameThread() -{ - return pthread_equal(pthread_self(), threadid); -} - -void *JThread::TheThread(void *param) -{ - JThread *jthread = (JThread *)param; - - jthread->continuemutex2.Lock(); - jthread->running = true; - - jthread->continuemutex.Lock(); - jthread->continuemutex.Unlock(); - - jthread->Thread(); - - jthread->running = false; - - return NULL; -} - -void JThread::ThreadStarted() -{ - continuemutex2.Unlock(); -} - 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 <assert.h> -#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 <assert.h> -#define UNUSED(expr) do { (void)(expr); } while (0) -#ifndef _WIN32_WCE - #include <process.h> -#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(); -} - |