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/pthread | |
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/pthread')
-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 |
4 files changed, 0 insertions, 449 deletions
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(); -} - |