os_misc.c revision 9c8568743935f0892bb5bd33f5a5210bae53b8d3
1a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/************************************************************************** 2a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 3a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * Copyright 2008-2010 Vmware, Inc. 4a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * All Rights Reserved. 5a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 6a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * Permission is hereby granted, free of charge, to any person obtaining a 7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * copy of this software and associated documentation files (the 8a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * "Software"), to deal in the Software without restriction, including 9a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * without limitation the rights to use, copy, modify, merge, publish, 10a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * distribute, sub license, and/or sell copies of the Software, and to 11a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * permit persons to whom the Software is furnished to do so, subject to 12a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * the following conditions: 13a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 14a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * The above copyright notice and this permission notice (including the 15a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * next paragraph) shall be included in all copies or substantial portions 16a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * of the Software. 17a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 18a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * 26a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang **************************************************************************/ 27a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 28a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 29a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "os_misc.h" 30a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdarg.h> 32a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 33a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 34a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#if defined(PIPE_SUBSYSTEM_WINDOWS_USER) 35a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 36a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifndef WIN32_LEAN_AND_MEAN 37a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 38a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif 39a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <windows.h> 40a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdio.h> 41a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 42a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#else 43a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 44a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdio.h> 45a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdlib.h> 46a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 47a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif 48a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 49a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 50a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid 51a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangos_log_message(const char *message) 52a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{ 53a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang /* If the GALLIUM_LOG_FILE environment variable is set to a valid filename, 54a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * write all messages to that file. 55a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang */ 56a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang static FILE *fout = NULL; 57a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 58a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!fout) { 59a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang /* one-time init */ 60a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang const char *filename = os_get_option("GALLIUM_LOG_FILE"); 61a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (filename) 62a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fout = fopen(filename, "w"); 63a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if (!fout) 64a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fout = stderr; 65a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 66a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#if defined(PIPE_SUBSYSTEM_WINDOWS_USER) 68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang OutputDebugStringA(message); 69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang if(GetConsoleWindow() && !IsDebuggerPresent()) { 70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fflush(stdout); 71a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fputs(message, fout); 72a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fflush(fout); 73a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 74a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang else if (fout != stderr) { 75a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fputs(message, fout); 76a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fflush(fout); 77a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang } 78a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#else /* !PIPE_SUBSYSTEM_WINDOWS */ 79a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fflush(stdout); 80a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fputs(message, fout); 81a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang fflush(fout); 82a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif 83a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 84a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 85a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 86a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangconst char * 87a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangos_get_option(const char *name) 88a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{ 89a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang return getenv(name); 90a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang} 91a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang 92a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang