* fhandler.cc (fhandler_base::read): Return just read ahead characters if slow

device.
* fhandler.h (fhandler_base::set_eof): New virtual method.
(fhandler_pipe::set_eof): New method.
* pipe.cc (fhandler_pipe::fhandler_pipe): Clear saweof flag.
(fhandler_pipe::read): Return immediately if hit eof.
(fhandler_pipe::hit_eof): Return true if saweof flag is set.
* select.cc (peek_pipe): Don't call PeekNamedPipe if we couldn't grab the guard
mutex.
This commit is contained in:
Christopher Faylor 2001-11-03 05:42:21 +00:00
parent 243a041bd0
commit c41570695a
5 changed files with 36 additions and 46 deletions

View File

@ -1,3 +1,15 @@
2001-11-03 Christopher Faylor <cgf@redhat.com>
* fhandler.cc (fhandler_base::read): Return just read ahead characters
if slow device.
* fhandler.h (fhandler_base::set_eof): New virtual method.
(fhandler_pipe::set_eof): New method.
* pipe.cc (fhandler_pipe::fhandler_pipe): Clear saweof flag.
(fhandler_pipe::read): Return immediately if hit eof.
(fhandler_pipe::hit_eof): Return true if saweof flag is set.
* select.cc (peek_pipe): Don't call PeekNamedPipe if we couldn't grab
the guard mutex.
2001-11-02 Egor Duda <deo@logos-m.ru> 2001-11-02 Egor Duda <deo@logos-m.ru>
* dll_init.h (class dll_list): Reorder functions to avoid compiler * dll_init.h (class dll_list): Reorder functions to avoid compiler

View File

@ -479,6 +479,9 @@ fhandler_base::read (void *in_ptr, size_t in_len)
len--; len--;
} }
if (copied_chars && is_slow ())
return copied_chars;
if (len) if (len)
{ {
int readlen = raw_read (ptr + copied_chars, len); int readlen = raw_read (ptr + copied_chars, len);

View File

@ -13,41 +13,6 @@ details. */
#include <sys/ioctl.h> #include <sys/ioctl.h>
/* Classes
Code is located in fhandler.cc unless another file name is given.
fhandler_base normal I/O
fhandler_disk_file
fhandler_serial Adds vmin and vtime.
fhandler_dev_null Not really I/O
fhandler_dev_zero Faked
fhandler_dev_raw (fhandler_raw.cc)
fhandler_dev_floppy (fhandler_floppy.cc)
fhandler_dev_tape (fhandler_tape.cc)
fhandler_pipe
fhandler_socket (fhandler_socket.cc)
fhandler_tty_slave (tty.cc)
fhandler_pty_master (tty.cc)
fhandler_tty_master (tty.cc)
fhandler_console Out with ansi control. (console.cc)
fhandler_windows Windows messages I/O (fhandler_windows.cc)
fhandler_dev_random /dev/[u]random implementation (fhandler_random.cc)
fhandler_dev_mem /dev/mem implementation (fhandler_mem.cc)
fhandler_dev_clipboard /dev/clipboard implementation (fhandler_clipboard.cc)
fhandler_proc Interesting possibility, not implemented yet
*/
enum enum
{ {
FH_RBINARY = 0x00001000, /* binary read mode */ FH_RBINARY = 0x00001000, /* binary read mode */
@ -372,6 +337,7 @@ class fhandler_base
} }
void operator delete (void *); void operator delete (void *);
virtual HANDLE get_guard () const {return NULL;} virtual HANDLE get_guard () const {return NULL;}
virtual void set_eof () {}
}; };
class fhandler_socket: public fhandler_base class fhandler_socket: public fhandler_base
@ -425,6 +391,7 @@ class fhandler_socket: public fhandler_base
class fhandler_pipe: public fhandler_base class fhandler_pipe: public fhandler_base
{ {
HANDLE guard; HANDLE guard;
bool saweof;
HANDLE writepipe_exists; HANDLE writepipe_exists;
DWORD orig_pid; DWORD orig_pid;
unsigned id; unsigned id;
@ -441,6 +408,7 @@ class fhandler_pipe: public fhandler_base
int dup (fhandler_base *child); int dup (fhandler_base *child);
void fixup_after_fork (HANDLE); void fixup_after_fork (HANDLE);
bool hit_eof (); bool hit_eof ();
void set_eof () {saweof = true;}
friend int make_pipe (int fildes[2], unsigned int psize, int mode); friend int make_pipe (int fildes[2], unsigned int psize, int mode);
HANDLE get_guard () const {return guard;} HANDLE get_guard () const {return guard;}
}; };

View File

@ -26,7 +26,7 @@ static unsigned pipecount;
static const NO_COPY char pipeid_fmt[] = "stupid_pipe.%u.%u"; static const NO_COPY char pipeid_fmt[] = "stupid_pipe.%u.%u";
fhandler_pipe::fhandler_pipe (DWORD devtype) fhandler_pipe::fhandler_pipe (DWORD devtype)
: fhandler_base (devtype), guard (NULL), writepipe_exists(0), : fhandler_base (devtype), guard (NULL), saweof (false), writepipe_exists(0),
orig_pid (0), id (0) orig_pid (0), id (0)
{ {
} }
@ -52,8 +52,10 @@ fhandler_pipe::set_close_on_exec (int val)
int __stdcall int __stdcall
fhandler_pipe::read (void *in_ptr, size_t in_len) fhandler_pipe::read (void *in_ptr, size_t in_len)
{ {
if (hit_eof ())
return 0;
int res = this->fhandler_base::read (in_ptr, in_len); int res = this->fhandler_base::read (in_ptr, in_len);
ReleaseMutex (guard); (void) ReleaseMutex (guard);
return res; return res;
} }
@ -72,6 +74,8 @@ fhandler_pipe::hit_eof ()
{ {
char buf[80]; char buf[80];
HANDLE ev; HANDLE ev;
if (saweof)
return 1;
if (!orig_pid) if (!orig_pid)
return false; return false;
__small_sprintf (buf, pipeid_fmt, orig_pid, id); __small_sprintf (buf, pipeid_fmt, orig_pid, id);

View File

@ -389,9 +389,9 @@ peek_pipe (select_record *s, int ignra)
fhandler_base *fh = s->fh; fhandler_base *fh = s->fh;
HANDLE h; HANDLE h;
HANDLE guard_mutex = fh->get_guard ();
set_handle_or_return_if_not_open (h, s); set_handle_or_return_if_not_open (h, s);
HANDLE guard_mutex = fh->get_guard ();
/* Don't perform complicated tests if we don't need to. */ /* Don't perform complicated tests if we don't need to. */
if (!s->read_selected && !s->except_selected) if (!s->read_selected && !s->except_selected)
goto out; goto out;
@ -438,14 +438,16 @@ peek_pipe (select_record *s, int ignra)
select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ()); select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
n = -1; n = -1;
} }
else if (n && guard_mutex) else if (!n || !guard_mutex)
{ /* nothing */;
if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0) else if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0)
{ {
select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (), select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (),
guard_mutex); guard_mutex);
n = 0; n = 0;
} }
else
{
/* Now that we have the mutex, make sure that no one else has snuck /* Now that we have the mutex, make sure that no one else has snuck
in and grabbed the data that we originally saw. */ in and grabbed the data that we originally saw. */
if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL)) if (!PeekNamedPipe (h, NULL, 0, NULL, (DWORD *) &n, NULL))
@ -459,6 +461,7 @@ peek_pipe (select_record *s, int ignra)
if (n < 0) if (n < 0)
{ {
fh->set_eof ();
select_printf ("%s, n %d", fh->get_name (), n); select_printf ("%s, n %d", fh->get_name (), n);
if (s->except_selected) if (s->except_selected)
gotone += s->except_ready = TRUE; gotone += s->except_ready = TRUE;