diff --git a/arch/arm/src/cxd56xx/cxd56_geofence.c b/arch/arm/src/cxd56xx/cxd56_geofence.c index 813dc33b41a..9d17e43f188 100644 --- a/arch/arm/src/cxd56xx/cxd56_geofence.c +++ b/arch/arm/src/cxd56xx/cxd56_geofence.c @@ -433,7 +433,6 @@ static void cxd56_geofence_sighandler(uint32_t data, void *userdata) { struct cxd56_geofence_dev_s *priv = (struct cxd56_geofence_dev_s *)userdata; - int i; int ret; ret = nxsem_wait(&priv->devsem); @@ -442,16 +441,7 @@ static void cxd56_geofence_sighandler(uint32_t data, void *userdata) return; } - for (i = 0; i < CONFIG_GEOFENCE_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - gnssinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_GEOFENCE_NPOLLWAITERS, POLLIN); nxsem_post(&priv->devsem); } diff --git a/arch/arm/src/cxd56xx/cxd56_gnss.c b/arch/arm/src/cxd56xx/cxd56_gnss.c index 41fb3cb5ae6..16a87356a65 100644 --- a/arch/arm/src/cxd56xx/cxd56_gnss.c +++ b/arch/arm/src/cxd56xx/cxd56_gnss.c @@ -2318,7 +2318,6 @@ static void cxd56_gnss_default_sighandler(uint32_t data, void *userdata) { struct cxd56_gnss_dev_s *priv = (struct cxd56_gnss_dev_s *)userdata; - int i; int ret; int dtype = CXD56_CPU1_GET_DATA(data); @@ -2385,16 +2384,7 @@ static void cxd56_gnss_default_sighandler(uint32_t data, void *userdata) return; } - for (i = 0; i < CONFIG_CXD56_GNSS_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - gnssinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_CXD56_GNSS_NPOLLWAITERS, POLLIN); nxsem_post(&priv->devsem); diff --git a/arch/arm/src/sama5/sam_tsd.c b/arch/arm/src/sama5/sam_tsd.c index 6db5af7d67e..68333c10141 100644 --- a/arch/arm/src/sama5/sam_tsd.c +++ b/arch/arm/src/sama5/sam_tsd.c @@ -257,24 +257,13 @@ static struct sam_tsd_s g_tsd; static void sam_tsd_notify(struct sam_tsd_s *priv) { - int i; - /* If there are threads waiting on poll() for touchscreen data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. If they all try to * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_SAMA5_TSD_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_SAMA5_TSD_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/arch/arm/src/stm32/stm32_bbsram.c b/arch/arm/src/stm32/stm32_bbsram.c index 6f2cdf3fa32..75ddeca3663 100644 --- a/arch/arm/src/stm32/stm32_bbsram.c +++ b/arch/arm/src/stm32/stm32_bbsram.c @@ -544,11 +544,7 @@ static int stm32_bbsram_poll(struct file *filep, struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/arch/arm/src/stm32f7/stm32_bbsram.c b/arch/arm/src/stm32f7/stm32_bbsram.c index 4cc6111ee4e..d02125386ad 100644 --- a/arch/arm/src/stm32f7/stm32_bbsram.c +++ b/arch/arm/src/stm32f7/stm32_bbsram.c @@ -544,11 +544,7 @@ static int stm32_bbsram_poll(struct file *filep, struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/arch/arm/src/stm32h7/stm32_bbsram.c b/arch/arm/src/stm32h7/stm32_bbsram.c index d05b56d58f2..e8b48250d91 100644 --- a/arch/arm/src/stm32h7/stm32_bbsram.c +++ b/arch/arm/src/stm32h7/stm32_bbsram.c @@ -591,11 +591,7 @@ static int stm32_bbsram_poll(struct file *filep, struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/arch/renesas/src/rx65n/rx65n_sbram.c b/arch/renesas/src/rx65n/rx65n_sbram.c index e36d8ec8e65..08874f1b51a 100644 --- a/arch/renesas/src/rx65n/rx65n_sbram.c +++ b/arch/renesas/src/rx65n/rx65n_sbram.c @@ -488,11 +488,7 @@ static int rx65n_sbram_poll(FAR struct file *filep, FAR struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c b/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c index ed6971e8ef8..1d45a118de7 100644 --- a/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c +++ b/boards/arm/sam34/sam4l-xplained/src/sam_slcd.c @@ -1168,11 +1168,7 @@ static int slcd_poll(struct file *filep, struct pollfd *fds, { /* Data is always available to be read / Data can always be written */ - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c b/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c index 0a52a57fcfc..c09c1226343 100644 --- a/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c +++ b/boards/arm/stm32/mikroe-stm32f4/src/stm32_touchscreen.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -575,8 +576,6 @@ static inline bool tc_valid_sample(uint16_t sample) static void tc_notify(struct tc_dev_s *priv) { - int i; - /* If no threads have the driver open, then just dump the state */ #ifdef CONFIG_TOUCHSCREEN_REFCNT @@ -595,16 +594,7 @@ static void tc_notify(struct tc_dev_s *priv) * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_TOUCHSCREEN_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_TOUCHSCREEN_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c b/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c index 38ed31f696b..7a0ac5dcafc 100644 --- a/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c +++ b/boards/arm/stm32/stm32ldiscovery/src/stm32_lcd.c @@ -1502,11 +1502,7 @@ static int slcd_poll(struct file *filep, struct pollfd *fds, { /* Data is always available to be read / Data can always be written */ - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c b/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c index d36dee946d3..8d5c8fcb96e 100644 --- a/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c +++ b/boards/mips/pic32mx/pic32mx7mmb/src/pic32_touchscreen.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -475,8 +476,6 @@ static inline bool tc_valid_sample(uint16_t sample) static void tc_notify(struct tc_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for touchscreen data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. @@ -484,16 +483,7 @@ static void tc_notify(struct tc_dev_s *priv) * all. */ - for (i = 0; i < CONFIG_TOUCHSCREEN_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_TOUCHSCREEN_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c b/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c index d9e8208345b..3d8f0d73da4 100644 --- a/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c +++ b/boards/mips/pic32mx/sure-pic32mx/src/pic32mx_lcd1602.c @@ -1024,11 +1024,7 @@ static int lcd_poll(struct file *filep, struct pollfd *fds, { /* Data is always available to be read */ - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/analog/adc.c b/drivers/analog/adc.c index 02b2f37d698..b4fefdfb453 100644 --- a/drivers/analog/adc.c +++ b/drivers/analog/adc.c @@ -496,25 +496,6 @@ static int adc_receive(FAR struct adc_dev_s *dev, uint8_t ch, int32_t data) return errcode; } -/**************************************************************************** - * Name: adc_pollnotify - ****************************************************************************/ - -static void adc_pollnotify(FAR struct adc_dev_s *dev, uint32_t type) -{ - int i; - - for (i = 0; i < CONFIG_ADC_NPOLLWAITERS; i++) - { - struct pollfd *fds = dev->fds[i]; - if (fds) - { - fds->revents |= type; - nxsem_post(fds->sem); - } - } -} - /**************************************************************************** * Name: adc_notify ****************************************************************************/ @@ -527,7 +508,7 @@ static void adc_notify(FAR struct adc_dev_s *dev) * then wake them up now. */ - adc_pollnotify(dev, POLLIN); + poll_notify(dev->fds, CONFIG_ADC_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. @@ -596,7 +577,7 @@ static int adc_poll(FAR struct file *filep, struct pollfd *fds, bool setup) if (dev->ad_recv.af_head != dev->ad_recv.af_tail) { - adc_pollnotify(dev, POLLIN); + poll_notify(dev->fds, CONFIG_ADC_NPOLLWAITERS, POLLIN); } } else if (fds->priv) diff --git a/drivers/analog/comp.c b/drivers/analog/comp.c index 74908d93aa8..833fe5d2bc7 100644 --- a/drivers/analog/comp.c +++ b/drivers/analog/comp.c @@ -80,48 +80,6 @@ static const struct comp_callback_s g_comp_callback = * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: comp_pollnotify - * - * Description: - * This function is called to notify any waiters of poll-reated events. - * - ****************************************************************************/ - -static void comp_pollnotify(FAR struct comp_dev_s *dev, - pollevent_t eventset) -{ - int i; - - if (eventset & POLLERR) - { - eventset &= ~(POLLOUT | POLLIN); - } - - for (i = 0; i < CONFIG_DEV_COMP_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = dev->d_fds[i]; - - if (fds) - { - fds->revents |= eventset & (fds->events | POLLERR | POLLHUP); - - if ((fds->revents & (POLLOUT | POLLHUP)) == (POLLOUT | POLLHUP)) - { - /* POLLOUT and POLLHUP are mutually exclusive. */ - - fds->revents &= ~POLLOUT; - } - - if (fds->revents != 0) - { - ainfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: comp_semtake ****************************************************************************/ @@ -220,7 +178,7 @@ static int comp_notify(FAR struct comp_dev_s *dev, uint8_t val) dev->val = val; - comp_pollnotify(dev, POLLIN); + poll_notify(dev->d_fds, CONFIG_DEV_COMP_NPOLLWAITERS, POLLIN); nxsem_post(&dev->ad_readsem); return 0; diff --git a/drivers/bch/bchdev_driver.c b/drivers/bch/bchdev_driver.c index b51e73a0a23..872311fa442 100644 --- a/drivers/bch/bchdev_driver.c +++ b/drivers/bch/bchdev_driver.c @@ -97,11 +97,7 @@ static int bch_poll(FAR struct file *filep, FAR struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/can/can.c b/drivers/can/can.c index 6793af58ff0..052caa5fc26 100644 --- a/drivers/can/can.c +++ b/drivers/can/can.c @@ -100,11 +100,6 @@ static int can_takesem(FAR sem_t *sem); -/* Poll helpers */ - -static void can_pollnotify(FAR struct can_dev_s *dev, - pollevent_t eventset); - /* CAN helpers */ static uint8_t can_dlc2bytes(uint8_t dlc); @@ -169,30 +164,6 @@ static int can_takesem(FAR sem_t *sem) #define can_givesem(sem) nxsem_post(sem) -/**************************************************************************** - * Name: can_pollnotify - ****************************************************************************/ - -static void can_pollnotify(FAR struct can_dev_s *dev, pollevent_t eventset) -{ - FAR struct pollfd *fds; - int i; - - for (i = 0; i < CONFIG_CAN_NPOLLWAITERS; i++) - { - fds = dev->cd_fds[i]; - if (fds != NULL) - { - fds->revents |= fds->events & eventset; - if (fds->revents != 0) - { - caninfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: can_dlc2bytes * @@ -1154,7 +1125,7 @@ static int can_poll(FAR struct file *filep, FAR struct pollfd *fds, if (ndx != dev->cd_xmit.tx_head) { - eventset |= fds->events & POLLOUT; + eventset |= POLLOUT; } can_givesem(&dev->cd_xmit.tx_sem); @@ -1174,7 +1145,7 @@ static int can_poll(FAR struct file *filep, FAR struct pollfd *fds, { /* No need to wait, just notify the application immediately */ - eventset |= fds->events & POLLIN; + eventset |= POLLIN; } else { @@ -1182,10 +1153,7 @@ static int can_poll(FAR struct file *filep, FAR struct pollfd *fds, } } - if (eventset != 0) - { - can_pollnotify(dev, eventset); - } + poll_notify(dev->cd_fds, CONFIG_CAN_NPOLLWAITERS, eventset); } else if (fds->priv != NULL) { @@ -1401,7 +1369,7 @@ int can_receive(FAR struct can_dev_s *dev, FAR struct can_hdr_s *hdr, * cd_recv buffer */ - can_pollnotify(dev, POLLIN); + poll_notify(dev->cd_fds, CONFIG_CAN_NPOLLWAITERS, POLLIN); sval = 0; if (nxsem_get_value(&fifo->rx_sem, &sval) < 0) @@ -1546,7 +1514,7 @@ int can_txdone(FAR struct can_dev_s *dev) * buffer */ - can_pollnotify(dev, POLLOUT); + poll_notify(dev->cd_fds, CONFIG_CAN_NPOLLWAITERS, POLLOUT); /* Are there any threads waiting for space in the TX FIFO? */ diff --git a/drivers/crypto/dev_urandom.c b/drivers/crypto/dev_urandom.c index 09603991636..0137fdfaf3f 100644 --- a/drivers/crypto/dev_urandom.c +++ b/drivers/crypto/dev_urandom.c @@ -292,11 +292,7 @@ static int devurand_poll(FAR struct file *filep, FAR struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/input/ads7843e.c b/drivers/input/ads7843e.c index e7e204bb122..0f94ce0a89d 100644 --- a/drivers/input/ads7843e.c +++ b/drivers/input/ads7843e.c @@ -279,24 +279,13 @@ static uint16_t ads7843e_sendcmd(FAR struct ads7843e_dev_s *priv, static void ads7843e_notify(FAR struct ads7843e_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for ADS7843E data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. If they all try to * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_ADS7843E_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_ADS7843E_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/input/ajoystick.c b/drivers/input/ajoystick.c index a0f04597cc6..ef81fd86741 100644 --- a/drivers/input/ajoystick.c +++ b/drivers/input/ajoystick.c @@ -223,7 +223,6 @@ static void ajoy_sample(FAR struct ajoy_upperhalf_s *priv) ajoy_buttonset_t press; ajoy_buttonset_t release; irqstate_t flags; - int i; DEBUGASSERT(priv); lower = priv->au_lower; @@ -265,19 +264,8 @@ static void ajoy_sample(FAR struct ajoy_upperhalf_s *priv) /* Yes.. Notify all waiters */ - for (i = 0; i < CONFIG_INPUT_AJOYSTICK_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = opriv->ao_fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } + poll_notify(opriv->ao_fds, CONFIG_INPUT_AJOYSTICK_NPOLLWAITERS, + POLLIN); } /* Have any signal events occurred? */ @@ -635,12 +623,7 @@ static int ajoy_poll(FAR struct file *filep, FAR struct pollfd *fds, if (opriv->ao_pollpending) { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN); } break; diff --git a/drivers/input/button_upper.c b/drivers/input/button_upper.c index 0b572e46336..10117aa2d40 100644 --- a/drivers/input/button_upper.c +++ b/drivers/input/button_upper.c @@ -230,7 +230,6 @@ static void btn_sample(FAR struct btn_upperhalf_s *priv) btn_buttonset_t change; btn_buttonset_t press; btn_buttonset_t release; - int i; DEBUGASSERT(priv && priv->bu_lower); lower = priv->bu_lower; @@ -267,19 +266,8 @@ static void btn_sample(FAR struct btn_upperhalf_s *priv) { /* Yes.. Notify all waiters */ - for (i = 0; i < CONFIG_INPUT_BUTTONS_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = opriv->bo_fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } + poll_notify(opriv->bo_fds, CONFIG_INPUT_BUTTONS_NPOLLWAITERS, + POLLIN); } /* Have any signal events occurred? */ @@ -687,12 +675,7 @@ static int btn_poll(FAR struct file *filep, FAR struct pollfd *fds, if (opriv->bo_pending) { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN); } break; diff --git a/drivers/input/cypress_mbr3108.c b/drivers/input/cypress_mbr3108.c index 26073fbfa7b..8e803cb0343 100644 --- a/drivers/input/cypress_mbr3108.c +++ b/drivers/input/cypress_mbr3108.c @@ -981,25 +981,6 @@ static int mbr3108_close(FAR struct file *filep) return 0; } -static void mbr3108_poll_notify(FAR struct mbr3108_dev_s *priv) -{ - int i; - - DEBUGASSERT(priv != NULL); - - for (i = 0; i < CONFIG_INPUT_CYPRESS_MBR3108_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - mbr3108_dbg("Report events: %08" PRIx32 "\n", fds->revents); - - fds->revents |= POLLIN; - nxsem_post(fds->sem); - } - } -} - static int mbr3108_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) { @@ -1059,7 +1040,9 @@ static int mbr3108_poll(FAR struct file *filep, FAR struct pollfd *fds, pending = priv->int_pending; if (pending) { - mbr3108_poll_notify(priv); + poll_notify(priv->fds, + CONFIG_INPUT_CYPRESS_MBR3108_NPOLLWAITERS, + POLLIN); } } } @@ -1092,7 +1075,7 @@ static int mbr3108_isr_handler(int irq, FAR void *context, FAR void *arg) priv->int_pending = true; leave_critical_section(flags); - mbr3108_poll_notify(priv); + poll_notify(priv->fds, CONFIG_INPUT_CYPRESS_MBR3108_NPOLLWAITERS, POLLIN); return 0; } diff --git a/drivers/input/djoystick.c b/drivers/input/djoystick.c index a62a411016b..d2ba83a841e 100644 --- a/drivers/input/djoystick.c +++ b/drivers/input/djoystick.c @@ -223,7 +223,6 @@ static void djoy_sample(FAR struct djoy_upperhalf_s *priv) djoy_buttonset_t press; djoy_buttonset_t release; irqstate_t flags; - int i; DEBUGASSERT(priv); lower = priv->du_lower; @@ -265,19 +264,8 @@ static void djoy_sample(FAR struct djoy_upperhalf_s *priv) /* Yes.. Notify all waiters */ - for (i = 0; i < CONFIG_INPUT_DJOYSTICK_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = opriv->do_fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } + poll_notify(opriv->do_fds, CONFIG_INPUT_DJOYSTICK_NPOLLWAITERS, + POLLIN); } /* Have any signal events occurred? */ @@ -629,12 +617,7 @@ static int djoy_poll(FAR struct file *filep, FAR struct pollfd *fds, if (opriv->do_pollpending) { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN); } break; diff --git a/drivers/input/ft5x06.c b/drivers/input/ft5x06.c index f278bc3f9c1..b1c10ce3cde 100644 --- a/drivers/input/ft5x06.c +++ b/drivers/input/ft5x06.c @@ -201,24 +201,13 @@ static const uint8_t g_event_map[4] = static void ft5x06_notify(FAR struct ft5x06_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for FT5x06 data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. If they all try to * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_FT5X06_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_FT5X06_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/input/keyboard_upper.c b/drivers/input/keyboard_upper.c index 2ff5d2b3d67..762d028de94 100644 --- a/drivers/input/keyboard_upper.c +++ b/drivers/input/keyboard_upper.c @@ -75,7 +75,6 @@ static ssize_t keyboard_write(FAR struct file *filep, FAR const char *buffer, size_t len); static int keyboard_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); -static void keyboard_notify(FAR struct keyboard_opriv_s *buffer); /**************************************************************************** * Private Data @@ -99,30 +98,6 @@ static const struct file_operations g_keyboard_fops = * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: keyboard_notify - ****************************************************************************/ - -static void keyboard_notify(FAR struct keyboard_opriv_s *opriv) -{ - FAR struct pollfd *fds = opriv->fds; - if (fds != NULL) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - /* report event log */ - - int semcount; - nxsem_get_value(fds->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: keyboard_open ****************************************************************************/ @@ -301,7 +276,7 @@ static int keyboard_poll(FAR struct file *filep, if (!circbuf_is_empty(&opriv->circ)) { - keyboard_notify(opriv); + poll_notify(&opriv->fds, 1, POLLIN); } } else @@ -437,7 +412,7 @@ void keyboard_event(FAR struct keyboard_lowerhalf_s *lower, uint32_t keycode, nxsem_post(&opriv->waitsem); } - keyboard_notify(opriv); + poll_notify(&opriv->fds, 1, POLLIN); nxsem_post(&opriv->locksem); } } diff --git a/drivers/input/max11802.c b/drivers/input/max11802.c index 53fa899ba5c..1d40432d8c2 100644 --- a/drivers/input/max11802.c +++ b/drivers/input/max11802.c @@ -236,24 +236,13 @@ static uint16_t max11802_sendcmd(FAR struct max11802_dev_s *priv, static void max11802_notify(FAR struct max11802_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for MAX11802 data to become * available, then wake them up now. NOTE: we wake up all waiting * threads because we do not know that they are going to do. If they * all try to read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_MAX11802_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_MAX11802_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/input/mxt.c b/drivers/input/mxt.c index d26721e0e5b..76d2629a90c 100644 --- a/drivers/input/mxt.c +++ b/drivers/input/mxt.c @@ -584,24 +584,13 @@ static int mxt_flushmsgs(FAR struct mxt_dev_s *priv) static void mxt_notify(FAR struct mxt_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for maXTouch data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. If they all try to * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_MXT_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_MXT_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/input/spq10kbd.c b/drivers/input/spq10kbd.c index cbde80cd703..e491c50de8f 100644 --- a/drivers/input/spq10kbd.c +++ b/drivers/input/spq10kbd.c @@ -440,29 +440,6 @@ static int spq10kbd_interrupt(int irq, FAR void *context, FAR void *arg) return OK; } -/**************************************************************************** - * Name: spq10kbd_pollnotify - ****************************************************************************/ - -static void spq10kbd_pollnotify(FAR struct spq10kbd_dev_s *priv) -{ - int i; - - for (i = 0; i < CONFIG_SPQ10KBD_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - uinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: spq10kbd_open * @@ -676,7 +653,7 @@ static int spq10kbd_poll(FAR struct file *filep, FAR struct pollfd *fds, if (priv->headndx != priv->tailndx) { - spq10kbd_pollnotify(priv); + poll_notify(priv->fds, CONFIG_SPQ10KBD_NPOLLWAITERS, POLLIN); } } else diff --git a/drivers/input/stmpe811_tsc.c b/drivers/input/stmpe811_tsc.c index ec68333632c..3baaa162121 100644 --- a/drivers/input/stmpe811_tsc.c +++ b/drivers/input/stmpe811_tsc.c @@ -145,24 +145,13 @@ static const struct file_operations g_stmpe811fops = static void stmpe811_notify(FAR struct stmpe811_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for STMPE811 data to become * available, then wake them up now. NOTE: we wake up all waiting threads * because we do not know that they are going to do. If they all try to * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_STMPE811_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_STMPE811_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/input/touchscreen_upper.c b/drivers/input/touchscreen_upper.c index 6740d24ac62..ae1ed01c953 100644 --- a/drivers/input/touchscreen_upper.c +++ b/drivers/input/touchscreen_upper.c @@ -66,8 +66,6 @@ struct touch_upperhalf_s * Private Function Prototypes ****************************************************************************/ -static void touch_notify(FAR struct touch_openpriv_s *openpriv, - pollevent_t eventset); static int touch_open(FAR struct file *filep); static int touch_close(FAR struct file *filep); static ssize_t touch_read(FAR struct file *filep, FAR char *buffer, @@ -101,29 +99,6 @@ static const struct file_operations g_touch_fops = * Private Functions ****************************************************************************/ -static void touch_notify(FAR struct touch_openpriv_s *openpriv, - pollevent_t eventset) -{ - FAR struct pollfd *fd = openpriv->fds; - - fd = openpriv->fds; - if (fd) - { - fd->revents |= (fd->events & eventset); - if (fd->revents != 0) - { - /* report event log */ - - int semcount; - nxsem_get_value(fd->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fd->sem); - } - } - } -} - /**************************************************************************** * Name: touch_open ****************************************************************************/ @@ -323,13 +298,10 @@ static int touch_poll(FAR struct file *filep, struct pollfd *fds, bool setup) if (!circbuf_is_empty(&openpriv->circbuf)) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } - if (eventset) - { - touch_notify(openpriv, POLLIN); - } + poll_notify(&openpriv->fds, 1, eventset); } else if (fds->priv) { @@ -368,7 +340,7 @@ void touch_event(FAR void *priv, FAR const struct touch_sample_s *sample) nxsem_post(&openpriv->waitsem); } - touch_notify(openpriv, POLLIN); + poll_notify(&openpriv->fds, 1, POLLIN); } nxsem_post(&upper->exclsem); diff --git a/drivers/input/tsc2007.c b/drivers/input/tsc2007.c index 8ca4c8a3a13..eefccda8e55 100644 --- a/drivers/input/tsc2007.c +++ b/drivers/input/tsc2007.c @@ -237,24 +237,13 @@ static struct tsc2007_dev_s *g_tsc2007list; static void tsc2007_notify(FAR struct tsc2007_dev_s *priv) { - int i; - /* If there are threads waiting on poll() for TSC2007 data to become * available, then wake them up now. NOTE: we wake up all waiting * threads because we do not know that they are going to do. If they * all try to read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_TSC2007_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_TSC2007_NPOLLWAITERS, POLLIN); /* If there are threads waiting for read data, then signal one of them * that the read data is available. diff --git a/drivers/ipcc/ipcc_poll.c b/drivers/ipcc/ipcc_poll.c index ccea384e78f..aa986121ded 100644 --- a/drivers/ipcc/ipcc_poll.c +++ b/drivers/ipcc/ipcc_poll.c @@ -136,71 +136,17 @@ int ipcc_poll(FAR struct file *filep, FAR struct pollfd *fds, #ifdef CONFIG_IPCC_BUFFERED if (circbuf_used(&priv->ipcc->rxbuf) > 0) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } if (circbuf_space(&priv->ipcc->txbuf) > 0) { - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; } #endif - if (eventset) - { - ipcc_pollnotify(priv, eventset); - } + poll_notify(priv->fds, CONFIG_IPCC_NPOLLWAITERS, eventset); nxsem_post(&priv->exclsem); return OK; } - -/**************************************************************************** - * Name: ipcc_pollnotify - * - * Description: - * Wakes up all sleeping threads waiting for event associated with ipcc - * driver. - * - * Input Parameters: - * ipcc - driver instance to check for poll events - * eventset - list of events to check for activity - * - * Returned Value: - * None - * - * Assumptions/Limitations: - * This function may be called from interrupt handler. - * - ****************************************************************************/ - -void ipcc_pollnotify(FAR struct ipcc_driver_s *priv, pollevent_t eventset) -{ - struct pollfd *fds; - int semcount; - int i; - - for (i = 0; i < CONFIG_IPCC_NPOLLWAITERS; i++) - { - if ((fds = priv->fds[i]) == NULL) - { - /* Slot empty, move to next one */ - - continue; - } - - if ((fds->revents |= fds->events & eventset) == 0) - { - /* No event */ - - continue; - } - - finfo("Report events: %08" PRIx32 "\n", fds->revents); - - nxsem_get_value(fds->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fds->sem); - } - } -} diff --git a/drivers/lcd/pcf8574_lcd_backpack.c b/drivers/lcd/pcf8574_lcd_backpack.c index ce589f428b5..346195ce7c6 100644 --- a/drivers/lcd/pcf8574_lcd_backpack.c +++ b/drivers/lcd/pcf8574_lcd_backpack.c @@ -1558,11 +1558,7 @@ static int pcf8574_lcd_poll(FAR struct file *filep, FAR struct pollfd *fds, { /* Data is always available to be read */ - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/lcd/tda19988.c b/drivers/lcd/tda19988.c index 4b362a455eb..462305f373c 100644 --- a/drivers/lcd/tda19988.c +++ b/drivers/lcd/tda19988.c @@ -1180,11 +1180,7 @@ static int tda19988_poll(FAR struct file *filep, FAR struct pollfd *fds, if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } nxsem_post(&priv->exclsem); diff --git a/drivers/misc/dev_null.c b/drivers/misc/dev_null.c index 8e7c5e90d74..da6fc348637 100644 --- a/drivers/misc/dev_null.c +++ b/drivers/misc/dev_null.c @@ -105,11 +105,7 @@ static int devnull_poll(FAR struct file *filep, FAR struct pollfd *fds, if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/misc/dev_zero.c b/drivers/misc/dev_zero.c index 882fb60a5f1..097e79d1c5c 100644 --- a/drivers/misc/dev_zero.c +++ b/drivers/misc/dev_zero.c @@ -104,11 +104,7 @@ static int devzero_poll(FAR struct file *filep, FAR struct pollfd *fds, if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/modem/u-blox.c b/drivers/modem/u-blox.c index ecb8df0b80a..b858a4a0729 100644 --- a/drivers/modem/u-blox.c +++ b/drivers/modem/u-blox.c @@ -260,11 +260,7 @@ static int ubxmdm_poll(FAR struct file * filep, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/mtd/mtd_config.c b/drivers/mtd/mtd_config.c index ade51d77f2e..f4d02abc519 100644 --- a/drivers/mtd/mtd_config.c +++ b/drivers/mtd/mtd_config.c @@ -1713,11 +1713,7 @@ static int mtdconfig_poll(FAR struct file *filep, FAR struct pollfd *fds, { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/mtd/mtd_config_fs.c b/drivers/mtd/mtd_config_fs.c index 1a1e0665432..ccfeb250a54 100644 --- a/drivers/mtd/mtd_config_fs.c +++ b/drivers/mtd/mtd_config_fs.c @@ -1985,11 +1985,7 @@ static int mtdconfig_poll(FAR struct file *filep, FAR struct pollfd *fds, { if (setup) { - fds->revents |= fds->events & (POLLIN | POLLOUT); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } return OK; diff --git a/drivers/net/telnet.c b/drivers/net/telnet.c index 5b7dec309d9..5a283b2e911 100644 --- a/drivers/net/telnet.c +++ b/drivers/net/telnet.c @@ -1247,11 +1247,7 @@ static int telnet_poll(FAR struct file *filep, FAR struct pollfd *fds, { /* Yes.. then signal the poll logic */ - fds->revents |= (POLLRDNORM & fds->events); - if (fds->revents) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLRDNORM); } /* Then let psock_poll() do the heavy lifting */ diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 6e54c117601..967305e26d7 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -295,13 +295,7 @@ static void tun_pollnotify(FAR struct tun_device_s *priv, return; } - eventset &= fds->events; - - if (eventset != 0) - { - fds->revents |= eventset; - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); } /**************************************************************************** @@ -1261,7 +1255,7 @@ int tun_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) if (priv->write_d_len == 0) { - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; } /* The write buffer sometimes could be used for TX. @@ -1270,13 +1264,10 @@ int tun_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) if (priv->read_d_len != 0 || priv->write_d_len != 0) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } - if (eventset) - { - tun_pollnotify(priv, eventset); - } + tun_pollnotify(priv, eventset); } else { diff --git a/drivers/pipes/pipe_common.c b/drivers/pipes/pipe_common.c index 9974dc37235..24350af1fa7 100644 --- a/drivers/pipes/pipe_common.c +++ b/drivers/pipes/pipe_common.c @@ -73,44 +73,6 @@ static int pipecommon_semtake(FAR sem_t *sem) return nxsem_wait_uninterruptible(sem); } -/**************************************************************************** - * Name: pipecommon_pollnotify - ****************************************************************************/ - -static void pipecommon_pollnotify(FAR struct pipe_dev_s *dev, - pollevent_t eventset) -{ - int i; - - if (eventset & POLLERR) - { - eventset &= ~(POLLOUT | POLLIN); - } - - for (i = 0; i < CONFIG_DEV_PIPE_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = dev->d_fds[i]; - - if (fds) - { - fds->revents |= eventset & (fds->events | POLLERR | POLLHUP); - - if ((fds->revents & (POLLOUT | POLLHUP)) == (POLLOUT | POLLHUP)) - { - /* POLLOUT and POLLHUP are mutually exclusive. */ - - fds->revents &= ~POLLOUT; - } - - if (fds->revents != 0) - { - finfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Public Functions ****************************************************************************/ @@ -321,7 +283,7 @@ int pipecommon_close(FAR struct file *filep) { /* Inform poll readers that other end closed. */ - pipecommon_pollnotify(dev, POLLHUP); + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, POLLHUP); while (nxsem_get_value(&dev->d_rdsem, &sval) == 0 && sval <= 0) { @@ -342,7 +304,8 @@ int pipecommon_close(FAR struct file *filep) { /* Inform poll writers that other end closed. */ - pipecommon_pollnotify(dev, POLLERR); + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, + POLLERR); while (nxsem_get_value(&dev->d_wrsem, &sval) == 0 && sval <= 0) { @@ -477,7 +440,7 @@ ssize_t pipecommon_read(FAR struct file *filep, FAR char *buffer, size_t len) /* Notify all poll/select waiters that they can write to the FIFO */ - pipecommon_pollnotify(dev, POLLOUT); + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, POLLOUT); /* Notify all waiting writers that bytes have been removed from the * buffer. @@ -588,7 +551,7 @@ ssize_t pipecommon_write(FAR struct file *filep, FAR const char *buffer, * FIFO. */ - pipecommon_pollnotify(dev, POLLIN); + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, POLLIN); /* Yes.. Notify all of the waiting readers that more data is * available. @@ -617,7 +580,7 @@ ssize_t pipecommon_write(FAR struct file *filep, FAR const char *buffer, * FIFO. */ - pipecommon_pollnotify(dev, POLLIN); + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, POLLIN); /* Yes.. Notify all of the waiting readers that more data is * available. @@ -761,10 +724,7 @@ int pipecommon_poll(FAR struct file *filep, FAR struct pollfd *fds, eventset |= POLLERR; } - if (eventset) - { - pipecommon_pollnotify(dev, eventset); - } + poll_notify(dev->d_fds, CONFIG_DEV_PIPE_NPOLLWAITERS, eventset); } else { diff --git a/drivers/power/battery/battery_charger.c b/drivers/power/battery/battery_charger.c index 5aa74c435cc..4e4c8769f1c 100644 --- a/drivers/power/battery/battery_charger.c +++ b/drivers/power/battery/battery_charger.c @@ -122,12 +122,7 @@ static int battery_charger_notify(FAR struct battery_charger_priv_s *priv, priv->mask |= mask; if (priv->mask) { - fd->revents |= POLLIN; - nxsem_get_value(fd->sem, &semcnt); - if (semcnt < 1) - { - nxsem_post(fd->sem); - } + poll_notify(&fd, 1, POLLIN); nxsem_get_value(&priv->wait, &semcnt); if (semcnt < 1) diff --git a/drivers/power/battery/battery_gauge.c b/drivers/power/battery/battery_gauge.c index bf93c2422b0..17d79f5704c 100644 --- a/drivers/power/battery/battery_gauge.c +++ b/drivers/power/battery/battery_gauge.c @@ -124,12 +124,7 @@ static int battery_gauge_notify(FAR struct battery_gauge_priv_s *priv, priv->mask |= mask; if (priv->mask) { - fd->revents |= POLLIN; - nxsem_get_value(fd->sem, &semcnt); - if (semcnt < 1) - { - nxsem_post(fd->sem); - } + poll_notify(&fd, 1, POLLIN); nxsem_get_value(&priv->wait, &semcnt); if (semcnt < 1) diff --git a/drivers/power/battery/battery_monitor.c b/drivers/power/battery/battery_monitor.c index b277e753b5c..235faec335a 100644 --- a/drivers/power/battery/battery_monitor.c +++ b/drivers/power/battery/battery_monitor.c @@ -123,12 +123,7 @@ static int battery_monitor_notify(FAR struct battery_monitor_priv_s *priv, priv->mask |= mask; if (priv->mask) { - fd->revents |= POLLIN; - nxsem_get_value(fd->sem, &semcnt); - if (semcnt < 1) - { - nxsem_post(fd->sem); - } + poll_notify(&fd, 1, POLLIN); nxsem_get_value(&priv->wait, &semcnt); if (semcnt < 1) diff --git a/drivers/rc/lirc_dev.c b/drivers/rc/lirc_dev.c index cff75262c79..793b8f20484 100644 --- a/drivers/rc/lirc_dev.c +++ b/drivers/rc/lirc_dev.c @@ -80,7 +80,6 @@ struct lirc_fh_s * Private Function Prototypes ****************************************************************************/ -static void lirc_pollnotify(FAR struct lirc_fh_s *fh, pollevent_t eventset); static int lirc_open(FAR struct file *filep); static int lirc_close(FAR struct file *filep); static int lirc_ioctl(FAR struct file *filep, int cmd, unsigned long arg); @@ -113,28 +112,6 @@ static const struct file_operations g_lirc_fops = * Private Functions ****************************************************************************/ -static void lirc_pollnotify(FAR struct lirc_fh_s *fh, - pollevent_t eventset) -{ - int semcount; - - if (fh->fd) - { - fh->fd->revents |= (fh->fd->events & eventset); - - if (fh->fd->revents != 0) - { - rcinfo("Report events: %08" PRIx32 "\n", fh->fd->revents); - - nxsem_get_value(fh->fd->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fh->fd->sem); - } - } - } -} - static int lirc_open(FAR struct file *filep) { FAR struct inode *inode = filep->f_inode; @@ -251,13 +228,10 @@ static int lirc_poll(FAR struct file *filep, if (!circbuf_is_empty(&fh->buffer)) { - eventset = (fds->events & (POLLIN | POLLRDNORM)); + eventset |= POLLIN | POLLRDNORM; } - if (eventset) - { - lirc_pollnotify(fh, eventset); - } + poll_notify(&fh->fd, 1, eventset); } else if (fds->priv != NULL) { @@ -941,7 +915,7 @@ void lirc_raw_event(FAR struct lirc_lowerhalf_s *lower, fh = (FAR struct lirc_fh_s *)node; if (circbuf_write(&fh->buffer, &gap, sizeof(int)) > 0) { - lirc_pollnotify(fh, POLLIN | POLLRDNORM); + poll_notify(&fh->fd, 1, POLLIN | POLLRDNORM); nxsem_get_value(&fh->waitsem, &semcount); if (semcount < 1) { @@ -971,7 +945,7 @@ void lirc_raw_event(FAR struct lirc_lowerhalf_s *lower, if (circbuf_write(&fh->buffer, &sample, sizeof(unsigned int)) > 0) { - lirc_pollnotify(fh, POLLIN | POLLRDNORM); + poll_notify(&fh->fd, 1, POLLIN | POLLRDNORM); nxsem_get_value(&fh->waitsem, &semcount); if (semcount < 1) { @@ -1015,7 +989,7 @@ void lirc_scancode_event(FAR struct lirc_lowerhalf_s *lower, fh = (FAR struct lirc_fh_s *)node; if (circbuf_write(&fh->buffer, lsc, sizeof(*lsc)) > 0) { - lirc_pollnotify(fh, POLLIN | POLLRDNORM); + poll_notify(&fh->fd, 1, POLLIN | POLLRDNORM); nxsem_get_value(&fh->waitsem, &semcount); if (semcount < 1) { @@ -1061,7 +1035,7 @@ void lirc_sample_event(FAR struct lirc_lowerhalf_s *lower, fh = (FAR struct lirc_fh_s *)node; if (circbuf_write(&fh->buffer, &sample, sizeof(unsigned int)) > 0) { - lirc_pollnotify(fh, POLLIN | POLLRDNORM); + poll_notify(&fh->fd, 1, POLLIN | POLLRDNORM); nxsem_get_value(&fh->waitsem, &semcount); if (semcount < 1) { diff --git a/drivers/sensors/hc_sr04.c b/drivers/sensors/hc_sr04.c index 49313a86bcc..413adf18f3b 100644 --- a/drivers/sensors/hc_sr04.c +++ b/drivers/sensors/hc_sr04.c @@ -271,30 +271,6 @@ static bool hcsr04_sample(FAR struct hcsr04_dev_s *priv) return (done == 0); } -static void hcsr04_notify(FAR struct hcsr04_dev_s *priv) -{ - DEBUGASSERT(priv != NULL); - - int i; - - /* If there are threads waiting on poll() for data to become available, - * then wake them up now. NOTE: we wake up all waiting threads because we - * do not know that they are going to do. If they all try to read the - * data, then some make end up blocking after all. - */ - - for (i = 0; i < CONFIG_HCSR04_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - hcsr04_dbg("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } -} - static int hcsr04_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) { @@ -356,7 +332,7 @@ static int hcsr04_poll(FAR struct file *filep, FAR struct pollfd *fds, flags = enter_critical_section(); if (hcsr04_sample(priv)) { - hcsr04_notify(priv); + poll_notify(priv->fds, CONFIG_HCSR04_NPOLLWAITERS, POLLIN); } leave_critical_section(flags); @@ -415,7 +391,7 @@ static int hcsr04_int_handler(int irq, FAR void *context, FAR void *arg) } hcsr04_dbg("HC-SR04 interrupt\n"); - hcsr04_notify(priv); + poll_notify(priv->fds, CONFIG_HCSR04_NPOLLWAITERS, POLLIN); return OK; } diff --git a/drivers/sensors/hts221.c b/drivers/sensors/hts221.c index d22c9aa5cfb..7547ab3ba1d 100644 --- a/drivers/sensors/hts221.c +++ b/drivers/sensors/hts221.c @@ -1054,30 +1054,6 @@ static bool hts221_sample(FAR struct hts221_dev_s *priv) return status.is_humid_ready || status.is_temp_ready; } -static void hts221_notify(FAR struct hts221_dev_s *priv) -{ - DEBUGASSERT(priv != NULL); - - int i; - - /* If there are threads waiting on poll() for data to become available, - * then wake them up now. NOTE: we wake up all waiting threads because we - * do not know that they are going to do. If they all try to read the - * data, then some make end up blocking after all. - */ - - for (i = 0; i < CONFIG_HTS221_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - hts221_dbg("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } -} - static int hts221_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) { @@ -1139,7 +1115,7 @@ static int hts221_poll(FAR struct file *filep, FAR struct pollfd *fds, flags = enter_critical_section(); if (priv->int_pending || hts221_sample(priv)) { - hts221_notify(priv); + poll_notify(priv->fds, CONFIG_HTS221_NPOLLWAITERS, POLLIN); } leave_critical_section(flags); @@ -1170,7 +1146,7 @@ static int hts221_int_handler(int irq, FAR void *context, FAR void *arg) priv->int_pending = true; hts221_dbg("Hts221 interrupt\n"); - hts221_notify(priv); + poll_notify(priv->fds, CONFIG_HTS221_NPOLLWAITERS, POLLIN); return OK; } diff --git a/drivers/sensors/lis2dh.c b/drivers/sensors/lis2dh.c index fd10b9536e3..4147e805d32 100644 --- a/drivers/sensors/lis2dh.c +++ b/drivers/sensors/lis2dh.c @@ -118,7 +118,6 @@ static int lis2dh_powerdown(FAR struct lis2dh_dev_s *dev); static int lis2dh_reboot(FAR struct lis2dh_dev_s *dev); static int lis2dh_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); -static void lis2dh_notify(FAR struct lis2dh_dev_s *priv); static int lis2dh_int_handler(int irq, FAR void *context, FAR void *arg); static int lis2dh_setup(FAR struct lis2dh_dev_s *dev, @@ -439,7 +438,7 @@ static ssize_t lis2dh_read(FAR struct file *filep, FAR char *buffer, priv->int_pending = true; #endif - lis2dh_notify(priv); + poll_notify(priv->fds, CONFIG_LIS2DH_NPOLLWAITERS, POLLIN); leave_critical_section(flags); } else if (fifo_mode != LIS2DH_STREAM_MODE && priv->fifo_stopped) @@ -715,7 +714,7 @@ static int lis2dh_poll(FAR struct file *filep, FAR struct pollfd *fds, if (priv->int_pending) { - lis2dh_notify(priv); + poll_notify(priv->fds, CONFIG_LIS2DH_NPOLLWAITERS, POLLIN); } } else if (fds->priv) @@ -736,30 +735,6 @@ out: return ret; } -static void lis2dh_notify(FAR struct lis2dh_dev_s *priv) -{ - DEBUGASSERT(priv != NULL); - - int i; - - /* If there are threads waiting on poll() for LIS2DH data to become - * available, then wake them up now. NOTE: we wake up all waiting threads - * because we do not know that they are going to do. If they all try to - * read the data, then some make end up blocking after all. - */ - - for (i = 0; i < CONFIG_LIS2DH_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - lis2dh_dbg("lis2dh: Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } -} - /**************************************************************************** * Name: lis2dh_callback * @@ -783,7 +758,7 @@ static int lis2dh_int_handler(int irq, FAR void *context, FAR void *arg) priv->int_pending = true; #endif - lis2dh_notify(priv); + poll_notify(priv->fds, CONFIG_LIS2DH_NPOLLWAITERS, POLLIN); leave_critical_section(flags); return OK; diff --git a/drivers/sensors/max44009.c b/drivers/sensors/max44009.c index fdb7babddfd..1358fdee4e3 100644 --- a/drivers/sensors/max44009.c +++ b/drivers/sensors/max44009.c @@ -769,9 +769,7 @@ static void max44009_notify(FAR struct max44009_dev_s *priv) FAR struct pollfd *fds = priv->fds[i]; if (fds) { - fds->revents |= POLLIN; - max44009_dbg("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); + poll_notify(&fds, 1, POLLIN); priv->int_pending = false; } } diff --git a/drivers/sensors/sensor.c b/drivers/sensors/sensor.c index fde9cf619d7..c0c55e62608 100644 --- a/drivers/sensors/sensor.c +++ b/drivers/sensors/sensor.c @@ -488,28 +488,12 @@ static ssize_t sensor_do_samples(FAR struct sensor_upperhalf_s *upper, static void sensor_pollnotify_one(FAR struct sensor_user_s *user, pollevent_t eventset) { - int semcount; - if (eventset == POLLPRI) { user->changed = true; } - if (!user->fds) - { - return; - } - - user->fds->revents |= (user->fds->events & eventset); - if (user->fds->revents != 0) - { - sninfo("Report events: %08" PRIx32 "\n", user->fds->revents); - nxsem_get_value(user->fds->sem, &semcount); - if (semcount < 1) - { - nxsem_post(user->fds->sem); - } - } + poll_notify(&user->fds, 1, eventset); } static void sensor_pollnotify(FAR struct sensor_upperhalf_s *upper, @@ -899,31 +883,28 @@ static int sensor_poll(FAR struct file *filep, if (filep->f_oflags & O_NONBLOCK) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } else { nxsem_get_value(&user->buffersem, &semcount); if (semcount > 0) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } } } else if (sensor_is_updated(upper, user)) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } if (user->changed) { - eventset |= (fds->events & POLLPRI); + eventset |= POLLPRI; } - if (eventset) - { - sensor_pollnotify_one(user, eventset); - } + sensor_pollnotify_one(user, eventset); } else { diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 7b2c8b8622f..b61e4b09b80 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -81,7 +81,6 @@ ****************************************************************************/ static int uart_takesem(FAR sem_t *sem, bool errout); -static void uart_pollnotify(FAR uart_dev_t *dev, pollevent_t eventset); /* Write support */ @@ -165,40 +164,6 @@ static int uart_takesem(FAR sem_t *sem, bool errout) #define uart_givesem(sem) nxsem_post(sem) -/**************************************************************************** - * Name: uart_pollnotify - ****************************************************************************/ - -static void uart_pollnotify(FAR uart_dev_t *dev, pollevent_t eventset) -{ - int i; - - for (i = 0; i < CONFIG_SERIAL_NPOLLWAITERS; i++) - { - struct pollfd *fds = dev->fds[i]; - if (fds) - { -#ifdef CONFIG_SERIAL_REMOVABLE - fds->revents |= ((fds->events | (POLLERR | POLLHUP)) & eventset); -#else - fds->revents |= (fds->events & eventset); -#endif - if (fds->revents != 0) - { - int semcount; - - finfo("Report events: %08" PRIx32 "\n", fds->revents); - - nxsem_get_value(fds->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fds->sem); - } - } - } - } -} - /**************************************************************************** * Name: uart_putxmitchar ****************************************************************************/ @@ -1570,7 +1535,7 @@ static int uart_poll(FAR struct file *filep, if (ndx != dev->xmit.tail) { - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; } uart_givesem(&dev->xmit.sem); @@ -1585,7 +1550,7 @@ static int uart_poll(FAR struct file *filep, uart_takesem(&dev->recv.sem, false); if (dev->recv.head != dev->recv.tail) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } uart_givesem(&dev->recv.sem); @@ -1599,10 +1564,7 @@ static int uart_poll(FAR struct file *filep, } #endif - if (eventset) - { - uart_pollnotify(dev, eventset); - } + poll_notify(dev->fds, CONFIG_SERIAL_NPOLLWAITERS, eventset); } else if (fds->priv != NULL) { @@ -1757,7 +1719,7 @@ void uart_datareceived(FAR uart_dev_t *dev) { /* Notify all poll/select waiters that they can read from the recv buffer */ - uart_pollnotify(dev, POLLIN); + poll_notify(dev->fds, CONFIG_SERIAL_NPOLLWAITERS, POLLIN); /* Is there a thread waiting for read data? */ @@ -1795,7 +1757,7 @@ void uart_datasent(FAR uart_dev_t *dev) { /* Notify all poll/select waiters that they can write to xmit buffer */ - uart_pollnotify(dev, POLLOUT); + poll_notify(dev->fds, CONFIG_SERIAL_NPOLLWAITERS, POLLOUT); /* Is there a thread waiting for space in xmit.buffer? */ @@ -1845,7 +1807,7 @@ void uart_connected(FAR uart_dev_t *dev, bool connected) { /* Notify all poll/select waiters that a hangup occurred */ - uart_pollnotify(dev, (POLLERR | POLLHUP)); + poll_notify(dev->fds, CONFIG_SERIAL_NPOLLWAITERS, POLLERR | POLLHUP); /* Yes.. wake up all waiting threads. Each thread should detect the * disconnection and return the ENOTCONN error. diff --git a/drivers/serial/uart_bth4.c b/drivers/serial/uart_bth4.c index eb204d00f0b..017a2949083 100644 --- a/drivers/serial/uart_bth4.c +++ b/drivers/serial/uart_bth4.c @@ -113,22 +113,7 @@ static inline void uart_bth4_post(FAR sem_t *sem) static void uart_bth4_pollnotify(FAR struct uart_bth4_s *dev, pollevent_t eventset) { - int i; - - for (i = 0; i < CONFIG_UART_BTH4_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = dev->fds[i]; - - if (fds) - { - fds->revents |= (fds->events & eventset); - - if (fds->revents != 0) - { - uart_bth4_post(fds->sem); - } - } - } + poll_notify(dev->fds, CONFIG_UART_BTH4_NPOLLWAITERS, eventset); if ((eventset & POLLIN) != 0) { @@ -398,15 +383,12 @@ static int uart_bth4_poll(FAR struct file *filep, FAR struct pollfd *fds, if (!circbuf_is_empty(&dev->circbuf)) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; - if (eventset) - { - uart_bth4_pollnotify(dev, eventset); - } + uart_bth4_pollnotify(dev, eventset); } else if (fds->priv != NULL) { diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c index 8146f986f23..e1efd427701 100644 --- a/drivers/syslog/ramlog.c +++ b/drivers/syslog/ramlog.c @@ -199,7 +199,6 @@ static int ramlog_readnotify(FAR struct ramlog_dev_s *priv) static void ramlog_pollnotify(FAR struct ramlog_dev_s *priv, pollevent_t eventset) { - FAR struct pollfd *fds; irqstate_t flags; int i; @@ -208,16 +207,7 @@ static void ramlog_pollnotify(FAR struct ramlog_dev_s *priv, for (i = 0; i < CONFIG_RAMLOG_NPOLLWAITERS; i++) { flags = enter_critical_section(); - fds = priv->rl_fds[i]; - if (fds) - { - fds->revents |= (fds->events & eventset); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } - } - + poll_notify(&priv->rl_fds[i], 1, eventset); leave_critical_section(flags); } } @@ -741,10 +731,7 @@ static int ramlog_file_poll(FAR struct file *filep, FAR struct pollfd *fds, leave_critical_section(flags); - if (eventset) - { - ramlog_pollnotify(priv, eventset); - } + ramlog_pollnotify(priv, eventset); } else if (fds->priv) { diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c index c18b427284f..f6259746e46 100644 --- a/drivers/usbdev/adb.c +++ b/drivers/usbdev/adb.c @@ -225,8 +225,6 @@ static int adb_char_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); static void adb_char_notify_readers(FAR struct usbdev_adb_s *priv); -static void adb_char_pollnotify(FAR struct usbdev_adb_s *dev, - pollevent_t eventset); static void adb_char_on_connect(FAR struct usbdev_adb_s *priv, int connect); @@ -545,7 +543,7 @@ static void usb_adb_wrcomplete(FAR struct usbdev_ep_s *ep, /* Notify all poll/select waiters */ - adb_char_pollnotify(priv, POLLOUT); + poll_notify(priv->fds, CONFIG_USBADB_NPOLLWAITERS, POLLOUT); } break; @@ -1538,37 +1536,7 @@ static void adb_char_notify_readers(FAR struct usbdev_adb_s *priv) /* Notify all poll/select waiters */ - adb_char_pollnotify(priv, POLLIN); -} - -/**************************************************************************** - * Name: adb_char_pollnotify - * - * Description: - * Notify threads waiting for device event. This function must be called - * with interrupt disabled. - * - ****************************************************************************/ - -static void adb_char_pollnotify(FAR struct usbdev_adb_s *dev, - pollevent_t eventset) -{ - FAR struct pollfd *fds; - int i; - - for (i = 0; i < CONFIG_USBADB_NPOLLWAITERS; i++) - { - fds = dev->fds[i]; - if (fds) - { - fds->revents |= eventset & (fds->events | POLLERR | POLLHUP); - - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } - } - } + poll_notify(priv->fds, CONFIG_USBADB_NPOLLWAITERS, POLLIN); } /**************************************************************************** @@ -2038,10 +2006,7 @@ static int adb_char_poll(FAR struct file *filep, FAR struct pollfd *fds, eventset |= POLLIN; } - if (eventset) - { - adb_char_pollnotify(priv, eventset); - } + poll_notify(priv->fds, CONFIG_USBADB_NPOLLWAITERS, eventset); exit_leave_critical: leave_critical_section(flags); @@ -2061,7 +2026,7 @@ static void adb_char_on_connect(FAR struct usbdev_adb_s *priv, int connect) { /* Notify poll/select with POLLIN */ - adb_char_pollnotify(priv, POLLIN); + poll_notify(priv->fds, CONFIG_USBADB_NPOLLWAITERS, POLLIN); } else { @@ -2089,7 +2054,7 @@ static void adb_char_on_connect(FAR struct usbdev_adb_s *priv, int connect) /* Notify all poll/select waiters that a hangup occurred */ - adb_char_pollnotify(priv, (POLLERR | POLLHUP)); + poll_notify(priv->fds, CONFIG_USBADB_NPOLLWAITERS, POLLERR | POLLHUP); } leave_critical_section(flags); diff --git a/drivers/usbhost/usbhost_cdcmbim.c b/drivers/usbhost/usbhost_cdcmbim.c index c7e1c7c5284..7d257186f35 100644 --- a/drivers/usbhost/usbhost_cdcmbim.c +++ b/drivers/usbhost/usbhost_cdcmbim.c @@ -241,10 +241,6 @@ struct usbhost_cdcmbim_s static void usbhost_takesem(sem_t *sem); #define usbhost_givesem(s) nxsem_post(s); -/* Polling support */ - -static void usbhost_pollnotify(FAR struct usbhost_cdcmbim_s *priv); - /* Memory allocation services */ static inline FAR struct usbhost_cdcmbim_s *usbhost_allocclass(void); @@ -399,29 +395,6 @@ static int usbhost_ctrl_cmd(FAR struct usbhost_cdcmbim_s *priv, return ret; } -/**************************************************************************** - * Name: usbhost_pollnotify - ****************************************************************************/ - -static void usbhost_pollnotify(FAR struct usbhost_cdcmbim_s *priv) -{ - int i; - - for (i = 0; i < CONFIG_USBHOST_CDCMBIM_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - uinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - static ssize_t usbhost_readmessage(FAR struct usbhost_cdcmbim_s *priv, FAR char *buffer, size_t buflen) { @@ -614,7 +587,8 @@ static int cdcwdm_poll(FAR struct file *filep, FAR struct pollfd *fds, if (priv->comm_rxlen > 0) { - usbhost_pollnotify(priv); + poll_notify(priv->fds, CONFIG_USBHOST_CDCMBIM_NPOLLWAITERS, + POLLIN); } } else @@ -956,7 +930,7 @@ static void usbhost_rxdata_work(FAR void *arg) /* Notify any poll waiters we have data */ - usbhost_pollnotify(priv); + poll_notify(priv->fds, CONFIG_USBHOST_CDCMBIM_NPOLLWAITERS, POLLIN); errout: usbhost_givesem(&priv->exclsem); diff --git a/drivers/usbhost/usbhost_hidkbd.c b/drivers/usbhost/usbhost_hidkbd.c index 008547d7711..091d1e9968d 100644 --- a/drivers/usbhost/usbhost_hidkbd.c +++ b/drivers/usbhost/usbhost_hidkbd.c @@ -243,10 +243,6 @@ static int usbhost_takesem(FAR sem_t *sem); static void usbhost_forcetake(FAR sem_t *sem); #define usbhost_givesem(s) nxsem_post(s); -/* Polling support */ - -static void usbhost_pollnotify(FAR struct usbhost_state_s *dev); - /* Memory allocation services */ static inline FAR struct usbhost_state_s *usbhost_allocclass(void); @@ -680,29 +676,6 @@ static void usbhost_forcetake(FAR sem_t *sem) while (ret < 0); } -/**************************************************************************** - * Name: usbhost_pollnotify - ****************************************************************************/ - -static void usbhost_pollnotify(FAR struct usbhost_state_s *priv) -{ - int i; - - for (i = 0; i < CONFIG_HIDKBD_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - uinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: usbhost_allocclass * @@ -1294,7 +1267,7 @@ static int usbhost_kbdpoll(int argc, char *argv[]) if (empty) { - usbhost_pollnotify(priv); + poll_notify(priv->fds, CONFIG_HIDKBD_NPOLLWAITERS, POLLIN); } /* Yes.. Is there a thread waiting for keyboard data now? */ @@ -2532,7 +2505,7 @@ static int usbhost_poll(FAR struct file *filep, FAR struct pollfd *fds, if (priv->headndx != priv->tailndx) { - usbhost_pollnotify(priv); + poll_notify(priv->fds, CONFIG_HIDKBD_NPOLLWAITERS, POLLIN); } } else diff --git a/drivers/usbhost/usbhost_hidmouse.c b/drivers/usbhost/usbhost_hidmouse.c index 0292197122c..e3017d424f6 100644 --- a/drivers/usbhost/usbhost_hidmouse.c +++ b/drivers/usbhost/usbhost_hidmouse.c @@ -292,10 +292,6 @@ static int usbhost_takesem(FAR sem_t *sem); static void usbhost_forcetake(FAR sem_t *sem); #define usbhost_givesem(s) nxsem_post(s); -/* Polling support */ - -static void usbhost_pollnotify(FAR struct usbhost_state_s *dev); - /* Memory allocation services */ static inline FAR struct usbhost_state_s *usbhost_allocclass(void); @@ -467,29 +463,6 @@ static void usbhost_forcetake(FAR sem_t *sem) while (ret < 0); } -/**************************************************************************** - * Name: usbhost_pollnotify - ****************************************************************************/ - -static void usbhost_pollnotify(FAR struct usbhost_state_s *priv) -{ - int i; - - for (i = 0; i < CONFIG_HIDMOUSE_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= (fds->events & POLLIN); - if (fds->revents != 0) - { - uinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: usbhost_allocclass * @@ -677,8 +650,6 @@ static void usbhost_destroy(FAR void *arg) static void usbhost_notify(FAR struct usbhost_state_s *priv) { - int i; - /* If there are threads waiting for read data, then signal one of them * that the read data is available. */ @@ -694,16 +665,7 @@ static void usbhost_notify(FAR struct usbhost_state_s *priv) * all try to read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_HIDMOUSE_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_HIDMOUSE_NPOLLWAITERS, POLLIN); } /**************************************************************************** @@ -2558,7 +2520,7 @@ static int usbhost_poll(FAR struct file *filep, FAR struct pollfd *fds, if (priv->valid) { - usbhost_pollnotify(priv); + poll_notify(priv->fds, CONFIG_HIDMOUSE_NPOLLWAITERS, POLLIN); } } else diff --git a/drivers/usbhost/usbhost_xboxcontroller.c b/drivers/usbhost/usbhost_xboxcontroller.c index 3f15e8f896f..ccc04561963 100644 --- a/drivers/usbhost/usbhost_xboxcontroller.c +++ b/drivers/usbhost/usbhost_xboxcontroller.c @@ -561,8 +561,6 @@ static void usbhost_destroy(FAR void *arg) static void usbhost_pollnotify(FAR struct usbhost_state_s *priv) { - int i; - /* If there are threads waiting for read data, then signal one of them * that the read data is available. */ @@ -578,16 +576,7 @@ static void usbhost_pollnotify(FAR struct usbhost_state_s *priv) * read the data, then some make end up blocking after all. */ - for (i = 0; i < CONFIG_XBOXCONTROLLER_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - iinfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } + poll_notify(priv->fds, CONFIG_XBOXCONTROLLER_NPOLLWAITERS, POLLIN); } /**************************************************************************** diff --git a/drivers/usbmisc/fusb301.c b/drivers/usbmisc/fusb301.c index 57ecc85ff42..d0654d805d4 100644 --- a/drivers/usbmisc/fusb301.c +++ b/drivers/usbmisc/fusb301.c @@ -80,7 +80,6 @@ static ssize_t fusb301_write(FAR struct file *filep, FAR const char *buffer, static int fusb301_ioctl(FAR struct file *filep, int cmd, unsigned long arg); static int fusb301_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); -static void fusb301_notify(FAR struct fusb301_dev_s *priv); /**************************************************************************** * Private Data @@ -706,7 +705,7 @@ static int fusb301_poll(FAR struct file *filep, flags = enter_critical_section(); if (priv->int_pending) { - fusb301_notify(priv); + poll_notify(priv->fds, CONFIG_FUSB301_NPOLLWAITERS, POLLIN); } leave_critical_section(flags); @@ -729,38 +728,6 @@ out: return ret; } -/**************************************************************************** - * Name: fusb301_notify - * - * Description: - * Notify thread about data to be available - * - ****************************************************************************/ - -static void fusb301_notify(FAR struct fusb301_dev_s *priv) -{ - DEBUGASSERT(priv != NULL); - - int i; - - /* If there are threads waiting on poll() for FUSB301 data to become - * available, then wake them up now. NOTE: we wake up all waiting threads - * because we do not know that they are going to do. If they all try to - * read the data, then some make end up blocking after all. - */ - - for (i = 0; i < CONFIG_FUSB301_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - fusb301_info("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } -} - /**************************************************************************** * Name: fusb301_callback * @@ -779,7 +746,7 @@ static int fusb301_int_handler(int irq, FAR void *context, FAR void *arg) flags = enter_critical_section(); priv->int_pending = true; - fusb301_notify(priv); + poll_notify(priv->fds, CONFIG_FUSB301_NPOLLWAITERS, POLLIN); leave_critical_section(flags); return OK; diff --git a/drivers/usbmisc/fusb303.c b/drivers/usbmisc/fusb303.c index a61028a1a7c..cc52ae9d741 100644 --- a/drivers/usbmisc/fusb303.c +++ b/drivers/usbmisc/fusb303.c @@ -114,7 +114,6 @@ static ssize_t fusb303_write(FAR struct file *filep, FAR const char *buffer, static int fusb303_ioctl(FAR struct file *filep, int cmd, unsigned long arg); static int fusb303_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); -static void fusb303_notify(FAR struct fusb303_dev_s *priv); /**************************************************************************** * Private Data @@ -894,7 +893,7 @@ static int fusb303_poll(FAR struct file *filep, FAR struct pollfd *fds, flags = enter_critical_section(); if (priv->int_pending) { - fusb303_notify(priv); + poll_notify(priv->fds, CONFIG_FUSB303_NPOLLWAITERS, POLLIN); } leave_critical_section(flags); @@ -917,38 +916,6 @@ out: return ret; } -/**************************************************************************** - * Name: fusb303_notify - * - * Description: - * Notify thread about data to be available - * - ****************************************************************************/ - -static void fusb303_notify(FAR struct fusb303_dev_s *priv) -{ - int i; - - DEBUGASSERT(priv != NULL); - - /* If there are threads waiting on poll() for FUSB303 data to become - * available, then wake them up now. NOTE: we wake up all waiting threads - * because we do not know that they are going to do. If they all try to - * read the data, then some make end up blocking after all. - */ - - for (i = 0; i < CONFIG_FUSB303_NPOLLWAITERS; i++) - { - struct pollfd *fds = priv->fds[i]; - if (fds) - { - fds->revents |= POLLIN; - fusb303_info("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } -} - /**************************************************************************** * Name: fusb303_callback * @@ -967,7 +934,7 @@ static int fusb303_int_handler(int irq, FAR void *context, FAR void *arg) flags = enter_critical_section(); priv->int_pending = true; - fusb303_notify(priv); + poll_notify(priv->fds, CONFIG_FUSB303_NPOLLWAITERS, POLLIN); leave_critical_section(flags); return OK; diff --git a/drivers/usrsock/usrsock_dev.c b/drivers/usrsock/usrsock_dev.c index b93d02df0d3..f9c3fa3e770 100644 --- a/drivers/usrsock/usrsock_dev.c +++ b/drivers/usrsock/usrsock_dev.c @@ -152,29 +152,6 @@ static bool usrsockdev_is_opened(FAR struct usrsockdev_s *dev) return ret; } -/**************************************************************************** - * Name: usrsockdev_pollnotify - ****************************************************************************/ - -static void usrsockdev_pollnotify(FAR struct usrsockdev_s *dev, - pollevent_t eventset) -{ - int i; - for (i = 0; i < ARRAY_SIZE(dev->pollfds); i++) - { - struct pollfd *fds = dev->pollfds[i]; - if (fds) - { - fds->revents |= (fds->events & eventset); - if (fds->revents != 0) - { - ninfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } -} - /**************************************************************************** * Name: usrsockdev_read ****************************************************************************/ @@ -512,10 +489,7 @@ static int usrsockdev_poll(FAR struct file *filep, FAR struct pollfd *fds, eventset |= POLLIN; } - if (eventset) - { - usrsockdev_pollnotify(dev, eventset); - } + poll_notify(dev->pollfds, ARRAY_SIZE(dev->pollfds), eventset); } else { @@ -566,7 +540,7 @@ int usrsock_request(FAR struct iovec *iov, unsigned int iovcnt) /* Notify daemon of new request. */ - usrsockdev_pollnotify(dev, POLLIN); + poll_notify(dev->pollfds, ARRAY_SIZE(dev->pollfds), POLLIN); } else { diff --git a/drivers/wireless/cc1101.c b/drivers/wireless/cc1101.c index d511b390ff9..6b876f69d38 100644 --- a/drivers/wireless/cc1101.c +++ b/drivers/wireless/cc1101.c @@ -92,6 +92,7 @@ #include #include #include +#include #include #include #include @@ -638,8 +639,7 @@ static int cc1101_file_poll(FAR struct file *filep, FAR struct pollfd *fds, cc1101_takesem(&dev->sem_rx_buffer); if (dev->fifo_len > 0) { - dev->pfd->revents |= POLLIN; /* Data available for input */ - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } nxsem_post(&dev->sem_rx_buffer); @@ -1540,9 +1540,7 @@ void cc1101_isr_process(FAR void *arg) if (dev->pfd) { - dev->pfd->revents |= POLLIN; /* Data available for input */ - wlinfo("Wake up polled fd\n"); - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } } break; diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c index 9e650a86f4b..a529689f878 100644 --- a/drivers/wireless/gs2200m.c +++ b/drivers/wireless/gs2200m.c @@ -423,8 +423,7 @@ static void _notif_q_push(FAR struct gs2200m_dev_s *dev, char cid) { /* If poll() waits and cid has been pushed to the queue, notify */ - dev->pfd->revents |= POLLIN; - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } wlinfo("+++ pushed %c count=%d\n", cid, dev->notif_q.count); @@ -3187,9 +3186,7 @@ static int gs2200m_poll(FAR struct file *filep, FAR struct pollfd *fds, if (0 < n) { - dev->pfd->revents |= POLLIN; - nxsem_post(dev->pfd->sem); - wlinfo("==== _notif_q_count=%d\n", n); + poll_notify(&dev->pfd, 1, POLLIN); } } else diff --git a/drivers/wireless/lpwan/sx127x/sx127x.c b/drivers/wireless/lpwan/sx127x/sx127x.c index 7841cc710e9..d04653d1162 100644 --- a/drivers/wireless/lpwan/sx127x/sx127x.c +++ b/drivers/wireless/lpwan/sx127x/sx127x.c @@ -1229,8 +1229,7 @@ static int sx127x_poll(FAR struct file *filep, FAR struct pollfd *fds, { /* Data available for input */ - dev->pfd->revents |= POLLIN; - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } nxsem_post(&dev->rx_buffer_sem); @@ -1313,10 +1312,7 @@ static int sx127x_lora_isr0_process(FAR struct sx127x_dev_s *dev) { /* Data available for input */ - dev->pfd->revents |= POLLIN; - - wlinfo("Wake up polled fd\n"); - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } /* Wake-up any thread waiting in recv */ @@ -1448,10 +1444,7 @@ static int sx127x_fskook_isr0_process(FAR struct sx127x_dev_s *dev) { /* Data available for input */ - dev->pfd->revents |= POLLIN; - - wlinfo("Wake up polled fd\n"); - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } /* Wake-up any thread waiting in recv */ diff --git a/drivers/wireless/nrf24l01.c b/drivers/wireless/nrf24l01.c index 824b5a49c16..9920686a4c0 100644 --- a/drivers/wireless/nrf24l01.c +++ b/drivers/wireless/nrf24l01.c @@ -714,10 +714,7 @@ static void nrf24l01_worker(FAR void *arg) if (dev->pfd && has_data) { - dev->pfd->revents |= POLLIN; /* Data available for input */ - - wlinfo("Wake up polled fd\n"); - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } /* Clear interrupt sources */ @@ -1410,8 +1407,7 @@ static int nrf24l01_poll(FAR struct file *filep, FAR struct pollfd *fds, nxsem_wait(&dev->sem_fifo); if (dev->fifo_len > 0) { - dev->pfd->revents |= POLLIN; /* Data available for input */ - nxsem_post(dev->pfd->sem); + poll_notify(&dev->pfd, 1, POLLIN); } nxsem_post(&dev->sem_fifo); diff --git a/fs/mqueue/mq_open.c b/fs/mqueue/mq_open.c index 6f421a3166e..47e853c51a6 100644 --- a/fs/mqueue/mq_open.c +++ b/fs/mqueue/mq_open.c @@ -127,18 +127,15 @@ static int nxmq_file_poll(FAR struct file *filep, if (msgq->nmsgs < msgq->maxmsgs) { - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; } if (msgq->nmsgs) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } - if (eventset) - { - nxmq_pollnotify(msgq, eventset); - } + nxmq_pollnotify(msgq, eventset); } else if (fds->priv != NULL) { @@ -370,34 +367,6 @@ static mqd_t nxmq_vopen(FAR const char *mq_name, int oflags, va_list ap) * Public Functions ****************************************************************************/ -#if CONFIG_FS_MQUEUE_NPOLLWAITERS > 0 -void nxmq_pollnotify(FAR struct mqueue_inode_s *msgq, pollevent_t eventset) -{ - int i; - - for (i = 0; i < CONFIG_FS_MQUEUE_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = msgq->fds[i]; - - if (fds) - { - fds->revents |= (fds->events & eventset); - - if (fds->revents != 0) - { - int semcount; - - nxsem_get_value(fds->sem, &semcount); - if (semcount < 1) - { - nxsem_post(fds->sem); - } - } - } - } -} -#endif - /**************************************************************************** * Name: file_mq_open * diff --git a/fs/vfs/fs_epoll.c b/fs/vfs/fs_epoll.c index 5eceb21fbd4..f835acde0e3 100644 --- a/fs/vfs/fs_epoll.c +++ b/fs/vfs/fs_epoll.c @@ -367,8 +367,7 @@ int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev) if (eph->poll[0].sem) { - eph->poll[0].revents |= eph->poll[0].events; - nxsem_post(eph->poll[0].sem); + poll_notify(&eph->poll, 1, eph->poll[0].events); } return 0; diff --git a/fs/vfs/fs_eventfd.c b/fs/vfs/fs_eventfd.c index a34e55a6484..ef56686bde6 100644 --- a/fs/vfs/fs_eventfd.c +++ b/fs/vfs/fs_eventfd.c @@ -81,9 +81,6 @@ static ssize_t eventfd_do_write(FAR struct file *filep, #ifdef CONFIG_EVENT_FD_POLL static int eventfd_do_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); - -static void eventfd_pollnotify(FAR struct eventfd_priv_s *dev, - pollevent_t eventset); #endif static int eventfd_blocking_io(FAR struct eventfd_priv_s *dev, @@ -144,29 +141,6 @@ static void eventfd_destroy(FAR struct eventfd_priv_s *dev) kmm_free(dev); } -#ifdef CONFIG_EVENT_FD_POLL -static void eventfd_pollnotify(FAR struct eventfd_priv_s *dev, - pollevent_t eventset) -{ - FAR struct pollfd *fds; - int i; - - for (i = 0; i < CONFIG_EVENT_FD_NPOLLWAITERS; i++) - { - fds = dev->fds[i]; - if (fds) - { - fds->revents |= eventset & fds->events; - - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } - } - } -} -#endif - static unsigned int eventfd_get_unique_minor(void) { static unsigned int minor; @@ -370,7 +344,7 @@ static ssize_t eventfd_do_read(FAR struct file *filep, FAR char *buffer, #ifdef CONFIG_EVENT_FD_POLL /* Notify all poll/select waiters */ - eventfd_pollnotify(dev, POLLOUT); + poll_notify(dev->fds, CONFIG_EVENT_FD_NPOLLWAITERS, POLLOUT); #endif /* Notify all waiting writers that counter have been decremented */ @@ -447,7 +421,7 @@ static ssize_t eventfd_do_write(FAR struct file *filep, #ifdef CONFIG_EVENT_FD_POLL /* Notify all poll/select waiters */ - eventfd_pollnotify(dev, POLLIN); + poll_notify(dev->fds, CONFIG_EVENT_FD_NPOLLWAITERS, POLLIN); #endif /* Notify all of the waiting readers */ @@ -538,10 +512,7 @@ static int eventfd_do_poll(FAR struct file *filep, FAR struct pollfd *fds, eventset |= POLLIN; } - if (eventset) - { - eventfd_pollnotify(dev, eventset); - } + poll_notify(dev->fds, CONFIG_EVENT_FD_NPOLLWAITERS, eventset); out: nxsem_post(&dev->exclsem); diff --git a/fs/vfs/fs_poll.c b/fs/vfs/fs_poll.c index 9c784baf81f..233ee570ee1 100644 --- a/fs/vfs/fs_poll.c +++ b/fs/vfs/fs_poll.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -276,6 +277,60 @@ static inline int poll_teardown(FAR struct pollfd *fds, nfds_t nfds, * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: poll_notify + * + * Description: + * Notify the poll, this function should be called by drivers to notify + * the caller the poll is ready. + * + * Input Parameters: + * afds - The fds array + * nfds - Number of fds array + * eventset - List of events to check for activity + * + * Returned Value: + * None + * + ****************************************************************************/ + +void poll_notify(FAR struct pollfd **afds, int nfds, pollevent_t eventset) +{ + int i; + int semcount; + FAR struct pollfd *fds; + + DEBUGASSERT(afds != NULL && nfds >= 1); + + for (i = 0; i < nfds && eventset; i++) + { + fds = afds[i]; + if (fds != NULL) + { + /* The error event must be set in fds->revents */ + + fds->revents |= eventset & (fds->events | POLLERR | POLLHUP); + if ((fds->revents & (POLLERR | POLLHUP)) != 0) + { + /* Error, clear POLLIN and POLLOUT event */ + + fds->revents &= ~(POLLIN | POLLOUT); + } + + if (fds->revents != 0) + { + finfo("Report events: %08" PRIx32 "\n", fds->revents); + + nxsem_get_value(fds->sem, &semcount); + if (semcount < 1) + { + nxsem_post(fds->sem); + } + } + } + } +} + /**************************************************************************** * Name: file_poll * @@ -328,11 +383,7 @@ int file_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) { if (setup) { - fds->revents |= (fds->events & (POLLIN | POLLOUT)); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, POLLIN | POLLOUT); } ret = OK; @@ -340,8 +391,7 @@ int file_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) } else { - fds->revents |= (POLLERR | POLLHUP); - nxsem_post(fds->sem); + poll_notify(&fds, 1, POLLERR | POLLHUP); ret = OK; } diff --git a/fs/vfs/fs_timerfd.c b/fs/vfs/fs_timerfd.c index ef1b50d4edd..2cc37160b02 100644 --- a/fs/vfs/fs_timerfd.c +++ b/fs/vfs/fs_timerfd.c @@ -94,9 +94,6 @@ static ssize_t timerfd_read(FAR struct file *filep, FAR char *buffer, #ifdef CONFIG_TIMER_FD_POLL static int timerfd_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup); - -static void timerfd_pollnotify(FAR struct timerfd_priv_s *dev, - pollevent_t eventset); #endif static int timerfd_blocking_io(FAR struct timerfd_priv_s *dev, @@ -174,29 +171,6 @@ static timerfd_t timerfd_get_counter(FAR struct timerfd_priv_s *dev) return counter; } -#ifdef CONFIG_TIMER_FD_POLL -static void timerfd_pollnotify(FAR struct timerfd_priv_s *dev, - pollevent_t eventset) -{ - FAR struct pollfd *fds; - int i; - - for (i = 0; i < CONFIG_TIMER_FD_NPOLLWAITERS; i++) - { - fds = dev->fds[i]; - if (fds) - { - fds->revents |= eventset & fds->events; - - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } - } - } -} -#endif - static unsigned int timerfd_get_unique_minor(void) { static unsigned int minor; @@ -460,7 +434,9 @@ static int timerfd_poll(FAR struct file *filep, FAR struct pollfd *fds, if (timerfd_get_counter(dev) > 0) { - timerfd_pollnotify(dev, POLLIN); +#ifdef CONFIG_TIMER_FD_POLL + poll_notify(dev->fds, CONFIG_TIMER_FD_NPOLLWAITERS, POLLIN); +#endif } out: @@ -484,7 +460,7 @@ static void timerfd_timeout_work(FAR void *arg) #ifdef CONFIG_TIMER_FD_POLL /* Notify all poll/select waiters */ - timerfd_pollnotify(dev, POLLIN); + poll_notify(dev->fds, CONFIG_TIMER_FD_NPOLLWAITERS, POLLIN); #endif /* Notify all of the waiting readers */ diff --git a/graphics/nxterm/nxterm_kbdin.c b/graphics/nxterm/nxterm_kbdin.c index c15f8fde327..3fa3730b777 100644 --- a/graphics/nxterm/nxterm_kbdin.c +++ b/graphics/nxterm/nxterm_kbdin.c @@ -49,7 +49,6 @@ static void nxterm_pollnotify(FAR struct nxterm_state_s *priv, pollevent_t eventset) { - FAR struct pollfd *fds; irqstate_t flags; int i; @@ -58,16 +57,7 @@ static void nxterm_pollnotify(FAR struct nxterm_state_s *priv, for (i = 0; i < CONFIG_NXTERM_NPOLLWAITERS; i++) { flags = enter_critical_section(); - fds = priv->fds[i]; - if (fds) - { - fds->revents |= (fds->events & eventset); - if (fds->revents != 0) - { - nxsem_post(fds->sem); - } - } - + poll_notify(&priv->fds[i], 1, eventset); leave_critical_section(flags); } } @@ -304,10 +294,7 @@ int nxterm_poll(FAR struct file *filep, FAR struct pollfd *fds, bool setup) eventset |= POLLIN; } - if (eventset) - { - nxterm_pollnotify(priv, eventset); - } + nxterm_pollnotify(priv, eventset); } else if (fds->priv) { diff --git a/include/nuttx/mqueue.h b/include/nuttx/mqueue.h index a25ff84b03d..094a7db1b20 100644 --- a/include/nuttx/mqueue.h +++ b/include/nuttx/mqueue.h @@ -79,6 +79,13 @@ # define _MQ_TIMEDRECEIVE(d,m,l,p,t) mq_timedreceive(d,m,l,p,t) #endif +#if CONFIG_FS_MQUEUE_NPOLLWAITERS > 0 +# define nxmq_pollnotify(msgq, eventset) \ + poll_notify(msgq->fds, CONFIG_FS_MQUEUE_NPOLLWAITERS, eventset) +#else +# define nxmq_pollnotify(msgq, eventset) +#endif + /**************************************************************************** * Public Type Declarations ****************************************************************************/ @@ -404,28 +411,6 @@ void nxmq_free_msgq(FAR struct mqueue_inode_s *msgq); int nxmq_alloc_msgq(FAR struct mq_attr *attr, FAR struct mqueue_inode_s **pmsgq); -/**************************************************************************** - * Name: nxmq_pollnotify - * - * Description: - * pollnotify, used for notifying the poll - * - * Input Parameters: - * msgq - Named message queue - * eventset - evnet - * - * Returned Value: - * The allocated and initialized message queue structure or NULL in the - * event of a failure. - * - ****************************************************************************/ - -#if CONFIG_FS_MQUEUE_NPOLLWAITERS > 0 -void nxmq_pollnotify(FAR struct mqueue_inode_s *msgq, pollevent_t eventset); -#else -# define nxmq_pollnotify(msgq, eventset) -#endif - /**************************************************************************** * Name: file_mq_open * diff --git a/include/sys/poll.h b/include/sys/poll.h index 4562ac89b52..d7888c1cd45 100644 --- a/include/sys/poll.h +++ b/include/sys/poll.h @@ -144,6 +144,8 @@ int ppoll(FAR struct pollfd *fds, nfds_t nfds, FAR const struct timespec *timeout_ts, FAR const sigset_t *sigmask); +void poll_notify(FAR struct pollfd **afds, int nfds, pollevent_t eventset); + #undef EXTERN #if defined(__cplusplus) } diff --git a/net/can/can_sockif.c b/net/can/can_sockif.c index 01ddf193e96..3e9ccc27b04 100644 --- a/net/can/can_sockif.c +++ b/net/can/can_sockif.c @@ -128,7 +128,7 @@ static uint16_t can_poll_eventhandler(FAR struct net_driver_s *dev, if ((flags & CAN_NEWDATA) != 0) { - eventset |= (POLLIN & info->fds->events); + eventset |= POLLIN; } /* Check for loss of connection events. */ @@ -143,16 +143,12 @@ static uint16_t can_poll_eventhandler(FAR struct net_driver_s *dev, else if ((flags & CAN_POLL) != 0 && psock_can_cansend(info->psock) >= 0) { - eventset |= (POLLOUT & info->fds->events); + eventset |= POLLOUT; } /* Awaken the caller of poll() is requested event occurred. */ - if (eventset) - { - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); - } + poll_notify(&info->fds, 1, eventset); } return flags; @@ -542,6 +538,7 @@ static int can_poll_local(FAR struct socket *psock, FAR struct pollfd *fds, FAR struct can_conn_s *conn; FAR struct can_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; int ret = OK; DEBUGASSERT(psock != NULL && psock->s_conn != NULL); @@ -602,24 +599,19 @@ static int can_poll_local(FAR struct socket *psock, FAR struct pollfd *fds, { /* Normal data may be read without blocking. */ - fds->revents |= (POLLRDNORM & fds->events); + eventset |= POLLRDNORM; } if (psock_can_cansend(psock) >= 0) { /* A CAN frame may be sent without blocking. */ - fds->revents |= (POLLWRNORM & fds->events); + eventset |= POLLWRNORM; } /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_with_lock: net_unlock(); diff --git a/net/icmp/icmp_netpoll.c b/net/icmp/icmp_netpoll.c index a5050e3665a..57b5626e385 100644 --- a/net/icmp/icmp_netpoll.c +++ b/net/icmp/icmp_netpoll.c @@ -97,7 +97,7 @@ static uint16_t icmp_poll_eventhandler(FAR struct net_driver_s *dev, eventset = 0; if ((flags & ICMP_NEWDATA) != 0) { - eventset |= (POLLIN & info->fds->events); + eventset |= POLLIN; } /* Check for loss of connection events. */ @@ -109,11 +109,7 @@ static uint16_t icmp_poll_eventhandler(FAR struct net_driver_s *dev, /* Awaken the caller of poll() is requested event occurred. */ - if (eventset) - { - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); - } + poll_notify(&info->fds, 1, eventset); } return flags; @@ -144,6 +140,7 @@ int icmp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) FAR struct icmp_conn_s *conn; FAR struct icmp_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; int ret = OK; /* Some of the following must be atomic */ @@ -213,23 +210,18 @@ int icmp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) { /* Normal data may be read without blocking. */ - fds->revents |= (POLLRDNORM & fds->events); + eventset |= POLLRDNORM; } /* Always report POLLWRNORM if caller request it because we don't utilize * IOB buffer for sending. */ - fds->revents |= (POLLWRNORM & fds->events); + eventset |= POLLWRNORM; /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_with_lock: net_unlock(); diff --git a/net/icmpv6/icmpv6_netpoll.c b/net/icmpv6/icmpv6_netpoll.c index b4cf027e29f..e46e0ecaa24 100644 --- a/net/icmpv6/icmpv6_netpoll.c +++ b/net/icmpv6/icmpv6_netpoll.c @@ -97,7 +97,7 @@ static uint16_t icmpv6_poll_eventhandler(FAR struct net_driver_s *dev, eventset = 0; if ((flags & ICMPv6_NEWDATA) != 0) { - eventset |= (POLLIN & info->fds->events); + eventset |= POLLIN; } /* Check for loss of connection events. */ @@ -109,11 +109,7 @@ static uint16_t icmpv6_poll_eventhandler(FAR struct net_driver_s *dev, /* Awaken the caller of poll() is requested event occurred. */ - if (eventset) - { - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); - } + poll_notify(&info->fds, 1, eventset); } return flags; @@ -144,6 +140,7 @@ int icmpv6_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) FAR struct icmpv6_conn_s *conn; FAR struct icmpv6_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; int ret = OK; /* Some of the following must be atomic */ @@ -213,23 +210,18 @@ int icmpv6_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) { /* Normal data may be read without blocking. */ - fds->revents |= (POLLRDNORM & fds->events); + eventset |= POLLRDNORM; } /* Always report POLLWRNORM if caller request it because we don't utilize * IOB buffer for sending. */ - fds->revents |= (POLLWRNORM & fds->events); + eventset |= POLLWRNORM; /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_with_lock: net_unlock(); diff --git a/net/local/local_netpoll.c b/net/local/local_netpoll.c index 741ffb2060c..572f9484e5d 100644 --- a/net/local/local_netpoll.c +++ b/net/local/local_netpoll.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -84,10 +85,7 @@ static int local_event_pollsetup(FAR struct local_conn_s *conn, eventset |= POLLIN; } - if (eventset) - { - local_event_pollnotify(conn, eventset); - } + local_event_pollnotify(conn, eventset); } else { @@ -125,21 +123,7 @@ void local_event_pollnotify(FAR struct local_conn_s *conn, pollevent_t eventset) { #ifdef CONFIG_NET_LOCAL_STREAM - int i; - - for (i = 0; i < LOCAL_NPOLLWAITERS; i++) - { - struct pollfd *fds = conn->lc_event_fds[i]; - if (fds) - { - fds->revents |= (fds->events & eventset); - if (fds->revents != 0) - { - ninfo("Report events: %08" PRIx32 "\n", fds->revents); - nxsem_post(fds->sem); - } - } - } + poll_notify(conn->lc_event_fds, LOCAL_NPOLLWAITERS, eventset); #endif } @@ -215,13 +199,13 @@ int local_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) } } - shadowfds[0].fd = 1; /* Does not matter */ - shadowfds[0].sem = fds->sem; - shadowfds[0].events = fds->events & ~POLLOUT; + shadowfds[0] = *fds; + shadowfds[0].fd = 1; /* Does not matter */ + shadowfds[0].events &= ~POLLOUT; - shadowfds[1].fd = 0; /* Does not matter */ - shadowfds[1].sem = fds->sem; - shadowfds[1].events = fds->events & ~POLLIN; + shadowfds[1] = *fds; + shadowfds[1].fd = 0; /* Does not matter */ + shadowfds[1].events &= ~POLLIN; net_unlock(); @@ -288,8 +272,7 @@ int local_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) #ifdef CONFIG_NET_LOCAL_STREAM pollerr: - fds->revents |= POLLERR; - nxsem_post(fds->sem); + poll_notify(&fds, 1, POLLERR); return OK; #endif } diff --git a/net/netlink/netlink.h b/net/netlink/netlink.h index 1d12abf70f9..1b734c770f8 100644 --- a/net/netlink/netlink.h +++ b/net/netlink/netlink.h @@ -73,8 +73,7 @@ struct netlink_conn_s /* poll() support */ int key; /* used to cancel notifications */ - FAR sem_t *pollsem; /* Used to wakeup poll() */ - FAR pollevent_t *pollevent; /* poll() wakeup event */ + FAR struct pollfd *fds; /* Used to wakeup poll() */ /* Queued response data */ diff --git a/net/netlink/netlink_sockif.c b/net/netlink/netlink_sockif.c index d0a6c4f2ebf..e3a77fc8f5b 100644 --- a/net/netlink/netlink_sockif.c +++ b/net/netlink/netlink_sockif.c @@ -516,12 +516,11 @@ static void netlink_response_available(FAR void *arg) sched_lock(); net_lock(); - if (conn->pollsem != NULL && conn->pollevent != NULL) + if (conn->fds != NULL) { /* Wake up the poll() with POLLIN */ - *conn->pollevent |= POLLIN; - nxsem_post(conn->pollsem); + poll_notify(&conn->fds, 1, POLLIN); } else { @@ -530,8 +529,7 @@ static void netlink_response_available(FAR void *arg) /* Allow another poll() */ - conn->pollsem = NULL; - conn->pollevent = NULL; + conn->fds = NULL; net_unlock(); sched_unlock(); @@ -591,11 +589,9 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, * requested event set. */ - revents &= fds->events; - if (revents != 0) + poll_notify(&fds, 1, revents); + if (fds->revents != 0) { - fds->revents = revents; - nxsem_post(fds->sem); net_unlock(); return OK; } @@ -610,7 +606,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, * on the Netlink connection. */ - if (conn->pollsem != NULL || conn->pollevent != NULL) + if (conn->fds != NULL) { nerr("ERROR: Multiple polls() on socket not supported.\n"); net_unlock(); @@ -619,16 +615,14 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, /* Set up the notification */ - conn->pollsem = fds->sem; - conn->pollevent = &fds->revents; + conn->fds = fds; ret = netlink_notifier_setup(netlink_response_available, conn, conn); if (ret < 0) { nerr("ERROR: netlink_notifier_setup() failed: %d\n", ret); - conn->pollsem = NULL; - conn->pollevent = NULL; + conn->fds = NULL; } } @@ -639,8 +633,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, /* Cancel any response notifications */ netlink_notifier_teardown(conn); - conn->pollsem = NULL; - conn->pollevent = NULL; + conn->fds = NULL; } return ret; diff --git a/net/rpmsg/rpmsg_sockif.c b/net/rpmsg/rpmsg_sockif.c index da861f03c04..6d40d90e1ce 100644 --- a/net/rpmsg/rpmsg_sockif.c +++ b/net/rpmsg/rpmsg_sockif.c @@ -205,27 +205,6 @@ static inline void rpmsg_socket_post(FAR sem_t *sem) } } -static void rpmsg_socket_pollnotify(FAR struct rpmsg_socket_conn_s *conn, - pollevent_t eventset) -{ - int i; - - for (i = 0; i < CONFIG_NET_RPMSG_NPOLLWAITERS; i++) - { - FAR struct pollfd *fds = conn->fds[i]; - - if (fds) - { - fds->revents |= ((fds->events | POLLERR | POLLHUP) & eventset); - - if (fds->revents != 0) - { - rpmsg_socket_post(fds->sem); - } - } - } -} - static FAR struct rpmsg_socket_conn_s *rpmsg_socket_alloc(void) { FAR struct rpmsg_socket_conn_s *conn; @@ -314,7 +293,7 @@ static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept, } rpmsg_socket_post(&conn->sendsem); - rpmsg_socket_pollnotify(conn, POLLOUT); + poll_notify(conn->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, POLLOUT); rpmsg_socket_unlock(&conn->recvlock); } else @@ -329,7 +308,7 @@ static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept, if (rpmsg_socket_get_space(conn) > 0) { rpmsg_socket_post(&conn->sendsem); - rpmsg_socket_pollnotify(conn, POLLOUT); + poll_notify(conn->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, POLLOUT); } rpmsg_socket_unlock(&conn->sendlock); @@ -379,7 +358,7 @@ static int rpmsg_socket_ept_cb(FAR struct rpmsg_endpoint *ept, nerr("circbuf_write overflow, %zu, %zu\n", written, len); } - rpmsg_socket_pollnotify(conn, POLLIN); + poll_notify(conn->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, POLLIN); } rpmsg_socket_unlock(&conn->recvlock); @@ -411,7 +390,8 @@ static inline void rpmsg_socket_destroy_ept( rpmsg_destroy_ept(&conn->ept); rpmsg_socket_post(&conn->sendsem); rpmsg_socket_post(&conn->recvsem); - rpmsg_socket_pollnotify(conn, POLLIN | POLLOUT); + poll_notify(conn->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, + POLLIN | POLLOUT); } rpmsg_socket_unlock(&conn->recvlock); @@ -553,7 +533,7 @@ static void rpmsg_socket_ns_bind(FAR struct rpmsg_device *rdev, rpmsg_socket_ns_bound(&new->ept); rpmsg_socket_post(&server->recvsem); - rpmsg_socket_pollnotify(server, POLLIN); + poll_notify(server->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, POLLIN); } static int rpmsg_socket_getaddr(FAR struct rpmsg_socket_conn_s *conn, @@ -868,7 +848,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock, if (conn->next) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } } else if (_SS_ISCONNECTED(conn->sconn.s_flags)) @@ -883,7 +863,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock, if (rpmsg_socket_get_space(conn) > 0) { - eventset |= (fds->events & POLLOUT); + eventset |= POLLOUT; } rpmsg_socket_unlock(&conn->sendlock); @@ -892,7 +872,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock, if (!circbuf_is_empty(&conn->recvbuf)) { - eventset |= (fds->events & POLLIN); + eventset |= POLLIN; } rpmsg_socket_unlock(&conn->recvlock); @@ -908,10 +888,7 @@ static int rpmsg_socket_poll(FAR struct socket *psock, eventset |= POLLERR; } - if (eventset) - { - rpmsg_socket_pollnotify(conn, eventset); - } + poll_notify(conn->fds, CONFIG_NET_RPMSG_NPOLLWAITERS, eventset); } else if (fds->priv != NULL) { diff --git a/net/tcp/tcp_netpoll.c b/net/tcp/tcp_netpoll.c index 6f35b11188f..afd65c229d8 100644 --- a/net/tcp/tcp_netpoll.c +++ b/net/tcp/tcp_netpoll.c @@ -83,14 +83,14 @@ static uint16_t tcp_poll_eventhandler(FAR struct net_driver_s *dev, if ((flags & (TCP_NEWDATA | TCP_BACKLOG)) != 0) { - eventset |= POLLIN & info->fds->events; + eventset |= POLLIN; } /* Non-blocking connection */ if ((flags & TCP_CONNECTED) != 0) { - eventset |= POLLOUT & info->fds->events; + eventset |= POLLOUT; } /* Check for a loss of connection events. */ @@ -154,21 +154,20 @@ static uint16_t tcp_poll_eventhandler(FAR struct net_driver_s *dev, #endif ) { - eventset |= (POLLOUT & info->fds->events); + eventset |= POLLOUT; } /* Awaken the caller of poll() if requested event occurred. */ - if (eventset != 0) + poll_notify(&info->fds, 1, eventset); + + if (info->fds->revents != 0) { /* Stop further callbacks */ info->cb->flags = 0; info->cb->priv = NULL; info->cb->event = NULL; - - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); } } @@ -200,6 +199,7 @@ int tcp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) FAR struct tcp_conn_s *conn; FAR struct tcp_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; bool nonblock_conn; int ret = OK; @@ -291,7 +291,7 @@ int tcp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) { /* Normal data may be read without blocking. */ - fds->revents |= (POLLRDNORM & fds->events); + eventset |= POLLRDNORM; } /* Check for a loss of connection events. We need to be careful here. @@ -342,22 +342,17 @@ int tcp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) * exceptional event. */ - fds->revents |= (POLLERR | POLLHUP); + eventset |= POLLERR | POLLHUP; } else if (_SS_ISCONNECTED(conn->sconn.s_flags) && psock_tcp_cansend(conn) >= 0) { - fds->revents |= (POLLWRNORM & fds->events); + eventset |= POLLWRNORM; } /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_with_lock: net_unlock(); diff --git a/net/udp/udp_netpoll.c b/net/udp/udp_netpoll.c index c907f2dd29e..e3e2c563c3b 100644 --- a/net/udp/udp_netpoll.c +++ b/net/udp/udp_netpoll.c @@ -80,7 +80,7 @@ static uint16_t udp_poll_eventhandler(FAR struct net_driver_s *dev, if ((flags & UDP_NEWDATA) != 0) { - eventset |= (POLLIN & info->fds->events); + eventset |= POLLIN; } /* Check for loss of connection events. */ @@ -94,16 +94,12 @@ static uint16_t udp_poll_eventhandler(FAR struct net_driver_s *dev, else if (psock_udp_cansend(info->conn) >= 0) { - eventset |= (POLLOUT & info->fds->events); + eventset |= POLLOUT; } /* Awaken the caller of poll() is requested event occurred. */ - if (eventset) - { - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); - } + poll_notify(&info->fds, 1, eventset); } return flags; @@ -134,6 +130,7 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) FAR struct udp_conn_s *conn; FAR struct udp_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; int ret = OK; /* Some of the following must be atomic */ @@ -215,24 +212,19 @@ int udp_pollsetup(FAR struct socket *psock, FAR struct pollfd *fds) { /* Normal data may be read without blocking. */ - fds->revents |= (POLLRDNORM & fds->events); + eventset |= POLLRDNORM; } if (psock_udp_cansend(conn) >= 0) { /* Normal data may be sent without blocking (at least one byte). */ - fds->revents |= (POLLWRNORM & fds->events); + eventset |= POLLWRNORM; } /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_with_lock: net_unlock(); diff --git a/net/usrsock/usrsock_poll.c b/net/usrsock/usrsock_poll.c index 9184b27f6aa..8fe11d8b227 100644 --- a/net/usrsock/usrsock_poll.c +++ b/net/usrsock/usrsock_poll.c @@ -102,24 +102,7 @@ static uint16_t poll_event(FAR struct net_driver_s *dev, } } - /* Filter I/O events depending on requested events. */ - - eventset &= (~(POLLOUT | POLLIN) | info->fds->events); - - /* POLLOUT and PULLHUP are mutually exclusive. */ - - if ((eventset & POLLOUT) && (eventset & POLLHUP)) - { - eventset &= ~POLLOUT; - } - - /* Awaken the caller of poll() is requested event occurred. */ - - if (eventset) - { - info->fds->revents |= eventset; - nxsem_post(info->fds->sem); - } + poll_notify(&info->fds, 1, eventset); return flags; } @@ -145,6 +128,7 @@ static int usrsock_pollsetup(FAR struct socket *psock, FAR struct usrsock_conn_s *conn = psock->s_conn; FAR struct usrsock_poll_s *info; FAR struct devif_callback_s *cb; + pollevent_t eventset = 0; int ret = OK; /* Sanity check */ @@ -211,7 +195,7 @@ static int usrsock_pollsetup(FAR struct socket *psock, conn->state == USRSOCK_CONN_STATE_UNINITIALIZED ? "uninitialized" : "aborted"); - fds->revents |= (POLLERR | POLLHUP); + eventset |= (POLLERR | POLLHUP); } /* Stream sockets need to be connected or connecting (or listening). */ @@ -223,7 +207,7 @@ static int usrsock_pollsetup(FAR struct socket *psock, { ninfo("stream socket not connected and not connecting.\n"); - fds->revents |= (POLLOUT | POLLIN | POLLHUP); + eventset |= (POLLOUT | POLLIN | POLLHUP); } else if (conn->flags & USRSOCK_EVENT_REMOTE_CLOSED) { @@ -231,7 +215,7 @@ static int usrsock_pollsetup(FAR struct socket *psock, /* Remote closed. */ - fds->revents |= (POLLHUP | POLLIN); + eventset |= (POLLHUP | POLLIN); } else { @@ -241,36 +225,20 @@ static int usrsock_pollsetup(FAR struct socket *psock, { ninfo("socket send ready.\n"); - fds->revents |= POLLOUT; + eventset |= POLLOUT; } if (conn->flags & USRSOCK_EVENT_RECVFROM_AVAIL) { ninfo("socket recv avail.\n"); - fds->revents |= POLLIN; + eventset |= POLLIN; } } - /* Filter I/O events depending on requested events. */ - - fds->revents &= (~(POLLOUT | POLLIN) | info->fds->events); - - /* POLLOUT and PULLHUP are mutually exclusive. */ - - if ((fds->revents & POLLOUT) && (fds->revents & POLLHUP)) - { - fds->revents &= ~POLLOUT; - } - /* Check if any requested events are already in effect */ - if (fds->revents != 0) - { - /* Yes.. then signal the poll logic */ - - nxsem_post(fds->sem); - } + poll_notify(&fds, 1, eventset); errout_unlock: net_unlock();