blob: 06d66270afe54771e454bfe3b712fc47079b0860 [file] [log] [blame]
Roland Levillain21482ad2017-01-19 20:04:27 +00001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ART_RUNTIME_RUNTIME_COMMON_H_
18#define ART_RUNTIME_RUNTIME_COMMON_H_
19
20// Code shared by runtime/runtime_android.cc and runtime/runtime_linux.cc.
21
Roland Levillain32a5bb22017-01-31 14:33:16 +000022#if defined(__APPLE__)
23// On macOS, _XOPEN_SOURCE must be defined to access ucontext
24// routines, as they are considered deprecated on that platform.
25#define _XOPEN_SOURCE
26#endif
27
Roland Levillain21482ad2017-01-19 20:04:27 +000028#include <sys/utsname.h>
29#include <ucontext.h>
30
31#include <iomanip>
32
33#include "base/dumpable.h"
34#include "native_stack_dump.h"
35#include "utils.h"
36
37namespace art {
38
39struct Backtrace {
40 public:
41 explicit Backtrace(void* raw_context) : raw_context_(raw_context) {}
42 void Dump(std::ostream& os) const {
43 DumpNativeStack(os, GetTid(), nullptr, "\t", nullptr, raw_context_);
44 }
45 private:
46 // Stores the context of the signal that was unexpected and will terminate the runtime. The
47 // DumpNativeStack code will take care of casting it to the expected type. This is required
48 // as our signal handler runs on an alternate stack.
49 void* raw_context_;
50};
51
52struct OsInfo {
53 void Dump(std::ostream& os) const {
54 utsname info;
55 uname(&info);
56 // Linux 2.6.38.8-gg784 (x86_64)
57 // Darwin 11.4.0 (x86_64)
58 os << info.sysname << " " << info.release << " (" << info.machine << ")";
59 }
60};
61
62const char* GetSignalName(int signal_number);
63const char* GetSignalCodeName(int signal_number, int signal_code);
64
Roland Levillain21482ad2017-01-19 20:04:27 +000065// Return the signal number we recognize as timeout. -1 means not active/supported.
66int GetTimeoutSignal();
67
68void HandleUnexpectedSignalCommon(int signal_number,
69 siginfo_t* info,
70 void* raw_context,
Andreas Gampec6fe4272017-06-01 20:14:58 -070071 bool handle_timeout_signal,
72 bool dump_on_stderr);
Roland Levillain21482ad2017-01-19 20:04:27 +000073
74void InitPlatformSignalHandlersCommon(void (*newact)(int, siginfo_t*, void*),
75 struct sigaction* oldact,
76 bool handle_timeout_signal);
77
78} // namespace art
79
80#endif // ART_RUNTIME_RUNTIME_COMMON_H_