1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // system_utils_linux.cpp: Implementation of OS-specific functions for Linux 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #include "system_utils.h" 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Worker #include <sys/stat.h> 12*8975f5c5SAndroid Build Coastguard Worker #include <sys/time.h> 13*8975f5c5SAndroid Build Coastguard Worker #include <sys/types.h> 14*8975f5c5SAndroid Build Coastguard Worker #include <unistd.h> 15*8975f5c5SAndroid Build Coastguard Worker 16*8975f5c5SAndroid Build Coastguard Worker #include <array> 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace angle 19*8975f5c5SAndroid Build Coastguard Worker { GetExecutablePath()20*8975f5c5SAndroid Build Coastguard Workerstd::string GetExecutablePath() 21*8975f5c5SAndroid Build Coastguard Worker { 22*8975f5c5SAndroid Build Coastguard Worker // We cannot use lstat to get the size of /proc/self/exe as it always returns 0 23*8975f5c5SAndroid Build Coastguard Worker // so we just use a big buffer and hope the path fits in it. 24*8975f5c5SAndroid Build Coastguard Worker char path[4096]; 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker ssize_t result = readlink("/proc/self/exe", path, sizeof(path) - 1); 27*8975f5c5SAndroid Build Coastguard Worker if (result < 0 || static_cast<size_t>(result) >= sizeof(path) - 1) 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker return ""; 30*8975f5c5SAndroid Build Coastguard Worker } 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker path[result] = '\0'; 33*8975f5c5SAndroid Build Coastguard Worker return path; 34*8975f5c5SAndroid Build Coastguard Worker } 35*8975f5c5SAndroid Build Coastguard Worker GetExecutableDirectory()36*8975f5c5SAndroid Build Coastguard Workerstd::string GetExecutableDirectory() 37*8975f5c5SAndroid Build Coastguard Worker { 38*8975f5c5SAndroid Build Coastguard Worker std::string executablePath = GetExecutablePath(); 39*8975f5c5SAndroid Build Coastguard Worker size_t lastPathSepLoc = executablePath.find_last_of("/"); 40*8975f5c5SAndroid Build Coastguard Worker return (lastPathSepLoc != std::string::npos) ? executablePath.substr(0, lastPathSepLoc) : ""; 41*8975f5c5SAndroid Build Coastguard Worker } 42*8975f5c5SAndroid Build Coastguard Worker GetSharedLibraryExtension()43*8975f5c5SAndroid Build Coastguard Workerconst char *GetSharedLibraryExtension() 44*8975f5c5SAndroid Build Coastguard Worker { 45*8975f5c5SAndroid Build Coastguard Worker return "so"; 46*8975f5c5SAndroid Build Coastguard Worker } 47*8975f5c5SAndroid Build Coastguard Worker GetCurrentSystemTime()48*8975f5c5SAndroid Build Coastguard Workerdouble GetCurrentSystemTime() 49*8975f5c5SAndroid Build Coastguard Worker { 50*8975f5c5SAndroid Build Coastguard Worker struct timespec currentTime; 51*8975f5c5SAndroid Build Coastguard Worker clock_gettime(CLOCK_MONOTONIC, ¤tTime); 52*8975f5c5SAndroid Build Coastguard Worker return currentTime.tv_sec + currentTime.tv_nsec * 1e-9; 53*8975f5c5SAndroid Build Coastguard Worker } 54*8975f5c5SAndroid Build Coastguard Worker SetCurrentThreadName(const char * name)55*8975f5c5SAndroid Build Coastguard Workervoid SetCurrentThreadName(const char *name) 56*8975f5c5SAndroid Build Coastguard Worker { 57*8975f5c5SAndroid Build Coastguard Worker // There's a 15-character (16 including '\0') limit. If the name is too big (and ERANGE is 58*8975f5c5SAndroid Build Coastguard Worker // returned), just ignore the name. 59*8975f5c5SAndroid Build Coastguard Worker pthread_setname_np(pthread_self(), name); 60*8975f5c5SAndroid Build Coastguard Worker } 61*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 62