X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=chunk_queue.c;h=5b102f286641d7b93418f3ae92e7dcdf6f71d0f6;hb=5667dca4697c3bbbe4830699ee91df800bf2efd3;hp=ad28190a163d32c4731316a3bd609f626f7871ec;hpb=c1d6c466251d21d1fb7b513ba2297ebf94d44853;p=paraslash.git diff --git a/chunk_queue.c b/chunk_queue.c index ad28190a..5b102f28 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -92,6 +92,34 @@ void cq_dequeue(struct chunk_queue *cq) 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. *