return hint; // TODO: end-game mode
while (hint.layer()>layer)
hint = hint.left();
+ assert(ack_hint_out_.get(hint)==bins::EMPTY);
+ if (file().ack_out().get(hint)!=bins::EMPTY) {
+ eprintf("bogus hint: (%i,%lli)\n",(int)hint.layer(),hint.offset());
+ exit(1);
+ }
ack_hint_out_.set(hint);
return hint;
/*for (int l=layer; l>=0; l--) {
} else {
int status = file().ack_out().get(f.bin);
if (status==bins::EMPTY) {
- transfer().picker().Received(f.bin);
+ transfer().picker().Expired(f.bin);
break;
} else if (status==bins::FILLED) {
hint_out_.pop_front();
dprintf("%s #%i hinted %lli peer_cwnd %lli/%lli=%f\n",
tintstr(),id,hinted,rtt_avg_,dip_avg_,((float)rtt_avg_/dip_avg_));
- if ( 8*peer_cwnd > hinted ) { //hinted*1024 < peer_cwnd*4 ) {
+ if ( 4*peer_cwnd > hinted ) { //hinted*1024 < peer_cwnd*4 ) {
uint8_t layer = 2; // actually, enough
bin64_t hint = transfer().picker().Pick(ack_in_,layer);
dgram.Push(buf,r);
dprintf("%s #%i +data (%lli)\n",tintstr(),id,tosend.base_offset());
data_out_.push_back(tosend);
+ ack_in_.set(tosend);
return tosend;
}
tint dip = NOW - last_recv_time_;
dip_avg_ = ( dip_avg_*3 + dip ) >> 2;
}
+ transfer().picker().Received(pos); // so dirty; FIXME FIXME FIXME
return pos;
} else
return bin64_t::NONE;
void Channel::OnHint (Datagram& dgram) {
bin64_t hint = dgram.Pull32();
hint_in_.push_back(hint);
+ ack_in_.set(hint,bins::EMPTY);
//RequeueSend(cc_->OnHintRecvd(hint));
dprintf("%s #%i -hint (%i,%lli)\n",tintstr(),id,hint.layer(),hint.offset());
}