From 4f0b5a097da2464a8d5120ccc64bf9cf24ddd890 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 17 Mar 2014 04:41:35 +0000 Subject: [PATCH] * sigproc.h (no_thread_exit_protect): New class. * sigproc.cc (thread_exit): Use no_thread_exit_protect to determine if we need to coordinate ThreadExit/ExitProcess. * fhandler_dsp.cc (fhandler_dev_dsp::Audio_out::stop): Use no_thread_exit_protect to kludge around waiting for waveOutClose as it waits for a thread that never exits. (fhandler_dev_dsp::Audio_in::stop): Ditto for waveInClose. * fhandler.h (fhandler_dev_dsp::base): New method. (fhandler_dev_dsp::_read): Ditto. (fhandler_dev_dsp::_write): Ditto. (fhandler_dev_dsp::_ioctl): Ditto. (fhandler_dev_dsp::_fixup_after_fork): Ditto. (fhandler_dev_dsp::_fixup_after_exec): Ditto. * fhandler_dsp.cc (fhandler_dev_dsp::read): Call real function via base() pointer. (fhandler_dev_dsp::write): Ditto. (fhandler_dev_dsp::ioctl): Ditto. (fhandler_dev_dsp::fixup_after_fork): Ditto. (fhandler_dev_dsp::fixup_after_exec): Ditto. (fhandler_dev_dsp::_read): Rename by adding an leading underscore. (fhandler_dev_dsp::_write): Ditto. (fhandler_dev_dsp::_ioctl): Ditto. (fhandler_dev_dsp::_fixup_after_fork): Ditto. (fhandler_dev_dsp::_fixup_after_exec): Ditto. --- winsup/cygwin/ChangeLog | 30 ++++++++++++++++++++++++ winsup/cygwin/fhandler.h | 9 +++++++- winsup/cygwin/fhandler_dsp.cc | 43 +++++++++++++++++++++++++++++++---- winsup/cygwin/sigproc.cc | 6 ++++- winsup/cygwin/sigproc.h | 16 +++++++++++++ 5 files changed, 97 insertions(+), 7 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 6f71531b4..3ebeb7f25 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,33 @@ +2014-03-17 Christopher Faylor + + * sigproc.h (no_thread_exit_protect): New class. + * sigproc.cc (thread_exit): Use no_thread_exit_protect to determine if + we need to coordinate ThreadExit/ExitProcess. + * fhandler_dsp.cc (fhandler_dev_dsp::Audio_out::stop): Use + no_thread_exit_protect to kludge around waiting for waveOutClose as it + waits for a thread that never exits. + (fhandler_dev_dsp::Audio_in::stop): Ditto for waveInClose. + +2014-03-16 Christopher Faylor + + * fhandler.h (fhandler_dev_dsp::base): New method. + (fhandler_dev_dsp::_read): Ditto. + (fhandler_dev_dsp::_write): Ditto. + (fhandler_dev_dsp::_ioctl): Ditto. + (fhandler_dev_dsp::_fixup_after_fork): Ditto. + (fhandler_dev_dsp::_fixup_after_exec): Ditto. + * fhandler_dsp.cc (fhandler_dev_dsp::read): Call real function via + base() pointer. + (fhandler_dev_dsp::write): Ditto. + (fhandler_dev_dsp::ioctl): Ditto. + (fhandler_dev_dsp::fixup_after_fork): Ditto. + (fhandler_dev_dsp::fixup_after_exec): Ditto. + (fhandler_dev_dsp::_read): Rename by adding an leading underscore. + (fhandler_dev_dsp::_write): Ditto. + (fhandler_dev_dsp::_ioctl): Ditto. + (fhandler_dev_dsp::_fixup_after_fork): Ditto. + (fhandler_dev_dsp::_fixup_after_exec): Ditto. + 2014-03-12 Corinna Vinschen * cygheap.h (enum cygheap_pwdgrp::cache_t): Remove. diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 5e86f003c..663009622 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -1790,16 +1790,23 @@ class fhandler_dev_dsp: public fhandler_base Audio_in *audio_in_; public: fhandler_dev_dsp (); + fhandler_dev_dsp *base () const {return (fhandler_dev_dsp *)archetype;} int open (int flags, mode_t mode = 0); ssize_t __stdcall write (const void *ptr, size_t len); void __reg3 read (void *ptr, size_t& len); int ioctl (unsigned int cmd, void *); - off_t lseek (off_t, int) { return 0; } int close (); void fixup_after_fork (HANDLE parent); void fixup_after_exec (); + private: + ssize_t __stdcall _write (const void *ptr, size_t len); + void __reg3 _read (void *ptr, size_t& len); + int _ioctl (unsigned int cmd, void *); + void _fixup_after_fork (HANDLE parent); + void _fixup_after_exec (); + void close_audio_in (); void close_audio_out (bool immediately = false); bool use_archetype () const {return true;} diff --git a/winsup/cygwin/fhandler_dsp.cc b/winsup/cygwin/fhandler_dsp.cc index 80b014219..04b13057a 100644 --- a/winsup/cygwin/fhandler_dsp.cc +++ b/winsup/cygwin/fhandler_dsp.cc @@ -435,6 +435,7 @@ fhandler_dev_dsp::Audio_out::stop (bool immediately) debug_printf ("%u = waveOutUnprepareHeader(%p)", rc, pHdr); } + no_thread_exit_protect for_now (true); rc = waveOutClose (dev_); debug_printf ("%u = waveOutClose()", rc); @@ -810,6 +811,7 @@ fhandler_dev_dsp::Audio_in::stop () debug_printf ("%u = waveInUnprepareHeader(%p)", rc, pHdr); } + no_thread_exit_protect for_now (true); rc = waveInClose (dev_); debug_printf ("%u = waveInClose()", rc); @@ -1003,6 +1005,37 @@ fhandler_dev_dsp::fhandler_dev_dsp (): dev ().parse (FH_OSS_DSP); } +ssize_t __stdcall +fhandler_dev_dsp::write (const void *ptr, size_t len) +{ + return base ()->_write (ptr, len); +} + +void __reg3 +fhandler_dev_dsp::read (void *ptr, size_t& len) +{ + return base ()->_read (ptr, len); +} + +int +fhandler_dev_dsp::ioctl (unsigned int cmd, void *) +{ + return base ()->_ioctl (cmd, NULL); +} + +void +fhandler_dev_dsp::fixup_after_fork (HANDLE parent) +{ + base ()->fixup_after_fork (parent); +} + +void +fhandler_dev_dsp::fixup_after_exec () +{ + base ()->fixup_after_exec (); +} + + int fhandler_dev_dsp::open (int flags, mode_t mode) { @@ -1046,7 +1079,7 @@ fhandler_dev_dsp::open (int flags, mode_t mode) #define IS_READ() ((get_flags() & O_ACCMODE) != O_WRONLY) ssize_t __stdcall -fhandler_dev_dsp::write (const void *ptr, size_t len) +fhandler_dev_dsp::_write (const void *ptr, size_t len) { debug_printf ("ptr=%p len=%ld", ptr, len); int len_s = len; @@ -1092,7 +1125,7 @@ fhandler_dev_dsp::write (const void *ptr, size_t len) } void __reg3 -fhandler_dev_dsp::read (void *ptr, size_t& len) +fhandler_dev_dsp::_read (void *ptr, size_t& len) { debug_printf ("ptr=%p len=%ld", ptr, len); @@ -1159,7 +1192,7 @@ fhandler_dev_dsp::close () } int -fhandler_dev_dsp::ioctl (unsigned int cmd, void *buf) +fhandler_dev_dsp::_ioctl (unsigned int cmd, void *buf) { debug_printf ("audio_in=%p audio_out=%p", audio_in_, audio_out_); int *intbuf = (int *) buf; @@ -1362,7 +1395,7 @@ fhandler_dev_dsp::ioctl (unsigned int cmd, void *buf) } void -fhandler_dev_dsp::fixup_after_fork (HANDLE parent) +fhandler_dev_dsp::_fixup_after_fork (HANDLE parent) { // called from new child process debug_printf ("audio_in=%p audio_out=%p", audio_in_, audio_out_); @@ -1375,7 +1408,7 @@ fhandler_dev_dsp::fixup_after_fork (HANDLE parent) } void -fhandler_dev_dsp::fixup_after_exec () +fhandler_dev_dsp::_fixup_after_exec () { debug_printf ("audio_in=%p audio_out=%p, close_on_exec %d", audio_in_, audio_out_, close_on_exec ()); diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index 5525271ca..eb61755a1 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -39,6 +39,8 @@ struct sigaction *global_sigs; const char *__sp_fn ; int __sp_ln; +bool no_thread_exit_protect::flag; + char NO_COPY myself_nowait_dummy[1] = {'0'};// Flag to sig_send that signal goes to // current process but no wait is required @@ -446,6 +448,8 @@ void exit_thread (DWORD res) { # undef ExitThread + if (no_thread_exit_protect ()) + ExitThread (res); sigfillset (&_my_tls.sigmask); /* No signals wanted */ lock_process for_now; /* May block indefinitely when exiting. */ HANDLE h; @@ -465,7 +469,7 @@ exit_thread (DWORD res) siginfo_t si = {__SIGTHREADEXIT, SI_KERNEL}; si.si_cyg = h; sig_send (myself_nowait, si, &_my_tls); - ExitThread (0); + ExitThread (res); } int __reg3 diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index e73e33aeb..c6ef13e24 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -83,6 +83,22 @@ int kill_pgrp (pid_t, siginfo_t&); void __reg1 exit_thread (DWORD) __attribute__ ((noreturn)); void __reg1 setup_signal_exit (int); +class no_thread_exit_protect +{ + static bool flag; + bool modify; +public: + no_thread_exit_protect (int) {flag = true; modify = true;} + ~no_thread_exit_protect () + { + if (modify) + flag = false; + } + no_thread_exit_protect () {modify = false;} + operator int () {return flag;} +}; + + extern "C" void sigdelayed (); extern char myself_nowait_dummy[];