OLD | NEW |
1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dartino project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 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.md file. | 3 // BSD-style license that can be found in the LICENSE.md file. |
4 | 4 |
5 #if defined(FLETCH_TARGET_OS_POSIX) | 5 #if defined(DARTINO_TARGET_OS_POSIX) |
6 | 6 |
7 #include "src/vm/tick_sampler.h" | 7 #include "src/vm/tick_sampler.h" |
8 | 8 |
9 #include <errno.h> | 9 #include <errno.h> |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 #include <sys/time.h> | 11 #include <sys/time.h> |
12 #include <sys/signal.h> | 12 #include <sys/signal.h> |
13 | 13 |
14 #include "src/shared/flags.h" | 14 #include "src/shared/flags.h" |
15 #include "src/shared/platform.h" | 15 #include "src/shared/platform.h" |
16 #include "src/shared/utils.h" | 16 #include "src/shared/utils.h" |
17 | 17 |
18 #include "src/vm/process.h" | 18 #include "src/vm/process.h" |
19 #include "src/vm/tick_queue.h" | 19 #include "src/vm/tick_queue.h" |
20 #include "src/vm/thread.h" | 20 #include "src/vm/thread.h" |
21 | 21 |
22 | 22 |
23 namespace fletch { | 23 namespace dartino { |
24 | 24 |
25 class TickProcessor; | 25 class TickProcessor; |
26 | 26 |
27 Atomic<bool> TickSampler::is_active_(false); | 27 Atomic<bool> TickSampler::is_active_(false); |
28 static struct sigaction old_signal_handler; | 28 static struct sigaction old_signal_handler; |
29 static struct itimerval old_timer; | 29 static struct itimerval old_timer; |
30 static stack_t signal_stack; | 30 static stack_t signal_stack; |
31 static stack_t old_signal_stack; | 31 static stack_t old_signal_stack; |
32 static TickQueue* queue; | 32 static TickQueue* queue; |
33 static TickProcessor* processor; | 33 static TickProcessor* processor; |
34 | 34 |
35 static void SignalHandler(int signal, siginfo_t* info, void* context) { | 35 static void SignalHandler(int signal, siginfo_t* info, void* context) { |
36 USE(info); | 36 USE(info); |
37 if (signal != SIGPROF) return; | 37 if (signal != SIGPROF) return; |
38 TickSample* sample = queue->StartAdd(); | 38 TickSample* sample = queue->StartAdd(); |
39 if (sample == NULL) return; | 39 if (sample == NULL) return; |
40 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); | 40 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); |
41 mcontext_t& mcontext = ucontext->uc_mcontext; | 41 mcontext_t& mcontext = ucontext->uc_mcontext; |
42 word ip; | 42 word ip; |
43 #if defined(FLETCH_TARGET_OS_LINUX) | 43 #if defined(DARTINO_TARGET_OS_LINUX) |
44 #if defined(FLETCH_TARGET_IA32) | 44 #if defined(DARTINO_TARGET_IA32) |
45 sample->pc = bit_cast<word>(mcontext.gregs[REG_EIP]); | 45 sample->pc = bit_cast<word>(mcontext.gregs[REG_EIP]); |
46 sample->sp = bit_cast<word>(mcontext.gregs[REG_ESP]); | 46 sample->sp = bit_cast<word>(mcontext.gregs[REG_ESP]); |
47 sample->fp = bit_cast<word>(mcontext.gregs[REG_EBP]); | 47 sample->fp = bit_cast<word>(mcontext.gregs[REG_EBP]); |
48 ip = bit_cast<word>(mcontext.gregs[REG_ESI]); | 48 ip = bit_cast<word>(mcontext.gregs[REG_ESI]); |
49 #elif defined(FLETCH_TARGET_X64) | 49 #elif defined(DARTINO_TARGET_X64) |
50 sample->pc = bit_cast<word>(mcontext.gregs[REG_RIP]); | 50 sample->pc = bit_cast<word>(mcontext.gregs[REG_RIP]); |
51 sample->sp = bit_cast<word>(mcontext.gregs[REG_RSP]); | 51 sample->sp = bit_cast<word>(mcontext.gregs[REG_RSP]); |
52 sample->fp = bit_cast<word>(mcontext.gregs[REG_RBP]); | 52 sample->fp = bit_cast<word>(mcontext.gregs[REG_RBP]); |
53 ip = bit_cast<word>(mcontext.gregs[REG_RSI]); | 53 ip = bit_cast<word>(mcontext.gregs[REG_RSI]); |
54 #elif defined(FLETCH_TARGET_ARM) | 54 #elif defined(DARTINO_TARGET_ARM) |
55 sample->pc = bit_cast<word>(mcontext.arm_pc); | 55 sample->pc = bit_cast<word>(mcontext.arm_pc); |
56 sample->sp = bit_cast<word>(mcontext.arm_sp); | 56 sample->sp = bit_cast<word>(mcontext.arm_sp); |
57 sample->fp = bit_cast<word>(mcontext.arm_fp); | 57 sample->fp = bit_cast<word>(mcontext.arm_fp); |
58 ip = bit_cast<word>(mcontext.arm_r5); | 58 ip = bit_cast<word>(mcontext.arm_r5); |
59 #else | 59 #else |
60 FATAL("HandleSignal not support on this platform"); | 60 FATAL("HandleSignal not support on this platform"); |
61 #endif | 61 #endif |
62 #endif | 62 #endif |
63 #if defined(FLETCH_TARGET_OS_MACOS) | 63 #if defined(DARTINO_TARGET_OS_MACOS) |
64 #if defined(FLETCH_TARGET_IA32) | 64 #if defined(DARTINO_TARGET_IA32) |
65 sample->pc = bit_cast<word>(mcontext->__ss.__eip); | 65 sample->pc = bit_cast<word>(mcontext->__ss.__eip); |
66 sample->sp = bit_cast<word>(mcontext->__ss.__esp); | 66 sample->sp = bit_cast<word>(mcontext->__ss.__esp); |
67 sample->fp = bit_cast<word>(mcontext->__ss.__ebp); | 67 sample->fp = bit_cast<word>(mcontext->__ss.__ebp); |
68 ip = bit_cast<word>(mcontext->__ss.__esi); | 68 ip = bit_cast<word>(mcontext->__ss.__esi); |
69 #elif defined(FLETCH_TARGET_X64) | 69 #elif defined(DARTINO_TARGET_X64) |
70 sample->pc = bit_cast<word>(mcontext->__ss.__rip); | 70 sample->pc = bit_cast<word>(mcontext->__ss.__rip); |
71 sample->sp = bit_cast<word>(mcontext->__ss.__rsp); | 71 sample->sp = bit_cast<word>(mcontext->__ss.__rsp); |
72 sample->fp = bit_cast<word>(mcontext->__ss.__rbp); | 72 sample->fp = bit_cast<word>(mcontext->__ss.__rbp); |
73 ip = bit_cast<word>(mcontext->__ss.__rsi); | 73 ip = bit_cast<word>(mcontext->__ss.__rsi); |
74 #else | 74 #else |
75 FATAL("HandleSignal not support on this platform"); | 75 FATAL("HandleSignal not support on this platform"); |
76 #endif | 76 #endif |
77 #endif | 77 #endif |
78 Process* process = Thread::GetProcess(); | 78 Process* process = Thread::GetProcess(); |
79 if (process == NULL) { | 79 if (process == NULL) { |
(...skipping 25 matching lines...) Expand all Loading... |
105 static void* Entry(void* data) { | 105 static void* Entry(void* data) { |
106 reinterpret_cast<TickProcessor*>(data)->Main(); | 106 reinterpret_cast<TickProcessor*>(data)->Main(); |
107 return NULL; | 107 return NULL; |
108 } | 108 } |
109 | 109 |
110 void Main() { | 110 void Main() { |
111 FILE* file = fopen(Flags::tick_file, "w"); | 111 FILE* file = fopen(Flags::tick_file, "w"); |
112 if (file == NULL) { | 112 if (file == NULL) { |
113 FATAL("Tick file could not be opened for writing"); | 113 FATAL("Tick file could not be opened for writing"); |
114 } | 114 } |
115 fprintf(file, "# Tick samples from the Fletch VM.\n"); | 115 fprintf(file, "# Tick samples from the Dartino VM.\n"); |
116 const char* model; | 116 const char* model; |
117 if (kPointerSize == 8 && sizeof(fletch_double) == 8) { | 117 if (kPointerSize == 8 && sizeof(dartino_double) == 8) { |
118 model = "b64double"; | 118 model = "b64double"; |
119 } else if (kPointerSize == 8 && sizeof(fletch_double) == 4) { | 119 } else if (kPointerSize == 8 && sizeof(dartino_double) == 4) { |
120 model = "b64float"; | 120 model = "b64float"; |
121 } else if (kPointerSize == 4 && sizeof(fletch_double) == 8) { | 121 } else if (kPointerSize == 4 && sizeof(dartino_double) == 8) { |
122 model = "b32double"; | 122 model = "b32double"; |
123 } else { | 123 } else { |
124 ASSERT(kPointerSize == 4 && sizeof(fletch_double) == 4); | 124 ASSERT(kPointerSize == 4 && sizeof(dartino_double) == 4); |
125 model = "b32float"; | 125 model = "b32float"; |
126 } | 126 } |
127 fprintf(file, "model=%s\n", model); | 127 fprintf(file, "model=%s\n", model); |
128 bool timed_out; | 128 bool timed_out; |
129 do { | 129 do { |
130 { // Ensure the monitor is locked before calling wait. | 130 { // Ensure the monitor is locked before calling wait. |
131 ScopedMonitorLock scope(monitor_); | 131 ScopedMonitorLock scope(monitor_); |
132 timed_out = monitor_->Wait(pause_in_us_); | 132 timed_out = monitor_->Wait(pause_in_us_); |
133 } | 133 } |
134 TickSample* sample = queue_->StartRemove(); | 134 TickSample* sample = queue_->StartRemove(); |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 bool expected = true; | 223 bool expected = true; |
224 if (!is_active_.compare_exchange_strong(expected, false)) { | 224 if (!is_active_.compare_exchange_strong(expected, false)) { |
225 FATAL("Tick profiler has not been installed"); | 225 FATAL("Tick profiler has not been installed"); |
226 } | 226 } |
227 | 227 |
228 processor->Join(); | 228 processor->Join(); |
229 delete queue; | 229 delete queue; |
230 delete processor; | 230 delete processor; |
231 } | 231 } |
232 | 232 |
233 } // namespace fletch | 233 } // namespace dartino |
234 | 234 |
235 #endif // FLETCH_TARGET_OS_POSIX | 235 #endif // DARTINO_TARGET_OS_POSIX |
OLD | NEW |