00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "ad_nfs.h"
00010
00011 void ADIOI_NFS_ReadComplete(ADIO_Request *request, ADIO_Status *status, int *error_code)
00012 {
00013 #ifndef NO_AIO
00014 #ifndef PRINT_ERR_MSG
00015 static char myname[] = "ADIOI_NFS_READCOMPLETE";
00016 #endif
00017 #ifdef AIO_SUN
00018 aio_result_t *result=0, *tmp;
00019 #else
00020 int err;
00021 #endif
00022 #ifdef AIO_HANDLE_IN_AIOCB
00023 struct aiocb *tmp1;
00024 #endif
00025 #endif
00026
00027 if (*request == ADIO_REQUEST_NULL) {
00028 *error_code = MPI_SUCCESS;
00029 return;
00030 }
00031
00032 #ifdef AIO_SUN
00033 if ((*request)->queued) {
00034 tmp = (aio_result_t *) (*request)->handle;
00035 while (tmp->aio_return == AIO_INPROGRESS) usleep(1000);
00036
00037
00038 result = (aio_result_t *) aiowait(0);
00039
00040 (*request)->nbytes = tmp->aio_return;
00041
00042 #ifdef PRINT_ERR_MSG
00043 *error_code = (tmp->aio_return == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00044 #else
00045 if (tmp->aio_return == -1) {
00046 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00047 myname, "I/O Error", "%s", strerror(tmp->aio_errno));
00048 ADIOI_Error((*request)->fd, *error_code, myname);
00049 }
00050 else *error_code = MPI_SUCCESS;
00051 #endif
00052
00053
00054
00055
00056
00057
00058 }
00059 else *error_code = MPI_SUCCESS;
00060
00061 #ifdef HAVE_STATUS_SET_BYTES
00062 if ((*request)->nbytes != -1)
00063 MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
00064 #endif
00065
00066 #endif
00067
00068 #ifdef AIO_HANDLE_IN_AIOCB
00069
00070 if ((*request)->queued) {
00071 do {
00072 err = aio_suspend(1, (struct aiocb **) &((*request)->handle));
00073 } while ((err == -1) && (errno == EINTR));
00074
00075 tmp1 = (struct aiocb *) (*request)->handle;
00076 if (err != -1) {
00077 err = aio_return(tmp1->aio_handle);
00078 (*request)->nbytes = err;
00079 errno = aio_error(tmp1->aio_handle);
00080 }
00081 else (*request)->nbytes = -1;
00082
00083
00084
00085
00086
00087 #ifdef PRINT_ERR_MSG
00088 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00089 #else
00090 if (err == -1) {
00091 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00092 myname, "I/O Error", "%s", strerror(errno));
00093 ADIOI_Error((*request)->fd, *error_code, myname);
00094 }
00095 else *error_code = MPI_SUCCESS;
00096 #endif
00097 }
00098 else *error_code = MPI_SUCCESS;
00099
00100 #ifdef HAVE_STATUS_SET_BYTES
00101 if ((*request)->nbytes != -1)
00102 MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
00103 #endif
00104
00105 #elif (!defined(NO_AIO) && !defined(AIO_SUN))
00106
00107 if ((*request)->queued) {
00108 do {
00109 err = aio_suspend((const aiocb_t **) &((*request)->handle), 1, 0);
00110 } while ((err == -1) && (errno == EINTR));
00111
00112 if (err != -1) {
00113 err = aio_return((struct aiocb *) (*request)->handle);
00114 (*request)->nbytes = err;
00115 errno = aio_error((struct aiocb *) (*request)->handle);
00116 }
00117 else (*request)->nbytes = -1;
00118
00119 #ifdef PRINT_ERR_MSG
00120 *error_code = (err == -1) ? MPI_ERR_UNKNOWN : MPI_SUCCESS;
00121 #else
00122 if (err == -1) {
00123 *error_code = MPIR_Err_setmsg(MPI_ERR_IO, MPIR_ADIO_ERROR,
00124 myname, "I/O Error", "%s", strerror(errno));
00125 ADIOI_Error((*request)->fd, *error_code, myname);
00126 }
00127 else *error_code = MPI_SUCCESS;
00128 #endif
00129 }
00130 else *error_code = MPI_SUCCESS;
00131 #ifdef HAVE_STATUS_SET_BYTES
00132 if ((*request)->nbytes != -1)
00133 MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
00134 #endif
00135 #endif
00136
00137 #ifndef NO_AIO
00138 if ((*request)->queued != -1) {
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 if ((*request)->queued) ADIOI_Del_req_from_list(request);
00151
00152 (*request)->fd->async_count--;
00153 if ((*request)->handle) ADIOI_Free((*request)->handle);
00154 ADIOI_Free_request((ADIOI_Req_node *) (*request));
00155 *request = ADIO_REQUEST_NULL;
00156 }
00157
00158 #else
00159
00160
00161 #ifdef HAVE_STATUS_SET_BYTES
00162 MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
00163 #endif
00164 (*request)->fd->async_count--;
00165 ADIOI_Free_request((ADIOI_Req_node *) (*request));
00166 *request = ADIO_REQUEST_NULL;
00167 *error_code = MPI_SUCCESS;
00168 #endif
00169 }
00170
00171
00172 void ADIOI_NFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int *error_code)
00173 {
00174 ADIOI_NFS_ReadComplete(request, status, error_code);
00175 }