int freerdp_channels_global_uninit(void) { while (g_channels_list) freerdp_channels_free(g_channels_list->channels); freerdp_mutex_free(g_mutex_init); freerdp_mutex_free(g_mutex_list); return 0; }
int freerdp_chanman_global_uninit(void) { while (g_chan_man_list) freerdp_chanman_free(g_chan_man_list->chan_man); freerdp_mutex_free(g_mutex_init); freerdp_mutex_free(g_mutex_list); return 0; }
boolean WTSVirtualChannelClose( /* __in */ void* hChannelHandle) { wts_data_item* item; rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; if (channel != NULL) { if (channel->index < channel->client->settings->num_channels) channel->client->settings->channels[channel->index].handle = NULL; stream_free(channel->receive_data); if (channel->receive_event) wait_obj_free(channel->receive_event); if (channel->receive_queue) { while ((item = (wts_data_item*) list_dequeue(channel->receive_queue)) != NULL) { wts_data_item_free(item); } list_free(channel->receive_queue); } if (channel->mutex) freerdp_mutex_free(channel->mutex); xfree(channel); } return true; }
void freerdp_channels_free(rdpChannels * chan_man) { rdpChannelsList* list; rdpChannelsList* prev; freerdp_mutex_free(chan_man->sync_data_mutex); list_free(chan_man->sync_data_list); freerdp_sem_free(chan_man->event_sem); wait_obj_free(chan_man->signal); /* Remove from global list */ freerdp_mutex_lock(g_mutex_list); for (prev = NULL, list = g_channels_list; list; prev = list, list = list->next) { if (list->channels == chan_man) break; } if (list) { if (prev) prev->next = list->next; else g_channels_list = list->next; xfree(list); } freerdp_mutex_unlock(g_mutex_list); xfree(chan_man); }
void WTSDestroyVirtualChannelManager(WTSVirtualChannelManager* vcm) { wts_data_item* item; rdpPeerChannel* channel; if (vcm != NULL) { while ((channel = (rdpPeerChannel*) list_dequeue(vcm->dvc_channel_list)) != NULL) { WTSVirtualChannelClose(channel); } list_free(vcm->dvc_channel_list); if (vcm->drdynvc_channel != NULL) { WTSVirtualChannelClose(vcm->drdynvc_channel); vcm->drdynvc_channel = NULL; } wait_obj_free(vcm->send_event); while ((item = (wts_data_item*) list_dequeue(vcm->send_queue)) != NULL) { wts_data_item_free(item); } list_free(vcm->send_queue); freerdp_mutex_free(vcm->mutex); xfree(vcm); } }
void test_mutex(void) { freerdp_mutex mutex; mutex = freerdp_mutex_new(); freerdp_mutex_lock(mutex); freerdp_mutex_unlock(mutex); freerdp_mutex_free(mutex); }
void freerdp_thread_free(freerdp_thread* thread) { int i; for (i = 0; i < thread->num_signals; i++) wait_obj_free(thread->signals[i]); thread->num_signals = 0; freerdp_mutex_free(thread->mutex); thread->mutex = NULL; xfree(thread); }
boolean WTSVirtualChannelClose( /* __in */ void* hChannelHandle) { STREAM* s; wts_data_item* item; WTSVirtualChannelManager* vcm; rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; if (channel) { vcm = channel->vcm; if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_SVC) { if (channel->index < channel->client->settings->num_channels) channel->client->settings->channels[channel->index].handle = NULL; } else { freerdp_mutex_lock(vcm->mutex); list_remove(vcm->dvc_channel_list, channel); freerdp_mutex_unlock(vcm->mutex); if (channel->dvc_open_state == DVC_OPEN_STATE_SUCCEEDED) { s = stream_new(8); wts_write_drdynvc_header(s, CLOSE_REQUEST_PDU, channel->channel_id); WTSVirtualChannelWrite(vcm->drdynvc_channel, stream_get_head(s), stream_get_length(s), NULL); stream_free(s); } } if (channel->receive_data) stream_free(channel->receive_data); if (channel->receive_event) wait_obj_free(channel->receive_event); if (channel->receive_queue) { while ((item = (wts_data_item*) list_dequeue(channel->receive_queue)) != NULL) { wts_data_item_free(item); } list_free(channel->receive_queue); } if (channel->mutex) freerdp_mutex_free(channel->mutex); xfree(channel); } return true; }