-/* Copyright (C) 2010 Free Software Foundation, Inc.
+/* Copyright (C) 2010, 2013 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
# include <config.h>
#endif
+#include <poll.h>
+
#include "libguile/_scm.h"
#include "libguile/bytevectors.h"
#include "libguile/numbers.h"
#include "libguile/poll.h"
\f
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#endif
-
-\f
/* {Poll}
*/
If timeout is given and is non-negative, the poll will return after that
number of milliseconds if no fd became active.
*/
-#ifdef HAVE_POLL
static SCM
scm_primitive_poll (SCM pollfds, SCM nfds, SCM ports, SCM timeout)
#define FUNC_NAME "primitive-poll"
if (pt->read_pos < pt->read_end)
/* Buffered input waiting to be read. */
revents |= POLLIN;
- if (pt->write_pos < pt->write_end)
+ if (SCM_OUTPUT_PORT_P (port) && pt->write_pos < pt->write_end)
/* Buffered output possible. */
revents |= POLLOUT;
}
}
- if ((fds[i].revents = revents & fds[i].events))
- rv++;
+ /* Mask in the events we are interested, and test if any are
+ interesting. */
+ if ((revents &= fds[i].events))
+ {
+ /* Could be the underlying fd is also ready for reading. */
+ if (!fds[i].revents)
+ rv++;
+
+ /* In any case, add these events to whatever the syscall
+ set. */
+ fds[i].revents |= revents;
+ }
}
return scm_from_int (rv);
}
#undef FUNC_NAME
-#endif /* HAVE_POLL */
\f
static void
scm_init_poll (void)
{
-#if HAVE_POLL
scm_c_define_gsubr ("primitive-poll", 4, 0, 0, scm_primitive_poll);
-#else
- scm_misc_error ("%init-poll", "`poll' unavailable on this platform", SCM_EOL);
-#endif
+ scm_c_define ("%sizeof-struct-pollfd", scm_from_size_t (sizeof (struct pollfd)));
#ifdef POLLIN
scm_c_define ("POLLIN", scm_from_int (POLLIN));