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