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); } }
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; } }
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); }
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; }
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; }