151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston/*
251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * Copyright (c) 2012 Apple Inc.
351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston *
451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * Permission is hereby granted, free of charge, to any person
551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * obtaining a copy of this software and associated documentation files
651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * (the "Software"), to deal in the Software without restriction,
751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * including without limitation the rights to use, copy, modify, merge,
851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * publish, distribute, sublicense, and/or sell copies of the Software,
951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * and to permit persons to whom the Software is furnished to do so,
1051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * subject to the following conditions:
1151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston *
1251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * The above copyright notice and this permission notice shall be
1351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * included in all copies or substantial portions of the Software.
1451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston *
1551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
1851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * NONINFRINGEMENT.  IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT
1951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
2051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * DEALINGS IN THE SOFTWARE.
2351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston *
2451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * Except as contained in this notice, the name(s) of the above
2551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * copyright holders shall not be used in advertising or otherwise to
2651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * promote the sale, use or other dealings in this Software without
2751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston * prior written authorization.
2851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston */
2951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
3051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <sys/cdefs.h>
3151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <asl.h>
3251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <stdio.h>
3351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <stdbool.h>
3451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <stdint.h>
3551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <stdlib.h>
3651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <inttypes.h>
3751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include <pthread.h>
3851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston#include "apple_glx_log.h"
3951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
4051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonstatic bool diagnostic = false;
4151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonstatic aslclient aslc;
4251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
4351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonvoid apple_glx_log_init(void) {
4451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    if (getenv("LIBGL_DIAGNOSTIC")) {
4551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        diagnostic = true;
4651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    }
4751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
4851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    aslc = asl_open(NULL, NULL, 0);
4951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston}
5051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
5151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonvoid _apple_glx_log(int level, const char *file, const char *function,
5251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                    int line, const char *fmt, ...) {
5351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    va_list v;
5451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    va_start(v, fmt);
5551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    _apple_glx_vlog(level, file, function, line, fmt, v);
5651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    va_end(v);
5751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston}
5851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
5951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonstatic const char *
6051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston_asl_level_string(int level)
6151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston{
6251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_EMERG) return ASL_STRING_EMERG;
6351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_ALERT) return ASL_STRING_ALERT;
6451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_CRIT) return ASL_STRING_CRIT;
6551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_ERR) return ASL_STRING_ERR;
6651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_WARNING) return ASL_STRING_WARNING;
6751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_NOTICE) return ASL_STRING_NOTICE;
6851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_INFO) return ASL_STRING_INFO;
6951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (level == ASL_LEVEL_DEBUG) return ASL_STRING_DEBUG;
7051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        return "unknown";
7151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston}
7251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
7351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddlestonvoid _apple_glx_vlog(int level, const char *file, const char *function,
7451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                     int line, const char *fmt, va_list args) {
7551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    aslmsg msg;
7651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    uint64_t thread = 0;
7751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
7851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    if (pthread_is_threaded_np()) {
7927b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
8027b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston        thread = (uint64_t)(uintptr_t)pthread_self();
8127b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston#elif MAC_OS_X_VERSION_MIN_REQUIRED < 1060
8227b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston        if (&pthread_threadid_np) {
8327b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston            pthread_threadid_np(NULL, &thread);
8427b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston        } else {
8527b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston            thread = (uint64_t)(uintptr_t)pthread_self();
8627b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston        }
8727b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston#else
8851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        pthread_threadid_np(NULL, &thread);
8927b821bc95ea01cc4292ada9c7c65211580d1f98Jeremy Huddleston#endif
9051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    }
9151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
9251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    if (diagnostic) {
9351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        va_list args2;
9451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        va_copy(args2, args);
9551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
9651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        fprintf(stderr, "%-9s %24s:%-4d %s(%"PRIu64"): ",
9751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                _asl_level_string(level), file, line, function, thread);
9851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        vfprintf(stderr, fmt, args2);
9951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    }
10051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
10151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    msg = asl_new(ASL_TYPE_MSG);
10251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    if (msg) {
10351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (file)
10451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            asl_set(msg, "File", file);
10551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (function)
10651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            asl_set(msg, "Function", function);
10751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (line) {
10851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            char *_line;
10951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            asprintf(&_line, "%d", line);
11051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            if (_line) {
11151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                asl_set(msg, "Line", _line);
11251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                free(_line);
11351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            }
11451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        }
11551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        if (pthread_is_threaded_np()) {
11651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            char *_thread;
11751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            asprintf(&_thread, "%"PRIu64, thread);
11851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            if (_thread) {
11951691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                asl_set(msg, "Thread", _thread);
12051691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston                free(_thread);
12151691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston            }
12251691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        }
12351691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    }
12451691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston
12551691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    asl_vlog(aslc, msg, level, fmt, args);
12651691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston    if (msg)
12751691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston        asl_free(msg);
12851691f0767f6a75a1f549cd979a878a0ad12a228Jeremy Huddleston}
129