From 3997c57b572f10784bbc4d811d997d3b28ab0a12 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 6 May 2012 17:38:20 +0200 Subject: [PATCH] ip/torrent: keep peers in queue --- sys/src/cmd/ip/torrent.c | 44 ++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/sys/src/cmd/ip/torrent.c b/sys/src/cmd/ip/torrent.c index 8eb858ccf..38494492d 100644 --- a/sys/src/cmd/ip/torrent.c +++ b/sys/src/cmd/ip/torrent.c @@ -630,9 +630,9 @@ client(char *ip, char *port) static Dict *peers, *peerqh, *peerqt; static QLock peerslk; static int nprocs; - int try, fd; char *addr; Dict *d; + int fd; if(ip == nil || port == nil) return; @@ -648,23 +648,39 @@ client(char *ip, char *port) d->len = strlen(addr); d->typ = 'd'; d->val = d; - d->next = nil; - if(peerqt == nil) - peerqh = d; - else - peerqt->next = d; - peerqt = d; + /* enqueue to front */ + if((d->next = peerqh) == nil) + peerqt = d; + peerqh = d; if(nprocs >= CLIPROCS){ qunlock(&peerslk); return; } nprocs++; qunlock(&peerslk); - if(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT)) return; + + d = nil; for(;;){ 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((peerqh = d->next) == nil) peerqt = nil; @@ -677,14 +693,12 @@ client(char *ip, char *port) exits(0); addr = d->str; if(debug) fprint(2, "client %s\n", addr); - for(try = 0; try < 5; try++){ - if((fd = dial(addr, nil, nil, nil)) >= 0){ - if(!peer(fd, 0, addr)) - break; - close(fd); - } - sleep((1000<= 0){ + if(!peer(fd, 0, addr)) + d = nil; + close(fd); } + if(d) sleep(1000+nrand(5000)); } }