/*
 * kmp_debug.c -- debug utilities for the Guide library
 */


//===----------------------------------------------------------------------===//
//
//                     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 );
    }
}
