mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-02-07 06:53:33 +00:00
cd672e251f
This change fixes a bug where exiting a crash signal handler on Windows after adding the signal to uc_sigmask, but not correcting the CPU state would cause the signal handler to loop infinitely, causing process hang Another issue is that very tiny programs, that don't link posix signals would not have their SIGILL / SIGSEGV / etc. status reported to Cosmo's bash shell when terminating on crash. That's fixed by a tiny handler in WinMain() that knows how to map WIN32 crash codes to the POSIX flavors.
32 lines
884 B
C
32 lines
884 B
C
#ifndef COSMOPOLITAN_LIBC_CALLS_SIGNALS_INTERNAL_H_
|
|
#define COSMOPOLITAN_LIBC_CALLS_SIGNALS_INTERNAL_H_
|
|
#include "libc/calls/struct/sigset.h"
|
|
#include "libc/nt/struct/ntexceptionpointers.h"
|
|
#include "libc/thread/posixthread.internal.h"
|
|
|
|
#define SIG_HANDLED_NO_RESTART 1
|
|
#define SIG_HANDLED_SA_RESTART 2
|
|
|
|
COSMOPOLITAN_C_START_
|
|
|
|
struct Signals {
|
|
_Atomic(uint64_t) pending;
|
|
_Atomic(uint64_t) count;
|
|
};
|
|
|
|
extern struct Signals __sig;
|
|
|
|
bool __sig_ignored(int);
|
|
int __sig_check(void);
|
|
int __sig_crash_sig(struct NtExceptionPointers *, int *);
|
|
int __sig_get(sigset_t);
|
|
int __sig_kill(struct PosixThread *, int, int);
|
|
int __sig_mask(int, const sigset_t *, sigset_t *);
|
|
int __sig_raise(int, int);
|
|
int __sig_relay(int, int, sigset_t);
|
|
void __sig_delete(int);
|
|
void __sig_generate(int, int);
|
|
void __sig_init(void);
|
|
|
|
COSMOPOLITAN_C_END_
|
|
#endif /* COSMOPOLITAN_LIBC_CALLS_SIGNALS_INTERNAL_H_ */
|