int OSPDI_NbGlobalBarrier(OSPD_Handle_t *ospd_handle) { int status = OSP_SUCCESS; OSPD_Request_t *ospd_request; DCMF_Callback_t done_callback; volatile int active; OSPU_FUNC_ENTER(); ospd_request = OSPDI_Get_request(1); OSPU_ERR_POP(status = (ospd_request == NULL), "OSPDI_Get_request returned error \n"); OSPDI_Set_handle(ospd_request, ospd_handle); ospd_handle->active++; done_callback.function = OSPDI_Request_done; done_callback.clientdata = (void *) ospd_request; status = DCMF_GlobalBarrier(&OSPD_GlobalBarrier_protocol, &(ospd_request->request), done_callback); OSPU_ERR_ABORT(status != DCMF_SUCCESS, "DCMF_GlobalBarrier returned with an error"); fn_exit: OSPU_FUNC_EXIT(); return status; fn_fail: goto fn_exit; }
int OSPDI_GlobalBarrier() { int status = OSP_SUCCESS; DCMF_Request_t request; DCMF_Callback_t done_callback; volatile int active; OSPU_FUNC_ENTER(); active = 1; done_callback.function = OSPDI_Generic_done; done_callback.clientdata = (void *) &active; status = DCMF_GlobalBarrier(&OSPD_GlobalBarrier_protocol, &request, done_callback); OSPU_ERR_ABORT(status != DCMF_SUCCESS, "DCMF_GlobalBarrier returned with an error"); OSPDI_Conditional_advance(active > 0); fn_exit: OSPU_FUNC_EXIT(); return status; fn_fail: goto fn_exit; }
int MPIDO_Barrier_gi(MPID_Comm * comm) { int rc; MPID_Comm * comm_world; MPID_Comm_get_ptr(MPI_COMM_WORLD, comm_world); DCMF_Callback_t callback = { barrier_cb_done, (void *) &mpid_globalbarrier_active }; /* initialize global active field */ mpid_globalbarrier_active = 1; if (mpid_globalbarrier_restart) rc = DCMF_Restart (&mpid_globalbarrier_request); else { mpid_globalbarrier_restart = 1; rc = DCMF_GlobalBarrier(&MPIDI_Protocols.globalbarrier, &mpid_globalbarrier_request, callback); } if (rc == DCMF_SUCCESS) MPID_PROGRESS_WAIT_WHILE(* (int *) callback.clientdata); return rc; }