void
fhandler_console::set_cursor_maybe ()
{
+ acquire_attach_mutex (INFINITE);
con.fillin (get_output_handle ());
+ release_attach_mutex ();
/* Nothing to do for xterm compatible mode. */
if (wincap.has_con_24bit_colors () && !con_is_legacy)
return;
if (con.dwLastCursorPosition.X != con.b.dwCursorPosition.X ||
con.dwLastCursorPosition.Y != con.b.dwCursorPosition.Y)
{
+ acquire_attach_mutex (INFINITE);
SetConsoleCursorPosition (get_output_handle (), con.b.dwCursorPosition);
+ release_attach_mutex ();
con.dwLastCursorPosition = con.b.dwCursorPosition;
}
}
}
set_cursor_maybe (); /* to make cursor appear on the screen immediately */
+wait_retry:
switch (cygwait (get_handle (), timeout))
{
case WAIT_OBJECT_0:
buflen = (size_t) -1;
return;
default:
+ if (GetLastError () == ERROR_INVALID_HANDLE)
+ { /* Confirm the handle is still valid */
+ DWORD mode;
+ acquire_attach_mutex (INFINITE);
+ BOOL res = GetConsoleMode (get_handle (), &mode);
+ release_attach_mutex ();
+ if (res)
+ goto wait_retry;
+ }
goto err;
}
case TIOCGWINSZ:
int st;
+ acquire_attach_mutex (INFINITE);
st = con.fillin (get_output_handle ());
+ release_attach_mutex ();
if (st)
{
/* *not* the buffer size, the actual screen size... */
DWORD n;
int ret = 0;
INPUT_RECORD inp[INREC_SIZE];
+ acquire_attach_mutex (INFINITE);
if (!PeekConsoleInputW (get_handle (), inp, INREC_SIZE, &n))
{
set_errno (EINVAL);
+ release_attach_mutex ();
release_output_mutex ();
return -1;
}
+ release_attach_mutex ();
bool saw_eol = false;
for (DWORD i=0; i<n; i++)
if (inp[i].EventType == KEY_EVENT &&
if (queue == TCIFLUSH
|| queue == TCIOFLUSH)
{
+ acquire_attach_mutex (INFINITE);
if (!FlushConsoleInputBuffer (get_handle ()))
{
__seterrno ();
res = -1;
}
+ release_attach_mutex ();
}
return res;
}
DWORD flags = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT;
DWORD oflags;
+ acquire_attach_mutex (INFINITE);
GetConsoleMode (get_output_handle (), &oflags);
if (wincap.has_con_24bit_colors () && !con_is_legacy
&& (oflags & ENABLE_VIRTUAL_TERMINAL_PROCESSING))
flags |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
int res = SetConsoleMode (get_output_handle (), flags) ? 0 : -1;
+ release_attach_mutex ();
if (res)
__seterrno_from_win_error (GetLastError ());
release_output_mutex ();
DWORD oflags;
+ acquire_attach_mutex (INFINITE);
if (!GetConsoleMode (get_handle (), &oflags))
oflags = 0;
DWORD flags = 0;
syscall_printf ("%d = tcsetattr(,%p) enable flags %y, c_lflag %y iflag %y",
res, t, flags, t->c_lflag, t->c_iflag);
}
+ release_attach_mutex ();
get_ttyp ()->rstcons (false);
release_input_mutex ();
DWORD flags;
+ acquire_attach_mutex (INFINITE);
if (!GetConsoleMode (get_handle (), &flags))
{
__seterrno ();
/* All the output bits we can ignore */
res = 0;
}
+ release_attach_mutex ();
syscall_printf ("%d = tcgetattr(%p) enable flags %y, t->lflag %y, t->iflag %y",
res, t, flags, t->c_lflag, t->c_iflag);
return res;