diff options
author | Christopher Faylor <me@cgf.cx> | 2000-08-22 05:10:20 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2000-08-22 05:10:20 +0000 |
commit | bccd5e0d8530b8ba4d5388d7de6a86c0267e5be8 (patch) | |
tree | d03d4a3a1413b7651456f9dd4f97d1c70e5276ae /winsup/cygwin/perthread.h | |
parent | 19b48cd9822ffec2ddfb16f2e49df23f95b9e05c (diff) | |
download | cygnal-bccd5e0d8530b8ba4d5388d7de6a86c0267e5be8.tar.gz cygnal-bccd5e0d8530b8ba4d5388d7de6a86c0267e5be8.tar.bz2 cygnal-bccd5e0d8530b8ba4d5388d7de6a86c0267e5be8.zip |
* winsup.h: Eliminate inclusion of most of the cygwin .h files. Use .h files
only in sources which require them.
* Makefile.in: Generate dependencies with -MD option.
Diffstat (limited to 'winsup/cygwin/perthread.h')
-rw-r--r-- | winsup/cygwin/perthread.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/winsup/cygwin/perthread.h b/winsup/cygwin/perthread.h index fa6e1dfcb..7d009e1f0 100644 --- a/winsup/cygwin/perthread.h +++ b/winsup/cygwin/perthread.h @@ -35,3 +35,79 @@ set_reent (struct _reent *r) *base = PTMAGIC; base[-1] = (DWORD) r; } + +#define PER_THREAD_FORK_CLEAR ((void *)0xffffffff) +class per_thread +{ + DWORD tls; + int clear_on_fork_p; +public: + per_thread (int forkval = 1) {tls = TlsAlloc (); clear_on_fork_p = forkval;} + DWORD get_tls () {return tls;} + int clear_on_fork () {return clear_on_fork_p;} + + virtual void *get () {return TlsGetValue (get_tls ());} + virtual size_t size () {return 0;} + virtual void set (void *s = NULL); + virtual void set (int n) {TlsSetValue (get_tls (), (void *)n);} + virtual void *create () + { + void *s = new char [size ()]; + memset (s, 0, size ()); + set (s); + return s; + } +}; + +class per_thread_waitq : public per_thread +{ +public: + per_thread_waitq () : per_thread (0) {} + void *get () {return (waitq *) this->per_thread::get ();} + void *create () {return (waitq *) this->per_thread::create ();} + size_t size () {return sizeof (waitq);} +}; + +struct vfork_save +{ + int pid; + jmp_buf j; + DWORD frame[100]; + char **vfork_ebp; + char **vfork_esp; + int is_active () { return pid < 0; } +}; + +class per_thread_vfork : public per_thread +{ +public: + vfork_save *val () { return (vfork_save *) this->per_thread::get (); } + vfork_save *create () {return (vfork_save *) this->per_thread::create ();} + size_t size () {return sizeof (vfork_save);} +}; + +extern "C" { +struct signal_dispatch +{ + int arg; + void (*func) (int); + int sig; + int saved_errno; + DWORD oldmask; + DWORD retaddr; + DWORD *retaddr_on_stack; +}; +}; + +struct per_thread_signal_dispatch : public per_thread +{ + signal_dispatch *get () { return (signal_dispatch *) this->per_thread::get (); } + signal_dispatch *create () {return (signal_dispatch *) this->per_thread::create ();} + size_t size () {return sizeof (signal_dispatch);} +}; + +extern per_thread_waitq waitq_storage; +extern per_thread_vfork vfork_storage; +extern per_thread_signal_dispatch signal_dispatch_storage; + +extern per_thread *threadstuff[]; |