summaryrefslogtreecommitdiff
path: root/mcastseed/src/dgrambuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'mcastseed/src/dgrambuf.c')
-rw-r--r--mcastseed/src/dgrambuf.c86
1 files changed, 45 insertions, 41 deletions
diff --git a/mcastseed/src/dgrambuf.c b/mcastseed/src/dgrambuf.c
index b440390..5d4c302 100644
--- a/mcastseed/src/dgrambuf.c
+++ b/mcastseed/src/dgrambuf.c
@@ -237,7 +237,7 @@ int dgrambuf_have_data_ready_to_write(dgrambuf_t dbuf) {
unsigned int next_dgram_seq;
/* Last write was partial, so there is more to write */
- if ( dbuf->partial_write_remaining_bytes > 0 ) {
+ if ( dbuf->partial_write_remaining_bytes ) {
return 1;
}
@@ -248,7 +248,7 @@ int dgrambuf_have_data_ready_to_write(dgrambuf_t dbuf) {
/* Nothing to write if next dgram is not in buffer at all */
next_dgram_seq = ((struct indexed_uint *) gl_list_get_at(dbuf->dgram_used_slots, 0))->value;
- fprintf(stderr, "DEBUG : dgram_seq_base==%u next_dgram_seq == %u\n", dbuf->dgram_seq_base, next_dgram_seq);
+ /*fprintf(stderr, "DEBUG : dgram_seq_base==%u next_dgram_seq == %u\n", dbuf->dgram_seq_base, next_dgram_seq);*/
if ( next_dgram_seq != dbuf->dgram_seq_base ) {
return 0;
}
@@ -262,9 +262,9 @@ int dgrambuf_have_received_everything(dgrambuf_t dbuf) {
}
ssize_t dgrambuf_write(dgrambuf_t dbuf, int fd, int *info) {
- size_t dgram_index, i, vlen, used_count;
+ size_t dgram_index, i, vlen, total, len, remain, used_count;
unsigned int curr_seq, prev_seq, dgram_len;
- ssize_t nwrite, total, remain, len;
+ ssize_t nwrite;
struct iovec *iov;
struct indexed_uint *active_slot;
bool pos;
@@ -272,7 +272,7 @@ ssize_t dgrambuf_write(dgrambuf_t dbuf, int fd, int *info) {
/* FIXME Info ptr is mandatory */
*info = 0;
- if ( dbuf->partial_write_remaining_bytes > 0 ) {
+ if ( dbuf->partial_write_remaining_bytes ) {
/* Previous writev() was partial, continue it */
iov = dbuf->partial_write_iov;
vlen = dbuf->partial_write_remaining_iovcnt;
@@ -364,49 +364,53 @@ ssize_t dgrambuf_write(dgrambuf_t dbuf, int fd, int *info) {
return -1;
}
+ dbuf->partial_write_remaining_bytes = total - nwrite;
if ( nwrite > 0 ) {
dbuf->stats.write_byte += nwrite;
*info |= DGRAMBUF_WRITE_SUCCESS;
- }
- /* Check if the write was partially done */
- dbuf->partial_write_remaining_bytes = total - nwrite;
- if ( dbuf->partial_write_remaining_bytes > 0 ) {
- *info |= DGRAMBUF_WRITE_PARTIAL;
- dbuf->stats.write_partial++;
- /* Find the partially written iov and update it */
- remain = nwrite;
- for (i=0; i<vlen; i++) {
- len = dbuf->iov_write[i].iov_len;
- if ( remain < len ) {
- dbuf->partial_write_remaining_iovcnt = vlen - i;
- dbuf->partial_write_iov = dbuf->iov_write + i;
-
- dbuf->iov_write[i].iov_base =
- (uint8_t *) dbuf->iov_write[i].iov_base + remain;
- dbuf->iov_write[i].iov_len -= remain;
- break;
+ if ( dbuf->partial_write_remaining_bytes ) {
+ /* If the write was partially done */
+ *info |= DGRAMBUF_WRITE_PARTIAL;
+ dbuf->stats.write_partial++;
+ /* Find the partially written iov and update it */
+ remain = nwrite;
+ for (i=0; i<vlen; i++) {
+ len = dbuf->iov_write[i].iov_len;
+ if ( remain < len ) {
+ dbuf->partial_write_remaining_iovcnt = vlen - i;
+ if ( dbuf->partial_write_iov ) {
+ dbuf->partial_write_iov += i;
+ } else {
+ dbuf->partial_write_iov = dbuf->iov_write + i;
+ }
+
+ dbuf->iov_write[i].iov_base =
+ (uint8_t *) dbuf->iov_write[i].iov_base + remain;
+ dbuf->iov_write[i].iov_len -= remain;
+ break;
+ }
+ remain -= len;
+ }
+ if ( i == vlen ) {
+ fprintf(stderr, "Fatal : failed to find partial iov after partial write\n");
+ return -3;
}
- remain -= len;
- }
- if ( i == vlen ) {
- fprintf(stderr, "Fatal : failed to find partial iov after partial write\n");
- return -3;
- }
- } else {
- /* Full write has happened */
- for (i=0; i<dbuf->dgram_write_active_slots_count; i++) {
- active_slot = (struct indexed_uint *) dbuf->dgram_write_active_slots[i];
- active_slot->value = 0;
- pos = gl_sortedlist_nx_add(dbuf->dgram_empty_slots, _compare_indexed_uint, active_slot);
- if ( !pos ) /*TODO: better oom handling */
- return -4;
+ } else {
+ /* Full write has happened */
+ for (i=0; i<dbuf->dgram_write_active_slots_count; i++) {
+ active_slot = (struct indexed_uint *) dbuf->dgram_write_active_slots[i];
+ active_slot->value = 0;
+ pos = gl_sortedlist_nx_add(dbuf->dgram_empty_slots, _compare_indexed_uint, active_slot);
+ if ( !pos ) /*TODO: better oom handling ? */
+ return -4;
+ }
+ dbuf->dgram_write_active_slots_count = 0;
+ /* Wipe outdated partial_* values */
+ dbuf->partial_write_iov = NULL;
+ dbuf->partial_write_remaining_iovcnt = 0;
}
- dbuf->dgram_write_active_slots_count = 0;
- /* Wipe outdated partial_* values for clarity in debug mode (only _bytes is use on branching) */
- dbuf->partial_write_iov = NULL;
- dbuf->partial_write_remaining_iovcnt = 0;
}
return nwrite;