- smx_process_t process = NULL;
- while((process = xbt_setset_set_extract(state->interleave))){
- if(SIMIX_process_is_enabled(process)
- && !xbt_setset_set_belongs(state->done, process)){
- xbt_setset_set_insert(state->done, process);
- return &process->request;
+ return &state->internal_req;
+}
+
+smx_simcall_t MC_state_get_request(mc_state_t state, int *value)
+{
+ smx_process_t process = NULL;
+ mc_procstate_t procstate = NULL;
+ unsigned int start_count;
+ int min, max;
+
+ static int first = 0;
+ if(first == 0){
+ srand(987654321);
+ first = 1;
+ }
+
+ xbt_swag_foreach(process, simix_global->process_list){
+ procstate = &state->proc_status[process->pid];
+
+ if(procstate->state == MC_INTERLEAVE){
+ if(MC_process_is_enabled(process)){
+ switch(process->simcall.call){
+ case SIMCALL_COMM_WAITANY:
+ *value = -1;
+ while(procstate->interleave_count < xbt_dynar_length(simcall_comm_waitany__get__comms(&process->simcall))){
+ if(MC_request_is_enabled_by_idx(&process->simcall, procstate->interleave_count++)){
+ *value = procstate->interleave_count-1;
+ break;
+ }
+ }
+
+ if(procstate->interleave_count >= xbt_dynar_length(simcall_comm_waitany__get__comms(&process->simcall)))
+ procstate->state = MC_DONE;
+
+ if(*value != -1)
+ return &process->simcall;
+
+ break;
+
+ case SIMCALL_COMM_TESTANY:
+ start_count = procstate->interleave_count;
+ *value = -1;
+ while(procstate->interleave_count < xbt_dynar_length(simcall_comm_testany__get__comms(&process->simcall))){
+ if(MC_request_is_enabled_by_idx(&process->simcall, procstate->interleave_count++)){
+ *value = procstate->interleave_count - 1;
+ break;
+ }
+ }
+
+ if(procstate->interleave_count >= xbt_dynar_length(simcall_comm_testany__get__comms(&process->simcall)))
+ procstate->state = MC_DONE;
+
+ if(*value != -1 || start_count == 0)
+ return &process->simcall;
+
+ break;
+
+ case SIMCALL_COMM_WAIT:
+ if(simcall_comm_wait__get__comm(&process->simcall)->comm.src_proc
+ && simcall_comm_wait__get__comm(&process->simcall)->comm.dst_proc){
+ *value = 0;
+ }else{
+ *value = -1;
+ }
+ procstate->state = MC_DONE;
+ return &process->simcall;
+
+ break;
+
+ case SIMCALL_MC_RANDOM:
+ min = simcall_mc_random__get__min(&process->simcall);
+ max = simcall_mc_random__get__max(&process->simcall);
+ *value = (int)((rand() % ((max-min)+1)) + min);
+ procstate->state = MC_DONE;
+ return &process->simcall;
+ break;
+
+ default:
+ procstate->state = MC_DONE;
+ *value = 0;
+ return &process->simcall;
+ break;
+ }
+ }