
Tokens.pudu
Pudu19 lines1.0 KB
1/** @Utils.Tokens.Module — cancellation tokens that fire when any of several does */2module PuduLangHttpClient.Utils.Tokens34import Std.Concurrent.Cancel as Cancel5import Std.Sync as Sync6import PuduLangHttpClient.Constants.Defaults as Defaults78910export fn linked(parents: &Array[Cancel.Token], millis: Int) -> Cancel.Token {11 var ancestors: Array[Sync.Cell[Option[Cancel.Reason]]] = []12 var deadline = if millis == Defaults.INFINITE { Defaults.INFINITE } else { clock() + (if millis < 0 { 0 } else { millis }) }13 for parent in parents {14 ancestors = ancestors.concat(parent.ancestors).push(parent.own)15 if parent.deadline != Defaults.INFINITE && (deadline == Defaults.INFINITE || parent.deadline < deadline) { deadline = parent.deadline }16 }17 Cancel.Token{own: Sync.cell(None), guard: Sync.mutex(), ancestors: ancestors, deadline: deadline}18}19