flow engine: no longer allow FlowRequeue to be called with the same src and dst queue.

remotes/origin/master-1.2.x
Victor Julien 13 years ago
parent 84c7480c06
commit bfa872b9b7

@ -136,49 +136,41 @@ Flow *FlowDequeue (FlowQueue *q) {
* \brief Transfer a flow from one queue to another
*
* \param f the flow to be transfered
* \param srcq the source queue, where the flow will be removed. The param may
* be NULL.
* \param srcq the source queue, where the flow will be removed.
* \param dstq the dest queue where the flow will be placed
*
* \note srcq and dstq must be different queues.
*/
void FlowRequeue(Flow *f, FlowQueue *srcq, FlowQueue *dstq)
{
#ifdef DEBUG
BUG_ON(dstq == NULL);
BUG_ON(srcq == NULL || dstq == NULL || srcq == dstq);
#endif /* DEBUG */
if (srcq != NULL) {
SCMutexLock(&srcq->mutex_q);
SCMutexLock(&srcq->mutex_q);
/* remove from old queue */
if (srcq->top == f)
srcq->top = f->lnext; /* remove from queue top */
if (srcq->bot == f)
srcq->bot = f->lprev; /* remove from queue bot */
if (f->lprev != NULL)
f->lprev->lnext = f->lnext; /* remove from flow prev */
if (f->lnext != NULL)
f->lnext->lprev = f->lprev; /* remove from flow next */
/* remove from old queue */
if (srcq->top == f)
srcq->top = f->lnext; /* remove from queue top */
if (srcq->bot == f)
srcq->bot = f->lprev; /* remove from queue bot */
if (f->lprev != NULL)
f->lprev->lnext = f->lnext; /* remove from flow prev */
if (f->lnext != NULL)
f->lnext->lprev = f->lprev; /* remove from flow next */
#ifdef DEBUG
BUG_ON(srcq->len == 0);
BUG_ON(srcq->len == 0);
#endif
if (srcq->len > 0)
srcq->len--; /* adjust len */
if (srcq->len > 0)
srcq->len--; /* adjust len */
f->lnext = NULL;
f->lprev = NULL;
f->lnext = NULL;
f->lprev = NULL;
/* don't unlock if src and dst are the same */
if (srcq != dstq) {
SCMutexUnlock(&srcq->mutex_q);
}
}
SCMutexUnlock(&srcq->mutex_q);
/* now put it in dst */
if (srcq != dstq) {
SCMutexLock(&dstq->mutex_q);
}
SCMutexLock(&dstq->mutex_q);
/* add to new queue (append) */
f->lprev = dstq->bot;

Loading…
Cancel
Save