static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) { rfContext* rfi; freerdp* instance; rfi = GET_DATA(gp); instance = rfi->instance; if (rfi->thread) { pthread_cancel(rfi->thread); if (rfi->thread) pthread_join(rfi->thread, NULL); } pthread_mutex_destroy(&rfi->mutex); g_mutex_free(rfi->gmutex); g_cond_free(rfi->gcond); remmina_rdp_event_uninit(gp); remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect"); if (instance) { if ( rfi->connected ) { if (instance->context->channels) freerdp_channels_close(instance->context->channels, instance); freerdp_disconnect(instance); rfi->connected = False; } } if (rfi->rfx_context) { rfx_context_free(rfi->rfx_context); rfi->rfx_context = NULL; } if (instance) { /* Remove instance->context from gp object data to avoid double free */ g_object_steal_data(G_OBJECT(gp), "plugin-data"); if (instance->context->channels) { freerdp_channels_free(instance->context->channels); instance->context->channels = NULL; } freerdp_context_free(instance); /* context is rfContext* rfi */ freerdp_free(instance); rfi->instance = NULL; } return FALSE; }
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) { rfContext* rfi; freerdp* instance; rfi = GET_DATA(gp); instance = rfi->instance; if (rfi->thread) { pthread_cancel(rfi->thread); if (rfi->thread) pthread_join(rfi->thread, NULL); } pthread_mutex_destroy(&rfi->mutex); g_mutex_free(rfi->gmutex); g_cond_free(rfi->gcond); remmina_rdp_event_uninit(gp); remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect"); if (instance) { if (rfi->channels) { //freerdp_channels_close(rfi->channels, instance); freerdp_channels_free(rfi->channels); rfi->channels = NULL; } if (freerdp_shall_disconnect(instance)) { freerdp_disconnect(instance); } } if (rfi->rfx_context) { rfx_context_free(rfi->rfx_context); rfi->rfx_context = NULL; } if (instance) { //freerdp_context_free(instance); /* context is rfContext* rfi */ freerdp_free(instance); } return FALSE; }