aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbutl/fdstream.mxx53
1 files changed, 47 insertions, 6 deletions
diff --git a/libbutl/fdstream.mxx b/libbutl/fdstream.mxx
index 894f85b..dd46ad2 100644
--- a/libbutl/fdstream.mxx
+++ b/libbutl/fdstream.mxx
@@ -100,6 +100,30 @@ LIBBUTL_MODEXPORT namespace butl
int fd_;
};
+ inline bool
+ operator== (const auto_fd& x, const auto_fd& y)
+ {
+ return x.get () == y.get ();
+ }
+
+ inline bool
+ operator!= (const auto_fd& x, const auto_fd& y)
+ {
+ return !(x == y);
+ }
+
+ inline bool
+ operator== (const auto_fd& x, nullfd_t)
+ {
+ return x.get () == -1;
+ }
+
+ inline bool
+ operator!= (const auto_fd& x, nullfd_t y)
+ {
+ return !(x == y);
+ }
+
// An [io]fstream that can be initialized with a file descriptor in addition
// to a file name and that also by default enables exceptions on badbit and
// failbit. So instead of a dance like this:
@@ -804,15 +828,16 @@ LIBBUTL_MODEXPORT namespace butl
LIBBUTL_SYMEXPORT bool
fdterm (int);
- // Wait until one or more file descriptors becomes ready for reading or
- // writing. Return the pair of numbers of descriptors that are ready. Throw
- // std::invalid_argument if anything is wrong with arguments (both sets are
- // empty, invalid fd, etc). Throw ios::failure on the underlying OS error.
+ // Wait until one or more file descriptors becomes ready for input (reading)
+ // or output (writing). Return the pair of numbers of descriptors that are
+ // ready. Throw std::invalid_argument if anything is wrong with arguments
+ // (both sets are empty, invalid fd, etc). Throw ios::failure on the
+ // underlying OS error.
//
// Note that the function clears all the previously-ready entries on each
// call. Entries with nullfd are ignored.
//
- // On Windows only pipes and only their read ends are supported.
+ // On Windows only pipes and only their input (read) ends are supported.
//
struct fdselect_state
{
@@ -828,11 +853,27 @@ LIBBUTL_MODEXPORT namespace butl
using fdselect_set = small_vector<fdselect_state, 4>;
LIBBUTL_SYMEXPORT std::pair<std::size_t, std::size_t>
- fdselect (fdselect_set& read, fdselect_set& write);
+ fdselect (fdselect_set& ifds, fdselect_set& ofds);
+
+ inline std::size_t
+ ifdselect (fdselect_set& ifds)
+ {
+ fdselect_set ofds;
+ return fdselect (ifds, ofds).first;
+ }
+
+ inline std::size_t
+ ofdselect (fdselect_set& ofds)
+ {
+ fdselect_set ifds;
+ return fdselect (ifds, ofds).second;
+ }
// As above but wait up to the specified timeout returning a pair of zeroes
// if none of the descriptors became ready.
//
+ // @@ Maybe merge it with the above via a default/optional value?
+ //
// LIBBUTL_SYMEXPORT std::pair<std::size_t, std::size_t>
// fdselect (fdselect_set&, fdselect_set&, const duration& timeout);