1eda14cbcSMatt Macy /*
2eda14cbcSMatt Macy  * CDDL HEADER START
3eda14cbcSMatt Macy  *
4eda14cbcSMatt Macy  * The contents of this file are subject to the terms of the
5eda14cbcSMatt Macy  * Common Development and Distribution License, Version 1.0 only
6eda14cbcSMatt Macy  * (the "License").  You may not use this file except in compliance
7eda14cbcSMatt Macy  * with the License.
8eda14cbcSMatt Macy  *
9eda14cbcSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10271171e0SMartin Matuska  * or https://opensource.org/licenses/CDDL-1.0.
11eda14cbcSMatt Macy  * See the License for the specific language governing permissions
12eda14cbcSMatt Macy  * and limitations under the License.
13eda14cbcSMatt Macy  *
14eda14cbcSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
15eda14cbcSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16eda14cbcSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
17eda14cbcSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
18eda14cbcSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
19eda14cbcSMatt Macy  *
20eda14cbcSMatt Macy  * CDDL HEADER END
21eda14cbcSMatt Macy  */
22eda14cbcSMatt Macy /*
23eda14cbcSMatt Macy  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
24eda14cbcSMatt Macy  * Use is subject to license terms.
25eda14cbcSMatt Macy  */
26eda14cbcSMatt Macy 
27eda14cbcSMatt Macy #ifndef _LIBSPL_SYS_CMN_ERR_H
28eda14cbcSMatt Macy #define	_LIBSPL_SYS_CMN_ERR_H
29eda14cbcSMatt Macy 
30*2a58b312SMartin Matuska #include <atomic.h>
31*2a58b312SMartin Matuska 
32*2a58b312SMartin Matuska #define	cmn_err_once(ce, ...)				\
33*2a58b312SMartin Matuska do {							\
34*2a58b312SMartin Matuska 	static volatile uint32_t printed = 0;		\
35*2a58b312SMartin Matuska 	if (atomic_cas_32(&printed, 0, 1) == 0) {	\
36*2a58b312SMartin Matuska 		cmn_err(ce, __VA_ARGS__);		\
37*2a58b312SMartin Matuska 	}						\
38*2a58b312SMartin Matuska } while (0)
39*2a58b312SMartin Matuska 
40*2a58b312SMartin Matuska #define	vcmn_err_once(ce, fmt, ap)			\
41*2a58b312SMartin Matuska do {							\
42*2a58b312SMartin Matuska 	static volatile uint32_t printed = 0;		\
43*2a58b312SMartin Matuska 	if (atomic_cas_32(&printed, 0, 1) == 0) {	\
44*2a58b312SMartin Matuska 		vcmn_err(ce, fmt, ap);			\
45*2a58b312SMartin Matuska 	}						\
46*2a58b312SMartin Matuska } while (0)
47*2a58b312SMartin Matuska 
48*2a58b312SMartin Matuska #define	zcmn_err_once(zone, ce, ...)			\
49*2a58b312SMartin Matuska do {							\
50*2a58b312SMartin Matuska 	static volatile uint32_t printed = 0;		\
51*2a58b312SMartin Matuska 	if (atomic_cas_32(&printed, 0, 1) == 0) {	\
52*2a58b312SMartin Matuska 		zcmn_err(zone, ce, __VA_ARGS__);	\
53*2a58b312SMartin Matuska 	}						\
54*2a58b312SMartin Matuska } while (0)
55*2a58b312SMartin Matuska 
56*2a58b312SMartin Matuska #define	vzcmn_err_once(zone, ce, fmt, ap)		\
57*2a58b312SMartin Matuska do {							\
58*2a58b312SMartin Matuska 	static volatile uint32_t printed = 0;		\
59*2a58b312SMartin Matuska 	if (atomic_cas_32(&printed, 0, 1) == 0) {	\
60*2a58b312SMartin Matuska 		vzcmn_err(zone, ce, fmt, ap);		\
61*2a58b312SMartin Matuska 	}						\
62*2a58b312SMartin Matuska } while (0)
63*2a58b312SMartin Matuska 
64eda14cbcSMatt Macy #endif
65