59
60 // Returns one-line short description of a signal set in a user provided buffer.
61 static const char* describe_signal_set_short(const sigset_t* set, char* buffer, size_t size);
62
63 // Prints a short one-line description of a signal set.
64 static void print_signal_set_short(outputStream* st, const sigset_t* set);
65
66 // unblocks the signal masks for current thread
67 static int unblock_thread_signal_mask(const sigset_t *set);
68
69 // Writes a one-line description of a combination of sigaction.sa_flags
70 // into a user provided buffer. Returns that buffer.
71 static const char* describe_sa_flags(int flags, char* buffer, size_t size);
72
73 // Prints a one-line description of a combination of sigaction.sa_flags.
74 static void print_sa_flags(outputStream* st, int flags);
75
76 static address ucontext_get_pc(const ucontext_t* ctx);
77 // Set PC into context. Needed for continuation after signal.
78 static void ucontext_set_pc(ucontext_t* ctx, address pc);
79 };
80
81 /*
82 * Crash protection for the watcher thread. Wrap the callback
83 * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp
84 * back.
85 * To be able to use this - don't take locks, don't rely on destructors,
86 * don't make OS library calls, don't allocate memory, don't print,
87 * don't call code that could leave the heap / memory in an inconsistent state,
88 * or anything else where we are not in control if we suddenly jump out.
89 */
90 class WatcherThreadCrashProtection : public StackObj {
91 public:
92 WatcherThreadCrashProtection();
93 bool call(os::CrashProtectionCallback& cb);
94
95 static void check_crash_protection(int signal, Thread* thread);
96 private:
97 void restore();
98 sigjmp_buf _jmpbuf;
|
59
60 // Returns one-line short description of a signal set in a user provided buffer.
61 static const char* describe_signal_set_short(const sigset_t* set, char* buffer, size_t size);
62
63 // Prints a short one-line description of a signal set.
64 static void print_signal_set_short(outputStream* st, const sigset_t* set);
65
66 // unblocks the signal masks for current thread
67 static int unblock_thread_signal_mask(const sigset_t *set);
68
69 // Writes a one-line description of a combination of sigaction.sa_flags
70 // into a user provided buffer. Returns that buffer.
71 static const char* describe_sa_flags(int flags, char* buffer, size_t size);
72
73 // Prints a one-line description of a combination of sigaction.sa_flags.
74 static void print_sa_flags(outputStream* st, int flags);
75
76 static address ucontext_get_pc(const ucontext_t* ctx);
77 // Set PC into context. Needed for continuation after signal.
78 static void ucontext_set_pc(ucontext_t* ctx, address pc);
79
80 // Helper function; describes pthread attributes as short string. String is written
81 // to buf with len buflen; buf is returned.
82 static char* describe_pthread_attr(char* buf, size_t buflen, const pthread_attr_t* attr);
83
84 };
85
86 /*
87 * Crash protection for the watcher thread. Wrap the callback
88 * with a sigsetjmp and in case of a SIGSEGV/SIGBUS we siglongjmp
89 * back.
90 * To be able to use this - don't take locks, don't rely on destructors,
91 * don't make OS library calls, don't allocate memory, don't print,
92 * don't call code that could leave the heap / memory in an inconsistent state,
93 * or anything else where we are not in control if we suddenly jump out.
94 */
95 class WatcherThreadCrashProtection : public StackObj {
96 public:
97 WatcherThreadCrashProtection();
98 bool call(os::CrashProtectionCallback& cb);
99
100 static void check_crash_protection(int signal, Thread* thread);
101 private:
102 void restore();
103 sigjmp_buf _jmpbuf;
|