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