Lines Matching defs:pOnce

176  * @param   pOnce           The execute once structure.
180 static int rtOnceOtherThread(PRTONCE pOnce, PRTSEMEVENTMULTI phEvtM)
185 int32_t iState = ASMAtomicReadS32(&pOnce->iState);
192 if (ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_BUSY_CREATING_SEM, RTONCESTATE_BUSY_NO_SEM))
197 ASMAtomicWriteHandle(&pOnce->hEventMulti, *phEvtM);
198 int32_t cRefs = ASMAtomicIncS32(&pOnce->cEventRefs); Assert(cRefs == 1); NOREF(cRefs);
200 if (!ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_BUSY_HAVE_SEM, RTONCESTATE_BUSY_CREATING_SEM))
203 AssertReturn(ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE, RTONCESTATE_DONE_CREATING_SEM)
206 ASMAtomicWriteHandle(&pOnce->hEventMulti, NIL_RTSEMEVENTMULTI);
207 cRefs = ASMAtomicDecS32(&pOnce->cEventRefs); Assert(cRefs == 0);
215 AssertReturn( ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_BUSY_SPIN, RTONCESTATE_BUSY_CREATING_SEM)
216 || ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE, RTONCESTATE_DONE_CREATING_SEM)
254 int32_t cEventRefs = ASMAtomicUoReadS32(&pOnce->cEventRefs);
256 && ASMAtomicUoReadS32(&pOnce->iState) == RTONCESTATE_BUSY_HAVE_SEM)
258 if (ASMAtomicCmpXchgExS32(&pOnce->cEventRefs, cEventRefs + 1, cEventRefs, &cEventRefs))
265 ASMAtomicReadHandle(&pOnce->hEventMulti, phEvtM);
274 while (ASMAtomicReadS32(&pOnce->iState) == RTONCESTATE_BUSY_HAVE_SEM);
289 RTDECL(int) RTOnceSlow(PRTONCE pOnce, PFNRTONCE pfnOnce, PFNRTONCECLEANUP pfnCleanUp, void *pvUser)
294 AssertPtr(pOnce);
300 int32_t iState = ASMAtomicUoReadS32(&pOnce->iState);
305 return ASMAtomicUoReadS32(&pOnce->rc);
334 && ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_BUSY_NO_SEM, RTONCESTATE_UNINITIALIZED))
340 ASMAtomicWriteS32(&pOnce->rc, rcOnce);
350 pOnce->pfnCleanUp = pfnCleanUp;
351 pOnce->pvUser = pvUser;
352 RTListAppend(&g_CleanUpList, &pOnce->CleanUpNode);
361 if ( !ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE, RTONCESTATE_BUSY_NO_SEM)
362 && !ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE, RTONCESTATE_BUSY_SPIN)
363 && !ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE_CREATING_SEM, RTONCESTATE_BUSY_CREATING_SEM)
367 AssertReturn(ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE_HAVE_SEM, RTONCESTATE_BUSY_HAVE_SEM),
370 int32_t cRefs = ASMAtomicIncS32(&pOnce->cEventRefs);
374 ASMAtomicReadHandle(&pOnce->hEventMulti, &hEvtM);
377 ASMAtomicWriteS32(&pOnce->iState, RTONCESTATE_DONE);
390 rcOnce = rtOnceOtherThread(pOnce, &hEvtM);
393 if (ASMAtomicDecS32(&pOnce->cEventRefs) == 0)
396 ASMAtomicCmpXchgHandle(&pOnce->hEventMulti, NIL_RTSEMEVENTMULTI, hEvtM, fRc); Assert(fRc);
397 fRc = ASMAtomicCmpXchgS32(&pOnce->iState, RTONCESTATE_DONE, RTONCESTATE_DONE_HAVE_SEM); Assert(fRc);
402 rcOnce = ASMAtomicUoReadS32(&pOnce->rc);
410 RTDECL(void) RTOnceReset(PRTONCE pOnce)
413 AssertPtr(pOnce);
414 Assert(pOnce->hEventMulti == NIL_RTSEMEVENTMULTI);
415 int32_t iState = ASMAtomicUoReadS32(&pOnce->iState);
423 if (pOnce->pfnCleanUp)
427 RTListNodeRemove(&pOnce->CleanUpNode);
428 pOnce->pfnCleanUp = NULL;
429 pOnce->pvUser = NULL;
436 ASMAtomicWriteS32(&pOnce->rc, VERR_INTERNAL_ERROR);
437 ASMAtomicWriteS32(&pOnce->iState, RTONCESTATE_UNINITIALIZED);