]> git.lizzy.rs Git - plan9front.git/commitdiff
ip/torrent: keep peers in queue
authorcinap_lenrek <cinap_lenrek@gmx.de>
Sun, 6 May 2012 15:38:20 +0000 (17:38 +0200)
committercinap_lenrek <cinap_lenrek@gmx.de>
Sun, 6 May 2012 15:38:20 +0000 (17:38 +0200)
sys/src/cmd/ip/torrent.c

index 8eb858ccf67800f7bcf7f9bb27265a69a96d24da..38494492d6fb592b6bec52f376ae781cfbb7a72e 100644 (file)
@@ -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<<try)+nrand(5000));
+               if((fd = dial(addr, nil, nil, nil)) >= 0){
+                       if(!peer(fd, 0, addr))
+                               d = nil;
+                       close(fd);
                }
+               if(d) sleep(1000+nrand(5000));
        }
 }