diff options
author | Jeremy Huddleston <[email protected]> | 2012-04-28 23:19:42 -0700 |
---|---|---|
committer | Jeremy Huddleston <[email protected]> | 2012-05-03 10:58:34 -0700 |
commit | 51691f0767f6a75a1f549cd979a878a0ad12a228 (patch) | |
tree | 86685afa697ba08d558e26c86ba5880c53c547d1 /src/glx/apple/apple_glx_log.c | |
parent | cf5db0a418b63d71385b43897a7ea9be7bb785d1 (diff) |
darwin: Use ASL for logging
Signed-off-by: Jeremy Huddleston <[email protected]>
Diffstat (limited to 'src/glx/apple/apple_glx_log.c')
-rw-r--r-- | src/glx/apple/apple_glx_log.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/src/glx/apple/apple_glx_log.c b/src/glx/apple/apple_glx_log.c new file mode 100644 index 00000000000..9ebf666c9b4 --- /dev/null +++ b/src/glx/apple/apple_glx_log.c @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2012 Apple Inc. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation files + * (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT + * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above + * copyright holders shall not be used in advertising or otherwise to + * promote the sale, use or other dealings in this Software without + * prior written authorization. + */ + +#include <sys/cdefs.h> +#include <asl.h> +#include <stdio.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdlib.h> +#include <inttypes.h> +#include <pthread.h> +#include "apple_glx_log.h" + +static bool diagnostic = false; +static aslclient aslc; + +void apple_glx_log_init(void) { + if (getenv("LIBGL_DIAGNOSTIC")) { + diagnostic = true; + } + + aslc = asl_open(NULL, NULL, 0); +} + +void _apple_glx_log(int level, const char *file, const char *function, + int line, const char *fmt, ...) { + va_list v; + va_start(v, fmt); + _apple_glx_vlog(level, file, function, line, fmt, v); + va_end(v); +} + +static const char * +_asl_level_string(int level) +{ + if (level == ASL_LEVEL_EMERG) return ASL_STRING_EMERG; + if (level == ASL_LEVEL_ALERT) return ASL_STRING_ALERT; + if (level == ASL_LEVEL_CRIT) return ASL_STRING_CRIT; + if (level == ASL_LEVEL_ERR) return ASL_STRING_ERR; + if (level == ASL_LEVEL_WARNING) return ASL_STRING_WARNING; + if (level == ASL_LEVEL_NOTICE) return ASL_STRING_NOTICE; + if (level == ASL_LEVEL_INFO) return ASL_STRING_INFO; + if (level == ASL_LEVEL_DEBUG) return ASL_STRING_DEBUG; + return "unknown"; +} + +void _apple_glx_vlog(int level, const char *file, const char *function, + int line, const char *fmt, va_list args) { + aslmsg msg; + uint64_t thread = 0; + + if (pthread_is_threaded_np()) { + pthread_threadid_np(NULL, &thread); + } + + if (diagnostic) { + va_list args2; + va_copy(args2, args); + + fprintf(stderr, "%-9s %24s:%-4d %s(%"PRIu64"): ", + _asl_level_string(level), file, line, function, thread); + vfprintf(stderr, fmt, args2); + } + + msg = asl_new(ASL_TYPE_MSG); + if (msg) { + if (file) + asl_set(msg, "File", file); + if (function) + asl_set(msg, "Function", function); + if (line) { + char *_line; + asprintf(&_line, "%d", line); + if (_line) { + asl_set(msg, "Line", _line); + free(_line); + } + } + if (pthread_is_threaded_np()) { + char *_thread; + asprintf(&_thread, "%"PRIu64, thread); + if (_thread) { + asl_set(msg, "Thread", _thread); + free(_thread); + } + } + } + + asl_vlog(aslc, msg, level, fmt, args); + if (msg) + asl_free(msg); +} |