let iter_all section f =
  try
    locked := true ;
    exported_macros := Mset.empty ;
    Array.iter
      (fun (s,t) ->
         let k = s_index s in
         if not (Dset.is_empty gsection.(k)) then
           begin
             let job = if is_macro_section s then do_export f else f in
             section t ; Dset.iter job gsection.(k) ;
           end
      ) gtoc ;
    locked := false ;
    exported_macros := Mset.empty ;
  with e ->
    locked := false ;
    exported_macros := Mset.empty ;
    raise e