/** * 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); } }
void test_semaphore(void) { freerdp_sem sem; sem = freerdp_sem_new(1); freerdp_sem_wait(sem); freerdp_sem_signal(sem); freerdp_sem_free(sem); }
RDP_EVENT* freerdp_chanman_pop_event(rdpChanMan* chan_man) { RDP_EVENT* event; if (chan_man->event == NULL) return NULL; event = chan_man->event; chan_man->event = NULL; freerdp_sem_signal(chan_man->event_sem); /* release chan_man->event */ return event; }
/* can be called from any thread */ static uint32 FREERDP_CC MyVirtualChannelWrite(uint32 openHandle, void* pData, uint32 dataLength, void* pUserData) { rdpChanMan* chan_man; struct chan_data* lchan; int index; chan_man = freerdp_chanman_find_by_open_handle(openHandle, &index); if ((chan_man == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT)) { DEBUG_CHANMAN("error bad chanhan"); return CHANNEL_RC_BAD_CHANNEL_HANDLE; } if (!chan_man->is_connected) { DEBUG_CHANMAN("error not connected"); return CHANNEL_RC_NOT_CONNECTED; } if (pData == 0) { DEBUG_CHANMAN("error bad pData"); return CHANNEL_RC_NULL_DATA; } if (dataLength == 0) { DEBUG_CHANMAN("error bad dataLength"); return CHANNEL_RC_ZERO_LENGTH; } lchan = chan_man->chans + index; if (lchan->flags != 2) { DEBUG_CHANMAN("error not open"); return CHANNEL_RC_NOT_OPEN; } freerdp_sem_wait(chan_man->sync_data_sem); /* lock chan_man->sync* vars */ if (!chan_man->is_connected) { freerdp_sem_signal(chan_man->sync_data_sem); DEBUG_CHANMAN("error not connected"); return CHANNEL_RC_NOT_CONNECTED; } chan_man->sync_data = pData; chan_man->sync_data_length = dataLength; chan_man->sync_user_data = pUserData; chan_man->sync_index = index; /* set the event */ wait_obj_set(chan_man->signal); return CHANNEL_RC_OK; }
void* thread_func(void* param) { struct thread_data* data; data = (struct thread_data*) param; tfreerdp_run(data->instance); xfree(data); pthread_detach(pthread_self()); g_thread_count--; if (g_thread_count < 1) freerdp_sem_signal(&g_sem); return NULL; }
static void * thread_func(void * arg) { xfInfo * xfi; xfi = (xfInfo *) arg; g_error_code = run_xfreerdp(xfi); free(xfi->settings); freerdp_chanman_free(xfi->chan_man); free(xfi); pthread_detach(pthread_self()); g_thread_count--; if (g_thread_count < 1) { freerdp_sem_signal(&g_sem); } return NULL; }
static void * thread_func(void * arg) { struct thread_data * data; data = (struct thread_data *) arg; run_dfbfreerdp(data->settings, data->chan_man); free(data->settings); freerdp_chanman_free(data->chan_man); free(data); pthread_detach(pthread_self()); g_thread_count--; if (g_thread_count < 1) { freerdp_sem_signal(&g_sem); } return NULL; }
static uint32 FREERDP_CC MyVirtualChannelEventPush(uint32 openHandle, RDP_EVENT* event) { rdpChannels* chan_man; struct channel_data* lchan; int index; chan_man = freerdp_channels_find_by_open_handle(openHandle, &index); if ((chan_man == NULL) || (index < 0) || (index >= CHANNEL_MAX_COUNT)) { DEBUG_CHANNELS("error bad chanhan"); return CHANNEL_RC_BAD_CHANNEL_HANDLE; } if (!chan_man->is_connected) { DEBUG_CHANNELS("error not connected"); return CHANNEL_RC_NOT_CONNECTED; } if (event == NULL) { DEBUG_CHANNELS("error bad event"); return CHANNEL_RC_NULL_DATA; } lchan = chan_man->chans + index; if (lchan->flags != 2) { DEBUG_CHANNELS("error not open"); return CHANNEL_RC_NOT_OPEN; } freerdp_sem_wait(chan_man->event_sem); /* lock channels->event */ if (!chan_man->is_connected) { freerdp_sem_signal(chan_man->event_sem); DEBUG_CHANNELS("error not connected"); return CHANNEL_RC_NOT_CONNECTED; } chan_man->event = event; /* set the event */ wait_obj_set(chan_man->signal); return CHANNEL_RC_OK; }