Declaraciones públicas de src/bounded_queue.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.
BoundedQueue(T) — cola FIFO acotada y thread-safe, con la política de desborde como PARÁMETRO.
Es la versión concurrente de SubscriberQueue (nodo zkit/handle-concurrent,
r44 #9 de styx) y la generalización de PendingDeliveryQueue de styx
(moqt_pending_delivery.zig), que llevaba mezclados la cola, la política
live/VOD, la espera por backpressure (con nanosleep de 0.5 ms en bucle)
y los contadores de dominio. Aquí queda la parte genérica:
init: push NUNCA reserva
memoria, así que el hot path no tiene un error.OutOfMemory que
convertir en pérdida silenciosa.Overflow.reject: lleno ⇒ .full (o pushWait espera con un
Condition, sin sondeo, hasta un plazo).Overflow.drop_oldest: lleno ⇒ se expulsa el más viejo y se DEVUELVE
al llamador (.evicted) para que libere lo que posea — la versión
single-thread lo tiraba sin devolverlo, un leak para T con recursos.
La siguiente pop devuelve .discontinuity (contrato de
SubscriberQueue). El productor nunca espera ni es rechazado.beginDrain/settleDrain): lo que el consumidor
no pudo entregar vuelve al FRENTE en orden.
· .reject: lo sacado SIGUE contando contra la capacidad hasta que
se liquida. Invariante en todo instante: len + reserved <= capacity, así que settleDrain nunca desborda ni pierde nada.
· .drop_oldest: lo sacado NO bloquea al productor (lo fresco
manda). Invariante: len <= capacity. Si al liquidar no cabe
todo, se descartan los más viejos de lo devuelto (que son más
viejos que todo lo encolado) y se entregan al llamador.close() despierta a todos los que esperan; wakeAll() también, para
que un productor que espera re-mire su flag de cancelación.Los contadores de dominio (por pista, por sesión) se quedan en el
consumidor; aquí sólo hay agregados baratos en stats().
bounded_queue.Overflowtype · línea 39
pub const Overflow = enumSin ///.
bounded_queue.Optionstype · línea 47
pub const Options = structSin ///.
bounded_queue.BoundedQueuefn · línea 52
pub fn BoundedQueue(comptime T: type) typeSin ///.
bounded_queue.BoundedQueue.InitErrorconst · línea 56
pub const InitError = error{ InvalidParameter, OutOfMemory }Sin ///.
bounded_queue.BoundedQueue.Errorconst · línea 57
pub const Error = error{Closed}Sin ///.
bounded_queue.BoundedQueue.WaitErrorconst · línea 58
pub const WaitError = error{ Closed, Timeout, Cancelled }Sin ///.
bounded_queue.BoundedQueue.PushResulttype · línea 60
pub const PushResult = unionSin ///.
bounded_queue.BoundedQueue.PopResulttype · línea 70
pub const PopResult = unionSin ///.
bounded_queue.BoundedQueue.Statstype · línea 77
pub const Stats = structSin ///.
bounded_queue.BoundedQueue.initfn · línea 97
pub fn init(allocator: std.mem.Allocator, opts: Options) InitError!SelfSin ///.
bounded_queue.BoundedQueue.deinitfn · línea 108
pub fn deinit(self: *Self) voidLibera el anillo. Los items que queden NO se destruyen: si T
posee recursos, vacíala antes con drainInto.
bounded_queue.BoundedQueue.capacityfn · línea 117
pub fn capacity(self: *const Self) usizeSin ///.
bounded_queue.BoundedQueue.lenfn · línea 121
pub fn len(self: *Self) usizeSin ///.
bounded_queue.BoundedQueue.reservedCountfn · línea 127
pub fn reservedCount(self: *Self) usizeSin ///.
bounded_queue.BoundedQueue.statsfn · línea 133
pub fn stats(self: *Self) StatsSin ///.
bounded_queue.BoundedQueue.closefn · línea 142
pub fn close(self: *Self) voidCierra la cola: los push posteriores fallan con error.Closed, y
los que esperan se despiertan. Lo ya encolado se puede seguir
sacando.
bounded_queue.BoundedQueue.wakeAllfn · línea 154
pub fn wakeAll(self: *Self) voidDespierta a todos los que esperan para que re-evalúen su plazo o su flag de cancelación.
bounded_queue.BoundedQueue.pushfn · línea 165
pub fn push(self: *Self, item: T) Error!PushResultEncola sin bloquear.
bounded_queue.BoundedQueue.pushWaitfn · línea 180
pub fn pushWait( self: *Self, item: T, deadline: time.Deadline, cancel: ?*const std.atomic.Value(bool), ) WaitError!PushResultEncola; con .reject y la cola llena espera (sin sondeo) a que
haya sitio hasta deadline. cancel se re-evalúa en cada
despertar: quien lo pone a true debe llamar a wakeAll().
Con .drop_oldest no espera nunca.
bounded_queue.BoundedQueue.popfn · línea 242
pub fn pop(self: *Self) PopResultSaca el más viejo sin bloquear.
bounded_queue.BoundedQueue.popWaitfn · línea 254
pub fn popWait(self: *Self, deadline: time.Deadline) error{ Closed, Timeout }!PopResultComo pop, esperando hasta deadline si está vacía.
error.Closed sólo cuando está cerrada Y vacía.
bounded_queue.BoundedQueue.takeDiscontinuityfn · línea 283
pub fn takeDiscontinuity(self: *Self) booltrue (una vez) si hubo expulsiones desde la última consulta.
Para consumidores por lotes que no usan pop.
bounded_queue.BoundedQueue.drainIntofn · línea 291
pub fn drainInto(self: *Self, out: []T) usizeMueve hasta out.len items a out (propiedad plena, sin reserva).
bounded_queue.BoundedQueue.beginDrainfn · línea 300
pub fn beginDrain(self: *Self, out: []T) usizeComo drainInto, pero lo sacado SIGUE contando contra la
capacidad hasta settleDrain. Un único consumidor: begin/settle
estrictamente emparejados.
bounded_queue.BoundedQueue.settleDrainfn · línea 311
pub fn settleDrain(self: *Self, held: []const T, evicted: []T) usizeLiquida el drenado en curso: held (lo que NO se pudo entregar,
en su orden original, prefijo o subconjunto ordenado de lo sacado)
vuelve al FRENTE. En .reject siempre cabe (invariante len + reserved <= capacity) y devuelve 0. En .drop_oldest lo que no
quepa se descarta empezando por el más viejo de held: esos items
se copian a evicted (el llamador es su dueño; evicted.len debe
alcanzar held.len) y se devuelve cuántos.
BoundedQueuefn · línea 52
pub fn BoundedQueue(comptime T: type) typeSin ///.
BoundedQueue.InitErrorconst · línea 56
pub const InitError = error{ InvalidParameter, OutOfMemory }Sin ///.
BoundedQueue.Errorconst · línea 57
pub const Error = error{Closed}Sin ///.
BoundedQueue.WaitErrorconst · línea 58
pub const WaitError = error{ Closed, Timeout, Cancelled }Sin ///.
BoundedQueue.PushResulttype · línea 60
pub const PushResult = unionSin ///.
BoundedQueue.PopResulttype · línea 70
pub const PopResult = unionSin ///.
BoundedQueue.Statstype · línea 77
pub const Stats = structSin ///.
BoundedQueue.initfn · línea 97
pub fn init(allocator: std.mem.Allocator, opts: Options) InitError!SelfSin ///.
BoundedQueue.deinitfn · línea 108
pub fn deinit(self: *Self) voidLibera el anillo. Los items que queden NO se destruyen: si T
posee recursos, vacíala antes con drainInto.
BoundedQueue.capacityfn · línea 117
pub fn capacity(self: *const Self) usizeSin ///.
BoundedQueue.lenfn · línea 121
pub fn len(self: *Self) usizeSin ///.
BoundedQueue.reservedCountfn · línea 127
pub fn reservedCount(self: *Self) usizeSin ///.
BoundedQueue.statsfn · línea 133
pub fn stats(self: *Self) StatsSin ///.
BoundedQueue.closefn · línea 142
pub fn close(self: *Self) voidCierra la cola: los push posteriores fallan con error.Closed, y
los que esperan se despiertan. Lo ya encolado se puede seguir
sacando.
BoundedQueue.wakeAllfn · línea 154
pub fn wakeAll(self: *Self) voidDespierta a todos los que esperan para que re-evalúen su plazo o su flag de cancelación.
BoundedQueue.pushfn · línea 165
pub fn push(self: *Self, item: T) Error!PushResultEncola sin bloquear.
BoundedQueue.pushWaitfn · línea 180
pub fn pushWait( self: *Self, item: T, deadline: time.Deadline, cancel: ?*const std.atomic.Value(bool), ) WaitError!PushResultEncola; con .reject y la cola llena espera (sin sondeo) a que
haya sitio hasta deadline. cancel se re-evalúa en cada
despertar: quien lo pone a true debe llamar a wakeAll().
Con .drop_oldest no espera nunca.
BoundedQueue.popfn · línea 242
pub fn pop(self: *Self) PopResultSaca el más viejo sin bloquear.
BoundedQueue.popWaitfn · línea 254
pub fn popWait(self: *Self, deadline: time.Deadline) error{ Closed, Timeout }!PopResultComo pop, esperando hasta deadline si está vacía.
error.Closed sólo cuando está cerrada Y vacía.
BoundedQueue.takeDiscontinuityfn · línea 283
pub fn takeDiscontinuity(self: *Self) booltrue (una vez) si hubo expulsiones desde la última consulta.
Para consumidores por lotes que no usan pop.
BoundedQueue.drainIntofn · línea 291
pub fn drainInto(self: *Self, out: []T) usizeMueve hasta out.len items a out (propiedad plena, sin reserva).
BoundedQueue.beginDrainfn · línea 300
pub fn beginDrain(self: *Self, out: []T) usizeComo drainInto, pero lo sacado SIGUE contando contra la
capacidad hasta settleDrain. Un único consumidor: begin/settle
estrictamente emparejados.
BoundedQueue.settleDrainfn · línea 311
pub fn settleDrain(self: *Self, held: []const T, evicted: []T) usizeLiquida el drenado en curso: held (lo que NO se pudo entregar,
en su orden original, prefijo o subconjunto ordenado de lo sacado)
vuelve al FRENTE. En .reject siempre cabe (invariante len + reserved <= capacity) y devuelve 0. En .drop_oldest lo que no
quepa se descarta empezando por el más viejo de held: esos items
se copian a evicted (el llamador es su dueño; evicted.len debe
alcanzar held.len) y se devuelve cuántos.