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; }
int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status) { int error_code; static char myname[] = "MPIO_TEST"; #ifdef MPI_hpux int fl_xmpi; if (*request != MPIO_REQUEST_NULL) { HPMP_IO_WSTART(fl_xmpi, BLKMPIOTEST, TRDTSYSTEM, (*request)->fd); } #endif /* MPI_hpux */ MPIU_THREAD_SINGLE_CS_ENTER("io"); 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: *flag = ADIO_ReadDone(request, status, &error_code); break; case ADIOI_WRITE: *flag = ADIO_WriteDone(request, status, &error_code); break; } #ifdef MPI_hpux HPMP_IO_WEND(fl_xmpi); #endif /* MPI_hpux */ fn_exit: MPIU_THREAD_SINGLE_CS_EXIT("io"); return error_code; }
/*@ MPIO_Test - Test the completion of a nonblocking read or write Input Parameters: . request - request object (handle) Output Parameters: . flag - true if operation completed (logical) . status - status object (Status) .N fortran @*/ int MPIO_Test(MPIO_Request *request, int *flag, MPI_Status *status) { int error_code; #ifndef PRINT_ERR_MSG static char myname[] = "MPIO_TEST"; #endif #ifdef MPI_hpux int fl_xmpi; if (*request != MPIO_REQUEST_NULL) { HPMP_IO_WSTART(fl_xmpi, BLKMPIOTEST, TRDTSYSTEM, (*request)->fd); } #endif /* MPI_hpux */ if (*request == MPIO_REQUEST_NULL) return MPI_SUCCESS; if ((*request < (MPIO_Request) 0) || ((*request)->cookie != ADIOI_REQ_COOKIE)) { #ifdef PRINT_ERR_MSG FPRINTF(stderr, "MPIO_Test: Invalid request object\n"); MPI_Abort(MPI_COMM_WORLD, 1); #else error_code = MPIR_Err_setmsg(MPI_ERR_REQUEST, MPIR_ERR_REQUEST_NULL, myname, (char *) 0, (char *) 0); return ADIOI_Error(MPI_FILE_NULL, error_code, myname); #endif } switch ((*request)->optype) { case ADIOI_READ: *flag = ADIO_ReadDone(request, status, &error_code); break; case ADIOI_WRITE: *flag = ADIO_WriteDone(request, status, &error_code); break; } #ifdef MPI_hpux HPMP_IO_WEND(fl_xmpi); #endif /* MPI_hpux */ return error_code; }
/*@ MPI_File_close - Closes a file Input Parameters: . fh - file handle (handle) .N fortran @*/ int MPI_File_close(MPI_File *fh) { int error_code; ADIO_File adio_fh; static char myname[] = "MPI_FILE_CLOSE"; #ifdef MPI_hpux int fl_xmpi; HPMP_IO_WSTART(fl_xmpi, BLKMPIFILECLOSE, TRDTBLOCK, *adio_fh); #endif /* MPI_hpux */ MPIU_THREAD_CS_ENTER(ALLFUNC,); adio_fh = MPIO_File_resolve(*fh); /* --BEGIN ERROR HANDLING-- */ MPIO_CHECK_FILE_HANDLE(adio_fh, myname, error_code); /* --END ERROR HANDLING-- */ if (ADIO_Feature(adio_fh, ADIO_SHARED_FP)) { ADIOI_Free((adio_fh)->shared_fp_fname); /* POSIX semantics say a deleted file remains available until all * processes close the file. But since when was NFS posix-compliant? */ if (!ADIO_Feature(adio_fh, ADIO_UNLINK_AFTER_CLOSE)) { MPI_Barrier((adio_fh)->comm); } if ((adio_fh)->shared_fp_fd != ADIO_FILE_NULL) { MPI_File *fh_shared = &(adio_fh->shared_fp_fd); ADIO_Close((adio_fh)->shared_fp_fd, &error_code); MPIO_File_free(fh_shared); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ } } /* Because ROMIO expects the MPI library to provide error handler management * routines but it doesn't ever participate in MPI_File_close, we have to * somehow inform the MPI library that we no longer hold a reference to any * user defined error handler. We do this by setting the errhandler at this * point to MPI_ERRORS_RETURN. */ error_code = PMPI_File_set_errhandler(*fh, MPI_ERRORS_RETURN); if (error_code != MPI_SUCCESS) goto fn_fail; ADIO_Close(adio_fh, &error_code); MPIO_File_free(fh); /* --BEGIN ERROR HANDLING-- */ if (error_code != MPI_SUCCESS) goto fn_fail; /* --END ERROR HANDLING-- */ #ifdef MPI_hpux HPMP_IO_WEND(fl_xmpi); #endif /* MPI_hpux */ fn_exit: MPIU_THREAD_CS_EXIT(ALLFUNC,); return error_code; fn_fail: /* --BEGIN ERROR HANDLING-- */ error_code = MPIO_Err_return_file(adio_fh, error_code); goto fn_exit; /* --END ERROR HANDLING-- */ }