void CHANNEL_Select( DaoProcess *proc, DaoValue *par[], int n ) { DaoTaskEvent *event = NULL; DaoFuture *future = DaoProcess_GetInitFuture( proc ); DaoList *channels = (DaoList*) par[0]; float timeout = par[1]->xFloat.value; daoint i, size = DaoList_Size( channels ); for(i=0; i<size; ++i){ DaoValue *value = DaoList_GetItem( channels, i ); if( DaoValue_CheckCtype( value, dao_type_channel ) == 0 ){ DaoProcess_RaiseException( proc, DAO_ERROR_PARAM, "invalid type selection" ); return; } } event = DaoCallServer_MakeEvent(); DaoTaskEvent_Init( event, DAO_EVENT_WAIT_SELECT, DAO_EVENT_WAIT, future, NULL ); event->channels = DArray_Copy( & channels->items ); proc->status = DAO_PROCESS_SUSPENDED; proc->pauseType = DAO_PAUSE_CHANFUT_SELECT; DaoCallServer_AddTimedWait( proc, event, timeout ); /* Message may have been sent before this call: */ DMutex_Lock( & daoCallServer->mutex ); DaoChannel_ActivateEvent( NULL, DAO_EVENT_WAIT_SELECT ); DCondVar_Signal( & daoCallServer->condv ); DMutex_Unlock( & daoCallServer->mutex ); }
static void* DArray_CopyItem( DArray *self, void *item ) { DaoValue *v; if( item == NULL ) return NULL; switch( self->type ){ case DAO_DATA_VALUE : v = DaoValue_SimpleCopy( (DaoValue*) item ); GC_IncRC( v ); return v; case DAO_DATA_VMCODE : return DaoVmCodeX_Copy( (DaoVmCodeX*) item ); case DAO_DATA_TOKEN : return DaoToken_Copy( (DaoToken*) item ); case DAO_DATA_STRING : return DString_Copy( (DString*) item ); case DAO_DATA_VECTOR : return DVector_Copy( (DVector*) item ); case DAO_DATA_ARRAY : return DArray_Copy( (DArray*) item ); case DAO_DATA_MAP : return DMap_Copy( (DMap*) item ); default : break; } return item; }