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;
}