xref: /aosp_15_r20/external/angle/src/common/system_utils_apple.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2020 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_apple.cpp: Implementation of OS-specific functions for Apple platforms
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 <unistd.h>
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include <CoreServices/CoreServices.h>
14*8975f5c5SAndroid Build Coastguard Worker #include <mach-o/dyld.h>
15*8975f5c5SAndroid Build Coastguard Worker #include <mach/mach.h>
16*8975f5c5SAndroid Build Coastguard Worker #include <mach/mach_time.h>
17*8975f5c5SAndroid Build Coastguard Worker #include <cstdlib>
18*8975f5c5SAndroid Build Coastguard Worker #include <vector>
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker #include <array>
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker namespace angle
23*8975f5c5SAndroid Build Coastguard Worker {
GetExecutablePath()24*8975f5c5SAndroid Build Coastguard Worker std::string GetExecutablePath()
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker     std::string result;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     uint32_t size = 0;
29*8975f5c5SAndroid Build Coastguard Worker     _NSGetExecutablePath(nullptr, &size);
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker     std::vector<char> buffer;
32*8975f5c5SAndroid Build Coastguard Worker     buffer.resize(size + 1);
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker     _NSGetExecutablePath(buffer.data(), &size);
35*8975f5c5SAndroid Build Coastguard Worker     buffer[size] = '\0';
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     if (!strrchr(buffer.data(), '/'))
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         return "";
40*8975f5c5SAndroid Build Coastguard Worker     }
41*8975f5c5SAndroid Build Coastguard Worker     return buffer.data();
42*8975f5c5SAndroid Build Coastguard Worker }
43*8975f5c5SAndroid Build Coastguard Worker 
GetExecutableDirectory()44*8975f5c5SAndroid Build Coastguard Worker std::string GetExecutableDirectory()
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker     std::string executablePath = GetExecutablePath();
47*8975f5c5SAndroid Build Coastguard Worker     size_t lastPathSepLoc      = executablePath.find_last_of("/");
48*8975f5c5SAndroid Build Coastguard Worker     return (lastPathSepLoc != std::string::npos) ? executablePath.substr(0, lastPathSepLoc) : "";
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker 
GetCurrentSystemTime()51*8975f5c5SAndroid Build Coastguard Worker double GetCurrentSystemTime()
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker     mach_timebase_info_data_t timebaseInfo;
54*8975f5c5SAndroid Build Coastguard Worker     mach_timebase_info(&timebaseInfo);
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker     double secondCoeff = timebaseInfo.numer * 1e-9 / timebaseInfo.denom;
57*8975f5c5SAndroid Build Coastguard Worker     return secondCoeff * mach_absolute_time();
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker 
SetCurrentThreadName(const char * name)60*8975f5c5SAndroid Build Coastguard Worker void SetCurrentThreadName(const char *name)
61*8975f5c5SAndroid Build Coastguard Worker {
62*8975f5c5SAndroid Build Coastguard Worker     pthread_setname_np(name);
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
65