Referencia Zigzkit (SDK consumido)

src/safety/mutex.zig

Declaraciones públicas de src/safety/mutex.zig (zkit (SDK consumido)).

ImplementadoSin versión del tren todavía· generada desde apps/docs/generated/zig/zkit.json

Página generada desde zkit@zkit-0.0.0-_fk2iAa4BQCqGFKJeeY9WvMQClX5kiZQ2iOZrVsxVyyN (src/root.zig). No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla 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:

  • Dueño: 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".
  • Orden: cada mutex puede declarar un 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.Mutex

type · línea 51

pub const Mutex = struct

Sin ///.

safety.Mutex.init

fn · línea 56

pub fn init(opts: Options) Mutex

Sin ///.

safety.Mutex.deinit

fn · línea 60

pub fn deinit(m: *Mutex) void

Sin ///.

safety.Mutex.lock

fn · línea 65

pub fn lock(m: *Mutex) void

Sin ///.

safety.Mutex.tryLock

fn · línea 71

pub fn tryLock(m: *Mutex) bool

Sin ///.

safety.Mutex.unlock

fn · línea 78

pub fn unlock(m: *Mutex) void

Sin ///.

safety.Mutex.assertHeld

fn · línea 87

pub fn assertHeld(m: *const Mutex) void

Pánico si el hilo actual no tiene el lock (no-op sin runtime safety).

safety.Mutex.isHeldByCurrentThread

fn · línea 91

pub fn isHeldByCurrentThread(m: *const Mutex) bool

Sin ///.

safety.Mutex.acquire

fn · línea 95

pub fn acquire(m: *Mutex) Held

Sin ///.

safety.Mutex.Held

type · línea 100

pub const Held = struct

Sin ///.

safety.Mutex.Held.release

fn · línea 102

pub fn release(h: Held) void

Sin ///.

safety.Mutex.wait

fn · línea 109

pub fn wait(m: *Mutex, cond: *sync.Condition) void

cond.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.waitUntil

fn · línea 116

pub fn waitUntil(m: *Mutex, cond: *sync.Condition, deadline: time.Deadline) sync.TimedWaitError!void

Sin ///.

safety.Mutex.lockViolation

fn · línea 124

pub fn lockViolation(m: *const Mutex) ?Violation

Lo que lock comprobaría, sin efectos (para tests y diagnósticos).

safety.Mutex.unlockViolation

fn · línea 140

pub fn unlockViolation(m: *const Mutex) ?Violation

Sin ///.

safety.mutex.checks_enabled

const · línea 27

pub const checks_enabled = std.debug.runtime_safety

Sin ///.

safety.mutex.max_held

const · línea 28

pub const max_held = 16

Sin ///.

safety.mutex.Options

type · línea 30

pub const Options = struct

Sin ///.

safety.mutex.Violation

type · línea 44

pub const Violation = union

Sin ///.

safety.mutex.Mutex

type · línea 51

pub const Mutex = struct

Sin ///.

safety.mutex.Mutex.init

fn · línea 56

pub fn init(opts: Options) Mutex

Sin ///.

safety.mutex.Mutex.deinit

fn · línea 60

pub fn deinit(m: *Mutex) void

Sin ///.

safety.mutex.Mutex.lock

fn · línea 65

pub fn lock(m: *Mutex) void

Sin ///.

safety.mutex.Mutex.tryLock

fn · línea 71

pub fn tryLock(m: *Mutex) bool

Sin ///.

safety.mutex.Mutex.unlock

fn · línea 78

pub fn unlock(m: *Mutex) void

Sin ///.

safety.mutex.Mutex.assertHeld

fn · línea 87

pub fn assertHeld(m: *const Mutex) void

Pánico si el hilo actual no tiene el lock (no-op sin runtime safety).

safety.mutex.Mutex.isHeldByCurrentThread

fn · línea 91

pub fn isHeldByCurrentThread(m: *const Mutex) bool

Sin ///.

safety.mutex.Mutex.acquire

fn · línea 95

pub fn acquire(m: *Mutex) Held

Sin ///.

safety.mutex.Mutex.Held

type · línea 100

pub const Held = struct

Sin ///.

safety.mutex.Mutex.Held.release

fn · línea 102

pub fn release(h: Held) void

Sin ///.

safety.mutex.Mutex.wait

fn · línea 109

pub fn wait(m: *Mutex, cond: *sync.Condition) void

cond.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.waitUntil

fn · línea 116

pub fn waitUntil(m: *Mutex, cond: *sync.Condition, deadline: time.Deadline) sync.TimedWaitError!void

Sin ///.

safety.mutex.Mutex.lockViolation

fn · línea 124

pub fn lockViolation(m: *const Mutex) ?Violation

Lo que lock comprobaría, sin efectos (para tests y diagnósticos).

safety.mutex.Mutex.unlockViolation

fn · línea 140

pub fn unlockViolation(m: *const Mutex) ?Violation

Sin ///.

safety.mutex.heldCount

fn · línea 180

pub fn heldCount() usize

Número de safety.Mutex que el hilo actual tiene (diagnóstico/tests).