]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - chunk_queue.c
udp_send: Force chunk queuing.
[paraslash.git] / chunk_queue.c
index f7f503abea9ecc093fc4d577942bea36b510d419..5b102f286641d7b93418f3ae92e7dcdf6f71d0f6 100644 (file)
@@ -1,11 +1,13 @@
 /*
- * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2010 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file chunk_queue.c Queuing functions for paraslash senders. */
 
+#include <regex.h>
+
 #include "para.h"
 #include "list.h"
 #include "afh.h"
@@ -90,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.
  *
@@ -110,7 +140,7 @@ void cq_update(struct chunk_queue *cq, size_t sent)
  *
  * \param qc The queued chunk.
  * \param buf Result pointer.
- * \param len Number of bytes of \a buf.
+ * \param num_bytes Number of bytes of \a buf.
  *
  * \return Positive on success, negative on errors.
  */