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