Lines Matching defs:pTimer

102     PRTTIMER pTimer = (PRTTIMER)RTMemAlloc(sizeof(*pTimer));
103 if (!pTimer)
106 pTimer->u32Magic = RTTIMER_MAGIC;
107 pTimer->fSuspended = true;
108 pTimer->fDestroyed = false;
109 pTimer->pfnTimer = pfnTimer;
110 pTimer->pvUser = pvUser;
111 pTimer->Thread = NIL_RTTHREAD;
112 pTimer->Event = NIL_RTSEMEVENT;
113 pTimer->u64NanoInterval = u64NanoInterval;
114 pTimer->u64StartTS = 0;
116 int rc = RTSemEventCreate(&pTimer->Event);
119 rc = RTThreadCreate(&pTimer->Thread, rtTimerThread, pTimer, 0, RTTHREADTYPE_TIMER, RTTHREADFLAGS_WAITABLE, "Timer");
122 *ppTimer = pTimer;
126 pTimer->u32Magic = 0;
127 RTSemEventDestroy(pTimer->Event);
128 pTimer->Event = NIL_RTSEMEVENT;
130 RTMemFree(pTimer);
141 * @param pTimer The handle.
143 DECLINLINE(bool) rtTimerIsValid(PRTTIMER pTimer)
145 AssertReturn(VALID_PTR(pTimer), false);
146 AssertReturn(pTimer->u32Magic == RTTIMER_MAGIC, false);
147 AssertReturn(!pTimer->fDestroyed, false);
152 RTDECL(int) RTTimerDestroy(PRTTIMER pTimer)
155 if (pTimer == /*NIL_RTTIMER*/ NULL)
157 if (!rtTimerIsValid(pTimer))
165 RTTHREAD Thread = pTimer->Thread;
166 if (!pTimer->fSuspended)
167 ASMAtomicXchgU8(&pTimer->fSuspended, true);
168 ASMAtomicXchgU8(&pTimer->fDestroyed, true);
169 int rc = RTSemEventSignal(pTimer->Event);
180 RTDECL(int) RTTimerStart(PRTTIMER pTimer, uint64_t u64First)
182 if (!rtTimerIsValid(pTimer))
184 if (!pTimer->fSuspended)
191 ASMAtomicXchgU64(&pTimer->iTick, 0);
192 ASMAtomicXchgU64(&pTimer->u64StartTS, u64First);
193 ASMAtomicXchgU64(&pTimer->u64NextTS, u64First);
194 ASMAtomicXchgU8(&pTimer->fSuspended, false);
195 int rc = RTSemEventSignal(pTimer->Event);
204 RTDECL(int) RTTimerStop(PRTTIMER pTimer)
206 if (!rtTimerIsValid(pTimer))
208 if (pTimer->fSuspended)
214 ASMAtomicXchgU8(&pTimer->fSuspended, true);
215 int rc = RTSemEventSignal(pTimer->Event);
224 RTDECL(int) RTTimerChangeInterval(PRTTIMER pTimer, uint64_t u64NanoInterval)
226 if (!rtTimerIsValid(pTimer))
236 PRTTIMER pTimer = (PRTTIMER)pvUser;
242 while (!pTimer->fDestroyed)
244 if (pTimer->fSuspended)
246 int rc = RTSemEventWait(pTimer->Event, RT_INDEFINITE_WAIT);
256 if (u64NanoTS >= pTimer->u64NextTS)
258 pTimer->iTick++;
261 if (!pTimer->u64NanoInterval)
262 ASMAtomicXchgU8(&pTimer->fSuspended, true);
263 pTimer->pfnTimer(pTimer, pTimer->pvUser, pTimer->iTick);
266 if (pTimer->fSuspended || pTimer->fDestroyed)
270 pTimer->u64NextTS = pTimer->u64StartTS + pTimer->iTick * pTimer->u64NanoInterval;
271 if (pTimer->u64NextTS < u64NanoTS)
273 pTimer->u64NextTS = u64NanoTS + 1;
275 pTimer->u64NextTS = u64NanoTS + RTTimerGetSystemGranularity() / 2;
280 uint64_t cNanoSeconds = pTimer->u64NextTS - u64NanoTS;
285 int rc = RTSemEventWait(pTimer->Event, cNanoSeconds < 1000000 ? 1 : cNanoSeconds / 1000000);
298 ASMAtomicIncU32(&pTimer->u32Magic); /* make the handle invalid. */
299 int rc = RTSemEventDestroy(pTimer->Event); AssertRC(rc);
300 pTimer->Event = NIL_RTSEMEVENT;
301 pTimer->Thread = NIL_RTTHREAD;
302 RTMemFree(pTimer);