int MPIO_Wait(MPIO_Request *request, MPI_Status *status) { int error_code; static char myname[] = "MPIO_WAIT"; #ifdef MPI_hpux int fl_xmpi; if (*request != MPIO_REQUEST_NULL) { HPMP_IO_WSTART(fl_xmpi, BLKMPIOWAIT, TRDTBLOCK, (*request)->fd); } #endif /* MPI_hpux */ MPID_CS_ENTER(); MPIR_Nest_incr(); if (*request == MPIO_REQUEST_NULL) { error_code = MPI_SUCCESS; goto fn_exit; } /* --BEGIN ERROR HANDLING-- */ if ((*request < (MPIO_Request) 0) || ((*request)->cookie != ADIOI_REQ_COOKIE)) { error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_REQUEST, "**request", 0); error_code = MPIO_Err_return_file(MPI_FILE_NULL, error_code); goto fn_exit; } /* --END ERROR HANDLING-- */ switch ((*request)->optype) { case ADIOI_READ: ADIO_ReadComplete(request, status, &error_code); break; case ADIOI_WRITE: ADIO_WriteComplete(request, status, &error_code); break; } #ifdef MPI_hpux HPMP_IO_WEND(fl_xmpi); #endif /* MPI_hpux */ fn_exit: MPIR_Nest_decr(); MPID_CS_EXIT(); return error_code; }
/* Sets error_code to MPI_SUCCESS on success, creates an error code on * failure. */ void ADIOI_Complete_async(int *error_code) { /* complete all outstanding async I/O operations so that new ones can be initiated. Remove them all from async_list. */ ADIO_Status status; ADIO_Request *request; ADIOI_Async_node *tmp; static char myname[] = "ADIOI_Complete_async"; *error_code = MPI_SUCCESS; while (ADIOI_Async_list_head) { request = ADIOI_Async_list_head->request; (*request)->queued = -1; /* ugly internal hack that prevents ADIOI_xxxComplete from freeing the request object. This is required, because the user will call MPI_Wait later, which would require status to be filled. */ switch ((*request)->optype) { case ADIOI_READ: /* (*((*request)->fd->fns->ADIOI_xxx_ReadComplete))(request, &status,error_code);*/ ADIO_ReadComplete(request, &status, error_code); break; case ADIOI_WRITE: /* (*((*request)->fd->fns->ADIOI_xxx_WriteComplete))(request, &status, error_code);*/ ADIO_WriteComplete(request, &status, error_code); break; default: /* --BEGIN ERROR HANDLING-- */ *error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, myname, __LINE__, MPI_ERR_INTERN, "Unknown request optype", 0); return; /* --END ERROR HANDLING-- */ } (*request)->queued = 0; /* dequeued, but request object not freed */ tmp = ADIOI_Async_list_head; ADIOI_Async_list_head = ADIOI_Async_list_head->next; ADIOI_Free_async_node(tmp); } ADIOI_Async_list_tail = NULL; }