Added few more stubs so that control reaches to DestroyDevice().
[mesa.git] / src / util / os_misc.c
index 436bc38604b8757e96154af1ce089d70ae187dae..e184edc893da432bb187189ec903a6c7185ae512 100644 (file)
@@ -27,6 +27,8 @@
 
 
 #include "os_misc.h"
+#include "os_file.h"
+#include "macros.h"
 
 #include <stdarg.h>
 
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
 
 #endif
 
 
-#if DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD
+#if DETECT_OS_ANDROID
+#  define LOG_TAG "MESA"
+#  include <unistd.h>
+#  include <log/log.h>
+#elif DETECT_OS_LINUX || DETECT_OS_CYGWIN || DETECT_OS_SOLARIS || DETECT_OS_HURD
 #  include <unistd.h>
+#elif DETECT_OS_OPENBSD
+#  include <sys/resource.h>
+#  include <sys/sysctl.h>
 #elif DETECT_OS_APPLE || DETECT_OS_BSD
 #  include <sys/sysctl.h>
 #elif DETECT_OS_HAIKU
@@ -104,6 +115,9 @@ os_log_message(const char *message)
    fflush(stdout);
    fputs(message, fout);
    fflush(fout);
+#  if DETECT_OS_ANDROID
+   LOG_PRI(ANDROID_LOG_ERROR, LOG_TAG, "%s", message);
+#  endif
 #endif
 }
 
@@ -175,3 +189,47 @@ os_get_total_physical_memory(uint64_t *size)
    return false;
 #endif
 }
+
+bool
+os_get_available_system_memory(uint64_t *size)
+{
+#if DETECT_OS_LINUX
+   char *meminfo = os_read_file("/proc/meminfo", NULL);
+   if (!meminfo)
+      return false;
+
+   char *str = strstr(meminfo, "MemAvailable:");
+   if (!str) {
+      free(meminfo);
+      return false;
+   }
+
+   uint64_t kb_mem_available;
+   if (sscanf(str, "MemAvailable: %" PRIx64, &kb_mem_available) == 1) {
+      free(meminfo);
+      *size = kb_mem_available << 10;
+      return true;
+   }
+
+   free(meminfo);
+   return false;
+#elif DETECT_OS_OPENBSD
+   struct rlimit rl;
+   int mib[] = { CTL_HW, HW_USERMEM64 };
+   int64_t mem_available;
+   size_t len = sizeof(mem_available);
+
+   /* physmem - wired */
+   if (sysctl(mib, 2, &mem_available, &len, NULL, 0) == -1)
+      return false;
+
+   /* static login.conf limit */
+   if (getrlimit(RLIMIT_DATA, &rl) == -1)
+      return false;
+
+   *size = MIN2(mem_available, rl.rlim_cur);
+   return true;
+#else
+   return false;
+#endif
+}