| 1 | // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 | // for details. All rights reserved. Use of this source code is governed by a |
| 3 | // BSD-style license that can be found in the LICENSE file. |
| 4 | |
| 5 | #ifndef RUNTIME_BIN_PLATFORM_H_ |
| 6 | #define RUNTIME_BIN_PLATFORM_H_ |
| 7 | |
| 8 | #include "bin/builtin.h" |
| 9 | #include "platform/globals.h" |
| 10 | #include "platform/utils.h" |
| 11 | |
| 12 | #if defined(HOST_OS_MACOS) |
| 13 | #include "bin/platform_macos.h" |
| 14 | #endif // defined(HOST_OS_MACOS) |
| 15 | |
| 16 | namespace dart { |
| 17 | namespace bin { |
| 18 | |
| 19 | class Platform { |
| 20 | public: |
| 21 | // Perform platform specific initialization. |
| 22 | static bool Initialize(); |
| 23 | |
| 24 | // Returns the number of processors on the machine. |
| 25 | static int NumberOfProcessors(); |
| 26 | |
| 27 | // Returns a string representing the operating system ("linux", |
| 28 | // "macos", "windows", or "android"). The returned string should not be |
| 29 | // deallocated by the caller. |
| 30 | static const char* OperatingSystem(); |
| 31 | |
| 32 | // Returns a string representing the version of the operating system. The |
| 33 | // format of the string is determined by the platform. The returned string |
| 34 | // should not be deallocated by the caller. |
| 35 | static const char* OperatingSystemVersion(); |
| 36 | |
| 37 | // Returns the architecture name of the processor the VM is running on |
| 38 | // (ia32, x64, arm, or arm64). |
| 39 | static const char* HostArchitecture() { |
| 40 | #if defined(HOST_ARCH_ARM) |
| 41 | return "arm" ; |
| 42 | #elif defined(HOST_ARCH_ARM64) |
| 43 | return "arm64" ; |
| 44 | #elif defined(HOST_ARCH_IA32) |
| 45 | return "ia32" ; |
| 46 | #elif defined(HOST_ARCH_X64) |
| 47 | return "x64" ; |
| 48 | #else |
| 49 | #error Architecture detection failed. |
| 50 | #endif |
| 51 | } |
| 52 | |
| 53 | static const char* LibraryPrefix(); |
| 54 | |
| 55 | // Returns a string representing the operating system's shared library |
| 56 | // extension (e.g. 'so', 'dll', ...). The returned string should not be |
| 57 | // deallocated by the caller. |
| 58 | static const char* LibraryExtension(); |
| 59 | |
| 60 | // Extracts the local hostname. |
| 61 | static bool LocalHostname(char* buffer, intptr_t buffer_length); |
| 62 | |
| 63 | static const char* LocaleName(); |
| 64 | |
| 65 | // Extracts the environment variables for the current process. The array of |
| 66 | // strings is Dart_ScopeAllocated. The number of elements in the array is |
| 67 | // returned in the count argument. |
| 68 | static char** Environment(intptr_t* count); |
| 69 | |
| 70 | static const char* ResolveExecutablePath(); |
| 71 | |
| 72 | // This has the same effect as calling ResolveExecutablePath except that |
| 73 | // Dart_ScopeAllocate is not called and that the result goes into the given |
| 74 | // parameters. |
| 75 | // WARNING: On Fuchsia it returns -1, i.e. doesn't work. |
| 76 | // Note that `result` should be pre-allocated with size `result_size`. |
| 77 | // The return-value is the length read into `result` or -1 on failure. |
| 78 | static intptr_t ResolveExecutablePathInto(char* result, size_t result_size); |
| 79 | |
| 80 | // Stores the executable name. |
| 81 | static void SetExecutableName(const char* executable_name) { |
| 82 | executable_name_ = executable_name; |
| 83 | } |
| 84 | static const char* GetExecutableName(); |
| 85 | static const char* GetResolvedExecutableName() { |
| 86 | if (resolved_executable_name_ == NULL) { |
| 87 | // Try to resolve the executable path using platform specific APIs. |
| 88 | const char* resolved_name = Platform::ResolveExecutablePath(); |
| 89 | if (resolved_name != NULL) { |
| 90 | resolved_executable_name_ = Utils::StrDup(resolved_name); |
| 91 | } |
| 92 | } |
| 93 | return resolved_executable_name_; |
| 94 | } |
| 95 | |
| 96 | // Stores and gets the flags passed to the executable. |
| 97 | static void SetExecutableArguments(int script_index, char** argv) { |
| 98 | script_index_ = script_index; |
| 99 | argv_ = argv; |
| 100 | } |
| 101 | static int GetScriptIndex() { return script_index_; } |
| 102 | static char** GetArgv() { return argv_; } |
| 103 | |
| 104 | DART_NORETURN static void Exit(int exit_code); |
| 105 | |
| 106 | static void SetCoreDumpResourceLimit(int value); |
| 107 | |
| 108 | private: |
| 109 | // The path to the executable. |
| 110 | static const char* executable_name_; |
| 111 | // The path to the resolved executable. |
| 112 | static char* resolved_executable_name_; |
| 113 | |
| 114 | static int script_index_; |
| 115 | static char** argv_; // VM flags are argv_[1 ... script_index_ - 1] |
| 116 | |
| 117 | DISALLOW_ALLOCATION(); |
| 118 | DISALLOW_IMPLICIT_CONSTRUCTORS(Platform); |
| 119 | }; |
| 120 | |
| 121 | } // namespace bin |
| 122 | } // namespace dart |
| 123 | |
| 124 | #endif // RUNTIME_BIN_PLATFORM_H_ |
| 125 | |