int session_end()

in src/session.c [902:970]


int session_end(SESSION_HANDLE session, const char* condition_value, const char* description)
{
    int result;

    if (session == NULL)
    {
        result = MU_FAILURE;
    }
    else
    {
        SESSION_INSTANCE* session_instance = (SESSION_INSTANCE*)session;
        size_t i;

        if ((session_instance->session_state != SESSION_STATE_UNMAPPED) &&
            (session_instance->session_state != SESSION_STATE_DISCARDING))
        {
            ERROR_HANDLE error_handle = NULL;
            result = 0;

            if (condition_value != NULL)
            {
                error_handle = error_create(condition_value);
                if (error_handle == NULL)
                {
                    result = MU_FAILURE;
                }
                else
                {
                    if (error_set_description(error_handle, description) != 0)
                    {
                        result = MU_FAILURE;
                    }
                }
            }

            if (result == 0)
            {
                if (send_end_frame(session_instance, error_handle) != 0)
                {
                    result = MU_FAILURE;
                }
                else
                {
                    session_set_state(session_instance, SESSION_STATE_DISCARDING);
                    result = 0;
                }
            }

            if (error_handle != NULL)
            {
                error_destroy(error_handle);
            }
        }
        else
        {
            result = 0;
        }

        // all link endpoints are destroyed when the session end happens
        for (i = 0; i < session_instance->link_endpoint_count; i++)
        {
            free_link_endpoint(session_instance->link_endpoints[i]);
        }

        session_instance->link_endpoint_count = 0;
    }

    return result;
}