| 1 | % (c) 2009-2019 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
| 2 | % Heinrich Heine Universitaet Duesseldorf | |
| 3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
| 4 | ||
| 5 | ||
| 6 | :- module(tools_timeout, [ | |
| 7 | time_out_call/2, time_out_call/1, | |
| 8 | time_out_with_factor_call/3, time_out_with_factor_call/4, | |
| 9 | get_time_out_with_factor/2 | |
| 10 | ]). | |
| 11 | ||
| 12 | :- use_module(module_information). | |
| 13 | ||
| 14 | :- module_info(group,infrastructure). | |
| 15 | :- module_info(description,'This module contains higher-level timeout helper predicates.'). | |
| 16 | ||
| 17 | ||
| 18 | :- meta_predicate time_out_with_factor_call(0,*,0). | |
| 19 | :- meta_predicate time_out_call(0,0). | |
| 20 | :- meta_predicate time_out_call(0). | |
| 21 | ||
| 22 | :- use_module(tools_meta,[safe_time_out/3]). | |
| 23 | :- use_module(tools_printing,[print_term_summary/1]). | |
| 24 | :- use_module(error_manager,[add_message/3, add_error_and_fail/3]). | |
| 25 | :- use_module(tools_strings,[predicate_functor/3]). | |
| 26 | :- use_module(preferences,[get_preference/2]). | |
| 27 | ||
| 28 | time_out_call(Call,Res) :- | |
| 29 | get_preference(time_out,CurTO), | |
| 30 | safe_time_out(Call,CurTO,TimeOutRes), | |
| 31 | (TimeOutRes=time_out | |
| 32 | -> predicate_functor(Call,F,N), | |
| 33 | add_message(self_check,'Time out occurred: ',F/N), | |
| 34 | print_term_summary(Call), | |
| 35 | call(Res) | |
| 36 | ; true). | |
| 37 | ||
| 38 | time_out_call(Call) :- | |
| 39 | time_out_call(Call,add_error_and_fail(time_out_call,'*** TIMEOUT occurred: ',Call)). | |
| 40 | ||
| 41 | :- use_module(preferences,[get_time_out_preference_with_factor/2]). | |
| 42 | get_time_out_with_factor(fixed_time_out(Fixedms),TORes) :- % also allow to specify a hard time out value | |
| 43 | !, TORes = Fixedms. | |
| 44 | get_time_out_with_factor(Factor,Res) :- | |
| 45 | get_time_out_preference_with_factor(Factor,Res). | |
| 46 | ||
| 47 | time_out_with_factor_call(Call,Factor,Res) :- | |
| 48 | time_out_with_factor_call(Call,Factor,[],Res). | |
| 49 | time_out_with_factor_call(Call,Factor,Options,Res) :- | |
| 50 | get_time_out_with_factor(Factor,TO), | |
| 51 | %%print(time_out(Call,TO)),nl, | |
| 52 | statistics(runtime,[Start,_]), | |
| 53 | on_exception(enumeration_warning(_,_,_,_,_), | |
| 54 | safe_time_out(Call,TO,TimeOutRes), | |
| 55 | (TimeOutRes = time_out,EnumWarning=true)), | |
| 56 | (TimeOutRes=time_out | |
| 57 | -> (member(silent,Options) -> true | |
| 58 | ; statistics(runtime,[Stop,_]), | |
| 59 | predicate_functor(Call,F,N), | |
| 60 | (EnumWarning==true | |
| 61 | -> add_message(self_check,'Time-out forced by enumeration warning: ',F/N) | |
| 62 | ; add_message(self_check,'Time-out occurred: ',F/N) | |
| 63 | ), | |
| 64 | print_term_summary(Call), | |
| 65 | Diff is Stop-Start, | |
| 66 | print(Diff), print(' ms runtime (time_out = '), print(TO), print(' ms)'),nl | |
| 67 | ), | |
| 68 | call(Res) | |
| 69 | ; true). |