X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=chunk_queue.c;h=3f5ac1d929262c116f6c7822f67f0ceb8cf1e7f6;hp=bb97c6902ae92379b04033990598c958a8dd76b4;hb=a4f75cecaaee538edb7aae3f0ff19168a1dab59d;hpb=eecc102ad0abeb0335fe994bb72031a15b9090d7 diff --git a/chunk_queue.c b/chunk_queue.c index bb97c690..3f5ac1d9 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2009 Andre Noll + * Copyright (C) 2007-2010 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -82,16 +82,46 @@ struct queued_chunk *cq_peek(struct chunk_queue *cq) /** * Remove the current chunk from the queue. * - * \param cq The chunk to remove. + * \param cq The queue to remove from. */ void cq_dequeue(struct chunk_queue *cq) { struct queued_chunk *qc = cq_peek(cq); assert(qc); + assert(cq->num_pending >= qc->num_bytes); + cq->num_pending -= qc->num_bytes; list_del(&qc->node); free(qc); } +/** + * Force to add a chunk to the given queue. + * + * \param cq See \ref cq_enqueue. + * \param buf See \ref cq_enqueue. + * \param num_bytes See \ref cq_enqueue. + * + * If queuing the given buffer would result in exceeding the maximal queue + * size, buffers are dropped from the beginning of the queue. Note that this + * function still might fail. + * + * \return Standard. + */ +int cq_force_enqueue(struct chunk_queue *cq, const char *buf, size_t num_bytes) +{ + int ret; + + if (num_bytes > cq->max_pending) + return -E_QUEUE; + for (;;) { + ret = cq_enqueue(cq, buf, num_bytes); + if (ret >= 0) + return ret; + cq_dequeue(cq); + } + /* never reached */ +} + /** * Change the number of bytes sent for the current queued chunk. *