Lines Matching full:it

106 static void	realtimer_expire_l(struct itimer *it, bool proc_locked);
111 static void itimer_fire(struct itimer *it);
720 * as a delta, so that it is easy to keep periodic real-time signals from
726 * real time due to interrupt processing in the system, it is possible for
728 * in real time past when it is supposed to occur. It does not suffice,
896 struct itimer *it; in itimer_proc_continue() local
912 it = p->p_itimers->its_timers[id]; in itimer_proc_continue()
913 if (it == NULL) in itimer_proc_continue()
915 if ((it->it_flags & ITF_PSTOPPED) != 0) { in itimer_proc_continue()
916 ITIMER_LOCK(it); in itimer_proc_continue()
917 if ((it->it_flags & ITF_PSTOPPED) != 0) { in itimer_proc_continue()
918 it->it_flags &= ~ITF_PSTOPPED; in itimer_proc_continue()
919 if ((it->it_flags & ITF_DELETING) == 0) in itimer_proc_continue()
920 realtimer_expire_l(it, true); in itimer_proc_continue()
922 ITIMER_UNLOCK(it); in itimer_proc_continue()
976 * fix it to have at least minimal value (i.e. if it is less
977 * than the resolution of the clock, round it up.)
995 * it. In this case, carry over (usec - old value) to
998 * that it is called in a context where the timers
999 * on which it is operating cannot change in value.
1036 * it just gets very confused in this case.
1165 struct itimer *it; in itimer_init() local
1167 it = (struct itimer *)mem; in itimer_init()
1168 mtx_init(&it->it_mtx, "itimer lock", NULL, MTX_DEF); in itimer_init()
1175 struct itimer *it; in itimer_fini() local
1177 it = (struct itimer *)mem; in itimer_fini()
1178 mtx_destroy(&it->it_mtx); in itimer_fini()
1182 itimer_enter(struct itimer *it) in itimer_enter() argument
1185 mtx_assert(&it->it_mtx, MA_OWNED); in itimer_enter()
1186 it->it_usecount++; in itimer_enter()
1190 itimer_leave(struct itimer *it) in itimer_leave() argument
1193 mtx_assert(&it->it_mtx, MA_OWNED); in itimer_leave()
1194 KASSERT(it->it_usecount > 0, ("invalid it_usecount")); in itimer_leave()
1196 if (--it->it_usecount == 0 && (it->it_flags & ITF_WANTED) != 0) in itimer_leave()
1197 wakeup(it); in itimer_leave()
1236 struct itimer *it; in kern_ktimer_create() local
1260 it = uma_zalloc(itimer_zone, M_WAITOK); in kern_ktimer_create()
1261 it->it_flags = 0; in kern_ktimer_create()
1262 it->it_usecount = 0; in kern_ktimer_create()
1263 timespecclear(&it->it_time.it_value); in kern_ktimer_create()
1264 timespecclear(&it->it_time.it_interval); in kern_ktimer_create()
1265 it->it_overrun = 0; in kern_ktimer_create()
1266 it->it_overrun_last = 0; in kern_ktimer_create()
1267 it->it_clockid = clock_id; in kern_ktimer_create()
1268 it->it_proc = p; in kern_ktimer_create()
1269 ksiginfo_init(&it->it_ksi); in kern_ktimer_create()
1270 it->it_ksi.ksi_flags |= KSI_INS | KSI_EXT; in kern_ktimer_create()
1271 error = CLOCK_CALL(clock_id, timer_create, (it)); in kern_ktimer_create()
1298 p->p_itimers->its_timers[id] = it; in kern_ktimer_create()
1300 it->it_sigev = *evp; in kern_ktimer_create()
1302 it->it_sigev.sigev_notify = SIGEV_SIGNAL; in kern_ktimer_create()
1306 it->it_sigev.sigev_signo = SIGALRM; in kern_ktimer_create()
1309 it->it_sigev.sigev_signo = SIGVTALRM; in kern_ktimer_create()
1312 it->it_sigev.sigev_signo = SIGPROF; in kern_ktimer_create()
1315 it->it_sigev.sigev_value.sival_int = id; in kern_ktimer_create()
1318 if (it->it_sigev.sigev_notify == SIGEV_SIGNAL || in kern_ktimer_create()
1319 it->it_sigev.sigev_notify == SIGEV_THREAD_ID) { in kern_ktimer_create()
1320 it->it_ksi.ksi_signo = it->it_sigev.sigev_signo; in kern_ktimer_create()
1321 it->it_ksi.ksi_code = SI_TIMER; in kern_ktimer_create()
1322 it->it_ksi.ksi_value = it->it_sigev.sigev_value; in kern_ktimer_create()
1323 it->it_ksi.ksi_timerid = id; in kern_ktimer_create()
1330 ITIMER_LOCK(it); in kern_ktimer_create()
1331 CLOCK_CALL(it->it_clockid, timer_delete, (it)); in kern_ktimer_create()
1332 ITIMER_UNLOCK(it); in kern_ktimer_create()
1333 uma_zfree(itimer_zone, it); in kern_ktimer_create()
1352 struct itimer *it; in itimer_find() local
1357 (it = p->p_itimers->its_timers[timerid]) == NULL) { in itimer_find()
1360 ITIMER_LOCK(it); in itimer_find()
1361 if ((it->it_flags & ITF_DELETING) != 0) { in itimer_find()
1362 ITIMER_UNLOCK(it); in itimer_find()
1363 it = NULL; in itimer_find()
1365 return (it); in itimer_find()
1372 struct itimer *it; in kern_ktimer_delete() local
1375 it = itimer_find(p, timerid); in kern_ktimer_delete()
1376 if (it == NULL) { in kern_ktimer_delete()
1382 it->it_flags |= ITF_DELETING; in kern_ktimer_delete()
1383 while (it->it_usecount > 0) { in kern_ktimer_delete()
1384 it->it_flags |= ITF_WANTED; in kern_ktimer_delete()
1385 msleep(it, &it->it_mtx, PPAUSE, "itimer", 0); in kern_ktimer_delete()
1387 it->it_flags &= ~ITF_WANTED; in kern_ktimer_delete()
1388 CLOCK_CALL(it->it_clockid, timer_delete, (it)); in kern_ktimer_delete()
1389 ITIMER_UNLOCK(it); in kern_ktimer_delete()
1392 if (KSI_ONQ(&it->it_ksi)) in kern_ktimer_delete()
1393 sigqueue_take(&it->it_ksi); in kern_ktimer_delete()
1396 uma_zfree(itimer_zone, it); in kern_ktimer_delete()
1429 struct itimer *it; in kern_ktimer_settime() local
1434 if (timer_id < 3 || (it = itimer_find(p, timer_id)) == NULL) { in kern_ktimer_settime()
1439 itimer_enter(it); in kern_ktimer_settime()
1440 error = CLOCK_CALL(it->it_clockid, timer_settime, (it, in kern_ktimer_settime()
1442 itimer_leave(it); in kern_ktimer_settime()
1443 ITIMER_UNLOCK(it); in kern_ktimer_settime()
1470 struct itimer *it; in kern_ktimer_gettime() local
1475 if (timer_id < 3 || (it = itimer_find(p, timer_id)) == NULL) { in kern_ktimer_gettime()
1480 itimer_enter(it); in kern_ktimer_gettime()
1481 error = CLOCK_CALL(it->it_clockid, timer_gettime, (it, val)); in kern_ktimer_gettime()
1482 itimer_leave(it); in kern_ktimer_gettime()
1483 ITIMER_UNLOCK(it); in kern_ktimer_gettime()
1504 struct itimer *it; in kern_ktimer_getoverrun() local
1509 (it = itimer_find(p, timer_id)) == NULL) { in kern_ktimer_getoverrun()
1513 td->td_retval[0] = it->it_overrun_last; in kern_ktimer_getoverrun()
1514 ITIMER_UNLOCK(it); in kern_ktimer_getoverrun()
1522 realtimer_create(struct itimer *it) in realtimer_create() argument
1524 callout_init_mtx(&it->it_callout, &it->it_mtx, 0); in realtimer_create()
1529 realtimer_delete(struct itimer *it) in realtimer_delete() argument
1531 mtx_assert(&it->it_mtx, MA_OWNED); in realtimer_delete()
1537 timespecclear(&it->it_time.it_value); in realtimer_delete()
1538 timespecclear(&it->it_time.it_interval); in realtimer_delete()
1539 ITIMER_UNLOCK(it); in realtimer_delete()
1540 callout_drain(&it->it_callout); in realtimer_delete()
1541 ITIMER_LOCK(it); in realtimer_delete()
1546 realtimer_gettime(struct itimer *it, struct itimerspec *ovalue) in realtimer_gettime() argument
1550 mtx_assert(&it->it_mtx, MA_OWNED); in realtimer_gettime()
1552 realtimer_clocktime(it->it_clockid, &cts); in realtimer_gettime()
1553 *ovalue = it->it_time; in realtimer_gettime()
1567 realtimer_settime(struct itimer *it, int flags, struct itimerspec *value, in realtimer_settime() argument
1574 mtx_assert(&it->it_mtx, MA_OWNED); in realtimer_settime()
1588 realtimer_gettime(it, ovalue); in realtimer_settime()
1590 it->it_time = val; in realtimer_settime()
1592 realtimer_clocktime(it->it_clockid, &cts); in realtimer_settime()
1596 timespecadd(&it->it_time.it_value, &cts, in realtimer_settime()
1597 &it->it_time.it_value); in realtimer_settime()
1602 * fix it. in realtimer_settime()
1606 callout_reset(&it->it_callout, tvtohz(&tv), realtimer_expire, in realtimer_settime()
1607 it); in realtimer_settime()
1609 callout_stop(&it->it_callout); in realtimer_settime()
1627 struct itimer *it; in itimer_accept() local
1630 it = itimer_find(p, timerid); in itimer_accept()
1631 if (it != NULL) { in itimer_accept()
1632 ksi->ksi_overrun = it->it_overrun; in itimer_accept()
1633 it->it_overrun_last = it->it_overrun; in itimer_accept()
1634 it->it_overrun = 0; in itimer_accept()
1635 ITIMER_UNLOCK(it); in itimer_accept()
1662 realtimer_expire_l(struct itimer *it, bool proc_locked) in realtimer_expire_l() argument
1669 realtimer_clocktime(it->it_clockid, &cts); in realtimer_expire_l()
1671 if (timespeccmp(&cts, &it->it_time.it_value, >=)) { in realtimer_expire_l()
1672 if (timespecisset(&it->it_time.it_interval)) { in realtimer_expire_l()
1673 timespecadd(&it->it_time.it_value, in realtimer_expire_l()
1674 &it->it_time.it_interval, in realtimer_expire_l()
1675 &it->it_time.it_value); in realtimer_expire_l()
1677 interval = timespectons(&it->it_time.it_interval); in realtimer_expire_l()
1678 value = timespectons(&it->it_time.it_value); in realtimer_expire_l()
1686 if (it->it_overrun + overruns >= in realtimer_expire_l()
1687 it->it_overrun && in realtimer_expire_l()
1688 it->it_overrun + overruns <= INT_MAX) { in realtimer_expire_l()
1689 it->it_overrun += (int)overruns; in realtimer_expire_l()
1691 it->it_overrun = INT_MAX; in realtimer_expire_l()
1692 it->it_ksi.ksi_errno = ERANGE; in realtimer_expire_l()
1696 it->it_time.it_value = timespecfromns(value); in realtimer_expire_l()
1700 timespecclear(&it->it_time.it_value); in realtimer_expire_l()
1703 p = it->it_proc; in realtimer_expire_l()
1704 if (timespecisset(&it->it_time.it_value)) { in realtimer_expire_l()
1706 it->it_flags |= ITF_PSTOPPED; in realtimer_expire_l()
1708 timespecsub(&it->it_time.it_value, &cts, &ts); in realtimer_expire_l()
1710 callout_reset(&it->it_callout, tvtohz(&tv), in realtimer_expire_l()
1711 realtimer_expire, it); in realtimer_expire_l()
1715 itimer_enter(it); in realtimer_expire_l()
1716 ITIMER_UNLOCK(it); in realtimer_expire_l()
1719 itimer_fire(it); in realtimer_expire_l()
1722 ITIMER_LOCK(it); in realtimer_expire_l()
1723 itimer_leave(it); in realtimer_expire_l()
1724 } else if (timespecisset(&it->it_time.it_value)) { in realtimer_expire_l()
1725 p = it->it_proc; in realtimer_expire_l()
1727 it->it_flags |= ITF_PSTOPPED; in realtimer_expire_l()
1729 ts = it->it_time.it_value; in realtimer_expire_l()
1732 callout_reset(&it->it_callout, tvtohz(&tv), in realtimer_expire_l()
1733 realtimer_expire, it); in realtimer_expire_l()
1746 itimer_fire(struct itimer *it) in itimer_fire() argument
1748 struct proc *p = it->it_proc; in itimer_fire()
1751 if (it->it_sigev.sigev_notify == SIGEV_SIGNAL || in itimer_fire()
1752 it->it_sigev.sigev_notify == SIGEV_THREAD_ID) { in itimer_fire()
1753 if (sigev_findtd(p, &it->it_sigev, &td) != 0) { in itimer_fire()
1754 ITIMER_LOCK(it); in itimer_fire()
1755 timespecclear(&it->it_time.it_value); in itimer_fire()
1756 timespecclear(&it->it_time.it_interval); in itimer_fire()
1757 callout_stop(&it->it_callout); in itimer_fire()
1758 ITIMER_UNLOCK(it); in itimer_fire()
1761 if (!KSI_ONQ(&it->it_ksi)) { in itimer_fire()
1762 it->it_ksi.ksi_errno = 0; in itimer_fire()
1763 ksiginfo_set_sigev(&it->it_ksi, &it->it_sigev); in itimer_fire()
1764 tdsendsignal(p, td, it->it_ksi.ksi_signo, &it->it_ksi); in itimer_fire()
1766 if (it->it_overrun < INT_MAX) in itimer_fire()
1767 it->it_overrun++; in itimer_fire()
1769 it->it_ksi.ksi_errno = ERANGE; in itimer_fire()
1797 struct itimer *it; in itimers_event_exit_exec() local
1805 if ((it = its->its_timers[i]) != NULL) in itimers_event_exit_exec()