BOOL WINAPI DllMain()

in thread_notifications_lackey_dll/src/thread_notifications_lackey_dll.c [54:124]


BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpvReserved)  // reserved
{
    BOOL result = FALSE;

    (void)hinstDLL;
    (void)lpvReserved;

    switch (fdwReason)
    {
    default:
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_017: [ If fdwReason is any other value, DllMain shall terminate the process. ]*/
        ps_util_terminate_process();
        break;

    /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_005: [ If fdwReason is DLL_PROCESS_ATTACH: ]*/
    case DLL_PROCESS_ATTACH:
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_006: [ DllMain shall call logger_init to initialize logging for the module. ]*/
        if (logger_init() != 0)
        {
            /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_008: [ If logger_init fails, DllMain shall return FALSE. ]*/
            result = FALSE;
        }
        else
        {
            /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_007: [ Otherwise, DllMain shall initialize the callback maintained by the module with NULL and return TRUE. ]*/
            result = TRUE;
        }
        break;

    /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_011: [ If fdwReason is DLL_THREAD_ATTACH: ]*/
    case DLL_THREAD_ATTACH:
    {
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_013: [ If a callback was passed by the user through a thread_notifications_lackey_dll_init_callback call, the callback shall be called with THREAD_NOTIFICATIONS_LACKEY_DLL_REASON_THREAD_ATTACH. ]*/
        THREAD_NOTIFICATIONS_LACKEY_DLL_CALLBACK_FUNC existing_callback = (THREAD_NOTIFICATIONS_LACKEY_DLL_CALLBACK_FUNC)interlocked_compare_exchange_pointer((void* volatile_atomic*) & notifications_cb, NULL, NULL);
        if (existing_callback != NULL)
        {
            existing_callback(THREAD_NOTIFICATIONS_LACKEY_DLL_REASON_THREAD_ATTACH);
        }

        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_012: [ DllMain shall return TRUE. ]*/
        result = TRUE;
        break;
    }

    /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_014: [ If fdwReason is DLL_THREAD_DETACH: ]*/
    case DLL_THREAD_DETACH:
    {
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_016: [ If a callback was passed by the user through a thread_notifications_lackey_dll_init_callback call, the callback shall be called with THREAD_NOTIFICATIONS_LACKEY_DLL_REASON_THREAD_DETACH. ]*/
        THREAD_NOTIFICATIONS_LACKEY_DLL_CALLBACK_FUNC existing_callback = (THREAD_NOTIFICATIONS_LACKEY_DLL_CALLBACK_FUNC)interlocked_compare_exchange_pointer((void* volatile_atomic*) & notifications_cb, NULL, NULL);
        if (existing_callback != NULL)
        {
            existing_callback(THREAD_NOTIFICATIONS_LACKEY_DLL_REASON_THREAD_DETACH);
        }
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_015: [ DllMain shall return TRUE. ]*/
        result = TRUE;
        break;
    }

    /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_009: [ If fdwReason is DLL_PROCESS_DETACH: ]*/
    case DLL_PROCESS_DETACH:
        /* Codes_SRS_THREAD_NOTIFICATIONS_LACKEY_DLL_01_010: [DllMain shall call logger_deinit and return TRUE.]*/
        logger_deinit();
        result = TRUE;
        break;
    }

    return result;
}