mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-08 10:09:32 +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 *get_ttyp () {return (tty *) tc ();}
|
||||
int eat_readahead (int n);
|
||||
virtual void acquire_input_mutex_if_necessary (DWORD ms) {};
|
||||
virtual void release_input_mutex_if_necessary (void) {};
|
||||
|
||||
public:
|
||||
tty_min*& tc () {return _tc;}
|
||||
@ -2401,6 +2403,14 @@ private:
|
||||
void __release_input_mutex (const char *fn, int ln);
|
||||
DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
|
||||
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 ();
|
||||
size_t &ralen ();
|
||||
|
@ -571,31 +571,34 @@ wait_retry:
|
||||
#define buf ((char *) pv)
|
||||
|
||||
int ret;
|
||||
acquire_attach_mutex (INFINITE);
|
||||
acquire_input_mutex (INFINITE);
|
||||
acquire_attach_mutex (INFINITE);
|
||||
ret = process_input_message ();
|
||||
release_input_mutex ();
|
||||
release_attach_mutex ();
|
||||
switch (ret)
|
||||
{
|
||||
case input_error:
|
||||
release_input_mutex ();
|
||||
goto err;
|
||||
case input_processing:
|
||||
release_input_mutex ();
|
||||
continue;
|
||||
case input_ok: /* input ready */
|
||||
break;
|
||||
case input_signalled: /* signalled */
|
||||
release_input_mutex ();
|
||||
goto sig_exit;
|
||||
case input_winch:
|
||||
release_input_mutex ();
|
||||
continue;
|
||||
default:
|
||||
/* Should not come here */
|
||||
release_input_mutex ();
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check console read-ahead buffer filled from terminal requests */
|
||||
acquire_input_mutex (INFINITE);
|
||||
while (con.cons_rapoi && *con.cons_rapoi && buflen)
|
||||
{
|
||||
buf[copied_chars++] = *con.cons_rapoi++;
|
||||
@ -984,9 +987,7 @@ fhandler_console::process_input_message (void)
|
||||
if (toadd)
|
||||
{
|
||||
ssize_t ret;
|
||||
release_input_mutex ();
|
||||
line_edit_status res = line_edit (toadd, nread, *ti, &ret);
|
||||
acquire_input_mutex (INFINITE);
|
||||
if (res == line_edit_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);
|
||||
eat_readahead (-1);
|
||||
release_input_mutex_if_necessary ();
|
||||
tc ()->kill_pgrp (sig);
|
||||
acquire_input_mutex_if_necessary (INFINITE);
|
||||
ti.c_lflag &= ~FLUSHO;
|
||||
sawsig = true;
|
||||
goto restart_output;
|
||||
|
Loading…
x
Reference in New Issue
Block a user