733 pollstate_t *ps;
734 nfds_t nfds;
735 int fdcnt = 0;
736 hrtime_t deadline = 0;
737
738 STRUCT_INIT(dvpoll, mode);
739 error = copyin((caddr_t)arg, STRUCT_BUF(dvpoll),
740 STRUCT_SIZE(dvpoll));
741 if (error) {
742 DP_REFRELE(dpep);
743 return (EFAULT);
744 }
745
746 deadline = STRUCT_FGET(dvpoll, dp_timeout);
747 if (deadline > 0) {
748 /*
749 * Convert the deadline from relative milliseconds
750 * to absolute nanoseconds. They must wait for at
751 * least a tick.
752 */
753 deadline = deadline * NANOSEC / MILLISEC;
754 deadline = MAX(deadline, nsec_per_tick);
755 deadline += now;
756 }
757
758 if ((nfds = STRUCT_FGET(dvpoll, dp_nfds)) == 0) {
759 /*
760 * We are just using DP_POLL to sleep, so
761 * we don't any of the devpoll apparatus.
762 * Do not check for signals if we have a zero timeout.
763 */
764 DP_REFRELE(dpep);
765 if (deadline == 0)
766 return (0);
767 mutex_enter(&curthread->t_delay_lock);
768 while ((error =
769 cv_timedwait_sig_hrtime(&curthread->t_delay_cv,
770 &curthread->t_delay_lock, deadline)) > 0)
771 continue;
772 mutex_exit(&curthread->t_delay_lock);
773 return (error == 0 ? EINTR : 0);
|
733 pollstate_t *ps;
734 nfds_t nfds;
735 int fdcnt = 0;
736 hrtime_t deadline = 0;
737
738 STRUCT_INIT(dvpoll, mode);
739 error = copyin((caddr_t)arg, STRUCT_BUF(dvpoll),
740 STRUCT_SIZE(dvpoll));
741 if (error) {
742 DP_REFRELE(dpep);
743 return (EFAULT);
744 }
745
746 deadline = STRUCT_FGET(dvpoll, dp_timeout);
747 if (deadline > 0) {
748 /*
749 * Convert the deadline from relative milliseconds
750 * to absolute nanoseconds. They must wait for at
751 * least a tick.
752 */
753 deadline = MSEC2NSEC(deadline);
754 deadline = MAX(deadline, nsec_per_tick);
755 deadline += now;
756 }
757
758 if ((nfds = STRUCT_FGET(dvpoll, dp_nfds)) == 0) {
759 /*
760 * We are just using DP_POLL to sleep, so
761 * we don't any of the devpoll apparatus.
762 * Do not check for signals if we have a zero timeout.
763 */
764 DP_REFRELE(dpep);
765 if (deadline == 0)
766 return (0);
767 mutex_enter(&curthread->t_delay_lock);
768 while ((error =
769 cv_timedwait_sig_hrtime(&curthread->t_delay_cv,
770 &curthread->t_delay_lock, deadline)) > 0)
771 continue;
772 mutex_exit(&curthread->t_delay_lock);
773 return (error == 0 ? EINTR : 0);
|