15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2007, Google Inc. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// --- 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file just provides storage for FLAGS_verbose. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <config.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/commandlineflags.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DEFINE_int32(verbose, EnvToInt("PERFTOOLS_VERBOSE", 0), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Set to numbers >0 for more verbose output, or <0 for less. " 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "--verbose == -4 means we log fatal errors only."); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// While windows does have a POSIX-compatible API 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (_open/_write/_close), it acquires memory. Using this lower-level 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows API is the closest we can get to being "raw". 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RawFD RawOpenForWriting(const char* filename) { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CreateFile allocates memory if file_name isn't absolute, so if 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that ever becomes a problem then we ought to compute the absolute 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // path on its behalf (perhaps the ntdll/kernel function isn't aware 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the working directory?) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RawFD fd = CreateFileA(filename, GENERIC_WRITE, 0, NULL, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CREATE_ALWAYS, 0, NULL); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fd != kIllegalRawFD && GetLastError() == ERROR_ALREADY_EXISTS) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetEndOfFile(fd); // truncate the existing file 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fd; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RawWrite(RawFD handle, const char* buf, size_t len) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (len > 0) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD wrote; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOL ok = WriteFile(handle, buf, len, &wrote, NULL); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We do not use an asynchronous file handle, so ok==false means an error 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ok) break; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf += wrote; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len -= wrote; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RawClose(RawFD handle) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CloseHandle(handle); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // _WIN32 || __CYGWIN__ || __CYGWIN32__ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FCNTL_H 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <fcntl.h> 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Re-run fn until it doesn't cause EINTR. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NO_INTR(fn) do {} while ((fn) < 0 && errno == EINTR) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RawFD RawOpenForWriting(const char* filename) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0664); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RawWrite(RawFD fd, const char* buf, size_t len) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (len > 0) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ssize_t r; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_INTR(r = write(fd, buf, len)); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (r <= 0) break; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buf += r; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) len -= r; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RawClose(RawFD fd) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NO_INTR(close(fd)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // _WIN32 || __CYGWIN__ || __CYGWIN32__ 108