Log 

Demonstrates how to enable log and get log data when programming with ADLX.

Command Prompts

Command Prompt Description
1 Enable log with local file, file [./ADLX.log] is created.
2 Enable log with window debugger.
3 Eenable log with app handle.
Q/q Terminate the application.

Sample Path

/Samples/C/Generic/Log

Code 

//
// Copyright (c) 2021 - 2022 Advanced Micro Devices, Inc. All rights reserved.
//
//-------------------------------------------------------------------------------------------------

#include "SDK/ADLXHelper/Windows/C/ADLXHelper.h"
#include "SDK/Include/IDisplays.h"

// CallBack to handle ADLX log
ADLX_RESULT  ADLX_STD_CALL WriteLog(IADLXLog* pThis, const wchar_t* msg)
{
    wprintf(L"%s", msg);
    return ADLX_OK ;
}

// Application's log struct demostration, application can capture ADLX log here
typedef struct AppHandlLog
{
    ADLX_RESULT (ADLX_STD_CALL* WriteLog)
    (IADLXLog* pThis, const wchar_t* msg);
} AppHandlLog;

// Local file, ADLX log data is saved to file
void UseLocalFile()
{
    // Get system services
    IADLXSystem* sys = ADLXHelper_GetSystemServices();

    // Log destination, severity, logfile
    ADLX_LOG_DESTINATION  mode = LOCALFILE ;
    ADLX_LOG_SEVERITY  severity = LDEBUG ;
    wchar_t logfile[] = L"./ADLX.log";

    // Enable log
    ADLX_RESULT  res = sys->pVtbl->EnableLog(sys, mode, severity, NULL, logfile);
    printf("Enabled log result: %d (0 means success)\n", res);
}

// Output window of the application debugger, only output log information is captured in output
void UseWindowDebugger()
{
    // Get system services
    IADLXSystem* sys = ADLXHelper_GetSystemServices();

    // Log destination, severity
    ADLX_LOG_DESTINATION  mode = DBGVIEW ;
    ADLX_LOG_SEVERITY  severity = LDEBUG ;

    // Enable log
    ADLX_RESULT  res = sys->pVtbl->EnableLog(sys, mode, severity, NULL, NULL);
    printf("Enabled log result : %d (0 means Success)\n", res);
}

// Application handle log, application's callback will handle the ADLX log
void UseAppHandlLog(AppHandlLog** appHandlLog)
{
    // Get system services
    IADLXSystem* sys = ADLXHelper_GetSystemServices();

    // Log destination, severity
    ADLX_LOG_DESTINATION  mode = APPLICATION ;
    ADLX_LOG_SEVERITY  severity = LDEBUG ;

    // Enable log
    ADLX_RESULT  res = sys->pVtbl->EnableLog(sys, mode, severity, (IADLXLog*)appHandlLog, NULL);
    printf("Enabled log result : %d (0 means Success)\n", res);
}

// Main menu
void MainMenu()
{
    printf("\tChoose from the following options:\n");
    printf("\t->Press 1 to enable log with local file, file [./ADLX.log] will be created.\n");
    printf("\t->Press 2 to enable log with window debugger\n");
    printf("\t->Press 3 to enable log with app handle\n");
}

// Menu action control
void MenuControl(AppHandlLog** appHandlLog)
{
    int num = 0;
    num = getchar();
    switch (num)
    {
    // Local file
    case '1':
        UseLocalFile();
        break;

    // Window debugger
    case '2':
        UseWindowDebugger();
        break;

    // App handle
    case '3':
        UseAppHandlLog(appHandlLog);
        break;

    default:
        printf("Invalid input\n");
        break;
    }
}

// Wait for exit with error message
int WaitAndExit(const char* msg, const int retCode)
{
    // Printout the message and pause to see it before returning the desired code
    if (NULL != msg)
        printf("%s\n", msg);

    system("pause");
    return retCode;
}

int main()
{
    // Define return code
    ADLX_RESULT  res = ADLX_FAIL ;

    // Initialize ADLX
    res = ADLXHelper_Initialize();
    if (ADLX_SUCCEEDED (res))
    {
        // Get system services
        IADLXSystem* sys = ADLXHelper_GetSystemServices();

        // App create object to handle ADLX log
        AppHandlLog* appHandlLog = (AppHandlLog*)malloc(sizeof(AppHandlLog));
        appHandlLog->WriteLog = &WriteLog;

        // Menu
        MainMenu();
        MenuControl(&appHandlLog);

        // Try get log by using some interfaces
        // Get display service and display numbers
        IADLXDisplayServices* displayService = NULL;
        res = sys->pVtbl->GetDisplaysServices(sys, &displayService);
        if (ADLX_SUCCEEDED (res))
        {
            adlx_uint displayNum;
            displayService->pVtbl->GetNumberOfDisplays(displayService, &displayNum);
        }
        if (NULL != displayService)
        {
            displayService->pVtbl->Release(displayService);
            displayService = NULL;
        }

        // Destroy ADLX
        res = ADLXHelper_Terminate();
        printf("Destroy ADLX res: %d\n", res);

        // appHandlLog may be used throughout the life cycle of ADLX,
        // So destroy appHandlLog after destroying ADLX
        free(appHandlLog);
        appHandlLog = NULL;
    }
    else
    {
        return WaitAndExit("ADLX initialization failed", 0);
    }

    // Pause for user see the print out
    system("pause");

    return 0;
}