Declaraciones públicas de src/safety/mutex.zig (zkit (SDK consumido)).
apps/docs/generated/zig/zkit.jsonPágina generada desde
zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano:bun run docs:genla regenera ybun run docs:checkfalla si difiere.
zkit.safety.Mutex — mutex con dueño comprobado y orden de locks.
zkit.sync.Mutex es el mutex pthread desnudo. Éste lo envuelve con los
invariantes que convierten un bug de concurrencia latente (que TSAN sólo
ve si la carrera ocurre durante el test) en un fallo determinista la
primera vez que el código mal ordenado se EJECUTA:
unlock desde un hilo que no lo tiene, o re-lock desde el
hilo que ya lo tiene (autodeadlock), son pánico con el nombre del lock.
assertHeld() documenta y comprueba "esta función se llama con el lock".level. Un hilo sólo puede tomar
locks en orden estrictamente CRECIENTE de nivel; tomar uno de nivel <=
a alguno que ya tiene es pánico ("lock order violation: 'cache'(10)
mientras tiene 'session'(20)"). Así una inversión A→B / B→A se detecta
aunque los dos hilos nunca coincidan en el test. level = 0 = sin
orden (no participa).tryLock no puede interbloquear: no comprueba orden (sí se registra).Coste: con std.debug.runtime_safety (Debug, ReleaseSafe) un store
atómico del dueño y una pila thread-local de hasta 16 locks; en
ReleaseFast/Small los checks desaparecen y queda el mutex desnudo.
safety.Mutextype · línea 51
pub const Mutex = structSin ///.
safety.Mutex.initfn · línea 56
pub fn init(opts: Options) MutexSin ///.
safety.Mutex.deinitfn · línea 60
pub fn deinit(m: *Mutex) voidSin ///.
safety.Mutex.lockfn · línea 65
pub fn lock(m: *Mutex) voidSin ///.
safety.Mutex.tryLockfn · línea 71
pub fn tryLock(m: *Mutex) boolSin ///.
safety.Mutex.unlockfn · línea 78
pub fn unlock(m: *Mutex) voidSin ///.
safety.Mutex.assertHeldfn · línea 87
pub fn assertHeld(m: *const Mutex) voidPánico si el hilo actual no tiene el lock (no-op sin runtime safety).
safety.Mutex.isHeldByCurrentThreadfn · línea 91
pub fn isHeldByCurrentThread(m: *const Mutex) boolSin ///.
safety.Mutex.acquirefn · línea 95
pub fn acquire(m: *Mutex) HeldSin ///.
safety.Mutex.Heldtype · línea 100
pub const Held = structSin ///.
safety.Mutex.Held.releasefn · línea 102
pub fn release(h: Held) voidSin ///.
safety.Mutex.waitfn · línea 109
pub fn wait(m: *Mutex, cond: *sync.Condition) voidcond.wait con este mutex: suelta la propiedad mientras duerme y la
recupera al despertar (sin re-comprobar el orden: es el mismo lock).
safety.Mutex.waitUntilfn · línea 116
pub fn waitUntil(m: *Mutex, cond: *sync.Condition, deadline: time.Deadline) sync.TimedWaitError!voidSin ///.
safety.Mutex.lockViolationfn · línea 124
pub fn lockViolation(m: *const Mutex) ?ViolationLo que lock comprobaría, sin efectos (para tests y diagnósticos).
safety.Mutex.unlockViolationfn · línea 140
pub fn unlockViolation(m: *const Mutex) ?ViolationSin ///.
safety.mutex.checks_enabledconst · línea 27
pub const checks_enabled = std.debug.runtime_safetySin ///.
safety.mutex.max_heldconst · línea 28
pub const max_held = 16Sin ///.
safety.mutex.Optionstype · línea 30
pub const Options = structSin ///.
safety.mutex.Violationtype · línea 44
pub const Violation = unionSin ///.
safety.mutex.Mutextype · línea 51
pub const Mutex = structSin ///.
safety.mutex.Mutex.initfn · línea 56
pub fn init(opts: Options) MutexSin ///.
safety.mutex.Mutex.deinitfn · línea 60
pub fn deinit(m: *Mutex) voidSin ///.
safety.mutex.Mutex.lockfn · línea 65
pub fn lock(m: *Mutex) voidSin ///.
safety.mutex.Mutex.tryLockfn · línea 71
pub fn tryLock(m: *Mutex) boolSin ///.
safety.mutex.Mutex.unlockfn · línea 78
pub fn unlock(m: *Mutex) voidSin ///.
safety.mutex.Mutex.assertHeldfn · línea 87
pub fn assertHeld(m: *const Mutex) voidPánico si el hilo actual no tiene el lock (no-op sin runtime safety).
safety.mutex.Mutex.isHeldByCurrentThreadfn · línea 91
pub fn isHeldByCurrentThread(m: *const Mutex) boolSin ///.
safety.mutex.Mutex.acquirefn · línea 95
pub fn acquire(m: *Mutex) HeldSin ///.
safety.mutex.Mutex.Heldtype · línea 100
pub const Held = structSin ///.
safety.mutex.Mutex.Held.releasefn · línea 102
pub fn release(h: Held) voidSin ///.
safety.mutex.Mutex.waitfn · línea 109
pub fn wait(m: *Mutex, cond: *sync.Condition) voidcond.wait con este mutex: suelta la propiedad mientras duerme y la
recupera al despertar (sin re-comprobar el orden: es el mismo lock).
safety.mutex.Mutex.waitUntilfn · línea 116
pub fn waitUntil(m: *Mutex, cond: *sync.Condition, deadline: time.Deadline) sync.TimedWaitError!voidSin ///.
safety.mutex.Mutex.lockViolationfn · línea 124
pub fn lockViolation(m: *const Mutex) ?ViolationLo que lock comprobaría, sin efectos (para tests y diagnósticos).
safety.mutex.Mutex.unlockViolationfn · línea 140
pub fn unlockViolation(m: *const Mutex) ?ViolationSin ///.
safety.mutex.heldCountfn · línea 180
pub fn heldCount() usizeNúmero de safety.Mutex que el hilo actual tiene (diagnóstico/tests).