let iter_dnodes f d =
  let rec iter marked f d =
    if not (Sint.mem d.dn_id !marked) then
      ( (f d:unit) ; marked := Sint.add d.dn_id !marked ;
        List.iter (iter marked f) d.dn_source )
  in iter (ref Sint.empty) f d