summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler.h
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler.h')
-rw-r--r--winsup/cygwin/fhandler.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index e15f94632..6e964aaec 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -661,6 +661,7 @@ protected:
OVERLAPPED io_status;
OVERLAPPED *overlapped;
size_t max_atomic_write;
+ void *atomic_write_buf;
public:
wait_return __reg3 wait_overlapped (bool, bool, DWORD *, bool, DWORD = 0);
int __reg1 setup_overlapped ();
@@ -670,7 +671,7 @@ public:
OVERLAPPED *&get_overlapped () {return overlapped;}
OVERLAPPED *get_overlapped_buffer () {return &io_status;}
void set_overlapped (OVERLAPPED *ov) {overlapped = ov;}
- fhandler_base_overlapped (): io_pending (false), overlapped (NULL), max_atomic_write (0)
+ fhandler_base_overlapped (): io_pending (false), overlapped (NULL), max_atomic_write (0), atomic_write_buf (NULL)
{
memset (&io_status, 0, sizeof io_status);
}
@@ -686,11 +687,17 @@ public:
static void __reg1 flush_all_async_io ();;
fhandler_base_overlapped (void *) {}
+ ~fhandler_base_overlapped ()
+ {
+ if (atomic_write_buf)
+ cfree (atomic_write_buf);
+ }
virtual void copyto (fhandler_base *x)
{
x->pc.free_strings ();
*reinterpret_cast<fhandler_base_overlapped *> (x) = *this;
+ reinterpret_cast<fhandler_base_overlapped *> (x)->atomic_write_buf = NULL;
x->reset (this);
}