Changeset 1685 for trunk/psLib/src/sysUtils
- Timestamp:
- Sep 3, 2004, 10:39:50 AM (22 years ago)
- Location:
- trunk/psLib/src/sysUtils
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/sysUtils/psError.c
r1407 r1685 11 11 * @author Eric Van Alst, MHPCC 12 12 * 13 * @version $Revision: 1.1 0$ $Name: not supported by cvs2svn $14 * @date $Date: 2004-0 8-07 00:06:06$13 * @version $Revision: 1.11 $ $Name: not supported by cvs2svn $ 14 * @date $Date: 2004-09-03 20:39:50 $ 15 15 * 16 16 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii 17 17 */ 18 18 19 /******************************************************************************/ 19 #include <stdarg.h> 20 #include <pthread.h> 21 #include <string.h> 20 22 21 /* INCLUDE FILES */22 23 /******************************************************************************/24 #include <stdarg.h>25 23 #include "psLogMsg.h" 26 24 #include "psError.h" 25 #include "psMemory.h" 27 26 28 /******************************************************************************/ 27 #define MAX_ERROR_STACK_SIZE 64 28 static psErr* errorStack[MAX_ERROR_STACK_SIZE]; 29 static unsigned int errorStackSize = 0; 30 pthread_mutex_t lockErrorStack = PTHREAD_MUTEX_INITIALIZER; 29 31 30 /* DEFINE STATEMENTS */31 32 32 /******************************************************************************/ 33 static void pushErrorStack(psErr* err); 33 34 34 // None 35 static void pushErrorStack(psErr* err) 36 { 35 37 36 /******************************************************************************/ 38 pthread_mutex_lock(&lockErrorStack); 37 39 38 /* TYPE DEFINITIONS */ 40 if (errorStackSize < MAX_ERROR_STACK_SIZE) { 41 errorStack[errorStackSize] = psMemIncrRefCounter(err); 42 errorStackSize++; 43 } 39 44 40 /******************************************************************************/ 45 pthread_mutex_unlock(&lockErrorStack); 46 } 41 47 42 // None 48 static void errFree(psErr* err) 49 { 50 if (err != NULL) { 51 psFree(err->msg); 52 psFree(err->name); 53 } 54 } 43 55 44 /*****************************************************************************/ 56 psErr* psErrAlloc(const char* name, psErrorCode code, const char* msg) 57 { 58 psErr* err = psAlloc(sizeof(psErr)); 59 err->msg = strcpy(psAlloc(strlen(msg) + 1), msg); 60 err->name = strcpy(psAlloc(strlen(name) + 1), name); 61 err->code = code; 45 62 46 /* GLOBAL VARIABLES */ 63 p_psMemSetDeallocator(err,(psFreeFcn)errFree); 47 64 48 /*****************************************************************************/ 49 50 // None 51 52 /*****************************************************************************/ 53 54 /* FILE STATIC VARIABLES */ 55 56 /*****************************************************************************/ 57 58 // None 59 60 /*****************************************************************************/ 61 62 /* FUNCTION IMPLEMENTATIONS - LOCAL */ 63 64 /*****************************************************************************/ 65 66 // None 67 68 /*****************************************************************************/ 69 70 /* FUNCTION IMPLEMENTATIONS - PUBLIC */ 71 72 /*****************************************************************************/ 65 return err; 66 } 73 67 74 68 void psError(const char *name, const char *fmt, ...) … … 85 79 va_end(argPtr); 86 80 } 81 82 void psErrorClear() 83 { 84 pthread_mutex_lock(&lockErrorStack); 85 for (int lcv=0;lcv<errorStackSize;lcv++) { 86 psFree(errorStack[lcv]); 87 } 88 errorStackSize = 0; 89 pthread_mutex_unlock(&lockErrorStack); 90 } 91 92 void psErrorMsg(const char *name, psErrorCode code, bool new, const char* fmt, ...) 93 { 94 char errMsg[1024]; 95 psErr* err; 96 97 va_list argPtr; // variable list arguement pointer 98 99 // Get the variable list parameters to pass to logging function 100 va_start(argPtr, fmt); 101 102 // Call logging function with PS_LOG_ERROR level 103 psLogMsgV(name, PS_LOG_ERROR, fmt, argPtr); 104 105 if (new) { 106 psErrorClear(); 107 } 108 109 vsnprintf(errMsg,1024,fmt,argPtr); 110 err = psErrAlloc(name,code,errMsg); 111 pushErrorStack(err); 112 113 // Clean up stack after variable argument has been used 114 va_end(argPtr); 115 116 psFree(err); 117 } 118 119 const psErr* psErrorGet(int which) 120 { 121 psErr* result; 122 123 pthread_mutex_lock(&lockErrorStack); 124 125 which = errorStackSize-1-which; // the which input is from the end of errorStack 126 if (which < 0 || which >= errorStackSize) { 127 result = psErrAlloc("",PS_ERR_NONE,""); // no error at the given location 128 } else { 129 result = psMemIncrRefCounter(errorStack[which]); // a new reference passed back 130 } 131 132 pthread_mutex_unlock(&lockErrorStack); 133 134 return result; 135 } 136 137 const psErr* psErrorLast(void) 138 { 139 return psErrorGet(0); 140 } 141 142 void psErrorStackPrint(FILE *fd, const char *fmt, ...) 143 { 144 va_list argPtr; // variable list arguement pointer 145 146 // Get the variable list parameters to pass to logging function 147 va_start(argPtr, fmt); 148 149 psErrorStackPrintV(fd,fmt,argPtr); 150 151 va_end(argPtr); 152 } 153 154 void psErrorStackPrintV(FILE *fd, const char *fmt, va_list va) 155 { 156 157 pthread_mutex_lock(&lockErrorStack); 158 159 if (errorStackSize > 0) { 160 vfprintf(fd,fmt,va); 161 162 for (int lcv=0;lcv<errorStackSize;lcv++) { 163 fprintf(fd," -> %s: %s\n %s\n", 164 errorStack[lcv]->name, 165 psErrorCodeString(errorStack[lcv]->code), 166 errorStack[lcv]->msg); 167 } 168 } 169 170 pthread_mutex_unlock(&lockErrorStack); 171 } 172 -
trunk/psLib/src/sysUtils/psError.h
r1683 r1685 12 12 * @author Eric Van Alst, MHPCC 13 13 * 14 * @version $Revision: 1. 9$ $Name: not supported by cvs2svn $15 * @date $Date: 2004-09-0 2 22:23:20 $14 * @version $Revision: 1.10 $ $Name: not supported by cvs2svn $ 15 * @date $Date: 2004-09-03 20:39:50 $ 16 16 * 17 17 * Copyright 2004 Maui High Performance Computing Center, University of Hawaii … … 22 22 23 23 #include<stdio.h> 24 #include<stdbool.h> 24 25 25 26 #include "psErrorCodes.h" … … 29 30 */ 30 31 32 /** Error message object */ 31 33 typedef struct 32 34 { 33 char *name; ///< category of code that caused the error35 char* name; ///< category of code that caused the error 34 36 psErrorCode code; ///< class of error 35 char *msg; ///< the message associated with the error37 char* msg; ///< the message associated with the error 36 38 } 37 39 psErr; 38 40 39 const psErr *psErrorGet(int which); 40 const psErr *psErrorLast(void); 41 /** Get a error from the error stack 42 * 43 * Previous errors on the stack are returned by psErrorGet (a value of 0 44 * passed to psErrorGet is equivalent to a call to psErrorLast). 45 * 46 * if no error is at the which position, a non-NULL psErr is returned with 47 * code PS_ERR_NONE. 48 * 49 * @return Error message object at 'which' 50 */ 51 const psErr* psErrorGet( 52 int which ///< position in the error stack. 0 is last error on stack. 53 ); 54 55 /** Get last error put on the error stack 56 * 57 * The last error reported is available from psErrorLast; if no errors are 58 * current, a non-NULL psErr is returned with code PS_ERR_NONE. 59 * 60 * @return psErr* Reference to last error message on error stack 61 */ 62 const psErr* psErrorLast(void); 63 64 /** Clears the error stack. 65 * 66 * The error stack may be completely cleared with psErrorClear. 67 * 68 */ 41 69 void psErrorClear(void); 42 70 43 void psErrorStackPrint(FILE *fd, const char *fmt, ...); 44 void psErrorStackPrintV(FILE *fd, const char *fmt, va_list va); 71 /** Prints error stack to specified open file descriptor 72 * 73 * The entire error stack may be printed to an open file descriptor by 74 * calling psErrorStackPrint; if and only if there are current errors, the 75 * printf-style string fmt is first printed to the file descriptor fd. In 76 * this printout, error codes are replaced by their string equivalents. 77 * 78 */ 79 void psErrorStackPrint( 80 FILE* fd, ///< destination file descriptor 81 const char* fmt, ///< printf-style format of header line 82 ... ///< any parameters required in fmt 83 ); 84 85 /** Prints error stack to specified open file descriptor 86 * 87 * The entire error stack may be printed to an open file descriptor by 88 * calling psErrorStackPrintV; if and only if there are current errors, the 89 * vprintf-style string fmt is first printed to the file descriptor fd. In 90 * this printout, error codes are replaced by their string equivalents. 91 * 92 */ 93 void psErrorStackPrintV( 94 FILE* fd, ///< destination file descriptor 95 const char* fmt, ///< printf-style format of header line 96 va_list va ///< any parameters required in fmt 97 ); 45 98 46 99 /** Reports an error message to the logging facility … … 57 110 ); 58 111 112 /** Reports an error message to the logging facility 113 * 114 * This function will invoke the psLogMsg function with a level of 115 * PS_LOG_ERROR and pass the parameters name and fmt to generate a proper 116 * log message. 117 * 118 */ 119 void psErrorMsg( 120 const char *name, ///< Name of error in the form aaa.bbb.ccc 121 psErrorCode code, ///< Error class code 122 bool new, ///< true if error originates at this location 123 const char* fmt, ///< printf style formatting statement defining error message 124 ... 125 ); 126 127 /** Create a new psErr struct 128 * 129 * Creates a new psErr struct, making a copy of the parameters. 130 * 131 * @return psErr* new psErr object 132 */ 133 psErr* psErrAlloc( 134 const char* name, ///< Name of error in the form aaa.bbb.ccc 135 psErrorCode code, ///< Error class code 136 const char* msg ///< Error message 137 ); 138 59 139 /* @} */// End of SysUtils Functions 60 140
Note:
See TracChangeset
for help on using the changeset viewer.
