| Index: runtime/vm/signal_handler_android.cc | 
| =================================================================== | 
| --- runtime/vm/signal_handler_android.cc	(revision 35316) | 
| +++ runtime/vm/signal_handler_android.cc	(working copy) | 
| @@ -2,30 +2,60 @@ | 
| // for details. All rights reserved. Use of this source code is governed by a | 
| // BSD-style license that can be found in the LICENSE file. | 
|  | 
| -#include "platform/thread.h" | 
| #include "vm/globals.h" | 
| +#include "vm/simulator.h" | 
| #include "vm/signal_handler.h" | 
| #if defined(TARGET_OS_ANDROID) | 
|  | 
| namespace dart { | 
|  | 
| uintptr_t SignalHandler::GetProgramCounter(const mcontext_t& mcontext) { | 
| +  uintptr_t pc = 0; | 
| + | 
| +#if defined(TARGET_ARCH_ARM) | 
| +  pc = static_cast<uintptr_t>(mcontext.arm_pc); | 
| +#else | 
| UNIMPLEMENTED(); | 
| +#endif  // TARGET_ARCH_... | 
| +  return pc; | 
| } | 
|  | 
|  | 
| uintptr_t SignalHandler::GetFramePointer(const mcontext_t& mcontext) { | 
| +  uintptr_t fp = 0; | 
| + | 
| +#if defined(TARGET_ARCH_ARM) | 
| +  fp = static_cast<uintptr_t>(mcontext.arm_fp); | 
| +#else | 
| UNIMPLEMENTED(); | 
| +#endif  // TARGET_ARCH_... | 
| + | 
| +  return fp; | 
| } | 
|  | 
|  | 
| uintptr_t SignalHandler::GetStackPointer(const mcontext_t& mcontext) { | 
| +  uintptr_t sp = 0; | 
| + | 
| +#if defined(TARGET_ARCH_ARM) | 
| +  sp = static_cast<uintptr_t>(mcontext.arm_sp); | 
| +#else | 
| UNIMPLEMENTED(); | 
| +#endif  // TARGET_ARCH_... | 
| +  return sp; | 
| } | 
|  | 
|  | 
| void SignalHandler::Install(SignalAction action) { | 
| -  UNIMPLEMENTED(); | 
| +  struct sigaction act; | 
| +  memset(&act, 0, sizeof(act)); | 
| +  act.sa_sigaction = action; | 
| +  act.sa_flags = SA_RESTART | SA_SIGINFO; | 
| +  sigemptyset(&act.sa_mask); | 
| +  // TODO(johnmccutchan): Do we care about restoring the signal handler? | 
| +  struct sigaction old_act; | 
| +  int r = sigaction(SIGPROF, &act, &old_act); | 
| +  ASSERT(r == 0); | 
| } | 
|  | 
|  | 
|  |