os_misc.c revision 218459771a1801d7ad20dd340ac35a50f2b5b81a
10b0e7057128c213bee8d2158b976869475f7cb42José Fonseca/************************************************************************** 20b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * 30b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Copyright 2008-2010 Vmware, Inc. 40b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * All Rights Reserved. 50b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * 60b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 70b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * copy of this software and associated documentation files (the 80b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * "Software"), to deal in the Software without restriction, including 90b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 100b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 110b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * permit persons to whom the Software is furnished to do so, subject to 120b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * the following conditions: 130b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * 140b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * The above copyright notice and this permission notice (including the 150b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * next paragraph) shall be included in all copies or substantial portions 160b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * of the Software. 170b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * 180b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 190b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 200b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 210b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 220b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 230b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 240b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 250b0e7057128c213bee8d2158b976869475f7cb42José Fonseca * 260b0e7057128c213bee8d2158b976869475f7cb42José Fonseca **************************************************************************/ 270b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 280b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 290b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include "os_misc.h" 300b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 310b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include <stdarg.h> 320b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 330b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 3410b07665be5cff9fa9f03b0f7db459f3b380570dJosé Fonseca#if defined(PIPE_SUBSYSTEM_WINDOWS_USER) 350b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 360b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#ifndef WIN32_LEAN_AND_MEAN 370b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 380b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#endif 390b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include <windows.h> 400b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include <stdio.h> 410b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 420b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#else 430b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 440b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include <stdio.h> 450b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#include <stdlib.h> 460b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 470b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#endif 480b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 490b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 50c2867f5b3626157379ef0d4d5bcaf5180ca0ec1fVinson Lee#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS) 518d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov# include <unistd.h> 528d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD) 538d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov# include <sys/sysctl.h> 548d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_HAIKU) 558d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov# include <kernel/OS.h> 568d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_WINDOWS) 578d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov# include <windows.h> 588d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#else 598d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#error unexpected platform in os_sysinfo.c 608d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#endif 618d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 628d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 630b0e7057128c213bee8d2158b976869475f7cb42José Fonsecavoid 640b0e7057128c213bee8d2158b976869475f7cb42José Fonsecaos_log_message(const char *message) 650b0e7057128c213bee8d2158b976869475f7cb42José Fonseca{ 669c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul /* If the GALLIUM_LOG_FILE environment variable is set to a valid filename, 679c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul * write all messages to that file. 689c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul */ 699c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul static FILE *fout = NULL; 709c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul 719c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul if (!fout) { 72bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul#ifdef DEBUG 739c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul /* one-time init */ 749c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul const char *filename = os_get_option("GALLIUM_LOG_FILE"); 75bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul if (filename) { 76bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul const char *mode = "w"; 77bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul if (filename[0] == '+') { 78bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul /* If the filename is prefixed with '+' then open the file for 79bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul * appending instead of normal writing. 80bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul */ 81bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul mode = "a"; 82bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul filename++; /* skip the '+' */ 83bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul } 84bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul fout = fopen(filename, mode); 85bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul } 86bb1292e2261fa591cf66de443a1b0d4eb7f65cb2Brian Paul#endif 879c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul if (!fout) 889c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fout = stderr; 899c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul } 909c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul 9110b07665be5cff9fa9f03b0f7db459f3b380570dJosé Fonseca#if defined(PIPE_SUBSYSTEM_WINDOWS_USER) 920b0e7057128c213bee8d2158b976869475f7cb42José Fonseca OutputDebugStringA(message); 930b0e7057128c213bee8d2158b976869475f7cb42José Fonseca if(GetConsoleWindow() && !IsDebuggerPresent()) { 940b0e7057128c213bee8d2158b976869475f7cb42José Fonseca fflush(stdout); 959c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fputs(message, fout); 969c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fflush(fout); 979c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul } 989c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul else if (fout != stderr) { 999c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fputs(message, fout); 1009c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fflush(fout); 1010b0e7057128c213bee8d2158b976869475f7cb42José Fonseca } 1020b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#else /* !PIPE_SUBSYSTEM_WINDOWS */ 1030b0e7057128c213bee8d2158b976869475f7cb42José Fonseca fflush(stdout); 1049c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fputs(message, fout); 1059c8568743935f0892bb5bd33f5a5210bae53b8d3Brian Paul fflush(fout); 1060b0e7057128c213bee8d2158b976869475f7cb42José Fonseca#endif 1070b0e7057128c213bee8d2158b976869475f7cb42José Fonseca} 1080b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 1090b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 11060aea3011525de8bf6506e08c913cbe24cc17767José Fonseca#if !defined(PIPE_SUBSYSTEM_EMBEDDED) 1110b0e7057128c213bee8d2158b976869475f7cb42José Fonsecaconst char * 1120b0e7057128c213bee8d2158b976869475f7cb42José Fonsecaos_get_option(const char *name) 1130b0e7057128c213bee8d2158b976869475f7cb42José Fonseca{ 1140b0e7057128c213bee8d2158b976869475f7cb42José Fonseca return getenv(name); 1150b0e7057128c213bee8d2158b976869475f7cb42José Fonseca} 11660aea3011525de8bf6506e08c913cbe24cc17767José Fonseca#endif /* !PIPE_SUBSYSTEM_EMBEDDED */ 1170b0e7057128c213bee8d2158b976869475f7cb42José Fonseca 1188d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 1198d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov/** 1208d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov * Return the size of the total physical memory. 1218d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov * \param size returns the size of the total physical memory 1228d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov * \return true for success, or false on failure 1238d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov */ 1248d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikovbool 1258d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikovos_get_total_physical_memory(uint64_t *size) 1268d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov{ 127c2867f5b3626157379ef0d4d5bcaf5180ca0ec1fVinson Lee#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_SOLARIS) 1288d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov const long phys_pages = sysconf(_SC_PHYS_PAGES); 1298d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov const long page_size = sysconf(_SC_PAGE_SIZE); 1308d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 131218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy if (phys_pages <= 0 || page_size <= 0) 132218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy return false; 133218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy 134218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy *size = (int64_t)phys_pages * (int64_t)page_size; 135218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy return true; 1368d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_APPLE) || defined(PIPE_OS_BSD) 1377983a3d2e06b0bc16c1a16bddccc7f14fe1f132cJonathan Gray size_t len = sizeof(*size); 1388d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov int mib[2]; 1398d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 1408d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov mib[0] = CTL_HW; 1418d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#if defined(PIPE_OS_APPLE) 1428d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov mib[1] = HW_MEMSIZE; 1438d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_NETBSD) || defined(PIPE_OS_OPENBSD) 1448d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov mib[1] = HW_PHYSMEM64; 1458d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_FREEBSD) 1468d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov mib[1] = HW_REALMEM; 147a2fd55cfb65d3933c27ed6c2259966a98acc55ebVinson Lee#elif defined(PIPE_OS_DRAGONFLY) 148a2fd55cfb65d3933c27ed6c2259966a98acc55ebVinson Lee mib[1] = HW_PHYSMEM; 1498d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#else 1508d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#error Unsupported *BSD 1518d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#endif 1528d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 1537983a3d2e06b0bc16c1a16bddccc7f14fe1f132cJonathan Gray return (sysctl(mib, 2, size, &len, NULL, 0) == 0); 1548d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_HAIKU) 1558d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov system_info info; 1568d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov status_t ret; 1578d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 1588d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov ret = get_system_info(&info); 159218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy if (ret != B_OK || info.max_pages <= 0) 160218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy return false; 161218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy 162218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy *size = (int64_t)info.max_pages * (int64_t)B_PAGE_SIZE; 163218459771a1801d7ad20dd340ac35a50f2b5b81aAxel Davy return true; 1648d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#elif defined(PIPE_OS_WINDOWS) 1658d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov MEMORYSTATUSEX status; 1668d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov BOOL ret; 1678d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov 1688d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov status.dwLength = sizeof(status); 1698d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov ret = GlobalMemoryStatusEx(&status); 1708d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov *size = status.ullTotalPhys; 1718d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov return (ret == TRUE); 1728d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#else 1738d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#error unexpected platform in os_sysinfo.c 1748d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov return false; 1758d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov#endif 1768d2745703c2ad5dd73a060d135bdb030d0dda40aEmil Velikov} 177