mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Merge pull request #87 from archshift/remove-cruft
Removed redundant headers for std implementations
This commit is contained in:
		
						commit
						85f1b76cd8
					
				
					 8 changed files with 7 additions and 857 deletions
				
			
		|  | @ -49,9 +49,6 @@ set(HEADERS | |||
|             msg_handler.h | ||||
|             platform.h | ||||
|             scm_rev.h | ||||
|             std_condition_variable.h | ||||
|             std_mutex.h | ||||
|             std_thread.h | ||||
|             string_util.h | ||||
|             swap.h | ||||
|             symbols.h | ||||
|  |  | |||
|  | @ -6,11 +6,11 @@ | |||
| 
 | ||||
| #include "common/log.h" | ||||
| #include "common/string_util.h" | ||||
| #include "common/thread.h" | ||||
| #include "common/file_util.h" | ||||
| 
 | ||||
| #include <cstring> | ||||
| #include <set> | ||||
| #include <mutex> | ||||
| 
 | ||||
| #define MAX_MESSAGES 8000 | ||||
| #define MAX_MSGLEN  1024 | ||||
|  |  | |||
|  | @ -1,168 +0,0 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #define GCC_VER(x,y,z)    ((x) * 10000 + (y) * 100 + (z)) | ||||
| #define GCC_VERSION GCC_VER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) | ||||
| 
 | ||||
| #ifndef __has_include | ||||
| #define __has_include(s) 0 | ||||
| #endif | ||||
| 
 | ||||
| #if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__  | ||||
| 
 | ||||
| // GCC 4.4 provides <condition_variable>
 | ||||
| #include <condition_variable> | ||||
| 
 | ||||
| #elif __has_include(<condition_variable>) && !ANDROID | ||||
| 
 | ||||
| // clang and libc++ provide <condition_variable> on OSX. However, the version
 | ||||
| // of libc++ bundled with OSX 10.7 and 10.8 is buggy: it uses _ as a variable.
 | ||||
| //
 | ||||
| // We work around this issue by undefining and redefining _.
 | ||||
| 
 | ||||
| #undef _ | ||||
| #include <condition_variable> | ||||
| #define _(s) wxGetTranslation((s)) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| // partial std::condition_variable implementation for win32/pthread
 | ||||
| 
 | ||||
| #include "common/std_mutex.h" | ||||
| 
 | ||||
| #if (_MSC_VER >= 1600) || (GCC_VERSION >= GCC_VER(4,3,0) && __GXX_EXPERIMENTAL_CXX0X__) | ||||
| #define USE_RVALUE_REFERENCES | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN32) && defined(_M_X64) | ||||
| #define USE_CONDITION_VARIABLES | ||||
| #elif defined(_WIN32) | ||||
| #define USE_EVENTS | ||||
| #endif | ||||
| 
 | ||||
| namespace std | ||||
| { | ||||
| 
 | ||||
| class condition_variable | ||||
| { | ||||
| #if defined(_WIN32) && defined(USE_CONDITION_VARIABLES) | ||||
|     typedef CONDITION_VARIABLE native_type; | ||||
| #elif defined(_WIN32) | ||||
|     typedef HANDLE native_type; | ||||
| #else | ||||
|     typedef pthread_cond_t native_type; | ||||
| #endif | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
| #ifdef USE_EVENTS | ||||
|     typedef native_type native_handle_type; | ||||
| #else | ||||
|     typedef native_type* native_handle_type; | ||||
| #endif | ||||
| 
 | ||||
|     condition_variable() | ||||
|     { | ||||
| #if defined(_WIN32) && defined(USE_CONDITION_VARIABLES) | ||||
|         InitializeConditionVariable(&m_handle); | ||||
| #elif defined(_WIN32) | ||||
|         m_handle = CreateEvent(NULL, false, false, NULL); | ||||
| #else | ||||
|         pthread_cond_init(&m_handle, NULL); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     ~condition_variable() | ||||
|     { | ||||
| #if defined(_WIN32) && !defined(USE_CONDITION_VARIABLES) | ||||
|         CloseHandle(m_handle); | ||||
| #elif !defined(_WIN32) | ||||
|         pthread_cond_destroy(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     condition_variable(const condition_variable&) /*= delete*/; | ||||
|     condition_variable& operator=(const condition_variable&) /*= delete*/; | ||||
| 
 | ||||
|     void notify_one() | ||||
|     { | ||||
| #if defined(_WIN32) && defined(USE_CONDITION_VARIABLES) | ||||
|         WakeConditionVariable(&m_handle); | ||||
| #elif defined(_WIN32) | ||||
|         SetEvent(m_handle); | ||||
| #else | ||||
|         pthread_cond_signal(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void notify_all() | ||||
|     { | ||||
| #if defined(_WIN32) && defined(USE_CONDITION_VARIABLES) | ||||
|         WakeAllConditionVariable(&m_handle); | ||||
| #elif defined(_WIN32) | ||||
|         // TODO: broken
 | ||||
|         SetEvent(m_handle); | ||||
| #else | ||||
|         pthread_cond_broadcast(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void wait(unique_lock<mutex>& lock) | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|     #ifdef USE_SRWLOCKS | ||||
|         SleepConditionVariableSRW(&m_handle, lock.mutex()->native_handle(), INFINITE, 0); | ||||
|     #elif defined(USE_CONDITION_VARIABLES) | ||||
|         SleepConditionVariableCS(&m_handle, lock.mutex()->native_handle(), INFINITE); | ||||
|     #else | ||||
|         // TODO: broken, the unlock and wait need to be atomic
 | ||||
|         lock.unlock(); | ||||
|         WaitForSingleObject(m_handle, INFINITE); | ||||
|         lock.lock(); | ||||
|     #endif | ||||
| #else | ||||
|         pthread_cond_wait(&m_handle, lock.mutex()->native_handle()); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     template <class Predicate> | ||||
|     void wait(unique_lock<mutex>& lock, Predicate pred) | ||||
|     { | ||||
|         while (!pred()) | ||||
|             wait(lock); | ||||
|     } | ||||
| 
 | ||||
|     //template <class Clock, class Duration>
 | ||||
|     //cv_status wait_until(unique_lock<mutex>& lock,
 | ||||
|     //    const chrono::time_point<Clock, Duration>& abs_time);
 | ||||
| 
 | ||||
|     //template <class Clock, class Duration, class Predicate>
 | ||||
|     //    bool wait_until(unique_lock<mutex>& lock,
 | ||||
|     //    const chrono::time_point<Clock, Duration>& abs_time,
 | ||||
|     //    Predicate pred);
 | ||||
| 
 | ||||
|     //template <class Rep, class Period>
 | ||||
|     //cv_status wait_for(unique_lock<mutex>& lock,
 | ||||
|     //    const chrono::duration<Rep, Period>& rel_time);
 | ||||
| 
 | ||||
|     //template <class Rep, class Period, class Predicate>
 | ||||
|     //    bool wait_for(unique_lock<mutex>& lock,
 | ||||
|     //    const chrono::duration<Rep, Period>& rel_time,
 | ||||
|     //    Predicate pred);
 | ||||
| 
 | ||||
|     native_handle_type native_handle() | ||||
|     { | ||||
| #ifdef USE_EVENTS | ||||
|         return m_handle; | ||||
| #else | ||||
|         return &m_handle; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     native_type m_handle; | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -1,362 +0,0 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #define GCC_VER(x,y,z)    ((x) * 10000 + (y) * 100 + (z)) | ||||
| #define GCC_VERSION GCC_VER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) | ||||
| 
 | ||||
| #ifndef __has_include | ||||
| #define __has_include(s) 0 | ||||
| #endif | ||||
| 
 | ||||
| #if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ | ||||
| // GCC 4.4 provides <mutex>
 | ||||
| #include <mutex> | ||||
| #elif __has_include(<mutex>) && !ANDROID | ||||
| // Clang + libc++
 | ||||
| #include <mutex> | ||||
| #else | ||||
| 
 | ||||
| // partial <mutex> implementation for win32/pthread
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| 
 | ||||
| #if defined(_WIN32) | ||||
| // WIN32
 | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #include <Windows.h> | ||||
| 
 | ||||
| #else | ||||
| // POSIX
 | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #if (_MSC_VER >= 1600) || (GCC_VERSION >= GCC_VER(4,3,0) && __GXX_EXPERIMENTAL_CXX0X__) | ||||
| #define USE_RVALUE_REFERENCES | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN32) && defined(_M_X64) | ||||
| #define USE_SRWLOCKS | ||||
| #endif | ||||
| 
 | ||||
| namespace std | ||||
| { | ||||
| 
 | ||||
| class recursive_mutex | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|     typedef CRITICAL_SECTION native_type; | ||||
| #else | ||||
|     typedef pthread_mutex_t native_type; | ||||
| #endif | ||||
| 
 | ||||
| public: | ||||
|     typedef native_type* native_handle_type; | ||||
| 
 | ||||
|     recursive_mutex(const recursive_mutex&) /*= delete*/; | ||||
|     recursive_mutex& operator=(const recursive_mutex&) /*= delete*/; | ||||
| 
 | ||||
|     recursive_mutex() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         InitializeCriticalSection(&m_handle); | ||||
| #else | ||||
|         pthread_mutexattr_t attr; | ||||
|         pthread_mutexattr_init(&attr); | ||||
|         pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); | ||||
|         pthread_mutex_init(&m_handle, &attr); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     ~recursive_mutex() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         DeleteCriticalSection(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_destroy(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void lock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         EnterCriticalSection(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_lock(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void unlock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         LeaveCriticalSection(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_unlock(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     bool try_lock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         return (0 != TryEnterCriticalSection(&m_handle)); | ||||
| #else | ||||
|         return !pthread_mutex_trylock(&m_handle); | ||||
| #endif     | ||||
|     } | ||||
| 
 | ||||
|     native_handle_type native_handle() | ||||
|     { | ||||
|         return &m_handle; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     native_type m_handle; | ||||
| }; | ||||
| 
 | ||||
| #if !defined(_WIN32) || defined(USE_SRWLOCKS) | ||||
| 
 | ||||
| class mutex | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|     typedef SRWLOCK native_type; | ||||
| #else | ||||
|     typedef pthread_mutex_t native_type; | ||||
| #endif | ||||
| 
 | ||||
| public: | ||||
|     typedef native_type* native_handle_type; | ||||
| 
 | ||||
|     mutex(const mutex&) /*= delete*/; | ||||
|     mutex& operator=(const mutex&) /*= delete*/; | ||||
| 
 | ||||
|     mutex() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         InitializeSRWLock(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_init(&m_handle, NULL); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     ~mutex() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
| #else | ||||
|         pthread_mutex_destroy(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void lock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         AcquireSRWLockExclusive(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_lock(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void unlock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         ReleaseSRWLockExclusive(&m_handle); | ||||
| #else | ||||
|         pthread_mutex_unlock(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     bool try_lock() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         // XXX TryAcquireSRWLockExclusive requires Windows 7!
 | ||||
|         // return (0 != TryAcquireSRWLockExclusive(&m_handle));
 | ||||
|         return false; | ||||
| #else | ||||
|         return !pthread_mutex_trylock(&m_handle); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     native_handle_type native_handle() | ||||
|     { | ||||
|         return &m_handle; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     native_type m_handle; | ||||
| }; | ||||
| 
 | ||||
| #else | ||||
| typedef recursive_mutex mutex;    // just use CriticalSections
 | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| enum defer_lock_t { defer_lock }; | ||||
| enum try_to_lock_t { try_to_lock }; | ||||
| enum adopt_lock_t { adopt_lock }; | ||||
| 
 | ||||
| template <class Mutex> | ||||
| class lock_guard | ||||
| { | ||||
| public: | ||||
|     typedef Mutex mutex_type; | ||||
| 
 | ||||
|     explicit lock_guard(mutex_type& m) | ||||
|         : pm(m) | ||||
|     { | ||||
|         m.lock(); | ||||
|     } | ||||
| 
 | ||||
|     lock_guard(mutex_type& m, adopt_lock_t) | ||||
|         : pm(m) | ||||
|     { | ||||
|     } | ||||
| 
 | ||||
|     ~lock_guard() | ||||
|     { | ||||
|         pm.unlock(); | ||||
|     } | ||||
| 
 | ||||
|     lock_guard(lock_guard const&) /*= delete*/; | ||||
|     lock_guard& operator=(lock_guard const&) /*= delete*/; | ||||
| 
 | ||||
| private: | ||||
|     mutex_type& pm; | ||||
| }; | ||||
| 
 | ||||
| template <class Mutex> | ||||
| class unique_lock | ||||
| { | ||||
| public: | ||||
|     typedef Mutex mutex_type; | ||||
| 
 | ||||
|     unique_lock() | ||||
|         : pm(NULL), owns(false) | ||||
|     {} | ||||
| 
 | ||||
|     /*explicit*/ unique_lock(mutex_type& m) | ||||
|         : pm(&m), owns(true) | ||||
|     { | ||||
|         m.lock(); | ||||
|     } | ||||
| 
 | ||||
|     unique_lock(mutex_type& m, defer_lock_t) | ||||
|         : pm(&m), owns(false) | ||||
|     {} | ||||
| 
 | ||||
|     unique_lock(mutex_type& m, try_to_lock_t) | ||||
|         : pm(&m), owns(m.try_lock()) | ||||
|     {} | ||||
| 
 | ||||
|     unique_lock(mutex_type& m, adopt_lock_t) | ||||
|         : pm(&m), owns(true) | ||||
|     {} | ||||
| 
 | ||||
|     //template <class Clock, class Duration>
 | ||||
|     //unique_lock(mutex_type& m, const chrono::time_point<Clock, Duration>& abs_time);
 | ||||
| 
 | ||||
|     //template <class Rep, class Period>
 | ||||
|     //unique_lock(mutex_type& m, const chrono::duration<Rep, Period>& rel_time);
 | ||||
| 
 | ||||
|     ~unique_lock() | ||||
|     { | ||||
|         if (owns_lock()) | ||||
|             mutex()->unlock(); | ||||
|     } | ||||
| 
 | ||||
| #ifdef USE_RVALUE_REFERENCES | ||||
|     unique_lock& operator=(const unique_lock&) /*= delete*/; | ||||
| 
 | ||||
|     unique_lock& operator=(unique_lock&& other) | ||||
|     { | ||||
| #else | ||||
|     unique_lock& operator=(const unique_lock& u) | ||||
|     { | ||||
|         // ugly const_cast to get around lack of rvalue references
 | ||||
|         unique_lock& other = const_cast<unique_lock&>(u); | ||||
| #endif | ||||
|         swap(other); | ||||
|         return *this; | ||||
|     } | ||||
|      | ||||
| #ifdef USE_RVALUE_REFERENCES | ||||
|     unique_lock(const unique_lock&) /*= delete*/; | ||||
|      | ||||
|     unique_lock(unique_lock&& other) | ||||
|         : pm(NULL), owns(false) | ||||
|     { | ||||
| #else | ||||
|     unique_lock(const unique_lock& u) | ||||
|         : pm(NULL), owns(false) | ||||
|     { | ||||
|         // ugly const_cast to get around lack of rvalue references
 | ||||
|         unique_lock& other = const_cast<unique_lock&>(u);     | ||||
| #endif | ||||
|         swap(other); | ||||
|     } | ||||
| 
 | ||||
|     void lock() | ||||
|     { | ||||
|         mutex()->lock(); | ||||
|         owns = true; | ||||
|     } | ||||
| 
 | ||||
|     bool try_lock() | ||||
|     { | ||||
|         owns = mutex()->try_lock(); | ||||
|         return owns; | ||||
|     } | ||||
| 
 | ||||
|     //template <class Rep, class Period>
 | ||||
|     //bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
 | ||||
|     //template <class Clock, class Duration>
 | ||||
|     //bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
 | ||||
|      | ||||
|     void unlock() | ||||
|     { | ||||
|         mutex()->unlock(); | ||||
|         owns = false; | ||||
|     } | ||||
| 
 | ||||
|     void swap(unique_lock& u) | ||||
|     { | ||||
|         std::swap(pm, u.pm); | ||||
|         std::swap(owns, u.owns); | ||||
|     } | ||||
| 
 | ||||
|     mutex_type* release() | ||||
|     { | ||||
|         auto const ret = mutex(); | ||||
| 
 | ||||
|         pm = NULL; | ||||
|         owns = false; | ||||
| 
 | ||||
|         return ret; | ||||
|     } | ||||
| 
 | ||||
|     bool owns_lock() const | ||||
|     { | ||||
|         return owns; | ||||
|     } | ||||
| 
 | ||||
|     //explicit operator bool () const
 | ||||
|     //{
 | ||||
|     //    return owns_lock();
 | ||||
|     //}
 | ||||
| 
 | ||||
|     mutex_type* mutex() const | ||||
|     { | ||||
|         return pm; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     mutex_type* pm; | ||||
|     bool owns; | ||||
| }; | ||||
| 
 | ||||
| template <class Mutex> | ||||
| void swap(unique_lock<Mutex>& x, unique_lock<Mutex>& y) | ||||
| { | ||||
|     x.swap(y); | ||||
| } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
|  | @ -1,314 +0,0 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #define GCC_VER(x,y,z)    ((x) * 10000 + (y) * 100 + (z)) | ||||
| #define GCC_VERSION GCC_VER(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) | ||||
| 
 | ||||
| #ifndef __has_include | ||||
| #define __has_include(s) 0 | ||||
| #endif | ||||
| 
 | ||||
| #if GCC_VERSION >= GCC_VER(4,4,0) && __GXX_EXPERIMENTAL_CXX0X__ | ||||
| // GCC 4.4 provides <thread>
 | ||||
| #ifndef _GLIBCXX_USE_SCHED_YIELD | ||||
| #define _GLIBCXX_USE_SCHED_YIELD | ||||
| #endif | ||||
| #include <thread> | ||||
| #elif __has_include(<thread>) && !ANDROID | ||||
| // Clang + libc++
 | ||||
| #include <thread> | ||||
| #else | ||||
| 
 | ||||
| // partial std::thread implementation for win32/pthread
 | ||||
| 
 | ||||
| #include <algorithm> | ||||
| 
 | ||||
| #if (_MSC_VER >= 1600) || (GCC_VERSION >= GCC_VER(4,3,0) && __GXX_EXPERIMENTAL_CXX0X__) | ||||
| #define USE_RVALUE_REFERENCES | ||||
| #endif | ||||
| 
 | ||||
| #ifdef __APPLE__ | ||||
| #import <Foundation/NSAutoreleasePool.h> | ||||
| #endif | ||||
| 
 | ||||
| #if defined(_WIN32) | ||||
| // WIN32
 | ||||
| 
 | ||||
| #define WIN32_LEAN_AND_MEAN | ||||
| #include <Windows.h> | ||||
| 
 | ||||
| #if defined(_MSC_VER) && defined(_MT) | ||||
| // When linking with LIBCMT (the multithreaded C library), Microsoft recommends
 | ||||
| // using _beginthreadex instead of CreateThread.
 | ||||
| #define USE_BEGINTHREADEX | ||||
| #include <process.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_BEGINTHREADEX | ||||
| #define THREAD_ID unsigned | ||||
| #define THREAD_RETURN unsigned __stdcall | ||||
| #else | ||||
| #define THREAD_ID DWORD | ||||
| #define THREAD_RETURN DWORD WINAPI | ||||
| #endif | ||||
| #define THREAD_HANDLE HANDLE | ||||
| 
 | ||||
| #else | ||||
| // PTHREAD
 | ||||
| 
 | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| #ifndef _POSIX_THREADS | ||||
| #error unsupported platform (no pthreads?) | ||||
| #endif | ||||
| 
 | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #define THREAD_ID pthread_t | ||||
| #define THREAD_HANDLE pthread_t | ||||
| #define THREAD_RETURN void* | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| namespace std | ||||
| { | ||||
| 
 | ||||
| class thread | ||||
| { | ||||
| public: | ||||
|     typedef THREAD_HANDLE native_handle_type; | ||||
| 
 | ||||
|     class id | ||||
|     { | ||||
|         friend class thread; | ||||
|     public: | ||||
|         id() : m_thread(0) {} | ||||
|         id(THREAD_ID _id) : m_thread(_id) {} | ||||
| 
 | ||||
|         bool operator==(const id& rhs) const | ||||
|         { | ||||
|             return m_thread == rhs.m_thread; | ||||
|         } | ||||
| 
 | ||||
|         bool operator!=(const id& rhs) const | ||||
|         { | ||||
|             return !(*this == rhs); | ||||
|         } | ||||
| 
 | ||||
|         bool operator<(const id& rhs) const | ||||
|         { | ||||
|             return m_thread < rhs.m_thread; | ||||
|         } | ||||
| 
 | ||||
|     private: | ||||
|         THREAD_ID m_thread; | ||||
|     }; | ||||
| 
 | ||||
|     // no variadic template support in msvc
 | ||||
|     //template <typename C, typename... A>
 | ||||
|     //thread(C&& func, A&&... args);
 | ||||
| 
 | ||||
|     template <typename C> | ||||
|     thread(C func) | ||||
|     { | ||||
|         StartThread(new Func<C>(func)); | ||||
|     } | ||||
| 
 | ||||
|     template <typename C, typename A> | ||||
|     thread(C func, A arg) | ||||
|     { | ||||
|         StartThread(new FuncArg<C, A>(func, arg)); | ||||
|     } | ||||
| 
 | ||||
|     thread() /*= default;*/ {} | ||||
| 
 | ||||
| #ifdef USE_RVALUE_REFERENCES | ||||
|     thread(const thread&) /*= delete*/; | ||||
| 
 | ||||
|     thread(thread&& other) | ||||
|     { | ||||
| #else | ||||
|     thread(const thread& t) | ||||
|     { | ||||
|         // ugly const_cast to get around lack of rvalue references
 | ||||
|         thread& other = const_cast<thread&>(t); | ||||
| #endif | ||||
|         swap(other); | ||||
|     } | ||||
| 
 | ||||
| #ifdef USE_RVALUE_REFERENCES | ||||
|     thread& operator=(const thread&) /*= delete*/; | ||||
| 
 | ||||
|     thread& operator=(thread&& other) | ||||
|     { | ||||
| #else | ||||
|     thread& operator=(const thread& t) | ||||
|     { | ||||
|         // ugly const_cast to get around lack of rvalue references
 | ||||
|         thread& other = const_cast<thread&>(t); | ||||
| #endif | ||||
|         if (joinable()) | ||||
|             detach(); | ||||
|         swap(other); | ||||
|         return *this; | ||||
|     } | ||||
| 
 | ||||
|     ~thread() | ||||
|     { | ||||
|         if (joinable()) | ||||
|             detach(); | ||||
|     } | ||||
| 
 | ||||
|     bool joinable() const | ||||
|     { | ||||
|         return m_id != id(); | ||||
|     } | ||||
| 
 | ||||
|     id get_id() const | ||||
|     { | ||||
|         return m_id; | ||||
|     } | ||||
| 
 | ||||
|     native_handle_type native_handle() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         return m_handle; | ||||
| #else | ||||
|         return m_id.m_thread; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void join() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         WaitForSingleObject(m_handle, INFINITE); | ||||
|         detach(); | ||||
| #else | ||||
|         pthread_join(m_id.m_thread, NULL); | ||||
|         m_id = id(); | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
|     void detach() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         CloseHandle(m_handle); | ||||
| #else | ||||
|         pthread_detach(m_id.m_thread); | ||||
| #endif | ||||
|         m_id = id(); | ||||
|     } | ||||
| 
 | ||||
|     void swap(thread& other) | ||||
|     { | ||||
|         std::swap(m_id, other.m_id); | ||||
| #ifdef _WIN32 | ||||
|         std::swap(m_handle, other.m_handle); | ||||
| #endif | ||||
|     } | ||||
|      | ||||
|     static unsigned hardware_concurrency() | ||||
|     { | ||||
| #ifdef _WIN32 | ||||
|         SYSTEM_INFO sysinfo; | ||||
|         GetSystemInfo(&sysinfo); | ||||
|         return static_cast<unsigned>(sysinfo.dwNumberOfProcessors); | ||||
| #else | ||||
|         return 0; | ||||
| #endif | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     id m_id; | ||||
|      | ||||
| #ifdef _WIN32 | ||||
|     native_handle_type m_handle; | ||||
| #endif | ||||
| 
 | ||||
|     template <typename F> | ||||
|     void StartThread(F* param) | ||||
|     { | ||||
| #ifdef USE_BEGINTHREADEX | ||||
|         m_handle = (HANDLE)_beginthreadex(NULL, 0, &RunAndDelete<F>, param, 0, &m_id.m_thread); | ||||
| #elif defined(_WIN32) | ||||
|         m_handle = CreateThread(NULL, 0, &RunAndDelete<F>, param, 0, &m_id.m_thread); | ||||
| #else | ||||
|         pthread_attr_t attr; | ||||
|         pthread_attr_init(&attr); | ||||
|         pthread_attr_setstacksize(&attr, 1024 * 1024); | ||||
|         if (pthread_create(&m_id.m_thread, &attr, &RunAndDelete<F>, param)) | ||||
|             m_id = id(); | ||||
| #endif | ||||
|     } | ||||
|      | ||||
|     template <typename C> | ||||
|     class Func | ||||
|     { | ||||
|     public: | ||||
|         Func(C _func) : func(_func) {} | ||||
| 
 | ||||
|         void Run() { func(); } | ||||
| 
 | ||||
|     private: | ||||
|         C const func; | ||||
|     }; | ||||
| 
 | ||||
|     template <typename C, typename A> | ||||
|     class FuncArg | ||||
|     { | ||||
|     public: | ||||
|         FuncArg(C _func, A _arg) : func(_func), arg(_arg) {} | ||||
| 
 | ||||
|         void Run() { func(arg); } | ||||
| 
 | ||||
|     private: | ||||
|         C const func; | ||||
|         A arg; | ||||
|     }; | ||||
| 
 | ||||
|     template <typename F> | ||||
|     static THREAD_RETURN RunAndDelete(void* param) | ||||
|     { | ||||
| #ifdef __APPLE__ | ||||
|         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; | ||||
| #endif | ||||
|         static_cast<F*>(param)->Run(); | ||||
|         delete static_cast<F*>(param); | ||||
| #ifdef __APPLE__ | ||||
|         [pool release]; | ||||
| #endif | ||||
|         return 0; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| namespace this_thread | ||||
| { | ||||
| 
 | ||||
| inline void yield() | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|     SwitchToThread(); | ||||
| #else | ||||
|     sleep(0); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| inline thread::id get_id() | ||||
| { | ||||
| #ifdef _WIN32 | ||||
|     return GetCurrentThreadId(); | ||||
| #else | ||||
|     return pthread_self(); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| }    // namespace this_thread
 | ||||
| 
 | ||||
| }    // namespace std
 | ||||
| 
 | ||||
| #undef USE_RVALUE_REFERENCES | ||||
| #undef USE_BEGINTHREADEX | ||||
| #undef THREAD_ID | ||||
| #undef THREAD_RETURN | ||||
| #undef THREAD_HANDLE | ||||
| 
 | ||||
| #endif | ||||
|  | @ -9,10 +9,8 @@ | |||
| #include <mach/mach.h> | ||||
| #elif defined(BSD4_4) || defined(__OpenBSD__) | ||||
| #include <pthread_np.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_BEGINTHREADEX | ||||
| #include <process.h> | ||||
| #elif defined(_WIN32) | ||||
| #include <Windows.h> | ||||
| #endif | ||||
| 
 | ||||
| namespace Common | ||||
|  |  | |||
|  | @ -4,14 +4,13 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/std_condition_variable.h" | ||||
| #include "common/std_mutex.h" | ||||
| #include "common/std_thread.h" | ||||
| 
 | ||||
| // Don't include common.h here as it will break LogManager
 | ||||
| #include "common/common_types.h" | ||||
| #include <cstdio> | ||||
| #include <cstring> | ||||
| #include <thread> | ||||
| #include <condition_variable> | ||||
| #include <mutex> | ||||
| 
 | ||||
| // This may not be defined outside _WIN32
 | ||||
| #ifndef _WIN32 | ||||
|  |  | |||
|  | @ -5,9 +5,9 @@ | |||
| #include <vector> | ||||
| #include <cstdio> | ||||
| #include <atomic> | ||||
| #include <mutex> | ||||
| 
 | ||||
| #include "common/msg_handler.h" | ||||
| #include "common/std_mutex.h" | ||||
| #include "common/chunk_file.h" | ||||
| 
 | ||||
| #include "core/core_timing.h" | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue