diff --git a/fs/fs_poll.c b/fs/fs_poll.c index a59cee5aaf..f28e84e269 100644 --- a/fs/fs_poll.c +++ b/fs/fs_poll.c @@ -48,6 +48,7 @@ #include #include +#include #include "fs_internal.h" @@ -195,6 +196,7 @@ static inline int poll_teardown(FAR struct pollfd *fds, nfds_t nfds, int *count) /* Process each descriptor in the list */ + *count = 0; for (i = 0; i < nfds; i++) { /* Teardown the poll */ @@ -228,7 +230,7 @@ static inline int poll_teardown(FAR struct pollfd *fds, nfds_t nfds, int *count) * ****************************************************************************/ -static void poll_timeout(int argc, uint32 isem) +static void poll_timeout(int argc, uint32 isem, ...) { /* Wake up the poller */ @@ -284,16 +286,19 @@ int poll(FAR struct pollfd *fds, nfds_t nfds, int timeout) { if (timeout >= 0) { - /* Wait for the poll event with a timeout */ + /* Wait for the poll event with a timeout. Note that the + * millisecond timeout has to be converted to system clock + * ticks for wd_start + */ wdog = wd_create(); - wd_start(wdog, poll_timeout, 1, (uint32)&sem); + wd_start(wdog, MSEC2TICK(timeout), poll_timeout, 1, (uint32)&sem); poll_semtake(&sem); wd_delete(wdog); } else { - /* Wait for the poll event with not timeout */ + /* Wait for the poll event with no timeout */ poll_semtake(&sem); } diff --git a/include/poll.h b/include/poll.h index 1dd6fc180e..e82d48f57c 100644 --- a/include/poll.h +++ b/include/poll.h @@ -89,14 +89,25 @@ * Public Type Definitions ****************************************************************************/ +/* The number of poll descriptors (required by poll() specification */ + typedef unsigned int nfds_t; +/* In the standard poll() definition, the size of the event set is 'short'. + * Here we pick the smallest storage element that will contain all of the + * poll events. + */ + +typedef ubyte pollevent_t; + +/* This is the Nuttx variant of the standard pollfd structure. */ + struct pollfd { - int fd; /* The descriptor being polled */ - sem_t *sem; /* Pointer to semaphore used to post output event */ - ubyte events; /* The input event flags */ - ubyte revents; /* The output event flags */ + int fd; /* The descriptor being polled */ + sem_t *sem; /* Pointer to semaphore used to post output event */ + pollevent_t events; /* The input event flags */ + pollevent_t revents; /* The output event flags */ }; /****************************************************************************