/* * Callback function for reading and writing */ static void ngrclGlobusCallback( globus_xio_handle_t handle, globus_result_t cResult, globus_byte_t *buffer, globus_size_t len, globus_size_t nbytes, globus_xio_data_descriptor_t dataDesc, void *userArg) { ngrclOperatorCallbackArg_t *arg = userArg; ngrcOperator_t *op = arg->ngoca_operator; globus_result_t gResult; bool locked = false; ngLog_t *log = NULL; NGEM_FNAME(ngrclGlobusCallback); log = ngemLogGetDefault(); ngLogDebug(log, NGRC_LOGCAT_GT, fName, "Called\n"); ngLogDebug(log, NGRC_LOGCAT_GT, fName, "user_data = %p.\n", arg); gResult = globus_mutex_lock(&op->ngo_mutex); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_mutex_lock", gResult); } else { locked = true; } ngLogDebug(log, NGRC_LOGCAT_GT, fName, "nBytes = %lu.\n", (unsigned long)nbytes); arg->ngoca_done = true; arg->ngoca_result = cResult; arg->ngoca_bytes = nbytes; gResult = globus_cond_broadcast(&op->ngo_cond); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_cond_broadcast", gResult); } if (locked) { gResult = globus_mutex_unlock(&op->ngo_mutex); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_mutex_unlock", gResult); } locked = false; } return; }
/** * Operator: write */ ngemResult_t ngrcOperatorWrite( ngrcOperator_t *op, void *buf, size_t size, size_t *nWrite, bool *canceled) { globus_result_t gResult; ngemResult_t ret = NGEM_FAILED; bool locked = false; ngLog_t *log = NULL; ngrclOperatorCallbackArg_t arg; NGEM_FNAME(ngrcOperatorWrite); log = ngemLogGetDefault(); NGEM_ASSERT(op != NULL); NGEM_ASSERT(size >= 0); NGEM_ASSERT(nWrite != NULL); NGEM_ASSERT(canceled != NULL); *canceled = false; gResult = globus_mutex_lock(&op->ngo_mutex); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_mutex_lock", gResult); goto finalize; } locked = true; ngrclOperatorCallbackArgInitialize(&arg, op); if (op->ngo_canceled) { *canceled = true; } else { ngLogDebug(log, NGRC_LOGCAT_GT, fName, "user_data = %p.\n", &arg); gResult = globus_xio_register_write( op->ngo_handle, buf, size, size, NULL, ngrclGlobusCallback, &arg); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_xio_register_write", gResult); goto finalize; } while (arg.ngoca_done == false) { gResult = globus_cond_wait(&op->ngo_cond, &op->ngo_mutex); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_cond_wait", gResult); } } if (arg.ngoca_result != GLOBUS_SUCCESS) { if (globus_xio_error_is_canceled(arg.ngoca_result) == GLOBUS_FALSE) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "Callback function for writing", arg.ngoca_result); goto finalize; } *canceled = true; } else { ngLogDebug(log, NGRC_LOGCAT_GT, fName, "Writes %lu bytes\n", (unsigned long)arg.ngoca_bytes); *nWrite = arg.ngoca_bytes; } } ret = NGEM_SUCCESS; finalize: ngrclOperatorCallbackArgFinalize(&arg); if (locked) { gResult = globus_mutex_unlock(&op->ngo_mutex); if (gResult != GLOBUS_SUCCESS) { ngcpLogGlobusError(log, NGRC_LOGCAT_GT, fName, "globus_mutex_unlock", gResult); ret = NGEM_FAILED; } locked = false; } return ret; }
static int ngexlStubGetArgument(int argumentNo, void *data, int *error) { int result; int methodID; ngLog_t *log; ngiArgument_t *arg; ngiArgumentPointer_t src, dest; ngRemoteMethodInformation_t *rmInfo; ngexiContext_t *context; static const char fName[] = "ngexlStubGetArgument"; static const ngexiExecutableStatus_t reqStatus[] = { NGEXI_EXECUTABLE_STATUS_CALCULATING, }; /* Initialize the local variables */ context = &ngexiContext; log = context->ngc_log; /* Get methodID */ methodID = ngexiContextGetMethodID(context); /* log */ ngLogInfo(log, NG_LOGCAT_NINFG_PURE, fName, "Getting argument %3d for method %d from Context.\n", argumentNo, methodID); /* Check the status */ result = ngexiContextExecutableStatusCheck( context, &reqStatus[0], NGI_NELEMENTS(reqStatus), log, error); if (result == 0) { ngLogError(log, NG_LOGCAT_NINFG_PURE, fName, "Invalid state.\n"); return 0; } /* Get the Method Information */ rmInfo = ngexiRemoteMethodInformationGet( context, methodID, log, error); if (rmInfo == NULL) { ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "Remote Method Information is not found.\n"); return 0; } /* Get the Argument Data */ ngexiContextGetMethodArgument(context, &arg); if (arg == NULL) { NGI_SET_ERROR(error, NG_ERROR_INVALID_ARGUMENT); ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "Argument Data is NULL.\n"); return 0; } if (arg->nga_nArguments < 0) { NGI_SET_ERROR(error, NG_ERROR_INVALID_ARGUMENT); ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "The number of Argument Data is smaller than zero.\n"); return 0; } if (arg->nga_nArguments > rmInfo->ngrmi_nArguments) { NGI_SET_ERROR(error, NG_ERROR_INVALID_ARGUMENT); ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "The number of Argument Data %d is greater than maximum %d.\n", arg->nga_nArguments, rmInfo->ngrmi_nArguments); return 0; } if (argumentNo < 0) { NGI_SET_ERROR(error, NG_ERROR_INVALID_ARGUMENT); ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "The requested Argument No. %d is smaller equal zero.\n", argumentNo); return 0; } if (argumentNo >= rmInfo->ngrmi_nArguments) { NGI_SET_ERROR(error, NG_ERROR_INVALID_ARGUMENT); ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "The number of Argument Data %d is greater than maximum %d.\n", argumentNo, rmInfo->ngrmi_nArguments); return 0; } /* Is argument scalar variable? */ src = arg->nga_argument[argumentNo].ngae_pointer; if (arg->nga_argument[argumentNo].ngae_dataType == NG_ARGUMENT_DATA_TYPE_FILENAME) { if (arg->nga_argument[argumentNo].ngae_tmpFileNameTable == NULL) { *(char **)data = NULL; } else if (arg->nga_argument[argumentNo].ngae_nDimensions <= 0) { *(char **)data = arg->nga_argument[argumentNo].ngae_tmpFileNameTable[0]; } else { *(char ***)data = arg->nga_argument[argumentNo].ngae_tmpFileNameTable; } } else if (arg->nga_argument[argumentNo].ngae_dataType == NG_ARGUMENT_DATA_TYPE_STRING) { if (src.ngap_string == NULL) { *(char **)data = NULL; } else if (arg->nga_argument[argumentNo].ngae_nDimensions <= 0) { *(char **)data = src.ngap_stringArray[0]; } else { *(char ***)data = src.ngap_stringArray; } } else if (arg->nga_argument[argumentNo].ngae_nDimensions != 0) { *(void **)data = src.ngap_void; } else { dest.ngap_void = data; result = ngiGetArgumentData( arg->nga_argument[argumentNo].ngae_dataType, src, dest, log, error); if (result == 0) { ngLogFatal(log, NG_LOGCAT_NINFG_PURE, fName, "Can't get the Argument Data.\n"); return 0; } } /* log */ ngLogDebug(log, NG_LOGCAT_NINFG_PURE, fName, "Getting argument %3d for method %d finished.\n", argumentNo, methodID); /* Success */ return 1; }