RD_EVENT * freerdp_chanman_pop_event(rdpChanMan * chan_man) { RD_EVENT * event; if (chan_man->event == NULL) return NULL; event = chan_man->event; chan_man->event = NULL; SEMAPHORE_POST(chan_man->sem_event); /* release chan_man->event */ return event; }
/* can be called from any thread */ static uint32 VCHAN_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("MyVirtualChannelWrite: error bad chanhan"); return CHANNEL_RC_BAD_CHANNEL_HANDLE; } if (!chan_man->is_connected) { DEBUG_CHANMAN("MyVirtualChannelWrite: error not connected"); return CHANNEL_RC_NOT_CONNECTED; } if (pData == 0) { DEBUG_CHANMAN("MyVirtualChannelWrite: error bad pData"); return CHANNEL_RC_NULL_DATA; } if (dataLength == 0) { DEBUG_CHANMAN("MyVirtualChannelWrite: error bad dataLength"); return CHANNEL_RC_ZERO_LENGTH; } lchan = chan_man->chans + index; if (lchan->flags != 2) { DEBUG_CHANMAN("MyVirtualChannelWrite: error not open"); return CHANNEL_RC_NOT_OPEN; } SEMAPHORE_WAIT(chan_man->sem); /* lock chan_man->sync* vars */ if (!chan_man->is_connected) { SEMAPHORE_POST(chan_man->sem); DEBUG_CHANMAN("MyVirtualChannelWrite: 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 */ freerdp_chanman_set_ev(chan_man); return CHANNEL_RC_OK; }
static uint32 VCHAN_CC MyVirtualChannelEventPush(uint32 openHandle, RD_EVENT * event) { 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("MyVirtualChannelEventPush: error bad chanhan"); return CHANNEL_RC_BAD_CHANNEL_HANDLE; } if (!chan_man->is_connected) { DEBUG_CHANMAN("MyVirtualChannelEventPush: error not connected"); return CHANNEL_RC_NOT_CONNECTED; } if (event == NULL) { DEBUG_CHANMAN("MyVirtualChannelEventPush: error bad event"); return CHANNEL_RC_NULL_DATA; } lchan = chan_man->chans + index; if (lchan->flags != 2) { DEBUG_CHANMAN("MyVirtualChannelEventPush: error not open"); return CHANNEL_RC_NOT_OPEN; } SEMAPHORE_WAIT(chan_man->sem_event); /* lock chan_man->event */ if (!chan_man->is_connected) { SEMAPHORE_POST(chan_man->sem_event); DEBUG_CHANMAN("MyVirtualChannelEventPush: error not connected"); return CHANNEL_RC_NOT_CONNECTED; } chan_man->event = event; /* set the event */ freerdp_chanman_set_ev(chan_man); return CHANNEL_RC_OK; }
/* 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; SEMAPHORE_POST(chan_man->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 msocket_server_cleanup_connection(msocket_server_t *self, void *arg){ MUTEX_LOCK(self->mutex); adt_ary_push(&self->cleanupItems,arg); MUTEX_UNLOCK(self->mutex); SEMAPHORE_POST(self->sem); }