* 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>
* 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--;
}
if (copied_chars && is_slow ())
return copied_chars;
if (len)
{
int readlen = raw_read (ptr + copied_chars, len);

View File

@ -13,41 +13,6 @@ details. */
#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
{
FH_RBINARY = 0x00001000, /* binary read mode */
@ -372,6 +337,7 @@ class fhandler_base
}
void operator delete (void *);
virtual HANDLE get_guard () const {return NULL;}
virtual void set_eof () {}
};
class fhandler_socket: public fhandler_base
@ -425,6 +391,7 @@ class fhandler_socket: public fhandler_base
class fhandler_pipe: public fhandler_base
{
HANDLE guard;
bool saweof;
HANDLE writepipe_exists;
DWORD orig_pid;
unsigned id;
@ -441,6 +408,7 @@ class fhandler_pipe: public fhandler_base
int dup (fhandler_base *child);
void fixup_after_fork (HANDLE);
bool hit_eof ();
void set_eof () {saweof = true;}
friend int make_pipe (int fildes[2], unsigned int psize, int mode);
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";
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)
{
}
@ -52,8 +52,10 @@ fhandler_pipe::set_close_on_exec (int val)
int __stdcall
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);
ReleaseMutex (guard);
(void) ReleaseMutex (guard);
return res;
}
@ -72,6 +74,8 @@ fhandler_pipe::hit_eof ()
{
char buf[80];
HANDLE ev;
if (saweof)
return 1;
if (!orig_pid)
return false;
__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;
HANDLE h;
HANDLE guard_mutex = fh->get_guard ();
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. */
if (!s->read_selected && !s->except_selected)
goto out;
@ -438,16 +438,18 @@ peek_pipe (select_record *s, int ignra)
select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
n = -1;
}
else if (n && guard_mutex)
else if (!n || !guard_mutex)
/* nothing */;
else if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0)
{
select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (),
guard_mutex);
n = 0;
}
else
{
if (WaitForSingleObject (guard_mutex, 0) != WAIT_OBJECT_0)
{
select_printf ("%s, couldn't get mutex %p, %E", fh->get_name (),
guard_mutex);
n = 0;
}
/* 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))
{
select_printf ("%s, PeekNamedPipe failed, %E", fh->get_name ());
@ -459,6 +461,7 @@ peek_pipe (select_record *s, int ignra)
if (n < 0)
{
fh->set_eof ();
select_printf ("%s, n %d", fh->get_name (), n);
if (s->except_selected)
gotone += s->except_ready = TRUE;