* fhandler.h (class fhandler_base): Add was_nonblocking status flag.
* fhandler.cc (fhandler_base::set_flags): Set was_nonblocking if the O_NONBLOCK flag has been specified. (fhandler_base_overlapped::close): Check for was_nonblocking instead of for is_nonblocking. Explain why. (fhandler_base::set_nonblocking): Set was_nonblocking if noblocking mode gets enabled.
This commit is contained in:
parent
f8a6c96306
commit
59076540bc
@ -1,3 +1,13 @@
|
|||||||
|
2015-02-24 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler.h (class fhandler_base): Add was_nonblocking status flag.
|
||||||
|
* fhandler.cc (fhandler_base::set_flags): Set was_nonblocking if the
|
||||||
|
O_NONBLOCK flag has been specified.
|
||||||
|
(fhandler_base_overlapped::close): Check for was_nonblocking instead
|
||||||
|
of for is_nonblocking. Explain why.
|
||||||
|
(fhandler_base::set_nonblocking): Set was_nonblocking if noblocking
|
||||||
|
mode gets enabled.
|
||||||
|
|
||||||
2015-02-24 Ken Brown <kbrown@cornell.edu>
|
2015-02-24 Ken Brown <kbrown@cornell.edu>
|
||||||
|
|
||||||
* include/sys/socket.h (sockatmark): Add prototype.
|
* include/sys/socket.h (sockatmark): Add prototype.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* fhandler.cc. See console.cc for fhandler_console functions.
|
/* fhandler.cc. See console.cc for fhandler_console functions.
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||||
2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc.
|
2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
@ -205,6 +205,8 @@ fhandler_base::set_flags (int flags, int supplied_bin)
|
|||||||
bin = wbinary () || rbinary () ? O_BINARY : O_TEXT;
|
bin = wbinary () || rbinary () ? O_BINARY : O_TEXT;
|
||||||
|
|
||||||
openflags = flags | bin;
|
openflags = flags | bin;
|
||||||
|
if (openflags & O_NONBLOCK)
|
||||||
|
was_nonblocking (true);
|
||||||
|
|
||||||
bin &= O_BINARY;
|
bin &= O_BINARY;
|
||||||
rbinary (bin ? true : false);
|
rbinary (bin ? true : false);
|
||||||
@ -1242,8 +1244,13 @@ fhandler_base_overlapped::close ()
|
|||||||
int res;
|
int res;
|
||||||
int writer = (get_access () & GENERIC_WRITE);
|
int writer = (get_access () & GENERIC_WRITE);
|
||||||
/* Need to treat non-blocking I/O specially because Windows appears to
|
/* Need to treat non-blocking I/O specially because Windows appears to
|
||||||
be brain-dead */
|
be brain-dead. We're checking here if the descriptor was ever set
|
||||||
if (writer && is_nonblocking () && has_ongoing_io ())
|
to nonblocking, rather than checking if it's nonblocking at close time.
|
||||||
|
The reason is that applications may switch back to blocking (for the
|
||||||
|
sake of some other application accessing this descriptor) without
|
||||||
|
performaing any further I/O. These applications would suffer data
|
||||||
|
loss, which this workaround is trying to fix. */
|
||||||
|
if (writer && was_nonblocking () && has_ongoing_io ())
|
||||||
{
|
{
|
||||||
clone (HEAP_3_FHANDLER)->check_later ();
|
clone (HEAP_3_FHANDLER)->check_later ();
|
||||||
res = 0;
|
res = 0;
|
||||||
@ -1629,6 +1636,8 @@ fhandler_base::set_nonblocking (int yes)
|
|||||||
int current = openflags & O_NONBLOCK_MASK;
|
int current = openflags & O_NONBLOCK_MASK;
|
||||||
int new_flags = yes ? (!current ? O_NONBLOCK : current) : 0;
|
int new_flags = yes ? (!current ? O_NONBLOCK : current) : 0;
|
||||||
openflags = (openflags & ~O_NONBLOCK_MASK) | new_flags;
|
openflags = (openflags & ~O_NONBLOCK_MASK) | new_flags;
|
||||||
|
if (new_flags)
|
||||||
|
was_nonblocking (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -149,12 +149,16 @@ class fhandler_base
|
|||||||
unsigned need_fork_fixup : 1; /* Set if need to fixup after fork. */
|
unsigned need_fork_fixup : 1; /* Set if need to fixup after fork. */
|
||||||
unsigned isclosed : 1; /* Set when fhandler is closed. */
|
unsigned isclosed : 1; /* Set when fhandler is closed. */
|
||||||
unsigned mandatory_locking : 1; /* Windows mandatory locking */
|
unsigned mandatory_locking : 1; /* Windows mandatory locking */
|
||||||
|
unsigned was_nonblocking : 1; /* Set when setting O_NONBLOCK. Never
|
||||||
|
reset. This is for the sake of
|
||||||
|
fhandler_base_overlapped::close. */
|
||||||
|
|
||||||
public:
|
public:
|
||||||
status_flags () :
|
status_flags () :
|
||||||
rbinary (0), rbinset (0), wbinary (0), wbinset (0), nohandle (0),
|
rbinary (0), rbinset (0), wbinary (0), wbinset (0), nohandle (0),
|
||||||
did_lseek (0), query_open (no_query), close_on_exec (0),
|
did_lseek (0), query_open (no_query), close_on_exec (0),
|
||||||
need_fork_fixup (0), isclosed (0), mandatory_locking (0)
|
need_fork_fixup (0), isclosed (0), mandatory_locking (0),
|
||||||
|
was_nonblocking (0)
|
||||||
{}
|
{}
|
||||||
} status, open_status;
|
} status, open_status;
|
||||||
|
|
||||||
@ -250,6 +254,7 @@ class fhandler_base
|
|||||||
IMPLEMENT_STATUS_FLAG (bool, need_fork_fixup)
|
IMPLEMENT_STATUS_FLAG (bool, need_fork_fixup)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, isclosed)
|
IMPLEMENT_STATUS_FLAG (bool, isclosed)
|
||||||
IMPLEMENT_STATUS_FLAG (bool, mandatory_locking)
|
IMPLEMENT_STATUS_FLAG (bool, mandatory_locking)
|
||||||
|
IMPLEMENT_STATUS_FLAG (bool, was_nonblocking)
|
||||||
|
|
||||||
int get_default_fmode (int flags);
|
int get_default_fmode (int flags);
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@ What's new:
|
|||||||
What changed:
|
What changed:
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
- Performance improvements of the new account DB handling.
|
||||||
|
|
||||||
|
|
||||||
Bug Fixes
|
Bug Fixes
|
||||||
---------
|
---------
|
||||||
@ -38,3 +40,6 @@ Bug Fixes
|
|||||||
|
|
||||||
- 64 bit: Avoid misbehaviour in signal mask computation.
|
- 64 bit: Avoid misbehaviour in signal mask computation.
|
||||||
Addresses: https://cygwin.com/ml/cygwin/2015-02/msg00665.html
|
Addresses: https://cygwin.com/ml/cygwin/2015-02/msg00665.html
|
||||||
|
|
||||||
|
- Avoid data loss on non-blocking pipes after switching back to blocking.
|
||||||
|
Addresses: https://cygwin.com/ml/cygwin/2015-02/msg00575.html
|
||||||
|
Loading…
x
Reference in New Issue
Block a user