* 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:
parent
243a041bd0
commit
c41570695a
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue