/** * called only from main thread */ static void freerdp_chanman_process_sync(rdpChanMan* chan_man, freerdp* instance) { struct chan_data* lchan_data; rdpChan* lrdp_chan; struct sync_data* item; 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_chanman_find_rdp_chan_by_name(chan_man, instance->settings, lchan_data->name, &item->index); if (lrdp_chan != NULL) { IFCALL(instance->SendChannelData, instance, lrdp_chan->chan_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_chanman_process_sync(rdpChanMan* chan_man, rdpInst* inst) { void* ldata; uint32 ldata_len; void* luser_data; int lindex; struct chan_data* lchan_data; struct rdp_chan* lrdp_chan; if (chan_man->sync_data == NULL) return; ldata = chan_man->sync_data; ldata_len = chan_man->sync_data_length; luser_data = chan_man->sync_user_data; lindex = chan_man->sync_index; chan_man->sync_data = NULL; chan_man->sync_data_length = 0; chan_man->sync_user_data = NULL; chan_man->sync_index = 0; freerdp_sem_signal(chan_man->sync_data_sem); /* release chan_man->sync* vars */ lchan_data = chan_man->chans + lindex; lrdp_chan = freerdp_chanman_find_rdp_chan_by_name(chan_man, inst->settings, lchan_data->name, &lindex); if (lrdp_chan != 0) { inst->rdp_channel_data(inst, lrdp_chan->chan_id, ldata, ldata_len); } if (lchan_data->open_event_proc != 0) { lchan_data->open_event_proc(lchan_data->open_handle, CHANNEL_EVENT_WRITE_COMPLETE, luser_data, sizeof(void *), sizeof(void *), 0); } }