@@ -145,6 +145,20 @@ pub fn call_printk_cont(lvl: LogLevel, args: fmt::Arguments<'_>) {
145
145
/// ```
146
146
#[ macro_export]
147
147
macro_rules! printk (
148
+ ( once, $( $arg: tt) +) => { {
149
+ use :: core:: sync:: atomic:: { AtomicBool , Ordering } ;
150
+
151
+ #[ link_section = ".data.once" ]
152
+ static ONCE : AtomicBool = AtomicBool :: new( false ) ;
153
+
154
+ if ONCE
155
+ . compare_exchange( false , true , Ordering :: Relaxed , Ordering :: Relaxed )
156
+ . is_ok( )
157
+ {
158
+ $crate:: printk!( $( $arg) +) ;
159
+ }
160
+ } } ;
161
+
148
162
( target: $target: expr, $lvl: expr, $( $arg: tt) +) => { {
149
163
$crate:: print:: call_printk(
150
164
$lvl,
@@ -176,6 +190,13 @@ macro_rules! printk (
176
190
/// ```
177
191
#[ macro_export]
178
192
macro_rules! pr_emerg (
193
+ ( once, target: $target: expr, $( $arg: tt) +) => (
194
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: EMERG , $( $arg) +)
195
+ ) ;
196
+ ( once, $( $arg: tt) +) => (
197
+ $crate:: printk!( once, $crate:: print:: LogLevel :: EMERG , $( $arg) +)
198
+ ) ;
199
+
179
200
( target: $target: expr, $( $arg: tt) +) => (
180
201
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: EMERG , $( $arg) +)
181
202
) ;
@@ -203,6 +224,13 @@ macro_rules! pr_emerg (
203
224
/// ```
204
225
#[ macro_export]
205
226
macro_rules! pr_alert (
227
+ ( once, target: $target: expr, $( $arg: tt) +) => (
228
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: ALERT , $( $arg) +)
229
+ ) ;
230
+ ( once, $( $arg: tt) +) => (
231
+ $crate:: printk!( once, $crate:: print:: LogLevel :: ALERT , $( $arg) +)
232
+ ) ;
233
+
206
234
( target: $target: expr, $( $arg: tt) +) => (
207
235
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: ALERT , $( $arg) +)
208
236
) ;
@@ -230,6 +258,13 @@ macro_rules! pr_alert (
230
258
/// ```
231
259
#[ macro_export]
232
260
macro_rules! pr_crit (
261
+ ( once, target: $target: expr, $( $arg: tt) +) => (
262
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: CRIT , $( $arg) +)
263
+ ) ;
264
+ ( once, $( $arg: tt) +) => (
265
+ $crate:: printk!( once, $crate:: print:: LogLevel :: CRIT , $( $arg) +)
266
+ ) ;
267
+
233
268
( target: $target: expr, $( $arg: tt) +) => (
234
269
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: CRIT , $( $arg) +)
235
270
) ;
@@ -257,6 +292,13 @@ macro_rules! pr_crit (
257
292
/// ```
258
293
#[ macro_export]
259
294
macro_rules! pr_err (
295
+ ( once, target: $target: expr, $( $arg: tt) +) => (
296
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: ERR , $( $arg) +)
297
+ ) ;
298
+ ( once, $( $arg: tt) +) => (
299
+ $crate:: printk!( once, $crate:: print:: LogLevel :: ERR , $( $arg) +)
300
+ ) ;
301
+
260
302
( target: $target: expr, $( $arg: tt) +) => (
261
303
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: ERR , $( $arg) +)
262
304
) ;
@@ -284,6 +326,13 @@ macro_rules! pr_err (
284
326
/// ```
285
327
#[ macro_export]
286
328
macro_rules! pr_warn (
329
+ ( once, target: $target: expr, $( $arg: tt) +) => (
330
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: WARNING , $( $arg) +)
331
+ ) ;
332
+ ( once, $( $arg: tt) +) => (
333
+ $crate:: printk!( once, $crate:: print:: LogLevel :: WARNING , $( $arg) +)
334
+ ) ;
335
+
287
336
( target: $target: expr, $( $arg: tt) +) => (
288
337
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: WARNING , $( $arg) +)
289
338
) ;
@@ -311,6 +360,13 @@ macro_rules! pr_warn (
311
360
/// ```
312
361
#[ macro_export]
313
362
macro_rules! pr_notice (
363
+ ( once, target: $target: expr, $( $arg: tt) +) => (
364
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: NOTICE , $( $arg) +)
365
+ ) ;
366
+ ( once, $( $arg: tt) +) => (
367
+ $crate:: printk!( once, $crate:: print:: LogLevel :: NOTICE , $( $arg) +)
368
+ ) ;
369
+
314
370
( target: $target: expr, $( $arg: tt) +) => (
315
371
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: NOTICE , $( $arg) +)
316
372
) ;
@@ -339,6 +395,13 @@ macro_rules! pr_notice (
339
395
#[ macro_export]
340
396
#[ doc( alias = "print" ) ]
341
397
macro_rules! pr_info (
398
+ ( once, target: $target: expr, $( $arg: tt) +) => (
399
+ $crate:: printk!( once, target: $target, $crate:: print:: LogLevel :: INFO , $( $arg) +)
400
+ ) ;
401
+ ( once, $( $arg: tt) +) => (
402
+ $crate:: printk!( once, $crate:: print:: LogLevel :: INFO , $( $arg) +)
403
+ ) ;
404
+
342
405
( target: $target: expr, $( $arg: tt) +) => (
343
406
$crate:: printk!( target: $target, $crate:: print:: LogLevel :: INFO , $( $arg) +)
344
407
) ;
0 commit comments