static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk) { MessagePipe_PostQuit(remdesk->MsgPipe, 0); WaitForSingleObject(remdesk->thread, INFINITE); MessagePipe_Free(remdesk->MsgPipe); CloseHandle(remdesk->thread); remdesk->channelEntryPoints.pVirtualChannelClose(remdesk->OpenHandle); if (remdesk->data_in) { Stream_Free(remdesk->data_in, TRUE); remdesk->data_in = NULL; } remdesk_remove_open_handle_data(remdesk->OpenHandle); remdesk_remove_init_handle_data(remdesk->InitHandle); }
static void svc_plugin_process_terminated(rdpSvcPlugin* plugin) { MessagePipe_PostQuit(plugin->MsgPipe, 0); WaitForSingleObject(plugin->thread, INFINITE); MessagePipe_Free(plugin->MsgPipe); CloseHandle(plugin->thread); plugin->channel_entry_points.pVirtualChannelClose(plugin->open_handle); svc_plugin_remove(plugin); if (plugin->data_in) { stream_free(plugin->data_in); plugin->data_in = NULL; } IFCALL(plugin->terminate_callback, plugin); }
void freerdp_channels_close(rdpChannels* channels, freerdp* instance) { int index; char* name; CHANNEL_OPEN_DATA* pChannelOpenData; CHANNEL_CLIENT_DATA* pChannelClientData; DEBUG_CHANNELS("closing"); channels->is_connected = 0; freerdp_channels_check_fds(channels, instance); /* tell all libraries we are shutting down */ for (index = 0; index < channels->clientDataCount; index++) { ChannelDisconnectedEventArgs e; pChannelClientData = &channels->clientDataList[index]; if (pChannelClientData->pChannelInitEventProc) pChannelClientData->pChannelInitEventProc(pChannelClientData->pInitHandle, CHANNEL_EVENT_TERMINATED, 0, 0); pChannelOpenData = &channels->openDataList[index]; name = (char*) malloc(9); CopyMemory(name, pChannelOpenData->name, 8); name[8] = '\0'; EventArgsInit(&e, "freerdp"); e.name = name; e.pInterface = pChannelOpenData->pInterface; PubSub_OnChannelDisconnected(instance->context->pubSub, instance->context, &e); free(name); } /* Emit a quit signal to the internal message pipe. */ MessagePipe_PostQuit(channels->MsgPipe, 0); }