Changeset 2853 for pjproject/trunk/pjlib/src/pj/log.c
- Timestamp:
- Aug 5, 2009 10:58:02 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjlib/src/pj/log.c
r2842 r2853 31 31 static int pj_log_max_level = PJ_LOG_MAX_LEVEL; 32 32 #endif 33 static long thread_suspended_tls_id = -1; 33 34 static pj_log_func *log_writer = &pj_log_write; 34 35 static unsigned log_decor = PJ_LOG_HAS_TIME | PJ_LOG_HAS_MICRO_SEC | … … 67 68 #endif 68 69 70 static void logging_shutdown(void) 71 { 72 #if PJ_HAS_THREADS 73 if (thread_suspended_tls_id != -1) { 74 pj_thread_local_free(thread_suspended_tls_id); 75 thread_suspended_tls_id = -1; 76 } 77 #endif 78 } 79 80 pj_status_t pj_log_init(void) 81 { 82 #if PJ_HAS_THREADS 83 if (thread_suspended_tls_id == -1) { 84 pj_thread_local_alloc(&thread_suspended_tls_id); 85 pj_atexit(&logging_shutdown); 86 } 87 #endif 88 return PJ_SUCCESS; 89 } 90 69 91 PJ_DEF(void) pj_log_set_decor(unsigned decor) 70 92 { … … 149 171 } 150 172 173 /* Temporarily suspend logging facility for this thread. 174 * If thread local storage/variable is not used or not initialized, then 175 * we can only suspend the logging globally across all threads. This may 176 * happen e.g. when log function is called before PJLIB is fully initialized 177 * or after PJLIB is shutdown. 178 */ 179 static void suspend_logging(int *saved_level) 180 { 181 #if PJ_HAS_THREADS 182 if (thread_suspended_tls_id != -1) 183 { 184 pj_thread_local_set(thread_suspended_tls_id, (void*)PJ_TRUE); 185 } 186 else 187 #endif 188 { 189 pj_log_max_level = 0; 190 } 191 /* Save the level regardless, just in case PJLIB is shutdown 192 * between suspend and resume. 193 */ 194 *saved_level = pj_log_max_level; 195 } 196 197 /* Resume logging facility for this thread */ 198 static void resume_logging(int *saved_level) 199 { 200 #if PJ_HAS_THREADS 201 if (thread_suspended_tls_id != -1) 202 { 203 pj_thread_local_set(thread_suspended_tls_id, (void*)PJ_FALSE); 204 } 205 else 206 #endif 207 { 208 /* Only revert the level if application doesn't change the 209 * logging level between suspend and resume. 210 */ 211 if (pj_log_max_level==0 && *saved_level) 212 pj_log_max_level = *saved_level; 213 } 214 } 215 216 /* Is logging facility suspended for this thread? */ 217 static pj_bool_t is_logging_suspended(void) 218 { 219 #if PJ_HAS_THREADS 220 if (thread_suspended_tls_id != -1) 221 { 222 return pj_thread_local_get(thread_suspended_tls_id) != NULL; 223 } 224 else 225 #endif 226 { 227 return pj_log_max_level != 0; 228 } 229 } 230 151 231 PJ_DEF(void) pj_log( const char *sender, int level, 152 232 const char *format, va_list marker) … … 158 238 char log_buffer[PJ_LOG_MAX_SIZE]; 159 239 #endif 160 int len, print_len;240 int saved_level, len, print_len; 161 241 162 242 PJ_CHECK_STACK(); … … 164 244 if (level > pj_log_max_level) 165 245 return; 246 247 if (is_logging_suspended()) 248 return; 249 250 /* Temporarily disable logging for this thread. Some of PJLIB APIs that 251 * this function calls below will recursively call the logging function 252 * back, hence it will cause infinite recursive calls if we allow that. 253 */ 254 suspend_logging(&saved_level); 166 255 167 256 /* Get current date/time. */ … … 275 364 } 276 365 366 /* It should be safe to resume logging at this point. Application can 367 * recursively call the logging function inside the callback. 368 */ 369 resume_logging(&saved_level); 370 277 371 if (log_writer) 278 372 (*log_writer)(level, log_buffer, len);
Note: See TracChangeset
for help on using the changeset viewer.