diff options
Diffstat (limited to 'winsup/cygwin/cygtls.h')
-rw-r--r-- | winsup/cygwin/cygtls.h | 60 |
1 files changed, 18 insertions, 42 deletions
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h index d683cf837..d8940ac26 100644 --- a/winsup/cygwin/cygtls.h +++ b/winsup/cygwin/cygtls.h @@ -1,12 +1,13 @@ /* cygtls.h - Copyright 2003, 2004, 2005, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc. + Copyright 2003, 2004, 2005, 2008, 2009, 2010, 2011 Red Hat, Inc. This software is a copyrighted work licensed under the terms of the Cygwin license. Please consult the file "CYGWIN_LICENSE" for details. */ -#pragma once +#ifndef _CYGTLS_H +#define _CYGTLS_H #include <signal.h> #include <pwd.h> @@ -157,7 +158,6 @@ typedef struct struct_waitq /*gentls_offsets*/ #include "cygerrno.h" -#include "security.h" extern "C" int __sjfault (jmp_buf); extern "C" int __ljfault (jmp_buf, int); @@ -169,29 +169,27 @@ typedef __uint32_t __stack_t; class _cygtls { public: - /* Please keep these two declarations first */ - struct _local_storage locals; - union - { - struct _reent local_clib; - char __dontuse[8 * ((sizeof(struct _reent) + 4) / 8)]; - }; - /**/ void (*func) /*gentls_offsets*/(int)/*gentls_offsets*/; int saved_errno; int sa_flags; sigset_t oldmask; sigset_t deltamask; + HANDLE event; int *errno_addr; sigset_t sigmask; sigset_t sigwait_mask; siginfo_t *sigwait_info; - HANDLE signal_arrived; - bool signal_waiting; struct ucontext thread_context; DWORD thread_id; + unsigned threadkill; siginfo_t infodata; struct pthread *tid; + union + { + struct _reent local_clib; + char __dontuse[8 * ((sizeof(struct _reent) + 4) / 8)]; + }; + struct _local_storage locals; class cygthread *_ctinfo; class san *andreas; waitq wq; @@ -204,8 +202,11 @@ public: unsigned initialized; /*gentls_offsets*/ + static CRITICAL_SECTION protect_linked_list; + static void init (); void init_thread (void *, DWORD (*) (void *, void *)); static void call (DWORD (*) (void *, void *), void *); + static struct _cygtls *find_tls (int sig); void remove (DWORD); void push (__stack_t) __attribute__ ((regparm (2))); __stack_t pop () __attribute__ ((regparm (1))); @@ -229,30 +230,14 @@ public: operator HANDLE () const {return tid->win32_obj_id;} #endif void set_siginfo (struct sigpacket *) __attribute__ ((regparm (3))); + void set_threadkill () {threadkill = true;} + void reset_threadkill () {threadkill = false;} int call_signal_handler () __attribute__ ((regparm (1))); void remove_wq (DWORD) __attribute__ ((regparm (1))); void fixup_after_fork () __attribute__ ((regparm (1))); void lock () __attribute__ ((regparm (1))); void unlock () __attribute__ ((regparm (1))); bool locked () __attribute__ ((regparm (1))); - void set_signal_arrived (bool setit, HANDLE& h) - { - if (!setit) - signal_waiting = false; - else - { - if (!signal_arrived) - signal_arrived = CreateEvent (&sec_none_nih, false, false, NULL); - h = signal_arrived; - signal_waiting = true; - } - } - void reset_signal_arrived () - { - if (signal_arrived) - ResetEvent (signal_arrived); - signal_waiting = false; - } private: void call2 (DWORD (*) (void *, void *), void *, void *) __attribute__ ((regparm (3))); /*gentls_offsets*/ @@ -320,15 +305,6 @@ public: } }; -class set_signal_arrived -{ -public: - set_signal_arrived (bool setit, HANDLE& h) { _my_tls.set_signal_arrived (setit, h); } - set_signal_arrived (HANDLE& h) { _my_tls.set_signal_arrived (true, h); } - - operator int () const {return _my_tls.signal_waiting;} - ~set_signal_arrived () { _my_tls.reset_signal_arrived (); } -}; - #define __getreent() (&_my_tls.local_clib) -/*gentls_offsets*/ + +#endif /*_CYGTLS_H*/ /*gentls_offsets*/ |