| 1 | // Copyright (c) 2011, 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_VM_OS_H_ |
| 6 | #define RUNTIME_VM_OS_H_ |
| 7 | |
| 8 | #include "vm/globals.h" |
| 9 | |
| 10 | // Forward declarations. |
| 11 | struct tm; |
| 12 | |
| 13 | namespace dart { |
| 14 | |
| 15 | // Forward declarations. |
| 16 | class Zone; |
| 17 | |
| 18 | // Interface to the underlying OS platform. |
| 19 | class OS { |
| 20 | public: |
| 21 | // Returns the name of the given OS. For example "linux". |
| 22 | static const char* Name(); |
| 23 | |
| 24 | // Returns the current process id. |
| 25 | static intptr_t ProcessId(); |
| 26 | |
| 27 | // Returns a time-zone name for the given instant. |
| 28 | // The name is provided by the underlying platform. |
| 29 | // The returned string may be Zone allocated. |
| 30 | static const char* GetTimeZoneName(int64_t seconds_since_epoch); |
| 31 | |
| 32 | // Returns the difference in seconds between local time and UTC for the given |
| 33 | // instant. |
| 34 | // For example 3600 for CET, and 7200 for CEST. |
| 35 | static int GetTimeZoneOffsetInSeconds(int64_t seconds_since_epoch); |
| 36 | |
| 37 | // Returns the difference in seconds between local time and UTC when no |
| 38 | // daylight saving is active. |
| 39 | // For example 3600 in CET and CEST. |
| 40 | static int GetLocalTimeZoneAdjustmentInSeconds(); |
| 41 | |
| 42 | // Returns the current time in milliseconds measured |
| 43 | // from midnight January 1, 1970 UTC. |
| 44 | static int64_t GetCurrentTimeMillis(); |
| 45 | |
| 46 | // Returns the current time in microseconds measured |
| 47 | // from midnight January 1, 1970 UTC. |
| 48 | static int64_t GetCurrentTimeMicros(); |
| 49 | |
| 50 | // Returns the current time used by the tracing infrastructure. |
| 51 | static int64_t GetCurrentMonotonicMicros(); |
| 52 | |
| 53 | // Returns the raw clock value from the monotonic clock. |
| 54 | static int64_t GetCurrentMonotonicTicks(); |
| 55 | |
| 56 | // Returns the frequency of the monotonic clock. |
| 57 | static int64_t GetCurrentMonotonicFrequency(); |
| 58 | |
| 59 | // Returns the value of current thread's CPU usage clock in microseconds. |
| 60 | // NOTE: This clock will return different values depending on the calling |
| 61 | // thread. It is only expected to increase in value as the thread uses |
| 62 | // CPU time. |
| 63 | // NOTE: This function will return -1 on OSs that are not supported. |
| 64 | static int64_t GetCurrentThreadCPUMicros(); |
| 65 | |
| 66 | // If the tracing/timeline configuration on the current OS supports thread |
| 67 | // timestamps, returns the same value as |GetCurrentThreadCPUMicros|. |
| 68 | // Otherwise, returns -1. |
| 69 | static int64_t GetCurrentThreadCPUMicrosForTimeline(); |
| 70 | |
| 71 | // Returns the activation frame alignment constraint or one if |
| 72 | // the platform doesn't care. Guaranteed to be a power of two. |
| 73 | static intptr_t ActivationFrameAlignment(); |
| 74 | |
| 75 | // Returns number of available processor cores. |
| 76 | static int NumberOfAvailableProcessors(); |
| 77 | |
| 78 | // Sleep the currently executing thread for millis ms. |
| 79 | static void Sleep(int64_t millis); |
| 80 | |
| 81 | // Sleep the currently executing thread for micros microseconds. |
| 82 | static void SleepMicros(int64_t micros); |
| 83 | |
| 84 | // Debug break. |
| 85 | static void DebugBreak(); |
| 86 | |
| 87 | // Returns the current program counter. |
| 88 | static uintptr_t GetProgramCounter(); |
| 89 | |
| 90 | // Print formatted output to stdout/stderr for debugging. |
| 91 | // Tracing and debugging prints from the VM should strongly prefer to use |
| 92 | // PrintErr to avoid interfering with the application's output, which may |
| 93 | // be parsed by another program. |
| 94 | static void Print(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); |
| 95 | static void PrintErr(const char* format, ...) PRINTF_ATTRIBUTE(1, 2); |
| 96 | static void VFPrint(FILE* stream, const char* format, va_list args); |
| 97 | |
| 98 | // Allocate a string and print formatted output into the buffer. |
| 99 | // Uses the zone for allocation if one if provided, and otherwise uses |
| 100 | // malloc. |
| 101 | static char* SCreate(Zone* zone, const char* format, ...) |
| 102 | PRINTF_ATTRIBUTE(2, 3); |
| 103 | static char* VSCreate(Zone* zone, const char* format, va_list args); |
| 104 | |
| 105 | // Converts a C string which represents a valid dart integer into a 64 bit |
| 106 | // value. |
| 107 | // Returns false if it is unable to convert the string to a 64 bit value, |
| 108 | // the failure could be because of underflow/overflow or invalid characters. |
| 109 | // On success the function returns true and 'value' contains the converted |
| 110 | // value. |
| 111 | static bool StringToInt64(const char* str, int64_t* value); |
| 112 | |
| 113 | // Register code observers relevant to this OS. |
| 114 | static void RegisterCodeObservers(); |
| 115 | |
| 116 | // Initialize the OS class. |
| 117 | static void Init(); |
| 118 | |
| 119 | // Cleanup the OS class. |
| 120 | static void Cleanup(); |
| 121 | |
| 122 | // Only implemented on Windows, prevents cleanup code from running. |
| 123 | static void PrepareToAbort(); |
| 124 | |
| 125 | DART_NORETURN static void Abort(); |
| 126 | |
| 127 | DART_NORETURN static void Exit(int code); |
| 128 | }; |
| 129 | |
| 130 | } // namespace dart |
| 131 | |
| 132 | #endif // RUNTIME_VM_OS_H_ |
| 133 | |