diff options
author | Christopher Faylor <me@cgf.cx> | 2002-12-11 04:00:04 +0000 |
---|---|---|
committer | Christopher Faylor <me@cgf.cx> | 2002-12-11 04:00:04 +0000 |
commit | 1d380f593ae54513419a7e7f31817fc23a5e69b9 (patch) | |
tree | 6997ee23c02f85f89c36ab4e7d971cd174c68869 /winsup/cygwin/select.cc | |
parent | ea01c7f5d25779a88d6476da8b7f780379bc0c05 (diff) | |
download | newlib-1d380f593ae54513419a7e7f31817fc23a5e69b9.zip newlib-1d380f593ae54513419a7e7f31817fc23a5e69b9.tar.gz newlib-1d380f593ae54513419a7e7f31817fc23a5e69b9.tar.bz2 |
* cygthread.h (cygthread::stack_ptr): New element.
(cygthread::detach): Accept a "wait_for_signal" argument.
(cygthread::terminate_thread): New function.
* cygthread.cc (cygthread::stub): Set stack pointer argument.
(cygthread::terminate_thread): New function. Forcibly terminate thread.
(cygthread::detach): Optionally wait for signals and kill thread when signal
arrives.
* exceptions.cc (signal_exit): Set signal_arrived prior to exiting to wake up
anything blocking on signals.
* fhandler.h (fhandler_base::set_r_no_interrupt): Change to accept bool
argument.
(fhandler_pipe::ready_for_read): Declare.
* pipe.cc (pipeargs): New structure.
(read_pipe): New thread stub wrapper for normal pipe read.
(fhandler_pipe::read): Modify to call reader in a cygthread, terminating on
signal, as appropriate.
* select.cc (fhandler_pipe::ready_for_read): Define new function.
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r-- | winsup/cygwin/select.cc | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 369bea9..d8d8999 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -431,7 +431,7 @@ peek_pipe (select_record *s, bool from_select) { case FH_PTYM: case FH_TTYM: - if (((fhandler_pty_master *)fh)->need_nl) + if (((fhandler_pty_master *) fh)->need_nl) { gotone = s->read_ready = true; goto out; @@ -521,7 +521,7 @@ struct pipeinf static DWORD WINAPI thread_pipe (void *arg) { - pipeinf *pi = (pipeinf *)arg; + pipeinf *pi = (pipeinf *) arg; BOOL gotone = FALSE; for (;;) @@ -563,18 +563,18 @@ start_thread_pipe (select_record *me, select_stuff *stuff) pipeinf *pi = new pipeinf; pi->start = &stuff->start; pi->stop_thread_pipe = FALSE; - pi->thread = new cygthread (thread_pipe, (LPVOID)pi, "select_pipe"); + pi->thread = new cygthread (thread_pipe, (LPVOID) pi, "select_pipe"); me->h = *pi->thread; if (!me->h) return 0; - stuff->device_specific[FHDEVN (FH_PIPE)] = (void *)pi; + stuff->device_specific[FHDEVN (FH_PIPE)] = (void *) pi; return 1; } static void pipe_cleanup (select_record *, select_stuff *stuff) { - pipeinf *pi = (pipeinf *)stuff->device_specific[FHDEVN (FH_PIPE)]; + pipeinf *pi = (pipeinf *) stuff->device_specific[FHDEVN (FH_PIPE)]; if (pi && pi->thread) { pi->stop_thread_pipe = true; @@ -584,6 +584,16 @@ pipe_cleanup (select_record *, select_stuff *stuff) } } +int +fhandler_pipe::ready_for_read (int fd, DWORD howlong) +{ + if (!howlong) + return this->fhandler_base::ready_for_read (fd, howlong); + + get_guard (); + return true; +} + select_record * fhandler_pipe::select_read (select_record *s) { @@ -631,7 +641,7 @@ static int peek_console (select_record *me, bool) { extern const char * get_nonascii_key (INPUT_RECORD& input_rec, char *); - fhandler_console *fh = (fhandler_console *)me->fh; + fhandler_console *fh = (fhandler_console *) me->fh; if (!me->read_selected) return me->write_ready; @@ -748,19 +758,19 @@ fhandler_console::select_except (select_record *s) select_record * fhandler_tty_common::select_read (select_record *s) { - return ((fhandler_pipe*)this)->fhandler_pipe::select_read (s); + return ((fhandler_pipe *) this)->fhandler_pipe::select_read (s); } select_record * fhandler_tty_common::select_write (select_record *s) { - return ((fhandler_pipe *)this)->fhandler_pipe::select_write (s); + return ((fhandler_pipe *) this)->fhandler_pipe::select_write (s); } select_record * fhandler_tty_common::select_except (select_record *s) { - return ((fhandler_pipe *)this)->fhandler_pipe::select_except (s); + return ((fhandler_pipe *) this)->fhandler_pipe::select_except (s); } static int @@ -846,7 +856,7 @@ peek_serial (select_record *s, bool) { COMSTAT st; - fhandler_serial *fh = (fhandler_serial *)s->fh; + fhandler_serial *fh = (fhandler_serial *) s->fh; if (fh->get_readahead_valid () || fh->overlapped_armed < 0) return s->read_ready = true; @@ -944,7 +954,7 @@ err: static DWORD WINAPI thread_serial (void *arg) { - serialinf *si = (serialinf *)arg; + serialinf *si = (serialinf *) arg; BOOL gotone= FALSE; for (;;) @@ -980,16 +990,16 @@ start_thread_serial (select_record *me, select_stuff *stuff) serialinf *si = new serialinf; si->start = &stuff->start; si->stop_thread_serial = FALSE; - si->thread = new cygthread (thread_serial, (LPVOID)si, "select_serial"); + si->thread = new cygthread (thread_serial, (LPVOID) si, "select_serial"); me->h = *si->thread; - stuff->device_specific[FHDEVN (FH_SERIAL)] = (void *)si; + stuff->device_specific[FHDEVN (FH_SERIAL)] = (void *) si; return 1; } static void serial_cleanup (select_record *, select_stuff *stuff) { - serialinf *si = (serialinf *)stuff->device_specific[FHDEVN (FH_SERIAL)]; + serialinf *si = (serialinf *) stuff->device_specific[FHDEVN (FH_SERIAL)]; if (si && si->thread) { si->stop_thread_serial = true; @@ -1200,7 +1210,7 @@ static int start_thread_socket (select_record *, select_stuff *); static DWORD WINAPI thread_socket (void *arg) { - socketinf *si = (socketinf *)arg; + socketinf *si = (socketinf *) arg; select_printf ("stuff_start %p", &si->start); int r = WINSOCK_SELECT (0, &si->readfds, &si->writefds, &si->exceptfds, NULL); @@ -1243,7 +1253,7 @@ start_thread_socket (select_record *me, select_stuff *stuff) { socketinf *si; - if ((si = (socketinf *)stuff->device_specific[FHDEVN (FH_SOCKET)])) + if ((si = (socketinf *) stuff->device_specific[FHDEVN (FH_SOCKET)])) { me->h = *si->thread; return 1; @@ -1314,7 +1324,7 @@ start_thread_socket (select_record *me, select_stuff *stuff) stuff->device_specific[FHDEVN (FH_SOCKET)] = (void *) si; si->start = &stuff->start; select_printf ("stuff_start %p", &stuff->start); - si->thread = new cygthread (thread_socket, (LPVOID)si, "select_socket"); + si->thread = new cygthread (thread_socket, (LPVOID) si, "select_socket"); me->h = *si->thread; return 1; @@ -1327,7 +1337,7 @@ err: void socket_cleanup (select_record *, select_stuff *stuff) { - socketinf *si = (socketinf *)stuff->device_specific[FHDEVN (FH_SOCKET)]; + socketinf *si = (socketinf *) stuff->device_specific[FHDEVN (FH_SOCKET)]; select_printf ("si %p si->thread %p", si, si ? si->thread : NULL); if (si && si->thread) { |