23#include "gdbsupport/event-loop.h"
24#include "gdbsupport/gdb_select.h"
36 char full_name[PATH_MAX];
38 if (GetModuleFileName (NULL, full_name, PATH_MAX))
39 return xstrdup (full_name);
40 return xstrdup (argv0);
51gdb_select (
int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
52 struct timeval *timeout)
54 static HANDLE never_handle;
55 HANDLE handles[MAXIMUM_WAIT_OBJECTS];
61 struct serial *scbs[MAXIMUM_WAIT_OBJECTS];
74 Sleep (timeout->tv_sec * 1000 + timeout->tv_usec / 1000);
84 HANDLE
read = NULL, except = NULL;
90 gdb_assert (!writefds || !FD_ISSET (
fd, writefds));
92 if ((!readfds || !FD_ISSET (
fd, readfds))
93 && (!exceptfds || !FD_ISSET (
fd, exceptfds)))
99 serial_wait_handle (scb, &
read, &except);
100 scbs[num_scbs++] = scb;
104 read = (HANDLE) _get_osfhandle (
fd);
108 never_handle = CreateEvent (0, FALSE, FALSE, 0);
110 except = never_handle;
113 if (readfds && FD_ISSET (
fd, readfds))
115 gdb_assert (num_handles < MAXIMUM_WAIT_OBJECTS);
116 handles[num_handles++] =
read;
119 if (exceptfds && FD_ISSET (
fd, exceptfds))
121 gdb_assert (num_handles < MAXIMUM_WAIT_OBJECTS);
122 handles[num_handles++] = except;
126 gdb_assert (num_handles <= MAXIMUM_WAIT_OBJECTS);
128 event = WaitForMultipleObjects (num_handles,
132 ? (timeout->tv_sec * 1000
133 + timeout->tv_usec / 1000)
138 gdb_assert (!(WAIT_ABANDONED_0 <= event
139 && event < WAIT_ABANDONED_0 + num_handles));
141 for (indx = 0; indx < num_scbs; ++indx)
142 serial_done_wait_handle (scbs[indx]);
143 if (event == WAIT_FAILED)
145 if (event == WAIT_TIMEOUT)
149 h = handles[
event - WAIT_OBJECT_0];
150 for (
fd = 0, indx = 0;
fd < n; ++
fd)
154 if ((!readfds || !FD_ISSET (
fd, readfds))
155 && (!exceptfds || !FD_ISSET (
fd, exceptfds)))
158 if (readfds && FD_ISSET (
fd, readfds))
160 fd_h = handles[indx++];
163 if (fd_h != h && WaitForSingleObject (fd_h, 0) != WAIT_OBJECT_0)
164 FD_CLR (
fd, readfds);
169 if (exceptfds && FD_ISSET (
fd, exceptfds))
171 fd_h = handles[indx++];
174 if (fd_h != h && WaitForSingleObject (fd_h, 0) != WAIT_OBJECT_0)
175 FD_CLR (
fd, exceptfds);
194 for (
int i = 0; i < 3; i++)
202 int bits = rgb[i] / 93;
203 retval |= ((
bits > 0) << (2 - i)) | ((
bits > 1) << 3);
229 hstdout = (HANDLE)_get_osfhandle (fileno (fstream));
231 CONSOLE_SCREEN_BUFFER_INFO csbi;
233 if (
hstdout != INVALID_HANDLE_VALUE
234 && GetConsoleMode (
hstdout, &cmode) != 0
235 && GetConsoleScreenBufferInfo (
hstdout, &csbi))
240 else if (
hstdout != INVALID_HANDLE_VALUE)
249 static int fg_color[] = {
253 FOREGROUND_GREEN | FOREGROUND_RED,
255 FOREGROUND_BLUE | FOREGROUND_RED,
256 FOREGROUND_BLUE | FOREGROUND_GREEN,
257 FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE
259 static int bg_color[] = {
263 BACKGROUND_GREEN | BACKGROUND_RED,
265 BACKGROUND_BLUE | BACKGROUND_RED,
266 BACKGROUND_BLUE | BACKGROUND_GREEN,
267 BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE
274 for ( ; (c = *linebuf) != 0; linebuf += n_read)
279 bool parsed = style.parse (linebuf, &n_read);
291 int fgcolor, bgcolor, bright, inverse;
295 fgcolor = fg_color[fg.
get_value () & 15];
301 bgcolor = bg_color[bg.
get_value () & 15];
306 switch (style.get_intensity ())
316 gdb_assert_not_reached (
"invalid intensity");
320 if (style.is_reverse ())
329 fgcolor = (bgcolor >> 4);
333 fgcolor |= FOREGROUND_INTENSITY;
335 SHORT attr = (bgcolor & (15 << 4)) | (fgcolor & 15);
338 SetConsoleTextAttribute (
hstdout, attr);
351 CONSOLE_SCREEN_BUFFER_INFO csbi;
354 GetConsoleScreenBufferInfo (
hstdout, &csbi);
358 start_pos = csbi.dwCursorPosition;
359 nchars = csbi.dwSize.X - start_pos.X;
362 start_pos, &written);
363 FillConsoleOutputCharacter (
hstdout,
' ', nchars,
364 start_pos, &written);
381 std::vector<DWORD> results (10);
385 len = GetConsoleProcessList (results.data (), results.size ());
388 if (len < results.size ())
391 results.resize (len);
394 results.resize (len);
395 if (std::find (results.begin (), results.end (),
pid) != results.end ())
402 return TRIBOOL_FALSE;
412 if (event_type == CTRL_BREAK_EVENT || event_type == CTRL_C_EVENT)
431 static bool installed =
false;
#define bits(obj, st, fn)
void get_rgb(uint8_t *rgb) const
ssize_t read(int fd, void *buf, size_t count)
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
void c_c_handler_ftype(int)
char * windows_get_absolute_argv0(const char *argv0)
static BOOL WINAPI ctrl_c_handler(DWORD event_type)
int gdb_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)
static int mingw_console_initialized
int gdb_console_fputs(const char *linebuf, FILE *fstream)
static c_c_handler_ftype * current_handler
static ui_file_style last_style
static int rgb_to_16colors(const ui_file_style::color &color)
c_c_handler_ftype * install_sigint_handler(c_c_handler_ftype *fn)
tribool sharing_input_terminal(int pid)
struct serial * serial_for_fd(int fd)