00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_ntfs.h"
00010
00011 void ADIOI_NTFS_ReadComplete(ADIO_Request *request, ADIO_Status *status, int *error_code)
00012 {
00013 #ifndef PRINT_ERR_MSG
00014 static char myname[] = "ADIOI_NTFS_READCOMPLETE";
00015 #endif
00016 DWORD ret_val;
00017
00018 if (*request == ADIO_REQUEST_NULL) {
00019 *error_code = MPI_SUCCESS;
00020 return;
00021 }
00022
00023 if ((*request)->queued) {
00024 ret_val = GetOverlappedResult((*request)->fd, (*request)->handle, &(*request)->nbytes, TRUE);
00025
00026
00027
00028
00029
00030
00031
00032
00033 if (!ret_val)
00034 (*request)->nbytes = -1;
00035
00036 #ifdef PRINT_ERR_MSG
00037 *error_code = (ret_val == FALSE) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00038 #else
00039 if (ret_val == FALSE) {
00040 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00041 myname, "I/O Error", "%s", strerror(errno));
00042 ADIOI_Error((*request)->fd, *error_code, myname);
00043 }
00044 else *error_code = MPI_SUCCESS;
00045 #endif
00046 }
00047 else *error_code = MPI_SUCCESS;
00048 #ifdef HAVE_STATUS_SET_BYTES
00049 if ((*request)->nbytes != -1)
00050 MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
00051 #endif
00052
00053 if ((*request)->queued != -1) {
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 if ((*request)->queued) ADIOI_Del_req_from_list(request);
00066
00067 (*request)->fd->async_count--;
00068 if ((*request)->handle)
00069 {
00070 CloseHandle(((OVERLAPPED*)((*request)->handle))->hEvent);
00071 ADIOI_Free((*request)->handle);
00072 }
00073 ADIOI_Free_request((ADIOI_Req_node *) (*request));
00074 *request = ADIO_REQUEST_NULL;
00075 }
00076
00077 }
00078
00079
00080 void ADIOI_NTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int *error_code)
00081 {
00082 ADIOI_NTFS_ReadComplete(request, status, error_code);
00083 }