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