Ejemplo n.º 1
0
void
lsQueueEntryDestroyAll_(struct lsQueue *head)
{
    struct lsQueueEntry *start, *qPtr, *nextQPtr;

    start = head->start;
    for (qPtr = start->forw; qPtr != start; qPtr = nextQPtr) {
	nextQPtr = qPtr->forw;

	lsQueueEntryDestroy_(qPtr, head);
    }
} 
Ejemplo n.º 2
0
int
ackAsyncReturnCode_(int s, struct LSFHeader *replyHdr)
{
    char                  cseqno;
    int                   seqno;
    int                   len;
    int                   rc;
    struct lsQueueEntry   *reqEntry;
    struct lsRequest      *reqHandle;

    seqno = replyHdr->refCode;
    cseqno = seqno;
    reqEntry = lsQueueSearch_(0, &cseqno, requestQ);
    if (reqEntry == NULL) {
	lserrno = LSE_PROTOC_RES;
	return -1;
    }

    lsQueueEntryRemove_(reqEntry);
    reqHandle = (struct lsRequest *)reqEntry->data;

    reqEntry->data = NULL;

    reqHandle->rc = replyHdr->opCode;
    reqHandle->completed = TRUE;
    if (replyHdr->length > 0) {
	reqHandle->replyBuf = malloc(replyHdr->length);
	if (reqHandle->replyBuf == NULL) {
	    lserrno = LSE_MALLOC;
            return -1;
	}

	len = b_read_fix(s, reqHandle->replyBuf, replyHdr->length);
	if (len != replyHdr->length) {
	    free(reqHandle->replyBuf);
	    lserrno = LSE_MSG_SYS;
	    return -1;
	}
	reqHandle->replyBufLen = len;
    }

    if (reqHandle->replyHandler) {
	rc = (*(reqHandle->replyHandler))(reqHandle);
	if (replyHdr->length > 0)
	    free(reqHandle->replyBuf);
	if (rc < 0) {
	    if (reqHandle->appHandler)
		rc=(*(reqHandle->appHandler))(reqHandle, reqHandle->appExtra);

	    lsQueueEntryDestroy_(reqEntry, requestQ);
	    return rc;
	}
    }

    if (reqHandle->appHandler)
	rc = (*(reqHandle->appHandler))(reqHandle, reqHandle->appExtra);

    lsQueueEntryDestroy_(reqEntry, requestQ);
    return rc;

}
Ejemplo n.º 3
0
int
lsMsgRcv_(int taskid, char *buffer, int len, int options)
{
    struct tid *tEnt;
    struct lsQueueEntry *qEnt;
    int rc;

    tEnt = tidFindIgnoreConn_(taskid);
    if (tEnt == NULL)
        return -1;

  Again:
    if (tEnt->isEOF) {
	lserrno = LSE_RES_INVCHILD;
	return -1;
    }

    if (lsMsgRdy_(taskid, NULL)) {
	struct lsTMsgHdr *header;

	qEnt = lsQueueDequeue_(tEnt->tMsgQ);

	if (qEnt == NULL) {
	    lserrno = LSE_MSG_SYS;
	    return -1;
	}

	header = (struct lsTMsgHdr *)qEnt->data;
	if (header->len > len) {
	    lserrno = LSE_MSG_SYS;

	    lsQueueEntryDestroy_(qEnt, tEnt->tMsgQ);
	    return -1;
	}

	if (header->type == LSTMSG_IOERR) {
	    lserrno = LSE_LOSTCON;
	    lsQueueEntryDestroy_(qEnt, tEnt->tMsgQ);
	    return -1;
	} else if (header->type == LSTMSG_EOF) {
	    tEnt->isEOF = TRUE;
	    lsQueueEntryDestroy_(qEnt, tEnt->tMsgQ);
	    return 0;
	}

	memcpy((char *)buffer, (char *)header->msgPtr, header->len);

	rc = header->len;
	lsQueueEntryDestroy_(qEnt, tEnt->tMsgQ);
	return rc;
    } else {
	int nrdy = 0;

	if (tEnt->sock < 0) {
	    lserrno = LSE_LOSTCON;
	    tid_remove(taskid);
	    return -1;
	}
	rc = lsMsgWait_(1, &taskid, &nrdy, 0, NULL, NULL, NULL, NULL, 0);
	if (rc < 0)
	    return rc;

	if (nrdy > 0)
	    goto Again;
	else
	    return -1;
    }
}