Lines Matching refs:tfd

67     struct rt_timerfd *tfd;  in timerfd_close()  local
72 tfd = file->vnode->data; in timerfd_close()
74 if (tfd) in timerfd_close()
76 if (tfd->timer != RT_NULL) in timerfd_close()
78 rt_timer_stop(tfd->timer); in timerfd_close()
79 rt_timer_delete(tfd->timer); in timerfd_close()
80 tfd->timer = RT_NULL; in timerfd_close()
83 if (tfd->wqn.wqueue) in timerfd_close()
85 rt_wqueue_remove(&tfd->wqn); in timerfd_close()
88 rt_mutex_detach(&tfd->lock); in timerfd_close()
89 rt_free(tfd); in timerfd_close()
97 struct rt_timerfd *tfd; in timerfd_poll() local
100 tfd = file->vnode->data; in timerfd_poll()
102 rt_mutex_take(&tfd->lock, RT_WAITING_FOREVER); in timerfd_poll()
104 rt_poll_add(&tfd->timerfd_queue, req); in timerfd_poll()
106 rt_mutex_release(&tfd->lock); in timerfd_poll()
108 if (rt_atomic_load(&(tfd->ticks)) > 0) in timerfd_poll()
122 struct rt_timerfd *tfd; in timerfd_read() local
134 tfd = file->vnode->data; in timerfd_read()
136 if (!tfd) in timerfd_read()
142 if ((rt_atomic_load(&(tfd->ticks)) == 0) && (file->flags & O_NONBLOCK)) in timerfd_read()
149 if (rt_atomic_load(&(tfd->ticks)) == 0) in timerfd_read()
151 tfd->wqn.polling_thread = rt_thread_self(); in timerfd_read()
153 if (tfd->wqn.wqueue) in timerfd_read()
155 rt_wqueue_remove(&tfd->wqn); in timerfd_read()
157 rt_wqueue_add(&tfd->timerfd_queue, &tfd->wqn); in timerfd_read()
159 ret = rt_thread_suspend_with_flag(tfd->wqn.polling_thread, RT_INTERRUPTIBLE); in timerfd_read()
170 (*buffer) = rt_atomic_load(&(tfd->timeout_num)); in timerfd_read()
171 rt_atomic_store(&(tfd->timeout_num), 0); in timerfd_read()
172 rt_atomic_store(&(tfd->ticks), 0); in timerfd_read()
185 struct rt_timerfd *tfd = RT_NULL; in timerfd_do_create() local
222 tfd = (struct rt_timerfd *)rt_calloc(1, sizeof(struct rt_timerfd)); in timerfd_do_create()
224 if (tfd) in timerfd_do_create()
226 rt_mutex_init(&tfd->lock, TIMERFD_MUTEX_NAME, RT_IPC_FLAG_FIFO); in timerfd_do_create()
227 rt_wqueue_init(&tfd->timerfd_queue); in timerfd_do_create()
229 tfd->isperiodic = INIT_PERIODIC; in timerfd_do_create()
230 tfd->ticks = 0; in timerfd_do_create()
231 tfd->timeout_num = 0; in timerfd_do_create()
232 tfd->tick_out = 0; in timerfd_do_create()
233 tfd->clockid = clockid; in timerfd_do_create()
234 tfd->timer = RT_NULL; in timerfd_do_create()
235 tfd->pre_time.tv_sec = 0; in timerfd_do_create()
236 tfd->pre_time.tv_nsec = 0; in timerfd_do_create()
237 tfd->wqn.polling_thread = rt_thread_self(); in timerfd_do_create()
238 rt_list_init(&(tfd->wqn.list)); in timerfd_do_create()
239 tfd->wqn.wakeup = timerfd_wqueue_callback; in timerfd_do_create()
245 df->vnode->data = tfd; in timerfd_do_create()
253 rt_free(tfd); in timerfd_do_create()
275 static int get_current_time(struct rt_timerfd *tfd, struct timespec *time) in get_current_time() argument
282 cur_time = &tfd->pre_time; in get_current_time()
289 if (tfd->clockid >= 0) in get_current_time()
291 ret = clock_gettime(tfd->clockid, cur_time); in get_current_time()
303 struct rt_timerfd *tfd = RT_NULL; in timerfd_timeout() local
305 tfd = (struct rt_timerfd *)parameter; in timerfd_timeout()
307 if (tfd == RT_NULL) in timerfd_timeout()
312 rt_wqueue_wakeup(&tfd->timerfd_queue, (void *)POLLIN); in timerfd_timeout()
314 rt_atomic_store(&(tfd->ticks), 1); in timerfd_timeout()
315 rt_atomic_add(&(tfd->timeout_num), 1); in timerfd_timeout()
317 rt_mutex_take(&tfd->lock, RT_WAITING_FOREVER); in timerfd_timeout()
319 get_current_time(tfd, RT_NULL); in timerfd_timeout()
320 if (tfd->isperiodic == OPEN_PERIODIC) in timerfd_timeout()
322 if (tfd->timer) in timerfd_timeout()
324 rt_timer_stop(tfd->timer); in timerfd_timeout()
325 rt_timer_delete(tfd->timer); in timerfd_timeout()
326 tfd->timer = RT_NULL; in timerfd_timeout()
328 tfd->isperiodic = ENTER_PERIODIC; in timerfd_timeout()
329 tfd->timer = rt_timer_create(TIMERFD_MUTEX_NAME, timerfd_timeout, in timerfd_timeout()
330 tfd, tfd->tick_out, in timerfd_timeout()
333 if (tfd->timer == RT_NULL) in timerfd_timeout()
336 rt_mutex_release(&tfd->lock); in timerfd_timeout()
339 rt_timer_start(tfd->timer); in timerfd_timeout()
342 rt_mutex_release(&tfd->lock); in timerfd_timeout()
366 struct rt_timerfd *tfd; in timerfd_do_settime() local
384 tfd = df->vnode->data; in timerfd_do_settime()
386 rt_atomic_store(&(tfd->ticks), 0); in timerfd_do_settime()
387 rt_atomic_store(&(tfd->timeout_num), 0); in timerfd_do_settime()
389 rt_mutex_take(&tfd->lock, RT_WAITING_FOREVER); in timerfd_do_settime()
390 tfd->isperiodic = INIT_PERIODIC; in timerfd_do_settime()
394 old->it_interval.tv_nsec = tfd->ittimer.it_interval.tv_nsec; in timerfd_do_settime()
395 old->it_interval.tv_sec = tfd->ittimer.it_interval.tv_sec; in timerfd_do_settime()
396 old->it_value.tv_nsec = tfd->ittimer.it_value.tv_nsec; in timerfd_do_settime()
397 old->it_value.tv_sec = tfd->ittimer.it_value.tv_sec; in timerfd_do_settime()
402 if (tfd->timer != RT_NULL) in timerfd_do_settime()
404 rt_timer_stop(tfd->timer); in timerfd_do_settime()
405 rt_timer_delete(tfd->timer); in timerfd_do_settime()
406 tfd->timer = RT_NULL; in timerfd_do_settime()
411 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
423 ret = get_current_time(tfd, &current_time); in timerfd_do_settime()
427 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
435 tfd->ittimer.it_interval.tv_nsec = new->it_interval.tv_nsec; in timerfd_do_settime()
436 tfd->ittimer.it_interval.tv_sec = new->it_interval.tv_sec; in timerfd_do_settime()
437 tfd->ittimer.it_value.tv_sec = new->it_value.tv_sec - current_time.tv_sec; in timerfd_do_settime()
438 tfd->ittimer.it_value.tv_nsec = new->it_value.tv_nsec - current_time.tv_nsec; in timerfd_do_settime()
439 timerfd_time_operation(&tfd->ittimer.it_value.tv_sec, &tfd->ittimer.it_value.tv_nsec); in timerfd_do_settime()
443 tfd->tick_out = rt_tick_from_millisecond(interval_msec); in timerfd_do_settime()
444 if (tfd->tick_out < 0) in timerfd_do_settime()
446 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
449 tfd->isperiodic = OPEN_PERIODIC; in timerfd_do_settime()
452 get_current_time(tfd, RT_NULL); in timerfd_do_settime()
458 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
465 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
468 tfd->timer = rt_timer_create(TIMERFD_MUTEX_NAME, timerfd_timeout, in timerfd_do_settime()
469 tfd, tick_out, in timerfd_do_settime()
471 if (tfd->timer == RT_NULL) in timerfd_do_settime()
474 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
477 rt_timer_start(tfd->timer); in timerfd_do_settime()
481 timerfd_timeout(tfd); in timerfd_do_settime()
490 rt_mutex_release(&tfd->lock); in timerfd_do_settime()
497 struct rt_timerfd *tfd; in timerfd_do_gettime() local
511 tfd = df->vnode->data; in timerfd_do_gettime()
513 get_current_time(tfd, &cur_time); in timerfd_do_gettime()
515 rt_mutex_take(&tfd->lock, RT_WAITING_FOREVER); in timerfd_do_gettime()
517 tv_sec = cur_time.tv_sec - tfd->pre_time.tv_sec; in timerfd_do_gettime()
518 tv_nsec = cur_time.tv_nsec - tfd->pre_time.tv_nsec; in timerfd_do_gettime()
520 cur->it_interval.tv_nsec = tfd->ittimer.it_interval.tv_nsec; in timerfd_do_gettime()
521 cur->it_interval.tv_sec = tfd->ittimer.it_interval.tv_sec; in timerfd_do_gettime()
523 if (tfd->isperiodic == ENTER_PERIODIC) in timerfd_do_gettime()
525 cur->it_value.tv_nsec = tfd->ittimer.it_interval.tv_nsec - tv_nsec; in timerfd_do_gettime()
526 cur->it_value.tv_sec = tfd->ittimer.it_interval.tv_sec - tv_sec; in timerfd_do_gettime()
531 if (rt_atomic_load(&(tfd->timeout_num)) == 1) in timerfd_do_gettime()
538 cur->it_value.tv_nsec = tfd->ittimer.it_value.tv_nsec - tv_nsec; in timerfd_do_gettime()
539 cur->it_value.tv_sec = tfd->ittimer.it_value.tv_sec - tv_sec; in timerfd_do_gettime()
544 rt_mutex_release(&tfd->lock); in timerfd_do_gettime()