Beispiel #1
0
void
lsQueueSetAdd_(struct lsQueue *head1, struct lsQueue *head2,
	       bool_t (*memberFunc)(struct lsQueueEntry *q, struct lsQueue *head))
{
    struct lsQueueEntry *start, *qEnt;
    
    start = head2->start;
    for (qEnt = start->forw;  qEnt != start; qEnt = qEnt->forw)
	if ((*memberFunc)(qEnt, head1) == FALSE)  {
	    lsQueueEntryRemove_(qEnt);
	    lsQueueEntryAppend_(qEnt, head1);
	} else {
	    lsQueueEntryRemove_(qEnt);
	}
	
}     
Beispiel #2
0
void
lsQueueSort_(struct lsQueue *head, int hint)
{
    struct lsQueueEntry *start;
    struct lsQueueEntry *q1, *q2;
    struct lsQueueEntry *nq1;
    struct lsQueueEntry *selected;
    int rc;

    start = head->start;
    for (q1 = start->forw; q1 != start; q1 = nq1) {
	selected = q1;
	for (q2 = q1->forw; q2 != start; q2 = q2->forw) {
	    rc = (*head->compare)((char *)selected, (char *)q2, hint);
	    
	    if (rc > 0) 
		selected = q2;
	}
	
	lsQueueEntryRemove_(selected);
	lsQueueEntryAddFront_(selected, head);

	nq1 = selected->forw;
    }
} 
Beispiel #3
0
void
lsQueueEntryDestroy_(struct lsQueueEntry *entry, struct lsQueue *head)
{
    if (entry->forw != NULL) 
	lsQueueEntryRemove_(entry);

    if (entry->data) {
	if (head->destroy) {
	    (*(head->destroy))(entry->data);
	}
    }

    free(entry);
} 
Beispiel #4
0
struct lsQueueEntry *
lsQueueDequeue_(struct lsQueue *head)
{
    struct lsQueueEntry *entry, *start;
    if (! head)
        return (struct lsQueueEntry *)NULL;

    if (! LS_QUEUE_EMPTY(head)) {
	start = head->start;
	entry = start->forw;
	lsQueueEntryRemove_(entry);
	return(entry);
    } else 
	return (struct lsQueueEntry *)NULL;

}     
Beispiel #5
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;

}