#include <stdarg.h>
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-
-#include <windows.h>
-#include <winddi.h>
-
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE)
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <windows.h>
-#include <types.h>
-
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#endif
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-static INLINE void
-_EngDebugPrint(const char *format, ...)
-{
- va_list ap;
- va_start(ap, format);
- EngDebugPrint("", (PCHAR)format, ap);
- va_end(ap);
-}
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
+# include <unistd.h>
+#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
+# include <sys/sysctl.h>
+#elif defined(PIPE_OS_HAIKU)
+# include <kernel/OS.h>
+#elif defined(PIPE_OS_WINDOWS)
+# include <windows.h>
+#else
+#error unexpected platform in os_sysinfo.c
#endif
void
os_log_message(const char *message)
{
-#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
- _EngDebugPrint("%s", message);
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+ /* If the GALLIUM_LOG_FILE environment variable is set to a valid filename,
+ * write all messages to that file.
+ */
+ static FILE *fout = NULL;
+
+ if (!fout) {
+ /* one-time init */
+ const char *filename = os_get_option("GALLIUM_LOG_FILE");
+ if (filename)
+ fout = fopen(filename, "w");
+ if (!fout)
+ fout = stderr;
+ }
+
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
OutputDebugStringA(message);
if(GetConsoleWindow() && !IsDebuggerPresent()) {
fflush(stdout);
- fputs(message, stderr);
- fflush(stderr);
+ fputs(message, fout);
+ fflush(fout);
+ }
+ else if (fout != stderr) {
+ fputs(message, fout);
+ fflush(fout);
}
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE)
- wchar_t *wide_format;
- long wide_str_len;
- /* Format is ascii - needs to be converted to wchar_t for printing */
- wide_str_len = MultiByteToWideChar(CP_ACP, 0, message, -1, NULL, 0);
- wide_format = (wchar_t *) malloc((wide_str_len+1) * sizeof(wchar_t));
- if (wide_format) {
- MultiByteToWideChar(CP_ACP, 0, message, -1,
- wide_format, wide_str_len);
- NKDbgPrintfW(wide_format, wide_format);
- free(wide_format);
- }
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT)
- /* TODO */
#else /* !PIPE_SUBSYSTEM_WINDOWS */
fflush(stdout);
- fputs(message, stderr);
+ fputs(message, fout);
+ fflush(fout);
#endif
}
-#ifdef PIPE_SUBSYSTEM_WINDOWS_DISPLAY
-static const char *
-find(const char *start, const char *end, char c)
-{
- const char *p;
- for(p = start; !end || p != end; ++p) {
- if(*p == c)
- return p;
- if(*p < 32)
- break;
- }
- return NULL;
-}
-
-static int
-compare(const char *start, const char *end, const char *s)
-{
- const char *p, *q;
- for(p = start, q = s; p != end && *q != '\0'; ++p, ++q) {
- if(*p != *q)
- return 0;
- }
- return p == end && *q == '\0';
-}
-
-static void
-copy(char *dst, const char *start, const char *end, size_t n)
+const char *
+os_get_option(const char *name)
{
- const char *p;
- char *q;
- for(p = start, q = dst, n = n - 1; p != end && n; ++p, ++q, --n)
- *q = *p;
- *q = '\0';
+ return getenv(name);
}
-#endif
-const char *
-os_get_option(const char *name)
+/**
+ * Return the size of the total physical memory.
+ * \param size returns the size of the total physical memory
+ * \return true for success, or false on failure
+ */
+bool
+os_get_total_physical_memory(uint64_t *size)
{
-#if defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
- /* EngMapFile creates the file if it does not exists, so it must either be
- * disabled on release versions (or put in a less conspicuous place). */
-#ifdef DEBUG
- const char *result = NULL;
- ULONG_PTR iFile = 0;
- const void *pMap = NULL;
- const char *sol, *eol, *sep;
- static char output[1024];
-
- pMap = EngMapFile(L"\\??\\c:\\gallium.cfg", 0, &iFile);
- if(pMap) {
- sol = (const char *)pMap;
- while(1) {
- /* TODO: handle LF line endings */
- eol = find(sol, NULL, '\r');
- if(!eol || eol == sol)
- break;
- sep = find(sol, eol, '=');
- if(!sep)
- break;
- if(compare(sol, sep, name)) {
- copy(output, sep + 1, eol, sizeof(output));
- result = output;
- break;
- }
- sol = eol + 2;
- }
- EngUnmapFile(iFile);
- }
- return result;
+#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS)
+ const long phys_pages = sysconf(_SC_PHYS_PAGES);
+ const long page_size = sysconf(_SC_PAGE_SIZE);
+
+ *size = phys_pages * page_size;
+ return (phys_pages > 0 && page_size > 0);
+#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD)
+ size_t len = sizeof(*size);
+ int mib[2];
+
+ mib[0] = CTL_HW;
+#if defined(PIPE_OS_APPLE)
+ mib[1] = HW_MEMSIZE;
+#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD)
+ mib[1] = HW_PHYSMEM64;
+#elif defined(PIPE_OS_FREEBSD)
+ mib[1] = HW_REALMEM;
+#elif defined(PIPE_OS_DRAGONFLY)
+ mib[1] = HW_PHYSMEM;
#else
- return NULL;
+#error Unsupported *BSD
#endif
-#elif defined(PIPE_SUBSYSTEM_WINDOWS_CE) || defined(PIPE_SUBSYSTEM_WINDOWS_MINIPORT)
- /* TODO: implement */
- return NULL;
+
+ return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
+#elif defined(PIPE_OS_HAIKU)
+ system_info info;
+ status_t ret;
+
+ ret = get_system_info(&info);
+ *size = info.max_pages * B_PAGE_SIZE;
+ return (ret == B_OK);
+#elif defined(PIPE_OS_WINDOWS)
+ MEMORYSTATUSEX status;
+ BOOL ret;
+
+ status.dwLength = sizeof(status);
+ ret = GlobalMemoryStatusEx(&status);
+ *size = status.ullTotalPhys;
+ return (ret == TRUE);
#else
- return getenv(name);
+#error unexpected platform in os_sysinfo.c
+ return false;
#endif
}
-