osi_assertx(lockp->readers > 0, "read lock underflow");
lockp->waiters++;
- osi_TWait(&lockp->d.turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, lockp->tid, csp);
+ osi_TWaitExt(&lockp->d.turn, OSI_SLEEPINFO_W4WRITE, &lockp->flags, lockp->tid, csp, FALSE);
lockp->waiters--;
osi_assertx(lockp->waiters >= 0, "waiters underflow");
osi_assert(lockp->readers == 0 && (lockp->flags & OSI_LOCKFLAG_EXCL));
void osi_TWait(osi_turnstile_t *turnp, int waitFor, void *patchp, DWORD *tidp, CRITICAL_SECTION *releasep)
{
+ osi_TWaitExt(turnp, waitFor, patchp, tidp, releasep, TRUE);
+}
+
+void osi_TWaitExt(osi_turnstile_t *turnp, int waitFor, void *patchp, DWORD *tidp, CRITICAL_SECTION *releasep, int prepend)
+{
osi_sleepInfo_t *sp;
unsigned int code;
sp->waitFor = waitFor;
sp->value = (LONG_PTR) patchp;
sp->tidp = tidp;
- osi_QAddT((osi_queue_t **) &turnp->firstp, (osi_queue_t **) &turnp->lastp, &sp->q);
- if (!turnp->lastp)
- turnp->lastp = sp;
+ if (prepend)
+ osi_QAddH((osi_queue_t **) &turnp->firstp, (osi_queue_t **) &turnp->lastp, &sp->q);
+ else
+ osi_QAddT((osi_queue_t **) &turnp->firstp, (osi_queue_t **) &turnp->lastp, &sp->q);
LeaveCriticalSection(releasep);
/* now wait for the signal */
void *patchp, DWORD *tidp,
Crit_Sec *releasep);
+extern void osi_TWaitExt(osi_turnstile_t *turnp, int waitFor,
+ void *patchp, DWORD *tidp,
+ Crit_Sec *releasep, int prepend);
+
extern void osi_TSignal(osi_turnstile_t *turnp);
extern void osi_TBroadcast(osi_turnstile_t *turnp);