aboutsummaryrefslogtreecommitdiffstats
path: root/src/glx/apple/apple_glx_log.c
diff options
context:
space:
mode:
authorJeremy Huddleston <[email protected]>2012-04-28 23:19:42 -0700
committerJeremy Huddleston <[email protected]>2012-05-03 10:58:34 -0700
commit51691f0767f6a75a1f549cd979a878a0ad12a228 (patch)
tree86685afa697ba08d558e26c86ba5880c53c547d1 /src/glx/apple/apple_glx_log.c
parentcf5db0a418b63d71385b43897a7ea9be7bb785d1 (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.c118
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);
+}