X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/31b7fa457f9267af8eda2eee06aae74dd78eb412..4f5b9e125ac4d5e4fc68290eabf29366318c37b2:/src/simix/smx_smurf.c diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 139d06bd97..cfc326b4d5 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -5,21 +5,34 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_smurf, simix, "Logging specific to SIMIX (SMURF)"); -/* Requests to handle at the end of this round of scheduling user processes */ -static xbt_heap_t req_todo; -/* to protect the write actions in the heap */ -static xbt_os_mutex_t sync_req_positions; +/* Tables with the requests to handle at the end of this round of scheduling + * user processes. There is one for each thread of execution. */ +static xbt_swag_t *req_lists; void SIMIX_request_init(void) { - req_todo = xbt_heap_new(5,NULL); - sync_req_positions = xbt_os_mutex_init(); + s_smx_req_t req; + int i, nthreads = SIMIX_context_get_nthreads(); + + req_lists = xbt_new0(xbt_swag_t, nthreads); + for(i=0; i < nthreads; i++) + req_lists[i] = xbt_swag_new(xbt_swag_offset(req, reqtable_hookup)); + } void SIMIX_request_destroy(void) { - xbt_heap_free(req_todo); - xbt_os_mutex_destroy(sync_req_positions); + int i, nthreads = SIMIX_context_get_nthreads(); + + for(i=0; i < nthreads; i++) + xbt_swag_free(req_lists[i]); + + xbt_free(req_lists); +} + +xbt_swag_t SIMIX_request_get_reqlist(int thread_pid) +{ + return req_lists[thread_pid]; } /* FIXME: we may want to save the initialization of issuer... */ @@ -30,18 +43,18 @@ XBT_INLINE smx_req_t SIMIX_req_mine() { void SIMIX_request_push() { + xbt_swag_t req_table; smx_process_t issuer = SIMIX_process_self(); + if (issuer != simix_global->maestro_process){ issuer->request.issuer = issuer; + req_table = SIMIX_request_get_reqlist(SIMIX_context_get_thread_id()); + + xbt_swag_insert_at_tail(&issuer->request, req_table); - if (smx_parallel_contexts) - xbt_os_mutex_acquire(sync_req_positions); - xbt_heap_push(req_todo,&issuer->request,issuer->pid); - DEBUG4("Pushed request %s (%d) of %s; now %d requests waiting", + DEBUG3("Pushed request %s (%d) of %s", SIMIX_request_name(issuer->request.call), issuer->request.call, - issuer->name,xbt_heap_size(req_todo)); - if (smx_parallel_contexts) - xbt_os_mutex_release(sync_req_positions); + issuer->name); DEBUG3("Yield process '%s' on request of type %s (%d)", issuer->name, SIMIX_request_name(issuer->request.call), issuer->request.call); @@ -53,13 +66,21 @@ void SIMIX_request_push() smx_req_t SIMIX_request_pop(void) { - smx_req_t req = xbt_heap_pop(req_todo); - if(req) - DEBUG4("Popped request %s (%d) of %s; now %d requests waiting", - SIMIX_request_name(req->issuer->request.call), - req->issuer->request.call, - req->issuer->name,xbt_heap_size(req_todo)); - return req; + int i; + smx_req_t req = NULL; + int nthreads = SIMIX_context_get_nthreads(); + + for(i=0; i < nthreads; i++){ + if((req = xbt_swag_extract(req_lists[i]))){ + DEBUG3("Popped request %s (%d) of %s", + SIMIX_request_name(req->issuer->request.call), + req->issuer->request.call, + req->issuer->name); + return req; + } + } + + return NULL; } void SIMIX_request_answer(smx_req_t req) @@ -84,13 +105,32 @@ void SIMIX_request_pre(smx_req_t req, int value) break; case REQ_COMM_WAIT: - SIMIX_pre_comm_wait(req, value); + SIMIX_pre_comm_wait(req, + req->comm_wait.comm, + req->comm_wait.timeout, + value); break; case REQ_COMM_WAITANY: SIMIX_pre_comm_waitany(req, value); break; + case REQ_COMM_SEND: + { + smx_action_t comm = SIMIX_comm_isend( + req->issuer, + req->comm_send.rdv, + req->comm_send.task_size, + req->comm_send.rate, + req->comm_send.src_buff, + req->comm_send.src_buff_size, + req->comm_send.match_fun, + req->comm_send.data, + 0); + SIMIX_pre_comm_wait(req, comm, req->comm_send.timeout, 0); + break; + } + case REQ_COMM_ISEND: req->comm_isend.result = SIMIX_comm_isend( req->issuer, @@ -105,6 +145,19 @@ void SIMIX_request_pre(smx_req_t req, int value) SIMIX_request_answer(req); break; + case REQ_COMM_RECV: + { + smx_action_t comm = SIMIX_comm_irecv( + req->issuer, + req->comm_recv.rdv, + req->comm_recv.dst_buff, + req->comm_recv.dst_buff_size, + req->comm_recv.match_fun, + req->comm_recv.data); + SIMIX_pre_comm_wait(req, comm, req->comm_recv.timeout, 0); + break; + } + case REQ_COMM_IRECV: req->comm_irecv.result = SIMIX_comm_irecv( req->issuer, @@ -148,30 +201,6 @@ void SIMIX_request_pre(smx_req_t req, int value) SIMIX_request_answer(req); break; - case REQ_COMM_GET_SRC_BUFF: - req->comm_get_src_buff.result = - SIMIX_comm_get_src_buff(req->comm_get_src_buff.comm); - SIMIX_request_answer(req); - break; - - case REQ_COMM_GET_DST_BUFF: - req->comm_get_dst_buff.result = - SIMIX_comm_get_dst_buff(req->comm_get_dst_buff.comm); - SIMIX_request_answer(req); - break; - - case REQ_COMM_GET_SRC_BUFF_SIZE: - req->comm_get_src_buff_size.result = - SIMIX_comm_get_src_buff_size(req->comm_get_src_buff_size.comm); - SIMIX_request_answer(req); - break; - - case REQ_COMM_GET_DST_BUFF_SIZE: - req->comm_get_dst_buff_size.result = - SIMIX_comm_get_dst_buff_size(req->comm_get_dst_buff_size.comm); - SIMIX_request_answer(req); - break; - case REQ_COMM_GET_SRC_PROC: req->comm_get_src_proc.result = SIMIX_comm_get_src_proc(req->comm_get_src_proc.comm);