Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2000-11-01 01:20:59 +0300
committerCorinna Vinschen <corinna@vinschen.de>2000-11-01 01:20:59 +0300
commit7cccedf8dead27e59bbe11c37622b260f6699e1f (patch)
treed754ddb4c85c47da6a99a18139138ddaa296029a /winsup/cygwin/fhandler_raw.cc
parent8e32a18e796dc9f8a0f92b720cf12aa1bf9dc5b5 (diff)
* fhandler.h (fhandler_dev_raw): Add definition for method
`fixup_after_fork'. * fhandler_raw.cc (fhandler_dev_raw::fhandler_dev_raw): Add `set_need_fixup_after_fork' call. (fhandler_dev_raw::~fhandler_dev_raw): Revert to user space allocation. (fhandler_dev_raw::open): Ditto. (fhandler_dev_raw::dup): Ditto. Reset buffer pointer. (fhandler_dev_raw::fixup_after_fork): New function. * fhandler_tape.cc (fhandler_dev_tape::open): Revert to user space memory allocation. (fhandler_dev_tape::ioctl): Ditto. Change behaviour on MTSETBLK when new size is 1.
Diffstat (limited to 'winsup/cygwin/fhandler_raw.cc')
-rw-r--r--winsup/cygwin/fhandler_raw.cc34
1 files changed, 21 insertions, 13 deletions
diff --git a/winsup/cygwin/fhandler_raw.cc b/winsup/cygwin/fhandler_raw.cc
index f34a02da9..70cf8284c 100644
--- a/winsup/cygwin/fhandler_raw.cc
+++ b/winsup/cygwin/fhandler_raw.cc
@@ -117,12 +117,13 @@ fhandler_dev_raw::fhandler_dev_raw (DWORD devtype, const char *name, int unit) :
{
clear ();
this->unit = unit;
+ set_need_fork_fixup ();
}
fhandler_dev_raw::~fhandler_dev_raw (void)
{
- if (devbufsiz >= 1L)
- cfree (devbuf);
+ if (devbufsiz > 1L)
+ delete [] devbuf;
clear ();
}
@@ -139,7 +140,7 @@ fhandler_dev_raw::open (const char *path, int flags, mode_t)
if (ret)
{
if (devbufsiz > 1L)
- devbuf = (char *) cmalloc (HEAP_BUF, devbufsiz);
+ devbuf = new char [devbufsiz];
}
else
devbufsiz = 0;
@@ -444,21 +445,28 @@ fhandler_dev_raw::dup (fhandler_base *child)
fhc->devbufsiz = devbufsiz;
if (devbufsiz > 1L)
- {
- fhc->devbuf = (char *) cmalloc (HEAP_BUF, devbufsiz);
- memcpy (fhc->devbuf, devbuf, devbufend);
- }
- fhc->devbufstart = devbufstart;
- fhc->devbufend = devbufend;
+ fhc->devbuf = new char [devbufsiz];
+ fhc->devbufstart = 0;
+ fhc->devbufend = 0;
fhc->eom_detected = eom_detected;
fhc->eof_detected = eof_detected;
- fhc->lastblk_to_read = lastblk_to_read;
+ fhc->lastblk_to_read = 0;
fhc->varblkop = varblkop;
fhc->unit = unit;
}
return ret;
}
+void
+fhandler_dev_raw::fixup_after_fork (HANDLE)
+{
+ if (devbufsiz > 1L)
+ devbuf = new char [devbufsiz];
+ devbufstart = 0;
+ devbufend = 0;
+ lastblk_to_read = 0;
+}
+
int
fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
{
@@ -488,12 +496,12 @@ fhandler_dev_raw::ioctl (unsigned int cmd, void *buf)
ret = ERROR_INVALID_PARAMETER;
else if (!devbuf || op->rd_parm != devbufsiz)
{
- char *buf = (char *) cmalloc (HEAP_BUF, op->rd_parm);
- if (devbuf)
+ char *buf = new char [op->rd_parm];
+ if (devbufsiz > 1L)
{
memcpy (buf, devbuf + devbufstart, devbufend - devbufstart);
devbufend -= devbufstart;
- cfree (devbuf);
+ delete [] devbuf;
}
else
devbufend = 0;