Lines Matching defs:pTimer

186     PRTTIMER pTimer = (PRTTIMER)pvArg;
187 RTTIMER Timer = *pTimer;
188 Assert(pTimer->u32Magic == RTTIMER_MAGIC);
225 int rc = pTimer->iError = RTErrConvertFromErrno(errno);
237 while ( !pTimer->fDestroyed
238 && pTimer->u32Magic == RTTIMER_MAGIC)
243 if (pTimer->fSuspended)
245 int rc = RTSemEventWait(pTimer->Event, RT_INDEFINITE_WAIT);
249 if (pTimer->fDestroyed)
253 if ( pTimer->fSuspended
254 || pTimer->fDestroyed)
269 if (pTimer->u64NanoFirst)
271 uint64_t u64 = RT_MAX(1000, pTimer->u64NanoFirst);
280 if (pTimer->u64NanoInterval)
282 uint64_t u64 = RT_MAX(1000, pTimer->u64NanoInterval);
294 ASMAtomicXchgU8(&pTimer->fSuspended, true);
295 pTimer->iError = RTErrConvertFromErrno(errno);
299 pTimer->iError = 0;
320 if (RT_UNLIKELY( pTimer->fSuspended
321 || pTimer->fDestroyed
322 || pTimer->u32Magic != RTTIMER_MAGIC))
325 pTimer->pfnTimer(pTimer, pTimer->pvUser, ++pTimer->iTick);
328 if (RT_UNLIKELY(!pTimer->u64NanoInterval))
330 ASMAtomicWriteU8(&pTimer->fSuspended, true);
337 } while (RT_LIKELY( !pTimer->fSuspended
338 && !pTimer->fDestroyed
339 && pTimer->u32Magic == RTTIMER_MAGIC));
351 if (!pTimer->fDestroyed)
353 pTimer->iError = 0;
361 pTimer->iError = 0;
374 LogFlow(("rttimerThread: signo=%d pTimer=%p\n", SigInfo.si_signo, SigInfo.si_value.sival_ptr));
378 PRTTIMER pTimer = (PRTTIMER)SigInfo.si_value.sival_ptr;
379 AssertPtr(pTimer);
380 if (RT_UNLIKELY( !VALID_PTR(pTimer)
381 || ASMAtomicUoReadU8(&pTimer->fSuspended)
382 || ASMAtomicUoReadU8(&pTimer->fDestroyed)
383 || pTimer->u32Magic != RTTIMER_MAGIC))
386 pTimer->pfnTimer(pTimer, pTimer->pvUser, ++pTimer->iTick);
389 if (RT_UNLIKELY(!pTimer->u64NanoInterval))
390 ASMAtomicWriteU8(&pTimer->fSuspended, true);
489 PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
490 if (pTimer)
492 pTimer->u32Magic = RTTIMER_MAGIC;
493 pTimer->fSuspended = true;
494 pTimer->fDestroyed = false;
495 pTimer->Thread = NIL_RTTHREAD;
496 pTimer->Event = NIL_RTSEMEVENT;
497 pTimer->pfnTimer = pfnTimer;
498 pTimer->pvUser = pvUser;
499 pTimer->u64NanoInterval = u64NanoInterval;
500 pTimer->u64NanoFirst = 0;
501 pTimer->iTick = 0;
502 pTimer->iError = 0;
503 rc = RTSemEventCreate(&pTimer->Event);
507 rc = RTThreadCreate(&pTimer->Thread, rttimerThread, pTimer, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "Timer");
515 rc = RTThreadUserWait(pTimer->Thread, 45*1000);
519 rc = RTThreadUserReset(pTimer->Thread); AssertRC(rc);
520 rc = pTimer->iError;
525 *ppTimer = pTimer;
531 ASMAtomicXchgU8(&pTimer->fDestroyed, true);
532 ASMAtomicXchgU32(&pTimer->u32Magic, ~RTTIMER_MAGIC);
533 RTThreadWait(pTimer->Thread, 45*1000, NULL);
535 RTSemEventDestroy(pTimer->Event);
536 pTimer->Event = NIL_RTSEMEVENT;
538 RTMemFree(pTimer);
556 PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
557 if (pTimer)
560 pTimer->u32Magic = RTTIMER_MAGIC;
561 pTimer->fSuspended = true;
562 pTimer->fDestroyed = false;
563 pTimer->pfnTimer = pfnTimer;
564 pTimer->pvUser = pvUser;
565 pTimer->u64NanoInterval = u64NanoInterval;
566 pTimer->iTick = 0;
574 SigEvt.sigev_value.sival_ptr = pTimer; /* sigev_value gets copied to siginfo. */
575 int err = timer_create(CLOCK_REALTIME, &SigEvt, &pTimer->NativeTimer);
588 LogFlow(("RTTimerCreateEx: rc=%Rrc pTimer=%p (thread already running)\n", rc, pTimer));
589 *ppTimer = pTimer;
605 LogFlow(("RTTimerCreateEx: rc=%Rrc pTimer=%p (thread already running)\n", rc, pTimer));
606 *ppTimer = pTimer;
618 timer_delete(pTimer->NativeTimer);
626 RTMemFree(pTimer);
636 RTR3DECL(int) RTTimerDestroy(PRTTIMER pTimer)
638 LogFlow(("RTTimerDestroy: pTimer=%p\n", pTimer));
644 if (!pTimer)
647 AssertPtrReturn(pTimer, VERR_INVALID_POINTER);
648 AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_MAGIC);
652 AssertReturn(pTimer->Thread != RTThreadSelf(), VERR_INTERNAL_ERROR);
658 ASMAtomicWriteU8(&pTimer->fDestroyed, true);
659 ASMAtomicWriteU32(&pTimer->u32Magic, ~RTTIMER_MAGIC);
665 if (pTimer->fSuspended)
670 int err = timer_settime(pTimer->NativeTimer, 0, &TimerSpec, NULL); NOREF(err);
689 RTTHREAD Thread = pTimer->Thread;
690 rc = RTSemEventSignal(pTimer->Event);
710 timer_delete(pTimer->NativeTimer);
712 RTSemEventDestroy(pTimer->Event);
713 pTimer->Event = NIL_RTSEMEVENT;
716 RTMemFree(pTimer);
721 RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
726 AssertPtrReturn(pTimer, VERR_INVALID_POINTER);
727 AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_MAGIC);
729 AssertReturn(pTimer->Thread != RTThreadSelf(), VERR_INTERNAL_ERROR);
735 if (!ASMAtomicXchgU8(&pTimer->fSuspended, false))
737 LogFlow(("RTTimerStart: pTimer=%p u64First=%llu u64NanoInterval=%llu\n", pTimer, u64First, pTimer->u64NanoInterval));
744 RTThreadUserReset(pTimer->Thread);
745 ASMAtomicUoWriteU64(&pTimer->u64NanoFirst, u64First);
746 ASMAtomicUoWriteU64(&pTimer->iTick, 0);
747 ASMAtomicWriteU8(&pTimer->fSuspended, false);
748 int rc = RTSemEventSignal(pTimer->Event);
751 rc = RTThreadUserWait(pTimer->Thread, 45*1000);
753 RTThreadUserReset(pTimer->Thread);
765 TimerSpec.it_interval.tv_sec = pTimer->u64NanoInterval / 1000000000;
766 TimerSpec.it_interval.tv_nsec = pTimer->u64NanoInterval % 1000000000;
767 int err = timer_settime(pTimer->NativeTimer, 0, &TimerSpec, NULL);
772 ASMAtomicXchgU8(&pTimer->fSuspended, false);
777 RTDECL(int) RTTimerStop(PRTTIMER pTimer)
782 AssertPtrReturn(pTimer, VERR_INVALID_POINTER);
783 AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_MAGIC);
788 if (ASMAtomicXchgU8(&pTimer->fSuspended, true))
790 LogFlow(("RTTimerStop: pTimer=%p\n", pTimer));
796 RTThreadUserReset(pTimer->Thread);
797 ASMAtomicXchgU8(&pTimer->fSuspended, true);
799 if (RTThreadSelf() != pTimer->Thread)
801 pthread_kill((pthread_t)RTThreadGetNative(pTimer->Thread), RT_TIMER_SIGNAL);
802 rc = RTThreadUserWait(pTimer->Thread, 45*1000);
804 RTThreadUserReset(pTimer->Thread);
814 int err = timer_settime(pTimer->NativeTimer, 0, &TimerSpec, NULL);
822 RTDECL(int) RTTimerChangeInterval(PRTTIMER pTimer, uint64_t u64NanoInterval)
824 AssertPtrReturn(pTimer, VERR_INVALID_POINTER);
825 AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, VERR_INVALID_MAGIC);