BLI_math_rotation: properly name the quaternion power function.
[blender.git] / source / blender / blenlib / intern / system.c
index ecb977c6e6154cd1ef530268856aed2244e3a01c..82c42c42d9d233db6de8ddfac7ba72e471bdaba0 100644 (file)
 
 #include "BLI_utildefines.h"
 #include "BLI_system.h"
+#include "BLI_string.h"
 
 #include "MEM_guardedalloc.h"
 
-/* for backtrace */
-#if defined(__linux__) || defined(__APPLE__)
-#  include <execinfo.h>
-#elif defined(WIN32)
+/* for backtrace and gethostname/GetComputerName */
+#if defined(WIN32)
 #  include <windows.h>
 #  include <dbghelp.h>
+#else
+#  include <execinfo.h>
+#  include <unistd.h>
 #endif
 
 int BLI_cpu_support_sse2(void)
@@ -138,3 +140,56 @@ void BLI_system_backtrace(FILE *fp)
 
 }
 /* end BLI_system_backtrace */
+
+/* NOTE: The code for CPU brand string is adopted from Cycles. */
+
+#if !defined(_WIN32) || defined(FREE_WINDOWS)
+static void __cpuid(int data[4], int selector)
+{
+#if defined(__x86_64__)
+       asm("cpuid" : "=a" (data[0]), "=b" (data[1]), "=c" (data[2]), "=d" (data[3]) : "a"(selector));
+#elif defined(__i386__)
+       asm("pushl %%ebx    \n\t"
+               "cpuid          \n\t"
+               "movl %%ebx, %1 \n\t"
+               "popl %%ebx     \n\t"
+               : "=a" (data[0]), "=r" (data[1]), "=c" (data[2]), "=d" (data[3])
+               : "a"(selector)
+               : "ebx");
+#else
+       data[0] = data[1] = data[2] = data[3] = 0;
+#endif
+}
+#endif
+
+char *BLI_cpu_brand_string(void)
+{
+       char buf[48] = { 0 };
+       int result[4] = { 0 };
+       __cpuid(result, 0x80000000);
+       if (result[0] >= (int)0x80000004) {
+               __cpuid((int *)(buf + 0), 0x80000002);
+               __cpuid((int *)(buf + 16), 0x80000003);
+               __cpuid((int *)(buf + 32), 0x80000004);
+               char *brand = BLI_strdup(buf);
+               /* TODO(sergey): Make it a bit more presentable by removing trademark. */
+               return brand;
+       }
+       return NULL;
+}
+
+void BLI_hostname_get(char *buffer, size_t bufsize)
+{
+#ifndef WIN32
+       if (gethostname(buffer, bufsize - 1) < 0) {
+               BLI_strncpy(buffer, "-unknown-", bufsize);
+       }
+       /* When gethostname() truncates, it doesn't guarantee the trailing \0. */
+       buffer[bufsize - 1] = '\0';
+#else
+       DWORD bufsize_inout = bufsize;
+       if (!GetComputerName(buffer, &bufsize_inout)) {
+               strncpy(buffer, "-unknown-", bufsize);
+       }
+#endif
+}