ip/torrent: keep peers in queue
This commit is contained in:
parent
ab022ff67d
commit
3997c57b57
|
@ -630,9 +630,9 @@ client(char *ip, char *port)
|
||||||
static Dict *peers, *peerqh, *peerqt;
|
static Dict *peers, *peerqh, *peerqt;
|
||||||
static QLock peerslk;
|
static QLock peerslk;
|
||||||
static int nprocs;
|
static int nprocs;
|
||||||
int try, fd;
|
|
||||||
char *addr;
|
char *addr;
|
||||||
Dict *d;
|
Dict *d;
|
||||||
|
int fd;
|
||||||
|
|
||||||
if(ip == nil || port == nil)
|
if(ip == nil || port == nil)
|
||||||
return;
|
return;
|
||||||
|
@ -648,23 +648,39 @@ client(char *ip, char *port)
|
||||||
d->len = strlen(addr);
|
d->len = strlen(addr);
|
||||||
d->typ = 'd';
|
d->typ = 'd';
|
||||||
d->val = d;
|
d->val = d;
|
||||||
d->next = nil;
|
/* enqueue to front */
|
||||||
if(peerqt == nil)
|
if((d->next = peerqh) == nil)
|
||||||
peerqh = d;
|
peerqt = d;
|
||||||
else
|
peerqh = d;
|
||||||
peerqt->next = d;
|
|
||||||
peerqt = d;
|
|
||||||
if(nprocs >= CLIPROCS){
|
if(nprocs >= CLIPROCS){
|
||||||
qunlock(&peerslk);
|
qunlock(&peerslk);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
nprocs++;
|
nprocs++;
|
||||||
qunlock(&peerslk);
|
qunlock(&peerslk);
|
||||||
|
|
||||||
if(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT))
|
if(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
d = nil;
|
||||||
for(;;){
|
for(;;){
|
||||||
qlock(&peerslk);
|
qlock(&peerslk);
|
||||||
|
if(d){
|
||||||
|
Dict **dd;
|
||||||
|
/* remove from peers list */
|
||||||
|
for(dd = &peers; *dd; dd = &((*dd)->next))
|
||||||
|
if(*dd == d){
|
||||||
|
*dd = d->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* enqueue to back */
|
||||||
|
d->next = nil;
|
||||||
|
if(peerqt == nil)
|
||||||
|
peerqh = d;
|
||||||
|
else
|
||||||
|
peerqt->next = d;
|
||||||
|
peerqt = d;
|
||||||
|
}
|
||||||
|
/* dequeue and put in peer list */
|
||||||
if(d = peerqh){
|
if(d = peerqh){
|
||||||
if((peerqh = d->next) == nil)
|
if((peerqh = d->next) == nil)
|
||||||
peerqt = nil;
|
peerqt = nil;
|
||||||
|
@ -677,14 +693,12 @@ client(char *ip, char *port)
|
||||||
exits(0);
|
exits(0);
|
||||||
addr = d->str;
|
addr = d->str;
|
||||||
if(debug) fprint(2, "client %s\n", addr);
|
if(debug) fprint(2, "client %s\n", addr);
|
||||||
for(try = 0; try < 5; try++){
|
if((fd = dial(addr, nil, nil, nil)) >= 0){
|
||||||
if((fd = dial(addr, nil, nil, nil)) >= 0){
|
if(!peer(fd, 0, addr))
|
||||||
if(!peer(fd, 0, addr))
|
d = nil;
|
||||||
break;
|
close(fd);
|
||||||
close(fd);
|
|
||||||
}
|
|
||||||
sleep((1000<<try)+nrand(5000));
|
|
||||||
}
|
}
|
||||||
|
if(d) sleep(1000+nrand(5000));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue