libstdc++: Allow net::io_context to compile without <poll.h> [PR 100180]

This adds dummy placeholders to net::io_context so that it can still be
compiled on targets without <poll.h>.

libstdc++-v3/ChangeLog:

	PR libstdc++/100180
	* include/experimental/io_context (io_context): Define
	dummy_pollfd type so that most member functions still compile
	without <poll.h> and struct pollfd.
This commit is contained in:
Jonathan Wakely 2021-04-23 13:38:05 +01:00
parent 3517dfe05c
commit 0e1e7b7790

View file

@ -716,6 +716,7 @@ inline namespace v1
struct __reactor
{
#ifdef _GLIBCXX_HAVE_POLL_H
__reactor() : _M_fds(1)
{
int __pipe[2];
@ -739,6 +740,7 @@ inline namespace v1
::close(_M_fds.back().fd);
::close(_M_notify_wr);
}
#endif
// write a notification byte to the pipe (ignoring errors)
void _M_notify()
@ -799,8 +801,12 @@ inline namespace v1
_M_notify();
}
# ifdef _GLIBCXX_HAVE_POLL_H
#ifdef _GLIBCXX_HAVE_POLL_H
using __fdvec = vector<::pollfd>;
#else
struct dummy_pollfd { int fd = -1; short events = 0, revents = 0; };
using __fdvec = vector<dummy_pollfd>;
#endif
// Find first element p such that !(p.fd < __fd)
// N.B. always returns a dereferencable iterator.
@ -816,6 +822,7 @@ inline namespace v1
__status
wait(__fdvec& __fds, chrono::milliseconds __timeout)
{
#ifdef _GLIBCXX_HAVE_POLL_H
// XXX not thread-safe!
__fds = _M_fds; // take snapshot to pass to poll()
@ -845,10 +852,14 @@ inline namespace v1
__fds.erase(__part, __fds.end());
return _S_ok;
#else
(void) __timeout;
__fds.clear();
return _S_error;
#endif
}
__fdvec _M_fds; // _M_fds.back() is the read end of the self-pipe
#endif
int _M_notify_wr; // write end of the self-pipe
};