1 | % (c) 2016-2025 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 | :- module(performance_messages, | |
6 | [ | |
7 | performance_monitoring_on/0, | |
8 | perfmessage/1, perfmessage/2, perfmessage/3, perfmessage/4, | |
9 | perfmessage_wf/5, | |
10 | perfmessage_bexpr/3, perfmessages_bexpr/3, perfmessages_bexpr_call/4, | |
11 | cond_perfmessage/2, | |
12 | perfmessagecall/3, perfmessagecall/4, | |
13 | perf_format/2, | |
14 | perf_format_wf/3, | |
15 | toggle_perfmessages/0 | |
16 | ]). | |
17 | ||
18 | :- meta_predicate perfmessagecall(*,0,*). | |
19 | :- meta_predicate perfmessagecall(*,*,0,*). | |
20 | :- meta_predicate perfmessages_bexpr_call(*,*,*,0). | |
21 | ||
22 | :- use_module(module_information,[module_info/2]). | |
23 | :- module_info(group,profiling). | |
24 | :- module_info(description,'This module allows to generate performance messages.'). | |
25 | ||
26 | :- use_module(preferences). | |
27 | :- use_module(error_manager). | |
28 | :- use_module(tools_printing,[format_with_colour/4]). | |
29 | :- use_module(tools_strings,[ajoin/2]). | |
30 | :- use_module(translate,[translate_bexpression_with_limit/3]). | |
31 | ||
32 | % ------------------------------------------- | |
33 | ||
34 | :- dynamic performance_monitoring_on/0. % should we use a preference | |
35 | %performance_monitoring_on. | |
36 | ||
37 | performance_monitoring_on :- get_preference(performance_monitoring_on,true). | |
38 | ||
39 | toggle_perfmessages :- print('TURNING PERF-MESSAGES '), | |
40 | (performance_monitoring_on | |
41 | -> set_preference(performance_monitoring_on,false), print('OFF') | |
42 | ; set_preference(performance_monitoring_on,true), print('ON')),nl. | |
43 | ||
44 | perf_format(M,Args) :- preference(performance_monitoring_on,true),!, | |
45 | format_with_colour(user_output,[blue],'==PERF-MESSAGE==> ',[]), | |
46 | format_with_colour(user_output,[blue],M,Args). | |
47 | perf_format(_,_). | |
48 | ||
49 | perf_format_wf(M,Args,WF) :- preference(performance_monitoring_on,true),!, | |
50 | format_with_colour(user_output,[blue],'==PERF-MESSAGE==> ',[]), | |
51 | format_with_colour(user_output,[blue],M,Args), | |
52 | kernel_waitflags:portray_call_stack(WF). | |
53 | perf_format_wf(_,_,_). | |
54 | ||
55 | perfmessage(M) :- preference(performance_monitoring_on,true),!, | |
56 | format_with_colour(user_output,[blue],'==PERF-MESSAGE==> ~w~n',[M]). | |
57 | perfmessage(_). | |
58 | ||
59 | :- use_module(library(lists),[maplist/2]). | |
60 | % conditional perfmessage | |
61 | cond_perfmessage(Prefs,M) :- preference(performance_monitoring_on,true), | |
62 | maplist(prefset,Prefs), | |
63 | !, | |
64 | format_with_colour(user_output,[blue],'==PERF-MESSAGE==> ~w~n',[M]). | |
65 | cond_perfmessage(_,_). | |
66 | ||
67 | prefset(P/V) :- get_preference(P,V). | |
68 | ||
69 | perfmessage(M,Location) :- preference(performance_monitoring_on,true),!, | |
70 | add_message(performance_message,'==PERF-MESSAGE==> ',M,Location). | |
71 | perfmessage(_,_). | |
72 | ||
73 | perfmessage(Category,M,Location) :- preference(performance_monitoring_on,true), | |
74 | show_message(Category), | |
75 | !, | |
76 | add_message(performance_message,'==PERF-MESSAGE==> ',M,Location). | |
77 | perfmessage(_,_,_). | |
78 | ||
79 | perfmessage(Category,Msg,Term,Location) :- preference(performance_monitoring_on,true), | |
80 | show_message(Category), | |
81 | !, | |
82 | ajoin(['==PERF-MESSAGE==> ',Msg],M), | |
83 | add_message(performance_message,M,Term,Location). | |
84 | perfmessage(_,_,_,_). | |
85 | ||
86 | :- use_module(probsrc(kernel_waitflags),[add_message_wf/5]). | |
87 | perfmessage_wf(Category,Msg,Term,Location,WF) :- preference(performance_monitoring_on,true), | |
88 | show_message(Category), | |
89 | !, | |
90 | ajoin(['==PERF-MESSAGE==> ',Msg],M), | |
91 | add_message_wf(performance_message,M,Term,Location,WF). | |
92 | perfmessage_wf(_,_,_,_,_). | |
93 | ||
94 | % perfmessage where we provide a BExpr as location and part of message | |
95 | perfmessage_bexpr(Category,Msg,BExpr) :- | |
96 | (Msg = [_|_] -> List=Msg ; List=[Msg]), | |
97 | perfmessages_bexpr(Category,List,BExpr). | |
98 | ||
99 | ||
100 | % perfmessage where we provide a BExpr as location and messages to be joined | |
101 | perfmessages_bexpr(Category,Msgs,BExpr) :- preference(performance_monitoring_on,true), | |
102 | show_message(Category), | |
103 | !, | |
104 | translate_bexpression_with_limit(BExpr,100,TS), | |
105 | append(Msgs,[TS],List), | |
106 | ajoin(List,M), | |
107 | add_message(performance_message,'==PERF-MESSAGE==> ',M,BExpr). | |
108 | perfmessages_bexpr(_,_,_). | |
109 | ||
110 | % a version of the above performing a call before printing the message | |
111 | perfmessages_bexpr_call(Category,Msgs,BExpr,Call) :- preference(performance_monitoring_on,true), | |
112 | show_message(Category),!, | |
113 | call(Call), | |
114 | perfmessages_bexpr(Category,Msgs,BExpr). | |
115 | perfmessages_bexpr_call(_,_,_,_). | |
116 | ||
117 | perfmessagecall(M,Call,Location) :- preference(performance_monitoring_on,true),!, | |
118 | add_message(performance_message,'==PERF-MESSAGE==> ',M,Location), | |
119 | call(Call),nl(user_output). | |
120 | perfmessagecall(_,_,_). | |
121 | ||
122 | ||
123 | perfmessagecall(Category,M,Call,Location) :- preference(performance_monitoring_on,true), | |
124 | show_message(Category), | |
125 | !, | |
126 | add_message(performance_message,'==PERF-MESSAGE==> ',M,Location), | |
127 | call(Call),nl(user_output). | |
128 | perfmessagecall(_,_,_,_). | |
129 | ||
130 | % decide based upon category and current preferences whether to show the message or not | |
131 | show_message(reify) :- !, | |
132 | get_preference(data_validation_mode,false). | |
133 | show_message(good(_)) :- !, | |
134 | get_preference(provide_trace_information,true). | |
135 | show_message(_Category). |