summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.h
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/sigproc.h')
-rw-r--r--winsup/cygwin/sigproc.h51
1 files changed, 49 insertions, 2 deletions
diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h
index 0ef9e74a1..eee35748f 100644
--- a/winsup/cygwin/sigproc.h
+++ b/winsup/cygwin/sigproc.h
@@ -32,12 +32,60 @@ typedef struct struct_waitq
HANDLE thread_ev;
} waitq;
+class muto;
+
+struct sigthread
+{
+ DWORD id;
+ DWORD frame;
+ muto *lock;
+ sigthread () : id (0), frame (0), lock (0) {}
+};
+
+class sigframe
+{
+private:
+ sigthread *st;
+
+public:
+ void set (sigthread &t, int up = 1)
+ {
+ if (!t.lock)
+ t.lock = new_muto (FALSE, "sigthread");
+ t.lock->acquire ();
+ st = &t;
+ t.frame = (DWORD) (up ? __builtin_frame_address (1) :
+ __builtin_frame_address (0));
+ t.lock->release ();
+ }
+
+ sigframe () {st = NULL;}
+ sigframe (sigthread &t, int up = 1)
+ {
+ if (!t.frame || t.id == GetCurrentThreadId ())
+ set (t, up);
+ else
+ st = NULL;
+ }
+ ~sigframe ()
+ {
+ if (st)
+ {
+ st->lock->acquire ();
+ st->frame = 0;
+ st->lock->release ();
+ st = NULL;
+ }
+ }
+};
+
+extern sigthread mainthread;
extern HANDLE signal_arrived;
BOOL __stdcall my_parent_is_alive ();
extern "C" int __stdcall sig_dispatch_pending (int force = FALSE) __asm__ ("sig_dispatch_pending");
extern "C" void __stdcall set_process_mask (sigset_t newmask);
-int __stdcall sig_handle (int, int);
+int __stdcall sig_handle (int);
void __stdcall sig_clear (int);
void __stdcall sig_set_pending (int);
int __stdcall handle_sigsuspend (sigset_t);
@@ -53,7 +101,6 @@ void __stdcall signal_fixup_after_fork ();
extern char myself_nowait_dummy[];
extern char myself_nowait_nonmain_dummy[];
-extern DWORD maintid;
extern HANDLE hExeced; // Process handle of new window
// process created by spawn_guts()