mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-02 04:20:28 +08:00
Cygwin: dsp: Fix hang on close() if another thread calls write().
fhandler_dev_dsp (OSS) has a problem that waitforallsent(), which is called from close(), falls into infinite loop if another thread calls write() accidentally after close(). This patch fixes the issue. Reviewed-by: Corinna Vinschen <corinna@vinschen.de> Signed-off-by: Takashi Yano <takashi.yano@nifty.ne.jp>
This commit is contained in:
parent
62bc6bee3b
commit
4384f47b93
@ -1093,6 +1093,8 @@ fhandler_dev_dsp::open (int flags, mode_t)
|
|||||||
|
|
||||||
debug_printf ("ACCMODE=%y audio_in=%d audio_out=%d, err=%d, ret=%d",
|
debug_printf ("ACCMODE=%y audio_in=%d audio_out=%d, err=%d, ret=%d",
|
||||||
flags & O_ACCMODE, num_in, num_out, err, ret);
|
flags & O_ACCMODE, num_in, num_out, err, ret);
|
||||||
|
if (ret)
|
||||||
|
being_closed = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1106,6 +1108,12 @@ fhandler_dev_dsp::_write (const void *ptr, size_t len)
|
|||||||
int len_s = len;
|
int len_s = len;
|
||||||
const char *ptr_s = static_cast <const char *> (ptr);
|
const char *ptr_s = static_cast <const char *> (ptr);
|
||||||
|
|
||||||
|
if (being_closed)
|
||||||
|
{
|
||||||
|
set_errno (EBADF);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (audio_out_)
|
if (audio_out_)
|
||||||
/* nothing to do */;
|
/* nothing to do */;
|
||||||
else if (IS_WRITE ())
|
else if (IS_WRITE ())
|
||||||
@ -1207,6 +1215,7 @@ int
|
|||||||
fhandler_dev_dsp::close ()
|
fhandler_dev_dsp::close ()
|
||||||
{
|
{
|
||||||
debug_printf ("audio_in=%p audio_out=%p", audio_in_, audio_out_);
|
debug_printf ("audio_in=%p audio_out=%p", audio_in_, audio_out_);
|
||||||
|
being_closed = true;
|
||||||
close_audio_in ();
|
close_audio_in ();
|
||||||
close_audio_out ();
|
close_audio_out ();
|
||||||
return fhandler_base::close ();
|
return fhandler_base::close ();
|
||||||
|
@ -2758,6 +2758,7 @@ class fhandler_dev_dsp: public fhandler_base
|
|||||||
int audiochannels_;
|
int audiochannels_;
|
||||||
Audio_out *audio_out_;
|
Audio_out *audio_out_;
|
||||||
Audio_in *audio_in_;
|
Audio_in *audio_in_;
|
||||||
|
bool being_closed;
|
||||||
public:
|
public:
|
||||||
fhandler_dev_dsp ();
|
fhandler_dev_dsp ();
|
||||||
fhandler_dev_dsp *base () const {return (fhandler_dev_dsp *)archetype;}
|
fhandler_dev_dsp *base () const {return (fhandler_dev_dsp *)archetype;}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user