xref: /illumos-gate/usr/src/lib/sun_fc/common/Trace.h (revision fcf3ce441efd61da9bb2884968af01cb7c1452cc)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_TRACE_H
27 #define	_TRACE_H
28 
29 
30 
31 #include <cstdarg>
32 #include <string>
33 #include <vector>
34 #include <stack>
35 #include <pthread.h>
36 
37 #ifndef	MAX_MSG_LEN
38 #define	MAX_MSG_LEN 2048
39 #endif
40 
41 /*
42  * @memo	    Tracing, Logging, and debugging facility
43  * @field	    ONE_FIELD_DESCRIPTION
44  *
45  * @doc		    The Trace class provides stack tracing, and basic
46  *		    logging/debugging facilities.
47  */
48 class Trace {
49 public:
50 	Trace(std::string myRoutine);
51 
52 	~Trace();
53 
label()54 	std::string label() {
55 	    return (routine);
56 	}
57 
noMemory()58 	void noMemory() {
59 	    message(1, "Out of memory");
60 	}
61 
debug(const char * fmt,...)62 	void debug(const char *fmt, ...) {
63 	    char msg[MAX_MSG_LEN];
64 	    va_list ap;
65 	    va_start(ap, fmt);
66 	    vsnprintf(msg, sizeof (msg), fmt, ap);
67 	    message(LOG_DEBUG, msg);
68 	    va_end(ap);
69 	}
70 
genericIOError(const char * fmt,...)71 	void genericIOError(const char *fmt, ...) {
72 	    char msg[MAX_MSG_LEN];
73 	    va_list ap;
74 	    va_start(ap, fmt);
75 	    vsnprintf(msg, sizeof (msg), fmt, ap);
76 	    message(IO_ERROR, msg);
77 	    va_end(ap);
78 	}
79 
internalError(const char * fmt,...)80 	void internalError(const char *fmt, ...) {
81 	    char msg[MAX_MSG_LEN];
82 	    va_list ap;
83 	    va_start(ap, fmt);
84 	    vsnprintf(msg, sizeof (msg), fmt, ap);
85 	    message(INTERNAL_ERROR, msg);
86 	    va_end(ap);
87 	}
88 
userError(const char * fmt,...)89 	void userError(const char *fmt, ...) {
90 	    char msg[MAX_MSG_LEN];
91 	    va_list ap;
92 	    va_start(ap, fmt);
93 	    vsnprintf(msg, sizeof (msg), fmt, ap);
94 	    message(USER_ERROR, msg);
95 	    va_end(ap);
96 	}
97 
98 	void stackTrace();
99 
100 private:
101 	std::string routine;
102 	pthread_t	tid;
103 	static const int INTERNAL_ERROR = 3;
104 	static const int STACK_TRACE = 4;
105 	static const int IO_ERROR = 5;
106 	static const int USER_ERROR = 6;
107 	static const int LOG_DEBUG = 7;
108 	void message(int priority, const char *msg);
109 	static std::vector<std::vector<Trace *> > stacks;
110 	static std::vector<std::string> indent;
111 };
112 
113 #endif /* _TRACE_H */
114