소스 검색

Wait until we don't have any unanswered requests on a peer before

sending an uninterest message.
master
Richard Nyberg 19 년 전
부모
커밋
e5cd773d85
2개의 변경된 파일24개의 추가작업 그리고 7개의 파일을 삭제
  1. +23
    -7
      btpd/peer.c
  2. +1
    -0
      btpd/peer.h

+ 23
- 7
btpd/peer.c 파일 보기

@@ -186,6 +186,8 @@ peer_cancel(struct peer *p, struct block_request *req, struct net_buf *nb)
}
if (!removed)
peer_send(p, nb);
if (p->nreqs_out == 0)
peer_on_no_reqs(p);
}

void
@@ -220,12 +222,14 @@ peer_want(struct peer *p, uint32_t index)
assert(p->nwant < p->npieces);
p->nwant++;
if (p->nwant == 1) {
int unsent = 0;
struct nb_link *nl = BTPDQ_LAST(&p->outq, nb_tq);
if (nl != NULL && nl->nb->type == NB_UNINTEREST)
unsent = peer_unsend(p, nl);
if (!unsent)
peer_send(p, btpd.interest_msg);
if (p->nreqs_out == 0) {
int unsent = 0;
struct nb_link *nl = BTPDQ_LAST(&p->outq, nb_tq);
if (nl != NULL && nl->nb->type == NB_UNINTEREST)
unsent = peer_unsend(p, nl);
if (!unsent)
peer_send(p, btpd.interest_msg);
}
p->flags |= PF_I_WANT;
}
}
@@ -237,7 +241,8 @@ peer_unwant(struct peer *p, uint32_t index)
p->nwant--;
if (p->nwant == 0) {
p->flags &= ~PF_I_WANT;
peer_send(p, btpd.uninterest_msg);
if (p->nreqs_out == 0)
peer_send(p, btpd.uninterest_msg);
}
}

@@ -303,6 +308,13 @@ peer_create_out_compact(struct torrent *tp, const char *compact)
peer_send(p, nb_create_shake(p->tp));
}

void
peer_on_no_reqs(struct peer *p)
{
if (p->nwant == 0)
peer_send(p, btpd.uninterest_msg);
}

void
peer_on_shake(struct peer *p)
{
@@ -331,6 +343,8 @@ peer_on_choke(struct peer *p)
if ((p->flags & PF_P_CHOKE) != 0)
return;
else {
if (p->nreqs_out > 0)
peer_on_no_reqs(p);
p->flags |= PF_P_CHOKE;
cm_on_choke(p);
struct nb_link *nl = BTPDQ_FIRST(&p->outq);
@@ -421,6 +435,8 @@ peer_on_piece(struct peer *p, uint32_t index, uint32_t begin,
p->nreqs_out--;
BTPDQ_REMOVE(&p->my_reqs, req, p_entry);
cm_on_block(p, req, index, begin, length, data);
if (p->nreqs_out == 0)
peer_on_no_reqs(p);
} else
btpd_log(BTPD_L_MSG, "discarded piece(%u,%u,%u) from %p\n",
index, begin, length, p);


+ 1
- 0
btpd/peer.h 파일 보기

@@ -88,6 +88,7 @@ void peer_create_out(struct torrent *tp, const uint8_t *id,
void peer_create_out_compact(struct torrent *tp, const char *compact);
void peer_kill(struct peer *p);

void peer_on_no_reqs(struct peer *p);
void peer_on_shake(struct peer *p);
void peer_on_interest(struct peer *p);
void peer_on_uninterest(struct peer *p);


불러오는 중...
취소
저장