| // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
 | // 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. | 
 |  | 
 | #ifndef RUNTIME_VM_SIGNAL_HANDLER_H_ | 
 | #define RUNTIME_VM_SIGNAL_HANDLER_H_ | 
 |  | 
 | #include "vm/allocation.h" | 
 | #include "vm/globals.h" | 
 |  | 
 | #if defined(DART_HOST_OS_LINUX) | 
 | #include <signal.h>    // NOLINT | 
 | #include <ucontext.h>  // NOLINT | 
 | #elif defined(DART_HOST_OS_ANDROID) | 
 | #include <signal.h>  // NOLINT | 
 | #if !defined(__BIONIC_HAVE_UCONTEXT_T) | 
 | #include <asm/sigcontext.h>  // NOLINT | 
 | // If ucontext_t is not defined on Android, define it here. | 
 | typedef struct sigcontext mcontext_t; | 
 | typedef struct ucontext { | 
 |   uint32_t uc_flags; | 
 |   struct ucontext* uc_link; | 
 |   stack_t uc_stack; | 
 |   struct sigcontext uc_mcontext; | 
 |   uint32_t uc_sigmask; | 
 | } ucontext_t; | 
 | #endif                       // !defined(__BIONIC_HAVE_UCONTEXT_T) | 
 | #elif defined(DART_HOST_OS_MACOS) | 
 | #include <signal.h>        // NOLINT | 
 | #include <sys/ucontext.h>  // NOLINT | 
 | #elif defined(DART_HOST_OS_WINDOWS) | 
 | // Stub out for windows. | 
 | struct siginfo_t; | 
 | struct mcontext_t; | 
 | struct sigset_t {}; | 
 | #elif defined(DART_HOST_OS_FUCHSIA) | 
 | #include <signal.h>    // NOLINT | 
 | #include <ucontext.h>  // NOLINT | 
 | #endif | 
 |  | 
 | namespace dart { | 
 |  | 
 | typedef void (*SignalAction)(int signal, siginfo_t* info, void* context); | 
 |  | 
 | class SignalHandler : public AllStatic { | 
 |  public: | 
 |   static void Install(SignalAction action); | 
 |   static void Remove(); | 
 |   static uintptr_t GetProgramCounter(const mcontext_t& mcontext); | 
 |   static uintptr_t GetFramePointer(const mcontext_t& mcontext); | 
 |   static uintptr_t GetCStackPointer(const mcontext_t& mcontext); | 
 |   static uintptr_t GetDartStackPointer(const mcontext_t& mcontext); | 
 |   static uintptr_t GetLinkRegister(const mcontext_t& mcontext); | 
 |  | 
 | #if defined(DART_HOST_OS_ANDROID) | 
 |   // Prepare current thread for handling interrupts. Returns | 
 |   // opaque pointer to the allocated state (if any). | 
 |   static void* PrepareCurrentThread(); | 
 |  | 
 |   // Cleanup any state which was created by |PrepareCurrentThread|. | 
 |   static void CleanupCurrentThreadState(void* state); | 
 | #endif | 
 | }; | 
 |  | 
 | #undef USE_SIGNAL_HANDLER_TRAMPOLINE | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_SIGNAL_HANDLER_H_ |