summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--winsup/cygwin/fhandler.cc56
-rw-r--r--winsup/cygwin/fhandler.h33
-rw-r--r--winsup/cygwin/fhandler_console.cc39
-rw-r--r--winsup/cygwin/fhandler_termios.cc35
-rw-r--r--winsup/cygwin/fhandler_tty.cc2
5 files changed, 110 insertions, 55 deletions
diff --git a/winsup/cygwin/fhandler.cc b/winsup/cygwin/fhandler.cc
index aeee8fe4d..4210510be 100644
--- a/winsup/cygwin/fhandler.cc
+++ b/winsup/cygwin/fhandler.cc
@@ -44,11 +44,11 @@ void
fhandler_base::reset (const fhandler_base *from)
{
pc << from->pc;
- rabuf = NULL;
- ralen = 0;
- raixget = 0;
- raixput = 0;
- rabuflen = 0;
+ ra.rabuf = NULL;
+ ra.ralen = 0;
+ ra.raixget = 0;
+ ra.raixput = 0;
+ ra.rabuflen = 0;
_refcnt = 0;
}
@@ -66,15 +66,15 @@ int
fhandler_base::put_readahead (char value)
{
char *newrabuf;
- if (raixput < rabuflen)
+ if (raixput () < rabuflen ())
/* Nothing to do */;
- else if ((newrabuf = (char *) realloc (rabuf, rabuflen += 32)))
- rabuf = newrabuf;
+ else if ((newrabuf = (char *) realloc (rabuf (), rabuflen () += 32)))
+ rabuf () = newrabuf;
else
return 0;
- rabuf[raixput++] = value;
- ralen++;
+ rabuf ()[raixput ()++] = value;
+ ralen ()++;
return 1;
}
@@ -82,11 +82,11 @@ int
fhandler_base::get_readahead ()
{
int chret = -1;
- if (raixget < ralen)
- chret = ((unsigned char) rabuf[raixget++]) & 0xff;
+ if (raixget () < ralen ())
+ chret = ((unsigned char) rabuf ()[raixget ()++]) & 0xff;
/* FIXME - not thread safe */
- if (raixget >= ralen)
- raixget = raixput = ralen = 0;
+ if (raixget () >= ralen ())
+ raixget () = raixput () = ralen () = 0;
return chret;
}
@@ -94,10 +94,10 @@ int
fhandler_base::peek_readahead (int queryput)
{
int chret = -1;
- if (!queryput && raixget < ralen)
- chret = ((unsigned char) rabuf[raixget]) & 0xff;
- else if (queryput && raixput > 0)
- chret = ((unsigned char) rabuf[raixput - 1]) & 0xff;
+ if (!queryput && raixget () < ralen ())
+ chret = ((unsigned char) rabuf ()[raixget ()]) & 0xff;
+ else if (queryput && raixput () > 0)
+ chret = ((unsigned char) rabuf ()[raixput () - 1]) & 0xff;
return chret;
}
@@ -105,7 +105,7 @@ void
fhandler_base::set_readahead_valid (int val, int ch)
{
if (!val)
- ralen = raixget = raixput = 0;
+ ralen () = raixget () = raixput () = 0;
if (ch != -1)
put_readahead (ch);
}
@@ -1092,7 +1092,7 @@ fhandler_base::lseek (off_t offset, int whence)
if (whence != SEEK_CUR || offset != 0)
{
if (whence == SEEK_CUR)
- offset -= ralen - raixget;
+ offset -= ralen () - raixget ();
set_readahead_valid (0);
}
@@ -1142,7 +1142,7 @@ fhandler_base::lseek (off_t offset, int whence)
readahead that we have to take into account when calculating
the actual position for the application. */
if (whence == SEEK_CUR)
- res -= ralen - raixget;
+ res -= ralen () - raixget ();
return res;
}
@@ -1565,23 +1565,23 @@ fhandler_base::fhandler_base () :
ino (0),
_refcnt (0),
openflags (0),
- rabuf (NULL),
- ralen (0),
- raixget (0),
- raixput (0),
- rabuflen (0),
unique_id (0),
archetype (NULL),
usecount (0)
{
+ ra.rabuf = NULL;
+ ra.ralen = 0;
+ ra.raixget = 0;
+ ra.raixput = 0;
+ ra.rabuflen = 0;
isclosed (false);
}
/* Normal I/O destructor */
fhandler_base::~fhandler_base ()
{
- if (rabuf)
- free (rabuf);
+ if (ra.rabuf)
+ free (ra.rabuf);
}
/**********************************************************************/
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index c0d56b4da..b4a5638fe 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -202,16 +202,21 @@ class fhandler_base
ino_t ino; /* file ID or hashed filename, depends on FS. */
LONG _refcnt;
+ public:
+ struct rabuf_t
+ {
+ char *rabuf; /* used for crlf conversion in text files */
+ size_t ralen;
+ size_t raixget;
+ size_t raixput;
+ size_t rabuflen;
+ };
protected:
/* File open flags from open () and fcntl () calls */
int openflags;
- char *rabuf; /* used for crlf conversion in text files */
- size_t ralen;
- size_t raixget;
- size_t raixput;
- size_t rabuflen;
+ struct rabuf_t ra;
/* Used for advisory file locking. See flock.cc. */
int64_t unique_id;
@@ -315,7 +320,13 @@ class fhandler_base
ReleaseSemaphore (read_state, n, NULL);
}
- bool get_readahead_valid () { return raixget < ralen; }
+ virtual char *&rabuf () { return ra.rabuf; };
+ virtual size_t &ralen () { return ra.ralen; };
+ virtual size_t &raixget () { return ra.raixget; };
+ virtual size_t &raixput () { return ra.raixput; };
+ virtual size_t &rabuflen () { return ra.rabuflen; };
+
+ bool get_readahead_valid () { return raixget () < ralen (); }
int puts_readahead (const char *s, size_t len = (size_t) -1);
int put_readahead (char value);
@@ -464,8 +475,8 @@ public:
virtual bg_check_types bg_check (int, bool = false) {return bg_ok;}
virtual void clear_readahead ()
{
- raixput = raixget = ralen = rabuflen = 0;
- rabuf = NULL;
+ raixput () = raixget () = ralen () = rabuflen () = 0;
+ rabuf () = NULL;
}
void operator delete (void *p) {cfree (p);}
virtual void set_eof () {}
@@ -2051,6 +2062,12 @@ private:
DWORD __acquire_output_mutex (const char *fn, int ln, DWORD ms);
void __release_output_mutex (const char *fn, int ln);
+ char *&rabuf ();
+ size_t &ralen ();
+ size_t &raixget ();
+ size_t &raixput ();
+ size_t &rabuflen ();
+
friend tty_min * tty_list::get_cttyp ();
};
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index b3f2cb65a..f88d24701 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -56,6 +56,10 @@ bool NO_COPY fhandler_console::invisible_console;
static DWORD orig_conin_mode = (DWORD) -1;
static DWORD orig_conout_mode = (DWORD) -1;
+/* con_ra is shared in the same process.
+ Only one console can exist in a process, therefore, static is suitable. */
+static struct fhandler_base::rabuf_t con_ra;
+
static void
beep ()
{
@@ -214,6 +218,36 @@ fhandler_console::setup ()
}
}
+char *&
+fhandler_console::rabuf ()
+{
+ return con_ra.rabuf;
+}
+
+size_t &
+fhandler_console::ralen ()
+{
+ return con_ra.ralen;
+}
+
+size_t &
+fhandler_console::raixget ()
+{
+ return con_ra.raixget;
+}
+
+size_t &
+fhandler_console::raixput ()
+{
+ return con_ra.raixput;
+}
+
+size_t &
+fhandler_console::rabuflen ()
+{
+ return con_ra.rabuflen;
+}
+
/* Return the tty structure associated with a given tty number. If the
tty number is < 0, just return a dummy record. */
tty_min *
@@ -454,7 +488,7 @@ fhandler_console::read (void *pv, size_t& buflen)
copied_chars +=
get_readahead_into_buffer (buf + copied_chars, buflen);
- if (!ralen)
+ if (!con_ra.ralen)
input_ready = false;
release_input_mutex ();
@@ -1103,6 +1137,9 @@ fhandler_console::close ()
CloseHandle (get_handle ());
CloseHandle (get_output_handle ());
+ if (con_ra.rabuf)
+ free (con_ra.rabuf);
+
/* If already attached to pseudo console, don't call free_console () */
cygheap_fdenum cfd (false);
while (cfd.next () >= 0)
diff --git a/winsup/cygwin/fhandler_termios.cc b/winsup/cygwin/fhandler_termios.cc
index 5b0ba5603..d96b669bd 100644
--- a/winsup/cygwin/fhandler_termios.cc
+++ b/winsup/cygwin/fhandler_termios.cc
@@ -265,25 +265,26 @@ fhandler_termios::bg_check (int sig, bool dontsignal)
int
fhandler_termios::eat_readahead (int n)
{
- int oralen = ralen;
+ int oralen = ralen ();
if (n < 0)
- n = ralen;
- if (n > 0 && ralen > 0)
+ n = ralen ();
+ if (n > 0 && ralen () > 0)
{
- if ((int) (ralen -= n) < 0)
- ralen = 0;
+ if ((int) (ralen () -= n) < 0)
+ ralen () = 0;
/* If IUTF8 is set, the terminal is in UTF-8 mode. If so, we erase
a complete UTF-8 multibyte sequence on VERASE/VWERASE. Otherwise,
if we only erase a single byte, invalid unicode chars are left in
the input. */
if (tc ()->ti.c_iflag & IUTF8)
- while (ralen > 0 && ((unsigned char) rabuf[ralen] & 0xc0) == 0x80)
- --ralen;
-
- if (raixget >= ralen)
- raixget = raixput = ralen = 0;
- else if (raixput > ralen)
- raixput = ralen;
+ while (ralen () > 0 &&
+ ((unsigned char) rabuf ()[ralen ()] & 0xc0) == 0x80)
+ --ralen ();
+
+ if (raixget () >= ralen ())
+ raixget () = raixput () = ralen () = 0;
+ else if (raixput () > ralen ())
+ raixput () = ralen ();
}
return oralen;
@@ -411,7 +412,7 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
if (ti.c_lflag & ECHO)
{
doecho ("\n\r", 2);
- doecho (rabuf, ralen);
+ doecho (rabuf (), ralen ());
}
continue;
}
@@ -438,13 +439,13 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
doecho (&c, 1);
/* Write in chunks of 32 bytes to reduce the number of WriteFile calls
in non-canonical mode. */
- if ((!iscanon && ralen >= 32) || input_done)
+ if ((!iscanon && ralen () >= 32) || input_done)
{
int status = accept_input ();
if (status != 1)
{
ret = status ? line_edit_error : line_edit_pipe_full;
- nread += ralen;
+ nread += ralen ();
break;
}
ret = line_edit_input_done;
@@ -453,14 +454,14 @@ fhandler_termios::line_edit (const char *rptr, size_t nread, termios& ti,
}
/* If we didn't write all bytes in non-canonical mode, write them now. */
- if (!iscanon && ralen > 0
+ if (!iscanon && ralen () > 0
&& (ret == line_edit_ok || ret == line_edit_input_done))
{
int status = accept_input ();
if (status != 1)
{
ret = status ? line_edit_error : line_edit_pipe_full;
- nread += ralen;
+ nread += ralen ();
}
else
ret = line_edit_input_done;
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 4977a8bd5..870fcebbc 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -525,7 +525,7 @@ fhandler_pty_master::accept_input ()
}
else
{
- char *p = rabuf;
+ char *p = rabuf ();
DWORD rc;
DWORD written = 0;