Exemple #1
0
/* ChapelIO.chpl:249 */
void writeThis(_string _this_18382, Writer f, int32_t _ln, _string _fn) {
    chpl_bool T1;
    file T2 = NULL;
    chpl_bool T3;
    StringClass T4 = NULL;
    T1 = (((object)f)->_cid == _e_file);
    if (T1) {
        T2 = ((file)(f));
        writeIt(T2, _this_18382, _ln, _fn);
    } else {
        T3 = (((object)f)->_cid == _e_StringClass);
        if (T3) {
            T4 = ((StringClass)(f));
            _writeIt_18503(T4, _this_18382, _ln, _fn);
        } else {
            _writeIt_18704(f, _this_18382);
        }
    }
    return;
}
static asynStatus writeOnce(const char *port, int addr,
                    char const *buffer, size_t buffer_len, double timeout,
                    size_t *nbytesTransfered,const char *drvInfo)
{
    asynStatus status;
    asynUser   *pasynUser;

    status = connect(port,addr,&pasynUser,drvInfo);
    if(status!=asynSuccess) {
         asynPrint(pasynUser, ASYN_TRACE_ERROR,
             "asynOctetSyncIO connect failed %s\n",pasynUser->errorMessage);
         disconnect(pasynUser);
         return status;
    }
    status = writeIt(pasynUser,buffer,buffer_len,timeout,nbytesTransfered);
    if(status!=asynSuccess) {
        asynPrint(pasynUser, ASYN_TRACE_ERROR,
             "asynOctetSyncIO write failed %s\n",pasynUser->errorMessage);
    }
    disconnect(pasynUser);
    return status;
}
static void callbackSiWriteRead(asynUser *pasynUser)
{
    devPvt         *pdevPvt = (devPvt *)pasynUser->userPvt;
    stringinRecord *precord = (stringinRecord *)pdevPvt->precord;
    asynStatus     status;
    size_t         nBytesRead;
    long           dbStatus;
    char           raw[MAX_STRING_SIZE];
    char           translate[MAX_STRING_SIZE];
    size_t         len = sizeof(precord->val);

    status = pasynManager->unblockProcessCallback(pasynUser,pdevPvt->blockAll);
    if(status!=asynSuccess) {
        asynPrint(pasynUser,ASYN_TRACE_ERROR,
            "%s pasynManager:unblockProcessCallback failed %s\n",
            precord->name,pasynUser->errorMessage);
        recGblSetSevr(precord,READ_ALARM,INVALID_ALARM);
        goto done;
    }
    switch(pdevPvt->state) {
    case stateIdle:
        dbStatus = dbGet(&pdevPvt->dbAddr,DBR_STRING,raw,0,0,0);
        if(dbStatus) {
            asynPrint(pasynUser,ASYN_TRACE_ERROR,
                "%s dbGet failed\n",precord->name);
            recGblSetSevr(precord,READ_ALARM,INVALID_ALARM);
            goto done;
        }
        dbTranslateEscape(translate,raw);
        status = writeIt(pasynUser,translate,strlen(translate));
        if(status!=asynSuccess) {
            asynPrint(pasynUser,ASYN_TRACE_ERROR,
                "%s asynOctet:write failed %s\n",
                precord->name,pasynUser->errorMessage);
            recGblSetSevr(precord,READ_ALARM,INVALID_ALARM);
            goto done;
        }
        pdevPvt->state = stateWrite;
        status = queueIt(pdevPvt);
        if(status!=asynSuccess) goto done;
        return;
    case stateWrite:
        status = readIt(pasynUser,precord->val,len,&nBytesRead);
        if(status!=asynSuccess) {
            asynPrint(pasynUser,ASYN_TRACE_ERROR,
                "%s asynOctet:write failed %s\n",
                precord->name,pasynUser->errorMessage);
            recGblSetSevr(precord,READ_ALARM,INVALID_ALARM);
            goto done;
        }
        if(status==asynSuccess) {
            if(nBytesRead==len) nBytesRead--;
            precord->val[nBytesRead] = 0;
        }
        pdevPvt->state = stateIdle;
        break; /*all done*/
    }
done:
    pdevPvt->state = stateIdle;
    callbackRequestProcessCallback(
        &pdevPvt->processCallback,precord->prio,precord);
}