aboutsummaryrefslogtreecommitdiff
path: root/butl/fdstream
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-08-03 09:01:56 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-08-03 09:01:56 +0200
commit31b87d3d695e35c1daf1c88d2b5d6ddebec3e62b (patch)
tree2494e235616c3bf5dcd15c5ef6780585ed5ef8c0 /butl/fdstream
parent614d23129684f96ff0c5d77ee9c5a29be1f44272 (diff)
Implement faster emulation of Windows NUL via temporary file
Diffstat (limited to 'butl/fdstream')
-rw-r--r--butl/fdstream18
1 files changed, 18 insertions, 0 deletions
diff --git a/butl/fdstream b/butl/fdstream
index 0caac5c..71de6a0 100644
--- a/butl/fdstream
+++ b/butl/fdstream
@@ -414,8 +414,26 @@ namespace butl
// Note that it's the caller's responsibility to close the returned file
// descriptor.
//
+ // On Windows the null device is NUL and writing anything substantial to it
+ // (like redirecting a process' output) is extremely slow, as in, an order
+ // of magnitude slower than writing to disk. If you are using the descriptor
+ // yourself this can be mitigated by setting the binary mode (already done
+ // by fdopen()) and using a buffer of around 64K. However, sometimes you
+ // have no control of how the descriptor will be used. For instance, it can
+ // be used to redirect a child's stdout and the way the child sets up its
+ // stdout is out of your control (on Windows). For such cases, there is an
+ // emulation via a temporary file. Mostly it functions as a proper null
+ // device with the file automatically removed once the descriptor is
+ // closed. One difference, however, would be if you were to both write to
+ // and read from the descriptor.
+ //
+#ifndef _WIN32
LIBBUTL_EXPORT int
fdnull () noexcept;
+#else
+ LIBBUTL_EXPORT int
+ fdnull (bool temp = false) noexcept;
+#endif
}
#include <butl/fdstream.ixx>