mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-03 06:18:38 +09:00
Add Atomics.notify instead of Atomics.wake according to revised spec.
- Keep .wake as an alias until we're certain it can be removed. - Enable SAB memory
This commit is contained in:
parent
c3a85ded77
commit
f5923f0626
5 changed files with 30 additions and 34 deletions
|
|
@ -834,7 +834,7 @@ js::atomics_wait(JSContext* cx, unsigned argc, Value* vp)
|
|||
}
|
||||
|
||||
bool
|
||||
js::atomics_wake(JSContext* cx, unsigned argc, Value* vp)
|
||||
js::atomics_notify(JSContext* cx, unsigned argc, Value* vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
HandleValue objv = args.get(0);
|
||||
|
|
@ -874,7 +874,7 @@ js::atomics_wake(JSContext* cx, unsigned argc, Value* vp)
|
|||
iter = iter->lower_pri;
|
||||
if (c->offset != offset || !c->rt->fx.isWaiting())
|
||||
continue;
|
||||
c->rt->fx.wake(FutexRuntime::WakeExplicit);
|
||||
c->rt->fx.notify(FutexRuntime::NotifyExplicit);
|
||||
++woken;
|
||||
--count;
|
||||
} while (count > 0 && iter != waiters);
|
||||
|
|
@ -950,7 +950,7 @@ js::FutexRuntime::isWaiting()
|
|||
// When a worker is awoken for an interrupt it goes into state
|
||||
// WaitingNotifiedForInterrupt for a short time before it actually
|
||||
// wakes up and goes into WaitingInterrupted. In those states the
|
||||
// worker is still waiting, and if an explicit wake arrives the
|
||||
// worker is still waiting, and if an explicit notify arrives the
|
||||
// worker transitions to Woken. See further comments in
|
||||
// FutexRuntime::wait().
|
||||
return state_ == Waiting || state_ == WaitingInterrupted || state_ == WaitingNotifiedForInterrupt;
|
||||
|
|
@ -1029,14 +1029,14 @@ js::FutexRuntime::wait(JSContext* cx, js::UniqueLock<js::Mutex>& locked,
|
|||
// should be woken when the interrupt handler returns.
|
||||
// To that end, we flag the thread as interrupted around
|
||||
// the interrupt and check state_ when the interrupt
|
||||
// handler returns. A wake() call that reaches the
|
||||
// handler returns. A notify() call that reaches the
|
||||
// runtime during the interrupt sets state_ to Woken.
|
||||
//
|
||||
// - It is in principle possible for wait() to be
|
||||
// reentered on the same thread/runtime and waiting on the
|
||||
// same location and to yet again be interrupted and enter
|
||||
// the interrupt handler. In this case, it is important
|
||||
// that when another agent wakes waiters, all waiters using
|
||||
// that when another agent notifies waiters, all waiters using
|
||||
// the same runtime on the same location are woken in LIFO
|
||||
// order; FIFO may be the required order, but FIFO would
|
||||
// fail to wake up the innermost call. Interrupts are
|
||||
|
|
@ -1073,25 +1073,25 @@ finished:
|
|||
}
|
||||
|
||||
void
|
||||
js::FutexRuntime::wake(WakeReason reason)
|
||||
js::FutexRuntime::notify(NotifyReason reason)
|
||||
{
|
||||
MOZ_ASSERT(isWaiting());
|
||||
|
||||
if ((state_ == WaitingInterrupted || state_ == WaitingNotifiedForInterrupt) && reason == WakeExplicit) {
|
||||
if ((state_ == WaitingInterrupted || state_ == WaitingNotifiedForInterrupt) && reason == NotifyExplicit) {
|
||||
state_ = Woken;
|
||||
return;
|
||||
}
|
||||
switch (reason) {
|
||||
case WakeExplicit:
|
||||
case NotifyExplicit:
|
||||
state_ = Woken;
|
||||
break;
|
||||
case WakeForJSInterrupt:
|
||||
case NotifyForJSInterrupt:
|
||||
if (state_ == WaitingNotifiedForInterrupt)
|
||||
return;
|
||||
state_ = WaitingNotifiedForInterrupt;
|
||||
break;
|
||||
default:
|
||||
MOZ_CRASH("bad WakeReason in FutexRuntime::wake()");
|
||||
MOZ_CRASH("bad NotifyReason in FutexRuntime::notify()");
|
||||
}
|
||||
cond_->notify_all();
|
||||
}
|
||||
|
|
@ -1108,7 +1108,8 @@ const JSFunctionSpec AtomicsMethods[] = {
|
|||
JS_INLINABLE_FN("xor", atomics_xor, 3,0, AtomicsXor),
|
||||
JS_INLINABLE_FN("isLockFree", atomics_isLockFree, 1,0, AtomicsIsLockFree),
|
||||
JS_FN("wait", atomics_wait, 4,0),
|
||||
JS_FN("wake", atomics_wake, 3,0),
|
||||
JS_FN("notify", atomics_notify, 3,0),
|
||||
JS_FN("wake", atomics_notify, 3,0), //Legacy name
|
||||
JS_FS_END
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue