/*
 * kmp_debug.c -- debug utilities for the Guide library
 * $Revision: 42951 $
 * $Date: 2014-01-21 14:41:41 -0600 (Tue, 21 Jan 2014) $
 */


//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.txt for details.
//
//===----------------------------------------------------------------------===//


#include "kmp.h"
#include "kmp_debug.h" /* really necessary? */
#include "kmp_i18n.h"
#include "kmp_io.h"

#ifdef KMP_DEBUG
void
__kmp_debug_printf_stdout( char const * format, ... )
{
    va_list ap;
    va_start( ap, format );

    __kmp_vprintf( kmp_out, format, ap );

    va_end(ap);
}
#endif

void
__kmp_debug_printf( char const * format, ... )
{
    va_list ap;
    va_start( ap, format );

    __kmp_vprintf( kmp_err, format, ap );

    va_end( ap );
}

#ifdef KMP_USE_ASSERT
    int
    __kmp_debug_assert(
        char const *  msg,
        char const *  file,
        int           line
    ) {

        if ( file == NULL ) {
            file = KMP_I18N_STR( UnknownFile );
        } else {
            // Remove directories from path, leave only file name. File name is enough, there is no need
            // in bothering developers and customers with full paths.
            char const * slash = strrchr( file, '/' );
            if ( slash != NULL ) {
                file = slash + 1;
            }; // if
        }; // if

        #ifdef KMP_DEBUG
            __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock );
            __kmp_debug_printf( "Assertion failure at %s(%d): %s.\n", file, line, msg );
            __kmp_release_bootstrap_lock( & __kmp_stdio_lock );
            #ifdef USE_ASSERT_BREAK
                #if KMP_OS_WINDOWS
                    DebugBreak();
                #endif
            #endif // USE_ASSERT_BREAK
            #ifdef USE_ASSERT_STALL
                /*    __kmp_infinite_loop(); */
                for(;;);
            #endif // USE_ASSERT_STALL
            #ifdef USE_ASSERT_SEG
                {
                    int volatile * ZERO = (int*) 0;
                    ++ (*ZERO);
                }
            #endif // USE_ASSERT_SEG
        #endif

        __kmp_msg(
            kmp_ms_fatal,
            KMP_MSG( AssertionFailure, file, line ),
            KMP_HNT( SubmitBugReport ),
            __kmp_msg_null
        );

        return 0;

    } // __kmp_debug_assert

#endif // KMP_USE_ASSERT

/* Dump debugging buffer to stderr */
void
__kmp_dump_debug_buffer( void )
{
    if ( __kmp_debug_buffer != NULL ) {
        int i;
        int dc = __kmp_debug_count;
        char *db = & __kmp_debug_buffer[ (dc % __kmp_debug_buf_lines) * __kmp_debug_buf_chars ];
        char *db_end = & __kmp_debug_buffer[ __kmp_debug_buf_lines * __kmp_debug_buf_chars ];
        char *db2;

        __kmp_acquire_bootstrap_lock( & __kmp_stdio_lock );
        __kmp_printf_no_lock( "\nStart dump of debugging buffer (entry=%d):\n",
                 dc % __kmp_debug_buf_lines );

        for ( i = 0; i < __kmp_debug_buf_lines; i++ ) {

            if ( *db != '\0' ) {
                /* Fix up where no carriage return before string termination char */
                for ( db2 = db + 1; db2 < db + __kmp_debug_buf_chars - 1; db2 ++) {
                    if ( *db2 == '\0' ) {
                        if ( *(db2-1) != '\n' ) { *db2 = '\n'; *(db2+1) = '\0'; }
                        break;
                    }
                }
                /* Handle case at end by shortening the printed message by one char if necessary */
                if ( db2 == db + __kmp_debug_buf_chars - 1 &&
                     *db2 == '\0' && *(db2-1) != '\n' ) {
                    *(db2-1) = '\n';
                }

                __kmp_printf_no_lock( "%4d: %.*s", i, __kmp_debug_buf_chars, db );
                *db = '\0'; /* only let it print once! */
            }

            db += __kmp_debug_buf_chars;
            if ( db >= db_end )
                db = __kmp_debug_buffer;
        }

        __kmp_printf_no_lock( "End dump of debugging buffer (entry=%d).\n\n",
                 ( dc+i-1 ) % __kmp_debug_buf_lines );
        __kmp_release_bootstrap_lock( & __kmp_stdio_lock );
    }
}
