Exemple #1
0
/*
 * 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;
}
Exemple #2
0
/**
 * 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;
}
Exemple #3
0
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;
}