summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2016-10-02 13:12:23 +0200
committerLudovic Pouzenc <ludovic@pouzenc.fr>2016-10-02 13:12:23 +0200
commit38f5f6389a0d7c17c0f11cc7927625012ae90888 (patch)
treeac1c87f5b3d4a86fe2a779783ea138ea1d4d07cc
parent2f8fc8b9a1b6617ed03072d8a0f0028d823d6d49 (diff)
downloadeficast-38f5f6389a0d7c17c0f11cc7927625012ae90888.tar.gz
eficast-38f5f6389a0d7c17c0f11cc7927625012ae90888.tar.bz2
eficast-38f5f6389a0d7c17c0f11cc7927625012ae90888.zip
Failed bug fix for partial write (uftp choosen as temporary mcastseed remplacement)
-rw-r--r--mcastseed/src/Makefile.am4
-rw-r--r--mcastseed/src/dgrambuf.c86
-rw-r--r--mcastseed/src/mcastleech.c4
3 files changed, 48 insertions, 46 deletions
diff --git a/mcastseed/src/Makefile.am b/mcastseed/src/Makefile.am
index c49cf70..2f2a735 100644
--- a/mcastseed/src/Makefile.am
+++ b/mcastseed/src/Makefile.am
@@ -5,9 +5,7 @@ AM_CFLAGS =\
-Wall \
-Wextra \
-pedantic \
- -Wno-format\
- -O0\
- -g
+ -Wno-format
bin_PROGRAMS = mcastseed mcastleech random_speed_dd
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;
diff --git a/mcastseed/src/mcastleech.c b/mcastseed/src/mcastleech.c
index 76e1e79..3345665 100644
--- a/mcastseed/src/mcastleech.c
+++ b/mcastseed/src/mcastleech.c
@@ -218,10 +218,10 @@ int receive_data() {
return nwrite;
}
- fprintf(stderr, "receive_data(): nread == %zi, nwrite == %zi\n", nread, nwrite);
+ /*fprintf(stderr, "receive_data(): nread == %zi, nwrite == %zi\n", nread, nwrite);*/
/* XXX Crapy dead state detection */
- if ( nread == 0 && nwrite == 0 ) {
+ if ( nread == 0 /* TEST && nwrite == 0 */ ) {
if ( noop_calls_count > 10 ) {
return 0;
}