* Add net_active flag to simplify removal of peers when shutting down the net for a torrent.master
@@ -12,20 +12,9 @@ dl_start(struct torrent *tp) | |||||
void | void | ||||
dl_stop(struct torrent *tp) | dl_stop(struct torrent *tp) | ||||
{ | { | ||||
struct peer *peer; | struct piece *pc; | ||||
struct piece *piece; | while ((pc = BTPDQ_FIRST(&tp->getlst)) != NULL) | ||||
piece_free(pc); | |||||
peer = BTPDQ_FIRST(&tp->peers); | |||||
while (peer != NULL) { | |||||
struct peer *next = BTPDQ_NEXT(peer, p_entry); | |||||
BTPDQ_REMOVE(&tp->peers, peer, p_entry); | |||||
BTPDQ_INSERT_TAIL(&net_unattached, peer, p_entry); | |||||
peer->flags &= ~PF_ATTACHED; | |||||
peer = next; | |||||
} | |||||
while ((piece = BTPDQ_FIRST(&tp->getlst)) != NULL) | |||||
piece_free(piece); | |||||
} | } | ||||
/* | /* | ||||
@@ -165,11 +154,6 @@ dl_on_bad_piece(struct piece *pc) | |||||
void | void | ||||
dl_on_new_peer(struct peer *p) | dl_on_new_peer(struct peer *p) | ||||
{ | { | ||||
struct torrent *tp = p->tp; | |||||
tp->npeers++; | |||||
p->flags |= PF_ATTACHED; | |||||
BTPDQ_REMOVE(&net_unattached, p, p_entry); | |||||
BTPDQ_INSERT_HEAD(&tp->peers, p, p_entry); | |||||
} | } | ||||
void | void | ||||
@@ -177,26 +161,12 @@ dl_on_lost_peer(struct peer *p) | |||||
{ | { | ||||
struct torrent *tp = p->tp; | struct torrent *tp = p->tp; | ||||
assert(tp->npeers > 0 && (p->flags & PF_ATTACHED) != 0); | |||||
tp->npeers--; | |||||
p->flags &= ~PF_ATTACHED; | |||||
BTPDQ_REMOVE(&tp->peers, p, p_entry); | |||||
for (uint32_t i = 0; i < tp->meta.npieces; i++) | for (uint32_t i = 0; i < tp->meta.npieces; i++) | ||||
if (peer_has(p, i)) | if (peer_has(p, i)) | ||||
tp->piece_count[i]--; | tp->piece_count[i]--; | ||||
if (p->nreqs_out > 0) | if (p->nreqs_out > 0) | ||||
dl_on_undownload(p); | dl_on_undownload(p); | ||||
#if 0 | |||||
struct piece *pc = BTPDQ_FIRST(&tp->getlst); | |||||
while (pc != NULL) { | |||||
struct piece *next = BTPDQ_NEXT(pc, entry); | |||||
if (peer_has(p, pc->index) && tp->piece_count[pc->index] == 0) | |||||
dl_on_peerless_piece(pc); | |||||
pc = next; | |||||
} | |||||
#endif | |||||
} | } | ||||
void | void | ||||
@@ -41,6 +41,7 @@ struct peer_tq net_unattached = BTPDQ_HEAD_INITIALIZER(net_unattached); | |||||
void | void | ||||
net_add_torrent(struct torrent *tp) | net_add_torrent(struct torrent *tp) | ||||
{ | { | ||||
tp->net_active = 1; | |||||
BTPDQ_INSERT_HEAD(&m_torrents, tp, net_entry); | BTPDQ_INSERT_HEAD(&m_torrents, tp, net_entry); | ||||
m_ntorrents++; | m_ntorrents++; | ||||
dl_start(tp); | dl_start(tp); | ||||
@@ -49,6 +50,7 @@ net_add_torrent(struct torrent *tp) | |||||
void | void | ||||
net_del_torrent(struct torrent *tp) | net_del_torrent(struct torrent *tp) | ||||
{ | { | ||||
tp->net_active = 0; | |||||
assert(m_ntorrents > 0); | assert(m_ntorrents > 0); | ||||
m_ntorrents--; | m_ntorrents--; | ||||
BTPDQ_REMOVE(&m_torrents, tp, net_entry); | BTPDQ_REMOVE(&m_torrents, tp, net_entry); | ||||
@@ -63,6 +65,13 @@ net_del_torrent(struct torrent *tp) | |||||
peer_kill(p); | peer_kill(p); | ||||
p = next; | p = next; | ||||
} | } | ||||
p = BTPDQ_FIRST(&tp->peers); | |||||
while (p != NULL) { | |||||
struct peer *next = BTPDQ_NEXT(p, p_entry); | |||||
peer_kill(p); | |||||
p = next; | |||||
} | |||||
} | } | ||||
void | void | ||||
@@ -17,8 +17,12 @@ peer_kill(struct peer *p) | |||||
btpd_log(BTPD_L_CONN, "killed peer %p\n", p); | btpd_log(BTPD_L_CONN, "killed peer %p\n", p); | ||||
if (p->flags & PF_ATTACHED) { | if (p->flags & PF_ATTACHED) { | ||||
ul_on_lost_peer(p); | if (p->tp->net_active) { | ||||
dl_on_lost_peer(p); | ul_on_lost_peer(p); | ||||
dl_on_lost_peer(p); | |||||
} | |||||
BTPDQ_REMOVE(&p->tp->peers, p, p_entry); | |||||
p->tp->npeers--; | |||||
} else | } else | ||||
BTPDQ_REMOVE(&net_unattached, p, p_entry); | BTPDQ_REMOVE(&net_unattached, p, p_entry); | ||||
if (p->flags & PF_ON_READQ) | if (p->flags & PF_ON_READQ) | ||||
@@ -340,6 +344,12 @@ peer_on_shake(struct peer *p) | |||||
peer_send(p, nb_create_bitdata(p->tp)); | peer_send(p, nb_create_bitdata(p->tp)); | ||||
} | } | ||||
} | } | ||||
BTPDQ_REMOVE(&net_unattached, p, p_entry); | |||||
BTPDQ_INSERT_HEAD(&p->tp->peers, p, p_entry); | |||||
p->flags |= PF_ATTACHED; | |||||
p->tp->npeers++; | |||||
ul_on_new_peer(p); | ul_on_new_peer(p); | ||||
dl_on_new_peer(p); | dl_on_new_peer(p); | ||||
} | } | ||||
@@ -41,6 +41,8 @@ struct torrent { | |||||
void *imem; | void *imem; | ||||
size_t isiz; | size_t isiz; | ||||
int net_active; | |||||
uint8_t *piece_field; | uint8_t *piece_field; | ||||
uint8_t *block_field; | uint8_t *block_field; | ||||