summaryrefslogtreecommitdiff
path: root/thirdparty/etcpak/System.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/etcpak/System.cpp')
-rw-r--r--thirdparty/etcpak/System.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/thirdparty/etcpak/System.cpp b/thirdparty/etcpak/System.cpp
new file mode 100644
index 0000000000..a09b289cb2
--- /dev/null
+++ b/thirdparty/etcpak/System.cpp
@@ -0,0 +1,68 @@
+#include <algorithm>
+#ifdef _WIN32
+# include <windows.h>
+#else
+# include <pthread.h>
+# include <unistd.h>
+#endif
+
+#include "System.hpp"
+
+unsigned int System::CPUCores()
+{
+ static unsigned int cores = 0;
+ if( cores == 0 )
+ {
+ int tmp;
+#ifdef _WIN32
+ SYSTEM_INFO info;
+ GetSystemInfo( &info );
+ tmp = (int)info.dwNumberOfProcessors;
+#else
+# ifndef _SC_NPROCESSORS_ONLN
+# ifdef _SC_NPROC_ONLN
+# define _SC_NPROCESSORS_ONLN _SC_NPROC_ONLN
+# elif defined _SC_CRAY_NCPU
+# define _SC_NPROCESSORS_ONLN _SC_CRAY_NCPU
+# endif
+# endif
+ tmp = (int)(long)sysconf( _SC_NPROCESSORS_ONLN );
+#endif
+ cores = (unsigned int)std::max( tmp, 1 );
+ }
+ return cores;
+}
+
+void System::SetThreadName( std::thread& thread, const char* name )
+{
+#ifdef _MSC_VER
+ const DWORD MS_VC_EXCEPTION=0x406D1388;
+
+# pragma pack( push, 8 )
+ struct THREADNAME_INFO
+ {
+ DWORD dwType;
+ LPCSTR szName;
+ DWORD dwThreadID;
+ DWORD dwFlags;
+ };
+# pragma pack(pop)
+
+ DWORD ThreadId = GetThreadId( static_cast<HANDLE>( thread.native_handle() ) );
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = name;
+ info.dwThreadID = ThreadId;
+ info.dwFlags = 0;
+
+ __try
+ {
+ RaiseException( MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info );
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
+#elif !defined(__APPLE__)
+ pthread_setname_np( thread.native_handle(), name );
+#endif
+}