xref: /freebsd-src/contrib/ofed/opensm/include/opensm/osm_log.h (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2009 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2012 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  */
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky /*
37*d6b92ffaSHans Petter Selasky  * Abstract:
38*d6b92ffaSHans Petter Selasky  * 	Declaration of osm_log_t.
39*d6b92ffaSHans Petter Selasky  *	This object represents the log file.
40*d6b92ffaSHans Petter Selasky  *	This object is part of the OpenSM family of objects.
41*d6b92ffaSHans Petter Selasky  */
42*d6b92ffaSHans Petter Selasky 
43*d6b92ffaSHans Petter Selasky #ifndef _OSM_LOG_H_
44*d6b92ffaSHans Petter Selasky #define _OSM_LOG_H_
45*d6b92ffaSHans Petter Selasky 
46*d6b92ffaSHans Petter Selasky #ifndef __WIN__
47*d6b92ffaSHans Petter Selasky #include <syslog.h>
48*d6b92ffaSHans Petter Selasky #endif
49*d6b92ffaSHans Petter Selasky #include <complib/cl_spinlock.h>
50*d6b92ffaSHans Petter Selasky #include <opensm/osm_base.h>
51*d6b92ffaSHans Petter Selasky #include <iba/ib_types.h>
52*d6b92ffaSHans Petter Selasky #include <stdio.h>
53*d6b92ffaSHans Petter Selasky 
54*d6b92ffaSHans Petter Selasky #ifdef __GNUC__
55*d6b92ffaSHans Petter Selasky #define STRICT_OSM_LOG_FORMAT __attribute__((format(printf, 3, 4)))
56*d6b92ffaSHans Petter Selasky #define STRICT_OSM_LOG_V2_FORMAT __attribute__((format(printf, 4, 5)))
57*d6b92ffaSHans Petter Selasky #else
58*d6b92ffaSHans Petter Selasky #define STRICT_OSM_LOG_FORMAT
59*d6b92ffaSHans Petter Selasky #define STRICT_OSM_LOG_V2_FORMAT
60*d6b92ffaSHans Petter Selasky #endif
61*d6b92ffaSHans Petter Selasky 
62*d6b92ffaSHans Petter Selasky #ifdef __cplusplus
63*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS extern "C" {
64*d6b92ffaSHans Petter Selasky #  define END_C_DECLS   }
65*d6b92ffaSHans Petter Selasky #else				/* !__cplusplus */
66*d6b92ffaSHans Petter Selasky #  define BEGIN_C_DECLS
67*d6b92ffaSHans Petter Selasky #  define END_C_DECLS
68*d6b92ffaSHans Petter Selasky #endif				/* __cplusplus */
69*d6b92ffaSHans Petter Selasky 
70*d6b92ffaSHans Petter Selasky BEGIN_C_DECLS
71*d6b92ffaSHans Petter Selasky #define LOG_ENTRY_SIZE_MAX		4096
72*d6b92ffaSHans Petter Selasky #define BUF_SIZE			LOG_ENTRY_SIZE_MAX
73*d6b92ffaSHans Petter Selasky #define __func__ __FUNCTION__
74*d6b92ffaSHans Petter Selasky #ifdef FILE_ID
75*d6b92ffaSHans Petter Selasky #define OSM_LOG_ENTER( OSM_LOG_PTR ) \
76*d6b92ffaSHans Petter Selasky 	osm_log_v2( OSM_LOG_PTR, OSM_LOG_FUNCS, FILE_ID, \
77*d6b92ffaSHans Petter Selasky 		    "%s: [\n", __func__);
78*d6b92ffaSHans Petter Selasky #define OSM_LOG_EXIT( OSM_LOG_PTR ) \
79*d6b92ffaSHans Petter Selasky 	osm_log_v2( OSM_LOG_PTR, OSM_LOG_FUNCS, FILE_ID, \
80*d6b92ffaSHans Petter Selasky 		    "%s: ]\n", __func__);
81*d6b92ffaSHans Petter Selasky #define OSM_LOG_IS_ACTIVE_V2( OSM_LOG_PTR, OSM_LOG_FUNCS ) \
82*d6b92ffaSHans Petter Selasky 	osm_log_is_active_v2( OSM_LOG_PTR, OSM_LOG_FUNCS, FILE_ID)
83*d6b92ffaSHans Petter Selasky #else
84*d6b92ffaSHans Petter Selasky #define OSM_LOG_ENTER( OSM_LOG_PTR ) \
85*d6b92ffaSHans Petter Selasky 	osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \
86*d6b92ffaSHans Petter Selasky 		 "%s: [\n", __func__);
87*d6b92ffaSHans Petter Selasky #define OSM_LOG_EXIT( OSM_LOG_PTR ) \
88*d6b92ffaSHans Petter Selasky 	osm_log( OSM_LOG_PTR, OSM_LOG_FUNCS, \
89*d6b92ffaSHans Petter Selasky 		 "%s: ]\n", __func__);
90*d6b92ffaSHans Petter Selasky #endif
91*d6b92ffaSHans Petter Selasky 
92*d6b92ffaSHans Petter Selasky /****h* OpenSM/Log
93*d6b92ffaSHans Petter Selasky * NAME
94*d6b92ffaSHans Petter Selasky *	Log
95*d6b92ffaSHans Petter Selasky *
96*d6b92ffaSHans Petter Selasky * DESCRIPTION
97*d6b92ffaSHans Petter Selasky *
98*d6b92ffaSHans Petter Selasky * AUTHOR
99*d6b92ffaSHans Petter Selasky *
100*d6b92ffaSHans Petter Selasky *********/
101*d6b92ffaSHans Petter Selasky typedef uint8_t osm_log_level_t;
102*d6b92ffaSHans Petter Selasky 
103*d6b92ffaSHans Petter Selasky #define OSM_LOG_NONE	0x00
104*d6b92ffaSHans Petter Selasky #define OSM_LOG_ERROR	0x01
105*d6b92ffaSHans Petter Selasky #define OSM_LOG_INFO	0x02
106*d6b92ffaSHans Petter Selasky #define OSM_LOG_VERBOSE	0x04
107*d6b92ffaSHans Petter Selasky #define OSM_LOG_DEBUG	0x08
108*d6b92ffaSHans Petter Selasky #define OSM_LOG_FUNCS	0x10
109*d6b92ffaSHans Petter Selasky #define OSM_LOG_FRAMES	0x20
110*d6b92ffaSHans Petter Selasky #define OSM_LOG_ROUTING	0x40
111*d6b92ffaSHans Petter Selasky #define OSM_LOG_ALL	0x7f
112*d6b92ffaSHans Petter Selasky #define OSM_LOG_SYS	0x80
113*d6b92ffaSHans Petter Selasky 
114*d6b92ffaSHans Petter Selasky /*
115*d6b92ffaSHans Petter Selasky 	DEFAULT - turn on ERROR and INFO only
116*d6b92ffaSHans Petter Selasky */
117*d6b92ffaSHans Petter Selasky #define OSM_LOG_DEFAULT_LEVEL		OSM_LOG_ERROR | OSM_LOG_INFO
118*d6b92ffaSHans Petter Selasky 
119*d6b92ffaSHans Petter Selasky /****s* OpenSM: Log/osm_log_t
120*d6b92ffaSHans Petter Selasky * NAME
121*d6b92ffaSHans Petter Selasky *	osm_log_t
122*d6b92ffaSHans Petter Selasky *
123*d6b92ffaSHans Petter Selasky * DESCRIPTION
124*d6b92ffaSHans Petter Selasky *
125*d6b92ffaSHans Petter Selasky * SYNOPSIS
126*d6b92ffaSHans Petter Selasky */
127*d6b92ffaSHans Petter Selasky typedef struct osm_log {
128*d6b92ffaSHans Petter Selasky 	osm_log_level_t level;
129*d6b92ffaSHans Petter Selasky 	cl_spinlock_t lock;
130*d6b92ffaSHans Petter Selasky 	unsigned long count;
131*d6b92ffaSHans Petter Selasky 	unsigned long max_size;
132*d6b92ffaSHans Petter Selasky 	boolean_t flush;
133*d6b92ffaSHans Petter Selasky 	FILE *out_port;
134*d6b92ffaSHans Petter Selasky 	boolean_t accum_log_file;
135*d6b92ffaSHans Petter Selasky 	boolean_t daemon;
136*d6b92ffaSHans Petter Selasky 	char *log_file_name;
137*d6b92ffaSHans Petter Selasky 	char *log_prefix;
138*d6b92ffaSHans Petter Selasky 	osm_log_level_t per_mod_log_tbl[256];
139*d6b92ffaSHans Petter Selasky } osm_log_t;
140*d6b92ffaSHans Petter Selasky /*********/
141*d6b92ffaSHans Petter Selasky 
142*d6b92ffaSHans Petter Selasky #define OSM_LOG_MOD_NAME_MAX	32
143*d6b92ffaSHans Petter Selasky 
144*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_get_log_per_module
145*d6b92ffaSHans Petter Selasky  * NAME
146*d6b92ffaSHans Petter Selasky  *	osm_get_log_per_module
147*d6b92ffaSHans Petter Selasky  *
148*d6b92ffaSHans Petter Selasky  * DESCRIPTION
149*d6b92ffaSHans Petter Selasky  *	This looks up the given file ID in the per module log table.
150*d6b92ffaSHans Petter Selasky  *	NOTE: this code is not thread safe. Need to grab the lock before
151*d6b92ffaSHans Petter Selasky  *	calling it.
152*d6b92ffaSHans Petter Selasky  *
153*d6b92ffaSHans Petter Selasky  * SYNOPSIS
154*d6b92ffaSHans Petter Selasky  */
155*d6b92ffaSHans Petter Selasky osm_log_level_t osm_get_log_per_module(IN osm_log_t * p_log,
156*d6b92ffaSHans Petter Selasky 				       IN const int file_id);
157*d6b92ffaSHans Petter Selasky /*
158*d6b92ffaSHans Petter Selasky  * PARAMETERS
159*d6b92ffaSHans Petter Selasky  *	p_log
160*d6b92ffaSHans Petter Selasky  *		[in] Pointer to a Log object to construct.
161*d6b92ffaSHans Petter Selasky  *
162*d6b92ffaSHans Petter Selasky  *	file_id
163*d6b92ffaSHans Petter Selasky  *		[in] File ID for module
164*d6b92ffaSHans Petter Selasky  *
165*d6b92ffaSHans Petter Selasky  * RETURN VALUES
166*d6b92ffaSHans Petter Selasky  *	The log level from the per module logging structure for this file ID.
167*d6b92ffaSHans Petter Selasky  *********/
168*d6b92ffaSHans Petter Selasky 
169*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_set_log_per_module
170*d6b92ffaSHans Petter Selasky  * NAME
171*d6b92ffaSHans Petter Selasky  *	osm_set_log_per_module
172*d6b92ffaSHans Petter Selasky  *
173*d6b92ffaSHans Petter Selasky  * DESCRIPTION
174*d6b92ffaSHans Petter Selasky  *	This sets log level for the given file ID in the per module log table.
175*d6b92ffaSHans Petter Selasky  *	NOTE: this code is not thread safe. Need to grab the lock before
176*d6b92ffaSHans Petter Selasky  *	calling it.
177*d6b92ffaSHans Petter Selasky  *
178*d6b92ffaSHans Petter Selasky  * SYNOPSIS
179*d6b92ffaSHans Petter Selasky  */
180*d6b92ffaSHans Petter Selasky void osm_set_log_per_module(IN osm_log_t * p_log, IN const int file_id,
181*d6b92ffaSHans Petter Selasky 			    IN osm_log_level_t level);
182*d6b92ffaSHans Petter Selasky /*
183*d6b92ffaSHans Petter Selasky  * PARAMETERS
184*d6b92ffaSHans Petter Selasky  *	p_log
185*d6b92ffaSHans Petter Selasky  *		[in] Pointer to a Log object to construct.
186*d6b92ffaSHans Petter Selasky  *
187*d6b92ffaSHans Petter Selasky  *	file_id
188*d6b92ffaSHans Petter Selasky  *		[in] File ID for module
189*d6b92ffaSHans Petter Selasky  *
190*d6b92ffaSHans Petter Selasky  *	level
191*d6b92ffaSHans Petter Selasky  *		[in] Log level of the module
192*d6b92ffaSHans Petter Selasky  *
193*d6b92ffaSHans Petter Selasky  * RETURN VALUES
194*d6b92ffaSHans Petter Selasky  *	This function does not return a value.
195*d6b92ffaSHans Petter Selasky  *********/
196*d6b92ffaSHans Petter Selasky 
197*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_reset_log_per_module
198*d6b92ffaSHans Petter Selasky  * NAME
199*d6b92ffaSHans Petter Selasky  *	osm_reset_log_per_module
200*d6b92ffaSHans Petter Selasky  *
201*d6b92ffaSHans Petter Selasky  * DESCRIPTION
202*d6b92ffaSHans Petter Selasky  *	This resets log level for the entire per module log table.
203*d6b92ffaSHans Petter Selasky  *	NOTE: this code is not thread safe. Need to grab the lock before
204*d6b92ffaSHans Petter Selasky  *	calling it.
205*d6b92ffaSHans Petter Selasky  *
206*d6b92ffaSHans Petter Selasky  * SYNOPSIS
207*d6b92ffaSHans Petter Selasky  */
208*d6b92ffaSHans Petter Selasky void osm_reset_log_per_module(IN osm_log_t * p_log);
209*d6b92ffaSHans Petter Selasky /*
210*d6b92ffaSHans Petter Selasky  * PARAMETERS
211*d6b92ffaSHans Petter Selasky  *	p_log
212*d6b92ffaSHans Petter Selasky  *		[in] Pointer to a Log object to construct.
213*d6b92ffaSHans Petter Selasky  *
214*d6b92ffaSHans Petter Selasky  * RETURN VALUES
215*d6b92ffaSHans Petter Selasky  *	This function does not return a value.
216*d6b92ffaSHans Petter Selasky  *********/
217*d6b92ffaSHans Petter Selasky 
218*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_construct
219*d6b92ffaSHans Petter Selasky * NAME
220*d6b92ffaSHans Petter Selasky *	osm_log_construct
221*d6b92ffaSHans Petter Selasky *
222*d6b92ffaSHans Petter Selasky * DESCRIPTION
223*d6b92ffaSHans Petter Selasky *	This function constructs a Log object.
224*d6b92ffaSHans Petter Selasky *
225*d6b92ffaSHans Petter Selasky * SYNOPSIS
226*d6b92ffaSHans Petter Selasky */
osm_log_construct(IN osm_log_t * p_log)227*d6b92ffaSHans Petter Selasky static inline void osm_log_construct(IN osm_log_t * p_log)
228*d6b92ffaSHans Petter Selasky {
229*d6b92ffaSHans Petter Selasky 	cl_spinlock_construct(&p_log->lock);
230*d6b92ffaSHans Petter Selasky }
231*d6b92ffaSHans Petter Selasky 
232*d6b92ffaSHans Petter Selasky /*
233*d6b92ffaSHans Petter Selasky * PARAMETERS
234*d6b92ffaSHans Petter Selasky *	p_log
235*d6b92ffaSHans Petter Selasky *		[in] Pointer to a Log object to construct.
236*d6b92ffaSHans Petter Selasky *
237*d6b92ffaSHans Petter Selasky * RETURN VALUE
238*d6b92ffaSHans Petter Selasky *	This function does not return a value.
239*d6b92ffaSHans Petter Selasky *
240*d6b92ffaSHans Petter Selasky * NOTES
241*d6b92ffaSHans Petter Selasky *	Allows calling osm_log_init, osm_log_init_v2, osm_log_destroy
242*d6b92ffaSHans Petter Selasky *
243*d6b92ffaSHans Petter Selasky *	Calling osm_log_construct is a prerequisite to calling any other
244*d6b92ffaSHans Petter Selasky *	method except osm_log_init or osm_log_init_v2.
245*d6b92ffaSHans Petter Selasky *
246*d6b92ffaSHans Petter Selasky * SEE ALSO
247*d6b92ffaSHans Petter Selasky *	Log object, osm_log_init, osm_log_init_v2,
248*d6b92ffaSHans Petter Selasky *	osm_log_destroy
249*d6b92ffaSHans Petter Selasky *********/
250*d6b92ffaSHans Petter Selasky 
251*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_destroy
252*d6b92ffaSHans Petter Selasky * NAME
253*d6b92ffaSHans Petter Selasky *	osm_log_destroy
254*d6b92ffaSHans Petter Selasky *
255*d6b92ffaSHans Petter Selasky * DESCRIPTION
256*d6b92ffaSHans Petter Selasky *	The osm_log_destroy function destroys the object, releasing
257*d6b92ffaSHans Petter Selasky *	all resources.
258*d6b92ffaSHans Petter Selasky *
259*d6b92ffaSHans Petter Selasky * SYNOPSIS
260*d6b92ffaSHans Petter Selasky */
osm_log_destroy(IN osm_log_t * p_log)261*d6b92ffaSHans Petter Selasky static inline void osm_log_destroy(IN osm_log_t * p_log)
262*d6b92ffaSHans Petter Selasky {
263*d6b92ffaSHans Petter Selasky 	cl_spinlock_destroy(&p_log->lock);
264*d6b92ffaSHans Petter Selasky 	if (p_log->out_port != stdout) {
265*d6b92ffaSHans Petter Selasky 		fclose(p_log->out_port);
266*d6b92ffaSHans Petter Selasky 		p_log->out_port = stdout;
267*d6b92ffaSHans Petter Selasky 	}
268*d6b92ffaSHans Petter Selasky 	closelog();
269*d6b92ffaSHans Petter Selasky }
270*d6b92ffaSHans Petter Selasky 
271*d6b92ffaSHans Petter Selasky /*
272*d6b92ffaSHans Petter Selasky * PARAMETERS
273*d6b92ffaSHans Petter Selasky *	p_log
274*d6b92ffaSHans Petter Selasky *		[in] Pointer to the object to destroy.
275*d6b92ffaSHans Petter Selasky *
276*d6b92ffaSHans Petter Selasky * RETURN VALUE
277*d6b92ffaSHans Petter Selasky *	This function does not return a value.
278*d6b92ffaSHans Petter Selasky *
279*d6b92ffaSHans Petter Selasky * NOTES
280*d6b92ffaSHans Petter Selasky *	Performs any necessary cleanup of the specified
281*d6b92ffaSHans Petter Selasky *	Log object.
282*d6b92ffaSHans Petter Selasky *	Further operations should not be attempted on the destroyed object.
283*d6b92ffaSHans Petter Selasky *	This function should only be called after a call to
284*d6b92ffaSHans Petter Selasky *	osm_log_construct, osm_log_init, or osm_log_init_v2.
285*d6b92ffaSHans Petter Selasky *
286*d6b92ffaSHans Petter Selasky * SEE ALSO
287*d6b92ffaSHans Petter Selasky *	Log object, osm_log_construct,
288*d6b92ffaSHans Petter Selasky *	osm_log_init, osm_log_init_v2
289*d6b92ffaSHans Petter Selasky *********/
290*d6b92ffaSHans Petter Selasky 
291*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_init_v2
292*d6b92ffaSHans Petter Selasky * NAME
293*d6b92ffaSHans Petter Selasky *	osm_log_init_v2
294*d6b92ffaSHans Petter Selasky *
295*d6b92ffaSHans Petter Selasky * DESCRIPTION
296*d6b92ffaSHans Petter Selasky *	The osm_log_init_v2 function initializes a
297*d6b92ffaSHans Petter Selasky *	Log object for use.
298*d6b92ffaSHans Petter Selasky *
299*d6b92ffaSHans Petter Selasky * SYNOPSIS
300*d6b92ffaSHans Petter Selasky */
301*d6b92ffaSHans Petter Selasky ib_api_status_t osm_log_init_v2(IN osm_log_t * p_log, IN boolean_t flush,
302*d6b92ffaSHans Petter Selasky 				IN uint8_t log_flags, IN const char *log_file,
303*d6b92ffaSHans Petter Selasky 				IN unsigned long max_size,
304*d6b92ffaSHans Petter Selasky 				IN boolean_t accum_log_file);
305*d6b92ffaSHans Petter Selasky /*
306*d6b92ffaSHans Petter Selasky * PARAMETERS
307*d6b92ffaSHans Petter Selasky *	p_log
308*d6b92ffaSHans Petter Selasky *		[in] Pointer to the log object.
309*d6b92ffaSHans Petter Selasky *
310*d6b92ffaSHans Petter Selasky *	flush
311*d6b92ffaSHans Petter Selasky *		[in] Set to TRUE directs the log to flush all log messages
312*d6b92ffaSHans Petter Selasky *		immediately.  This severely degrades log performance,
313*d6b92ffaSHans Petter Selasky *		and is normally used for debugging only.
314*d6b92ffaSHans Petter Selasky *
315*d6b92ffaSHans Petter Selasky *	log_flags
316*d6b92ffaSHans Petter Selasky *		[in] The log verbosity level to be used.
317*d6b92ffaSHans Petter Selasky *
318*d6b92ffaSHans Petter Selasky *	log_file
319*d6b92ffaSHans Petter Selasky *		[in] if not NULL defines the name of the log file. Otherwise
320*d6b92ffaSHans Petter Selasky *		it is stdout.
321*d6b92ffaSHans Petter Selasky *
322*d6b92ffaSHans Petter Selasky * RETURN VALUES
323*d6b92ffaSHans Petter Selasky *	CL_SUCCESS if the Log object was initialized
324*d6b92ffaSHans Petter Selasky *	successfully.
325*d6b92ffaSHans Petter Selasky *
326*d6b92ffaSHans Petter Selasky * NOTES
327*d6b92ffaSHans Petter Selasky *	Allows calling other Log methods.
328*d6b92ffaSHans Petter Selasky *
329*d6b92ffaSHans Petter Selasky * SEE ALSO
330*d6b92ffaSHans Petter Selasky *	Log object, osm_log_construct,
331*d6b92ffaSHans Petter Selasky *	osm_log_destroy
332*d6b92ffaSHans Petter Selasky *********/
333*d6b92ffaSHans Petter Selasky 
334*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_reopen_file
335*d6b92ffaSHans Petter Selasky * NAME
336*d6b92ffaSHans Petter Selasky *	osm_log_reopen_file
337*d6b92ffaSHans Petter Selasky *
338*d6b92ffaSHans Petter Selasky * DESCRIPTION
339*d6b92ffaSHans Petter Selasky *	The osm_log_reopen_file function reopens the log file
340*d6b92ffaSHans Petter Selasky *
341*d6b92ffaSHans Petter Selasky * SYNOPSIS
342*d6b92ffaSHans Petter Selasky */
343*d6b92ffaSHans Petter Selasky int osm_log_reopen_file(osm_log_t * p_log);
344*d6b92ffaSHans Petter Selasky /*
345*d6b92ffaSHans Petter Selasky * PARAMETERS
346*d6b92ffaSHans Petter Selasky *	p_log
347*d6b92ffaSHans Petter Selasky *		[in] Pointer to the log object.
348*d6b92ffaSHans Petter Selasky *
349*d6b92ffaSHans Petter Selasky * RETURN VALUES
350*d6b92ffaSHans Petter Selasky *	0 on success or nonzero value otherwise.
351*d6b92ffaSHans Petter Selasky *********/
352*d6b92ffaSHans Petter Selasky 
353*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_init
354*d6b92ffaSHans Petter Selasky * NAME
355*d6b92ffaSHans Petter Selasky *	osm_log_init
356*d6b92ffaSHans Petter Selasky *
357*d6b92ffaSHans Petter Selasky * DESCRIPTION
358*d6b92ffaSHans Petter Selasky *	The osm_log_init function initializes a
359*d6b92ffaSHans Petter Selasky *	Log object for use. It is a wrapper for osm_log_init_v2().
360*d6b92ffaSHans Petter Selasky *
361*d6b92ffaSHans Petter Selasky * SYNOPSIS
362*d6b92ffaSHans Petter Selasky */
363*d6b92ffaSHans Petter Selasky ib_api_status_t osm_log_init(IN osm_log_t * p_log, IN boolean_t flush,
364*d6b92ffaSHans Petter Selasky 			     IN uint8_t log_flags, IN const char *log_file,
365*d6b92ffaSHans Petter Selasky 			     IN boolean_t accum_log_file);
366*d6b92ffaSHans Petter Selasky /*
367*d6b92ffaSHans Petter Selasky  * Same as osm_log_init_v2() but without max_size parameter
368*d6b92ffaSHans Petter Selasky  */
369*d6b92ffaSHans Petter Selasky 
370*d6b92ffaSHans Petter Selasky void osm_log(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
371*d6b92ffaSHans Petter Selasky 	     IN const char *p_str, ...) STRICT_OSM_LOG_FORMAT;
372*d6b92ffaSHans Petter Selasky 
373*d6b92ffaSHans Petter Selasky void osm_log_v2(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
374*d6b92ffaSHans Petter Selasky 		IN const int file_id, IN const char *p_str, ...) STRICT_OSM_LOG_V2_FORMAT;
375*d6b92ffaSHans Petter Selasky 
376*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_get_level
377*d6b92ffaSHans Petter Selasky * NAME
378*d6b92ffaSHans Petter Selasky *	osm_log_get_level
379*d6b92ffaSHans Petter Selasky *
380*d6b92ffaSHans Petter Selasky * DESCRIPTION
381*d6b92ffaSHans Petter Selasky *	Returns the current log level.
382*d6b92ffaSHans Petter Selasky *
383*d6b92ffaSHans Petter Selasky * SYNOPSIS
384*d6b92ffaSHans Petter Selasky */
osm_log_get_level(IN const osm_log_t * p_log)385*d6b92ffaSHans Petter Selasky static inline osm_log_level_t osm_log_get_level(IN const osm_log_t * p_log)
386*d6b92ffaSHans Petter Selasky {
387*d6b92ffaSHans Petter Selasky 	return p_log->level;
388*d6b92ffaSHans Petter Selasky }
389*d6b92ffaSHans Petter Selasky 
390*d6b92ffaSHans Petter Selasky /*
391*d6b92ffaSHans Petter Selasky * PARAMETERS
392*d6b92ffaSHans Petter Selasky *	p_log
393*d6b92ffaSHans Petter Selasky *		[in] Pointer to the log object.
394*d6b92ffaSHans Petter Selasky *
395*d6b92ffaSHans Petter Selasky * RETURN VALUES
396*d6b92ffaSHans Petter Selasky *	Returns the current log level.
397*d6b92ffaSHans Petter Selasky *
398*d6b92ffaSHans Petter Selasky * NOTES
399*d6b92ffaSHans Petter Selasky *
400*d6b92ffaSHans Petter Selasky * SEE ALSO
401*d6b92ffaSHans Petter Selasky *	Log object, osm_log_construct,
402*d6b92ffaSHans Petter Selasky *	osm_log_destroy
403*d6b92ffaSHans Petter Selasky *********/
404*d6b92ffaSHans Petter Selasky 
405*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_set_level
406*d6b92ffaSHans Petter Selasky * NAME
407*d6b92ffaSHans Petter Selasky *	osm_log_set_level
408*d6b92ffaSHans Petter Selasky *
409*d6b92ffaSHans Petter Selasky * DESCRIPTION
410*d6b92ffaSHans Petter Selasky *	Sets the current log level.
411*d6b92ffaSHans Petter Selasky *
412*d6b92ffaSHans Petter Selasky * SYNOPSIS
413*d6b92ffaSHans Petter Selasky */
osm_log_set_level(IN osm_log_t * p_log,IN osm_log_level_t level)414*d6b92ffaSHans Petter Selasky static inline void osm_log_set_level(IN osm_log_t * p_log,
415*d6b92ffaSHans Petter Selasky 				     IN osm_log_level_t level)
416*d6b92ffaSHans Petter Selasky {
417*d6b92ffaSHans Petter Selasky 	p_log->level = level;
418*d6b92ffaSHans Petter Selasky 	osm_log(p_log, OSM_LOG_ALL, "Setting log level to: 0x%02x\n", level);
419*d6b92ffaSHans Petter Selasky }
420*d6b92ffaSHans Petter Selasky 
421*d6b92ffaSHans Petter Selasky /*
422*d6b92ffaSHans Petter Selasky * PARAMETERS
423*d6b92ffaSHans Petter Selasky *	p_log
424*d6b92ffaSHans Petter Selasky *		[in] Pointer to the log object.
425*d6b92ffaSHans Petter Selasky *
426*d6b92ffaSHans Petter Selasky *	level
427*d6b92ffaSHans Petter Selasky *		[in] New level to set.
428*d6b92ffaSHans Petter Selasky *
429*d6b92ffaSHans Petter Selasky * RETURN VALUES
430*d6b92ffaSHans Petter Selasky *	This function does not return a value.
431*d6b92ffaSHans Petter Selasky *
432*d6b92ffaSHans Petter Selasky * NOTES
433*d6b92ffaSHans Petter Selasky *
434*d6b92ffaSHans Petter Selasky * SEE ALSO
435*d6b92ffaSHans Petter Selasky *	Log object, osm_log_construct,
436*d6b92ffaSHans Petter Selasky *	osm_log_destroy
437*d6b92ffaSHans Petter Selasky *********/
438*d6b92ffaSHans Petter Selasky 
439*d6b92ffaSHans Petter Selasky /****f* OpenSM: Log/osm_log_is_active
440*d6b92ffaSHans Petter Selasky * NAME
441*d6b92ffaSHans Petter Selasky *	osm_log_is_active
442*d6b92ffaSHans Petter Selasky *
443*d6b92ffaSHans Petter Selasky * DESCRIPTION
444*d6b92ffaSHans Petter Selasky *	Returns TRUE if the specified log level would be logged.
445*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
446*d6b92ffaSHans Petter Selasky *
447*d6b92ffaSHans Petter Selasky * SYNOPSIS
448*d6b92ffaSHans Petter Selasky */
osm_log_is_active(IN const osm_log_t * p_log,IN osm_log_level_t level)449*d6b92ffaSHans Petter Selasky static inline boolean_t osm_log_is_active(IN const osm_log_t * p_log,
450*d6b92ffaSHans Petter Selasky 					  IN osm_log_level_t level)
451*d6b92ffaSHans Petter Selasky {
452*d6b92ffaSHans Petter Selasky 	return ((p_log->level & level) != 0);
453*d6b92ffaSHans Petter Selasky }
454*d6b92ffaSHans Petter Selasky 
455*d6b92ffaSHans Petter Selasky /*
456*d6b92ffaSHans Petter Selasky * PARAMETERS
457*d6b92ffaSHans Petter Selasky *	p_log
458*d6b92ffaSHans Petter Selasky *		[in] Pointer to the log object.
459*d6b92ffaSHans Petter Selasky *
460*d6b92ffaSHans Petter Selasky *	level
461*d6b92ffaSHans Petter Selasky *		[in] Level to check.
462*d6b92ffaSHans Petter Selasky *
463*d6b92ffaSHans Petter Selasky * RETURN VALUES
464*d6b92ffaSHans Petter Selasky *	Returns TRUE if the specified log level would be logged.
465*d6b92ffaSHans Petter Selasky *	FALSE otherwise.
466*d6b92ffaSHans Petter Selasky *
467*d6b92ffaSHans Petter Selasky * NOTES
468*d6b92ffaSHans Petter Selasky *
469*d6b92ffaSHans Petter Selasky * SEE ALSO
470*d6b92ffaSHans Petter Selasky *	Log object, osm_log_construct,
471*d6b92ffaSHans Petter Selasky *	osm_log_destroy
472*d6b92ffaSHans Petter Selasky *********/
473*d6b92ffaSHans Petter Selasky 
osm_log_is_active_v2(IN const osm_log_t * p_log,IN osm_log_level_t level,IN const int file_id)474*d6b92ffaSHans Petter Selasky static inline boolean_t osm_log_is_active_v2(IN const osm_log_t * p_log,
475*d6b92ffaSHans Petter Selasky 					     IN osm_log_level_t level,
476*d6b92ffaSHans Petter Selasky 					     IN const int file_id)
477*d6b92ffaSHans Petter Selasky {
478*d6b92ffaSHans Petter Selasky 	if ((p_log->level & level) != 0)
479*d6b92ffaSHans Petter Selasky 		return 1;
480*d6b92ffaSHans Petter Selasky 	if ((level & p_log->per_mod_log_tbl[file_id]))
481*d6b92ffaSHans Petter Selasky 		return 1;
482*d6b92ffaSHans Petter Selasky 	return 0;
483*d6b92ffaSHans Petter Selasky }
484*d6b92ffaSHans Petter Selasky 
485*d6b92ffaSHans Petter Selasky extern void osm_log_msg_box(osm_log_t *log, osm_log_level_t level,
486*d6b92ffaSHans Petter Selasky 			    const char *func_name, const char *msg);
487*d6b92ffaSHans Petter Selasky extern void osm_log_msg_box_v2(osm_log_t *log, osm_log_level_t level,
488*d6b92ffaSHans Petter Selasky 			       const int file_id, const char *func_name,
489*d6b92ffaSHans Petter Selasky 			       const char *msg);
490*d6b92ffaSHans Petter Selasky extern void osm_log_raw(IN osm_log_t * p_log, IN osm_log_level_t verbosity,
491*d6b92ffaSHans Petter Selasky 			IN const char *p_buf);
492*d6b92ffaSHans Petter Selasky 
493*d6b92ffaSHans Petter Selasky #ifdef FILE_ID
494*d6b92ffaSHans Petter Selasky #define OSM_LOG(log, level, fmt, ...) do { \
495*d6b92ffaSHans Petter Selasky 		if (osm_log_is_active_v2(log, (level), FILE_ID)) \
496*d6b92ffaSHans Petter Selasky 			osm_log_v2(log, level, FILE_ID, "%s: " fmt, __func__, ## __VA_ARGS__); \
497*d6b92ffaSHans Petter Selasky 	} while (0)
498*d6b92ffaSHans Petter Selasky 
499*d6b92ffaSHans Petter Selasky #define OSM_LOG_MSG_BOX(log, level, msg) \
500*d6b92ffaSHans Petter Selasky 		osm_log_msg_box_v2(log, level, FILE_ID, __func__, msg)
501*d6b92ffaSHans Petter Selasky #else
502*d6b92ffaSHans Petter Selasky #define OSM_LOG(log, level, fmt, ...) do { \
503*d6b92ffaSHans Petter Selasky 		if (osm_log_is_active(log, (level))) \
504*d6b92ffaSHans Petter Selasky 			osm_log(log, level, "%s: " fmt, __func__, ## __VA_ARGS__); \
505*d6b92ffaSHans Petter Selasky 	} while (0)
506*d6b92ffaSHans Petter Selasky 
507*d6b92ffaSHans Petter Selasky #define OSM_LOG_MSG_BOX(log, level, msg) \
508*d6b92ffaSHans Petter Selasky 		osm_log_msg_box(log, level, __func__, msg)
509*d6b92ffaSHans Petter Selasky #endif
510*d6b92ffaSHans Petter Selasky 
511*d6b92ffaSHans Petter Selasky #define DBG_CL_LOCK 0
512*d6b92ffaSHans Petter Selasky 
513*d6b92ffaSHans Petter Selasky #define CL_PLOCK_EXCL_ACQUIRE( __exp__ )  \
514*d6b92ffaSHans Petter Selasky {											    		\
515*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
516*d6b92ffaSHans Petter Selasky      printf("cl_plock_excl_acquire: Acquiring %p file %s, line %d\n", \
517*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
518*d6b92ffaSHans Petter Selasky    cl_plock_excl_acquire( __exp__ );      \
519*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
520*d6b92ffaSHans Petter Selasky      printf("cl_plock_excl_acquire: Acquired %p file %s, line %d\n", \
521*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
522*d6b92ffaSHans Petter Selasky }
523*d6b92ffaSHans Petter Selasky 
524*d6b92ffaSHans Petter Selasky #define CL_PLOCK_ACQUIRE( __exp__ )  \
525*d6b92ffaSHans Petter Selasky {											    		\
526*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
527*d6b92ffaSHans Petter Selasky      printf("cl_plock_acquire: Acquiring %p file %s, line %d\n", \
528*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
529*d6b92ffaSHans Petter Selasky    cl_plock_acquire( __exp__ );      \
530*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
531*d6b92ffaSHans Petter Selasky      printf("cl_plock_acquire: Acquired %p file %s, line %d\n", \
532*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
533*d6b92ffaSHans Petter Selasky }
534*d6b92ffaSHans Petter Selasky 
535*d6b92ffaSHans Petter Selasky #define CL_PLOCK_RELEASE( __exp__ )  \
536*d6b92ffaSHans Petter Selasky {											    		\
537*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
538*d6b92ffaSHans Petter Selasky      printf("cl_plock_release: Releasing %p file %s, line %d\n", \
539*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
540*d6b92ffaSHans Petter Selasky    cl_plock_release( __exp__ );      \
541*d6b92ffaSHans Petter Selasky    if (DBG_CL_LOCK)                      \
542*d6b92ffaSHans Petter Selasky      printf("cl_plock_release: Released  %p file %s, line %d\n", \
543*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
544*d6b92ffaSHans Petter Selasky }
545*d6b92ffaSHans Petter Selasky 
546*d6b92ffaSHans Petter Selasky #define DBG_CL_SPINLOCK 0
547*d6b92ffaSHans Petter Selasky #define CL_SPINLOCK_RELEASE( __exp__ )  \
548*d6b92ffaSHans Petter Selasky {											    		\
549*d6b92ffaSHans Petter Selasky    if (DBG_CL_SPINLOCK)                      \
550*d6b92ffaSHans Petter Selasky      printf("cl_spinlock_release: Releasing %p file %s, line %d\n", \
551*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
552*d6b92ffaSHans Petter Selasky    cl_spinlock_release( __exp__ );      \
553*d6b92ffaSHans Petter Selasky    if (DBG_CL_SPINLOCK)                      \
554*d6b92ffaSHans Petter Selasky      printf("cl_spinlock_release: Released  %p file %s, line %d\n", \
555*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
556*d6b92ffaSHans Petter Selasky }
557*d6b92ffaSHans Petter Selasky 
558*d6b92ffaSHans Petter Selasky #define CL_SPINLOCK_ACQUIRE( __exp__ )  \
559*d6b92ffaSHans Petter Selasky {											    		\
560*d6b92ffaSHans Petter Selasky    if (DBG_CL_SPINLOCK)                      \
561*d6b92ffaSHans Petter Selasky      printf("cl_spinlock_acquire: Acquiring %p file %s, line %d\n", \
562*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
563*d6b92ffaSHans Petter Selasky    cl_spinlock_acquire( __exp__ );      \
564*d6b92ffaSHans Petter Selasky    if (DBG_CL_SPINLOCK)                      \
565*d6b92ffaSHans Petter Selasky      printf("cl_spinlock_acquire: Acquired %p file %s, line %d\n", \
566*d6b92ffaSHans Petter Selasky           __exp__,__FILE__, __LINE__);            \
567*d6b92ffaSHans Petter Selasky }
568*d6b92ffaSHans Petter Selasky 
569*d6b92ffaSHans Petter Selasky /****f* OpenSM: Helper/osm_is_debug
570*d6b92ffaSHans Petter Selasky * NAME
571*d6b92ffaSHans Petter Selasky *	osm_is_debug
572*d6b92ffaSHans Petter Selasky *
573*d6b92ffaSHans Petter Selasky * DESCRIPTION
574*d6b92ffaSHans Petter Selasky *	The osm_is_debug function returns TRUE if the opensm was compiled
575*d6b92ffaSHans Petter Selasky *	in debug mode, and FALSE otherwise.
576*d6b92ffaSHans Petter Selasky *
577*d6b92ffaSHans Petter Selasky * SYNOPSIS
578*d6b92ffaSHans Petter Selasky */
579*d6b92ffaSHans Petter Selasky boolean_t osm_is_debug(void);
580*d6b92ffaSHans Petter Selasky /*
581*d6b92ffaSHans Petter Selasky * PARAMETERS
582*d6b92ffaSHans Petter Selasky *	None
583*d6b92ffaSHans Petter Selasky *
584*d6b92ffaSHans Petter Selasky * RETURN VALUE
585*d6b92ffaSHans Petter Selasky *	TRUE if compiled in debug version. FALSE otherwise.
586*d6b92ffaSHans Petter Selasky *
587*d6b92ffaSHans Petter Selasky * NOTES
588*d6b92ffaSHans Petter Selasky *
589*d6b92ffaSHans Petter Selasky *********/
590*d6b92ffaSHans Petter Selasky 
591*d6b92ffaSHans Petter Selasky END_C_DECLS
592*d6b92ffaSHans Petter Selasky #endif				/* _OSM_LOG_H_ */
593