@@ -46,17 +46,21 @@ typedef struct {
46
46
ulog_level_t threshold ;
47
47
} subscriber_t ;
48
48
49
+ static ulog_level_t ulog_lowest_log_level ();
50
+
49
51
// =============================================================================
50
52
// local storage
51
53
52
54
static subscriber_t s_subscribers [ULOG_MAX_SUBSCRIBERS ];
53
55
static char s_message [ULOG_MAX_MESSAGE_LENGTH ];
56
+ static ulog_level_t s_lowest_log_level ;
54
57
55
58
// =============================================================================
56
59
// user-visible code
57
60
58
61
void ulog_init () {
59
62
memset (s_subscribers , 0 , sizeof (s_subscribers ));
63
+ s_lowest_log_level = ulog_lowest_log_level ();
60
64
}
61
65
62
66
// search the s_subscribers table to install or update fn
@@ -80,6 +84,8 @@ ulog_err_t ulog_subscribe(ulog_function_t fn, ulog_level_t threshold) {
80
84
}
81
85
s_subscribers [available_slot ].fn = fn ;
82
86
s_subscribers [available_slot ].threshold = threshold ;
87
+ s_lowest_log_level = ulog_lowest_log_level (); // Update lowest log level
88
+
83
89
return ULOG_ERR_NONE ;
84
90
}
85
91
@@ -89,6 +95,7 @@ ulog_err_t ulog_unsubscribe(ulog_function_t fn) {
89
95
for (i = 0 ; i < ULOG_MAX_SUBSCRIBERS ; i ++ ) {
90
96
if (s_subscribers [i ].fn == fn ) {
91
97
s_subscribers [i ].fn = NULL ; // mark as empty
98
+ s_lowest_log_level = ulog_lowest_log_level (); // Update lowest log level
92
99
return ULOG_ERR_NONE ;
93
100
}
94
101
}
@@ -109,6 +116,11 @@ const char *ulog_level_name(ulog_level_t severity) {
109
116
}
110
117
111
118
void ulog_message (ulog_level_t severity , const char * fmt , ...) {
119
+ // Do not evaluate the log message if it will never be logged
120
+ if (severity < s_lowest_log_level ){
121
+ return ;
122
+ }
123
+
112
124
va_list ap ;
113
125
int i ;
114
126
va_start (ap , fmt );
@@ -127,4 +139,17 @@ void ulog_message(ulog_level_t severity, const char *fmt, ...) {
127
139
// =============================================================================
128
140
// private code
129
141
142
+ static ulog_level_t ulog_lowest_log_level (){
143
+ ulog_level_t lowest_log_level = ULOG_ALWAYS_LEVEL ;
144
+ int i ;
145
+ for (i = 0 ; i < ULOG_MAX_SUBSCRIBERS ; i ++ ) {
146
+ if (s_subscribers [i ].fn != NULL ){
147
+ if (s_subscribers [i ].threshold < lowest_log_level ) {
148
+ lowest_log_level = s_subscribers [i ].threshold ;
149
+ }
150
+ }
151
+ }
152
+ return lowest_log_level ;
153
+ }
154
+
130
155
#endif // #ifdef ULOG_ENABLED
0 commit comments