X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=chunk_queue.c;h=f7f503abea9ecc093fc4d577942bea36b510d419;hp=84f4a4a88ebfcb5acb4b0cfaf9dc861b87f82947;hb=3dca24604449f268274e8458fbd5447e55dd7cc8;hpb=04a8d064400936dc6ecd3b137397cb2ce2cc25d7 diff --git a/chunk_queue.c b/chunk_queue.c index 84f4a4a8..f7f503ab 100644 --- a/chunk_queue.c +++ b/chunk_queue.c @@ -31,10 +31,10 @@ struct chunk_queue { /** Describes one queued chunk in a chunk queue. */ struct queued_chunk { - /** The number of the queued chunk, -1U means header. */ - unsigned chunk_num; - /** The number of bytes already sent. */ - unsigned sent; + /** Pointer to the data to be queued. */ + const char *buf; + /** The number of bytes of this chunk. */ + size_t num_bytes; /** Position of the chunk in the chunk queue. */ struct list_head node; }; @@ -43,32 +43,21 @@ struct queued_chunk { * Add a chunk to the given queue. * * \param cq the queue to add the chunk to. - * \param chunk_num The number of the chunk to be queued. - * \param sent The number of bytes of this chunk that the sender was able to - * send. + * \param buf Pointer to the data to be queued. + * \param num_bytes The size of \a buf. * - * \return Positive on success, negative on errors. + * \return Standard. */ -int cq_enqueue(struct chunk_queue *cq, long unsigned chunk_num, - size_t sent) +int cq_enqueue(struct chunk_queue *cq, const char *buf, size_t num_bytes) { struct queued_chunk *qc; - char *buf; - size_t len; - int ret; - if (chunk_num != -1U) { - ret = vss_get_chunk(chunk_num, &buf, &len); - if (ret < 0) - return ret; - } else - vss_get_header(&buf, &len); - if (cq->num_pending + len > cq->max_pending) + if (cq->num_pending + num_bytes > cq->max_pending) return -E_QUEUE; qc = para_malloc(sizeof(struct queued_chunk)); - cq->num_pending += len; - qc->chunk_num = chunk_num; - qc->sent = sent; + cq->num_pending += num_bytes; + qc->buf = buf; + qc->num_bytes = num_bytes; list_add_tail(&qc->node, &cq->q); PARA_DEBUG_LOG("%lu bytes queued for %p\n", cq->num_pending, &cq->q); return 1; @@ -111,7 +100,8 @@ void cq_update(struct chunk_queue *cq, size_t sent) { struct queued_chunk *qc = cq_peek(cq); assert(qc); - qc->sent += sent; + qc->num_bytes -= sent; + qc->buf += sent; cq->num_pending -= sent; } @@ -124,19 +114,10 @@ void cq_update(struct chunk_queue *cq, size_t sent) * * \return Positive on success, negative on errors. */ -int cq_get(struct queued_chunk *qc, char **buf, size_t *len) +int cq_get(struct queued_chunk *qc, const char **buf, size_t *num_bytes) { - int ret; - - if (qc->chunk_num != -1U) { - ret = vss_get_chunk(qc->chunk_num, buf, len); - if (ret < 0) - return ret; - } else - vss_get_header(buf, len); - assert(*len > qc->sent); - *buf += qc->sent; - *len -= qc->sent; + *buf = qc->buf; + *num_bytes = qc->num_bytes; return 1; }