--- ../../dir/mldonkey/src/utils/net/basicSocket.ml 2004-01-30 07:11:07.000000000 +0100 +++ src/utils/net/basicSocket.ml 2004-02-03 17:29:46.000000000 +0100 @@ -77,8 +77,8 @@ type timer = { mutable next_time : float; time_handler : timer -> unit; - mutable applied : bool; mutable delay : float; + mutable reactivate : bool; } let nb_sockets = ref 0 @@ -286,51 +285,56 @@ let rec iter_timer timers time = match timers with - [] -> [] - | t :: timers -> - if t.applied then - iter_timer timers time + [] -> () + | p::r -> timeout := minf (p.next_time -. time) !timeout + +let rec insert_timer t timl = + match timl with + | [] -> [t] + | p::r-> + if t.next_time <= p.next_time + then + t :: timl else - begin - timeout := minf (t.next_time -. time) !timeout; - t :: (iter_timer timers time) - end + p :: insert_timer t r let add_timer delay f = - timers := { + timers := insert_timer + { next_time = !current_time +. delay; time_handler = f; - applied = false; delay = delay; - } :: !timers + reactivate = false; + } + !timers let reactivate_timer t = - if t.applied then begin + if t.reactivate then + begin t.next_time <- !current_time +. t.delay; - t.applied <- false; + timers:=insert_timer t !timers end let add_session_timer enabler delay f = - let f t = - if !enabler then begin - reactivate_timer t; - f () - end - in - add_timer delay f + let f t = f () in + timers := insert_timer + { + next_time = !current_time +. delay; + time_handler = f; + delay = delay; + reactivate = !enabler; + } + !timers -let add_infinite_timer delay f = add_session_timer (ref true) delay f +let add_infinite_timer delay f = + let f t = f () in + add_session_timer (ref true) delay f let add_session_option_timer enabler option f = - let f t = - if !enabler then begin - t.delay <- !!option; - reactivate_timer t; - f () - end - in - add_timer !!option f + let f t = f () in + add_session_timer enabler !!option f + let add_infinite_option_timer option f = add_session_option_timer (ref true) option f @@ -366,23 +370,33 @@ ); exec_tasks tail -let rec exec_timers = function - [] -> () +let rec exec_timers l = + let rec exec_timers_aux l acc = + match l with + [] -> [] | t :: tail -> - ( - if (not t.applied) && t.next_time <= !current_time then begin - t.applied <- true; - try t.time_handler t with _ -> () + if (t.next_time <= !current_time) then + begin + timers:=tail; + begin + try + t.time_handler t + with _ -> (); + end; + exec_timers_aux tail (t::acc) end - ); - exec_timers tail + else + acc + in + List.iter reactivate_timer (exec_timers_aux l []) + let loop_delay = ref 0.02 let loop () = while true do try - if !loop_delay > 0. then (try select [] !loop_delay; with _ -> ()); +(* if !loop_delay > 0. then (try select [] !loop_delay; with _ -> ());*) let time = update_time () in exec_tasks !fd_tasks; exec_hooks !after_select_hooks; @@ -399,7 +413,7 @@ (* lprintf "before iter_timer\n"; *) let time = update_time () in timeout := infinite_timeout; - timers := iter_timer !timers time; + iter_timer !timers time; (* lprintf "before iter_task\n"; *) let old_tasks = !fd_tasks in