mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-13 04:29:09 +08:00
Cygwin: console: Make read() thread-safe.
- Currently read() is somehow not thread-safe. This patch fixes the issue.
This commit is contained in:
parent
4ddd4acf04
commit
5ef4fd5548
@ -2090,6 +2090,8 @@ class fhandler_termios: public fhandler_base
|
|||||||
tty_min *_tc;
|
tty_min *_tc;
|
||||||
tty *get_ttyp () {return (tty *) tc ();}
|
tty *get_ttyp () {return (tty *) tc ();}
|
||||||
int eat_readahead (int n);
|
int eat_readahead (int n);
|
||||||
|
virtual void acquire_input_mutex_if_necessary (DWORD ms) {};
|
||||||
|
virtual void release_input_mutex_if_necessary (void) {};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
tty_min*& tc () {return _tc;}
|
tty_min*& tc () {return _tc;}
|
||||||
@ -2401,6 +2403,14 @@ private:
|
|||||||
void __release_input_mutex (const char *fn, int ln);
|
void __release_input_mutex (const char *fn, int ln);
|
||||||
DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
|
DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
|
||||||
void __release_output_mutex (const char *fn, int ln);
|
void __release_output_mutex (const char *fn, int ln);
|
||||||
|
void acquire_input_mutex_if_necessary (DWORD ms)
|
||||||
|
{
|
||||||
|
acquire_input_mutex (ms);
|
||||||
|
}
|
||||||
|
void release_input_mutex_if_necessary (void)
|
||||||
|
{
|
||||||
|
release_input_mutex ();
|
||||||
|
}
|
||||||
|
|
||||||
char *&rabuf ();
|
char *&rabuf ();
|
||||||
size_t &ralen ();
|
size_t &ralen ();
|
||||||
|
@ -571,31 +571,34 @@ wait_retry:
|
|||||||
#define buf ((char *) pv)
|
#define buf ((char *) pv)
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
acquire_attach_mutex (INFINITE);
|
|
||||||
acquire_input_mutex (INFINITE);
|
acquire_input_mutex (INFINITE);
|
||||||
|
acquire_attach_mutex (INFINITE);
|
||||||
ret = process_input_message ();
|
ret = process_input_message ();
|
||||||
release_input_mutex ();
|
|
||||||
release_attach_mutex ();
|
release_attach_mutex ();
|
||||||
switch (ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
case input_error:
|
case input_error:
|
||||||
|
release_input_mutex ();
|
||||||
goto err;
|
goto err;
|
||||||
case input_processing:
|
case input_processing:
|
||||||
|
release_input_mutex ();
|
||||||
continue;
|
continue;
|
||||||
case input_ok: /* input ready */
|
case input_ok: /* input ready */
|
||||||
break;
|
break;
|
||||||
case input_signalled: /* signalled */
|
case input_signalled: /* signalled */
|
||||||
|
release_input_mutex ();
|
||||||
goto sig_exit;
|
goto sig_exit;
|
||||||
case input_winch:
|
case input_winch:
|
||||||
|
release_input_mutex ();
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
/* Should not come here */
|
/* Should not come here */
|
||||||
|
release_input_mutex ();
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check console read-ahead buffer filled from terminal requests */
|
/* Check console read-ahead buffer filled from terminal requests */
|
||||||
acquire_input_mutex (INFINITE);
|
|
||||||
while (con.cons_rapoi && *con.cons_rapoi && buflen)
|
while (con.cons_rapoi && *con.cons_rapoi && buflen)
|
||||||
{
|
{
|
||||||
buf[copied_chars++] = *con.cons_rapoi++;
|
buf[copied_chars++] = *con.cons_rapoi++;
|
||||||
@ -984,9 +987,7 @@ fhandler_console::process_input_message (void)
|
|||||||
if (toadd)
|
if (toadd)
|
||||||
{
|
{
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
release_input_mutex ();
|
|
||||||
line_edit_status res = line_edit (toadd, nread, *ti, &ret);
|
line_edit_status res = line_edit (toadd, nread, *ti, &ret);
|
||||||
acquire_input_mutex (INFINITE);
|
|
||||||
if (res == line_edit_signalled)
|
if (res == line_edit_signalled)
|
||||||
{
|
{
|
||||||
stat = input_signalled;
|
stat = input_signalled;
|
||||||
|
@ -332,7 +332,9 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
|
|||||||
|
|
||||||
termios_printf ("got interrupt %d, sending signal %d", c, sig);
|
termios_printf ("got interrupt %d, sending signal %d", c, sig);
|
||||||
eat_readahead (-1);
|
eat_readahead (-1);
|
||||||
|
release_input_mutex_if_necessary ();
|
||||||
tc ()->kill_pgrp (sig);
|
tc ()->kill_pgrp (sig);
|
||||||
|
acquire_input_mutex_if_necessary (INFINITE);
|
||||||
ti.c_lflag &= ~FLUSHO;
|
ti.c_lflag &= ~FLUSHO;
|
||||||
sawsig = true;
|
sawsig = true;
|
||||||
goto restart_output;
|
goto restart_output;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user