/** * called only from main thread */ static void freerdp_channels_process_sync(rdpChannels* chan_man, freerdp* instance) { rdpChannel* lrdp_chan; struct sync_data* item; struct channel_data* lchan_data; while (chan_man->sync_data_list->head != NULL) { freerdp_mutex_lock(chan_man->sync_data_mutex); item = (struct sync_data*)list_dequeue(chan_man->sync_data_list); freerdp_mutex_unlock(chan_man->sync_data_mutex); lchan_data = chan_man->chans + item->index; lrdp_chan = freerdp_channels_find_channel_by_name(chan_man, instance->settings, lchan_data->name, &item->index); if (lrdp_chan != NULL) instance->SendChannelData(instance, lrdp_chan->channel_id, item->data, item->data_length); if (lchan_data->open_event_proc != 0) { lchan_data->open_event_proc(lchan_data->open_handle, CHANNEL_EVENT_WRITE_COMPLETE, item->user_data, sizeof(void *), sizeof(void *), 0); } xfree(item); } }
/** * called only from main thread */ static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance) { SYNC_DATA* item; rdpChannel* lrdp_channel; struct channel_data* lchannel_data; while (QueryDepthSList(channels->pSyncDataList) > 0) { item = (SYNC_DATA*) InterlockedPopEntrySList(channels->pSyncDataList); if (!item) break; lchannel_data = channels->channels_data + item->Index; lrdp_channel = freerdp_channels_find_channel_by_name(channels, instance->settings, lchannel_data->name, &item->Index); if (lrdp_channel != NULL) instance->SendChannelData(instance, lrdp_channel->ChannelId, item->Data, item->DataLength); if (lchannel_data->open_event_proc != 0) { lchannel_data->open_event_proc(lchannel_data->open_handle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, sizeof(void*), sizeof(void*), 0); } _aligned_free(item); } }
/** * called only from main thread */ static int freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance) { int rc = TRUE; wMessage message; wMessage* event; rdpChannel* channel; CHANNEL_OPEN_EVENT* item; CHANNEL_OPEN_DATA* pChannelOpenData; while (MessageQueue_Peek(channels->MsgPipe->Out, &message, TRUE)) { if (message.id == WMQ_QUIT) { rc = FALSE; break; } if (message.id == 0) { item = (CHANNEL_OPEN_EVENT*) message.wParam; if (!item) break; pChannelOpenData = &channels->openDataList[item->Index]; channel = freerdp_channels_find_channel_by_name(channels, instance->settings, pChannelOpenData->name, &item->Index); if (channel) instance->SendChannelData(instance, channel->ChannelId, item->Data, item->DataLength); if (pChannelOpenData->pChannelOpenEventProc) { pChannelOpenData->pChannelOpenEventProc(pChannelOpenData->OpenHandle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0); } free(item); } else if (message.id == 1) { event = (wMessage*) message.wParam; /** * Ignore for now, the same event is being pushed on the In queue, * and we're pushing it on the Out queue just to wake other threads */ } } return rc; }
/** * called only from main thread */ static int freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance) { int status = TRUE; wMessage message; rdpMcsChannel* channel; CHANNEL_OPEN_EVENT* item; CHANNEL_OPEN_DATA* pChannelOpenData; while (MessageQueue_Peek(channels->queue, &message, TRUE)) { if (message.id == WMQ_QUIT) { status = FALSE; break; } if (message.id == 0) { item = (CHANNEL_OPEN_EVENT*) message.wParam; if (!item) break; pChannelOpenData = item->pChannelOpenData; channel = freerdp_channels_find_channel_by_name(instance->context->rdp, pChannelOpenData->name); if (channel) instance->SendChannelData(instance, channel->ChannelId, item->Data, item->DataLength); if (pChannelOpenData->pChannelOpenEventProc) { pChannelOpenData->pChannelOpenEventProc( pChannelOpenData->OpenHandle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0); } else if (pChannelOpenData->pChannelOpenEventProcEx) { pChannelOpenData->pChannelOpenEventProcEx(pChannelOpenData->lpUserParam, pChannelOpenData->OpenHandle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0); } free(item); } } return status; }
/** * called only from main thread */ static void freerdp_channels_process_sync(rdpChannels* channels, freerdp* instance) { wMessage message; wMessage* event; CHANNEL_OPEN_EVENT* item; rdpChannel* lrdp_channel; struct channel_data* lchannel_data; while (MessageQueue_Peek(channels->MsgPipe->Out, &message, TRUE)) { if (message.id == WMQ_QUIT) break; if (message.id == 0) { item = (CHANNEL_OPEN_EVENT*) message.wParam; if (!item) break; lchannel_data = channels->channels_data + item->Index; lrdp_channel = freerdp_channels_find_channel_by_name(channels, instance->settings, lchannel_data->name, &item->Index); if (lrdp_channel) instance->SendChannelData(instance, lrdp_channel->ChannelId, item->Data, item->DataLength); if (lchannel_data->open_event_proc) { lchannel_data->open_event_proc(lchannel_data->open_handle, CHANNEL_EVENT_WRITE_COMPLETE, item->UserData, item->DataLength, item->DataLength, 0); } free(item); } else if (message.id == 1) { event = (wMessage*) message.wParam; /** * Ignore for now, the same event is being pushed on the In queue, * and we're pushing it on the Out queue just to wake other threads */ } } }