mldonkey-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Mldonkey-commits] Changes to mldonkey/src/networks/bittorrent/bTClients


From: mldonkey-commits
Subject: [Mldonkey-commits] Changes to mldonkey/src/networks/bittorrent/bTClients.ml
Date: Sat, 12 Nov 2005 06:20:27 -0500

Index: mldonkey/src/networks/bittorrent/bTClients.ml
diff -u mldonkey/src/networks/bittorrent/bTClients.ml:1.56 
mldonkey/src/networks/bittorrent/bTClients.ml:1.57
--- mldonkey/src/networks/bittorrent/bTClients.ml:1.56  Mon Nov  7 20:11:42 2005
+++ mldonkey/src/networks/bittorrent/bTClients.ml       Sat Nov 12 11:20:20 2005
@@ -264,7 +264,7 @@
           let file = c.client_file in
           (try if c.client_good then count_seen c with _ -> ());
           (* this is not useful already done in the match
-          (try close sock reason with _ -> ());          *)
+          (try close sock reason with _ -> ());   *)
 (*---------not needed ?? VvvvvV---------------
           c.client_ranges <- [];
           c.client_block <- None;
@@ -289,7 +289,7 @@
                      (Useful for availability)
                   *)
                   Int64Swarmer.unregister_uploader up
-(*           c.client_registered_bitfield <- false;
+(*        c.client_registered_bitfield <- false;
           for i = 0 to String.length c.client_bitmap - 1 do
             c.client_bitmap.[0] <- '0';
           done*)
@@ -304,7 +304,7 @@
               remove_client c;
               recompute_uploaders ();
             end
-          else 
+          else  
             remove_client c;
         with _ -> ()
   end
@@ -538,9 +538,12 @@
 *)
 and update_client_bitmap c =
   let file = c.client_file in
+  
   let swarmer = match file.file_swarmer with
       None -> assert false
-    | Some swarmer -> swarmer in
+    | Some swarmer -> swarmer 
+  in
+  
   let up =
     match c.client_uploader with
       None ->
@@ -555,18 +558,19 @@
   let bitmap = match c.client_bitmap with
       None ->
         let len = Int64Swarmer.partition_size swarmer in
-        let bitmap = String.make (len*8) '0' in
+        let bitmap = Bitv.create len false in
         c.client_bitmap <- Some bitmap;
         bitmap
     | Some bitmap -> bitmap
   in
 
-  if c.client_new_chunks <> [] then
+  if c.client_new_chunks <> [] then begin
     let chunks = c.client_new_chunks in
     c.client_new_chunks <- [];
     let file = c.client_file in
-    List.iter (fun n -> bitmap.[n] <- '1') chunks;
-    Int64Swarmer.update_uploader up (AvailableCharBitmap bitmap)
+    List.iter (fun n -> Bitv.set bitmap n true) chunks;
+    Int64Swarmer.update_uploader up (AvailableBitv bitmap);
+  end
 
 
 (** In this function we decide which piece we must request from client.
@@ -597,8 +601,8 @@
           lprintf_n () "Current download:\n  Current chunks: ";
           (try
           List.iter (fun (x,y) -> lprintf "%Ld-%Ld " x y) c.client_chunks
-         with _ -> lprintf "No Chunks");
-         lprint_newline ();
+    with _ -> lprintf "No Chunks");
+    lprint_newline ();
           lprintf_n () "Current ranges: ";
           List.iter (fun (p1,p2, r) ->
               let (x,y) = Int64Swarmer.range_range r
@@ -607,12 +611,12 @@
           (match c.client_range_waiting with
               None -> ()
             | Some (x,y,r) -> lprintf "Waiting %Ld-%Ld" x y);
-         lprint_newline ();
+    lprint_newline ();
           lprintf_n () "Current block: ";
           (match c.client_block with
               None -> lprintf "none"
             | Some b -> Int64Swarmer.print_block b);
-         lprint_newline ();
+    lprint_newline ();
           lprintf_nl () "Finding Range:";
         end;
       try
@@ -630,7 +634,7 @@
               let b = Int64Swarmer.find_block up in
               if !verbose_swarming then begin
                   lprintf_n () "Block Found: "; Int64Swarmer.print_block b;
-                 lprint_newline ()
+      lprint_newline ()
                 end;
               c.client_block <- Some b;
              (*We put the found block in client_block to
@@ -641,7 +645,7 @@
           | Some b ->
               if !verbose_swarming then begin
                   lprintf_n () "Current Block: "; Int64Swarmer.print_block b;
-                 lprint_newline ()
+      lprint_newline ()
                 end;
               try
                 (*Given a block find a range inside*)
@@ -854,50 +858,41 @@
             None -> ()
           | Some swarmer ->
               c.client_new_chunks <- [];
-              let len = String.length p in
-              let bitmap = String.make (len*8) '0' in
-              for i = 0 to len - 1 do
-                for j = 0 to 7 do
-                  if (int_of_char p.[i]) land bits.(j) <> 0 then
-                    begin
-                      c.client_new_chunks <- i*8+j :: c.client_new_chunks;
-                      bitmap.[i*8+j] <- '1';
-                    end
-                  else
-                    bitmap.[i*8+j] <- '0';
+              
+              let npieces = Int64Swarmer.partition_size swarmer in
+              let nbits = String.length p * 8 in
+
+              if nbits < npieces then begin
+                lprintf_nl () "Error: expected bitfield of atleast %d but got 
%d" npieces nbits;
+                disconnect_client c (Closed_for_error "Wrong bitfield length")
+              end else begin
+
+                let is_set s n = (Char.code s.[n lsr 3]) land (1 lsl (n land 
7)) <> 0 in
+                let verified = Int64Swarmer.verified_bitmap swarmer in
+
+                for i = 0 to npieces - 1 do
+                  if is_set p i then begin
+                    c.client_new_chunks <- i :: c.client_new_chunks;
+                    if verified.[i] < '2' then
+                      c.client_interesting <- true;
+                  end 
                 done;
-              done;
 
-              update_client_bitmap c;
+                update_client_bitmap c;
+                c.client_registered_bitfield <- true;
 
-              let verified = Int64Swarmer.verified_bitmap swarmer in
-              let npieces = Int64Swarmer.partition_size swarmer in
-              (* parse the pieces to see if the client is interesting *)
-              for i = 0 to npieces -1  do
-                (* lprintf "bitmap: %c, verified: %c" bitmap.[i] verified.[i]; 
*)
-                if bitmap.[i] = '1' && verified.[i] < '2' then
-                  c.client_interesting <- true;
-              done;
+                if c.client_interesting then
+                  send_interested c;
 
-              if !verbose_msg_clients then
-                lprintf_nl () "BitField translated";
-              if !verbose_msg_clients then
-                lprintf_nl () "Old BitField Unregistered";
-              (match c.client_uploader with
-                  None -> assert false
-                | Some up ->
-                    Int64Swarmer.update_uploader up
-                      (AvailableCharBitmap bitmap));
-              c.client_registered_bitfield <- true;
-              c.client_bitmap <- Some bitmap;
-              (* send interested if we are *)
-              if c.client_interesting then
-                send_interested c;
-              if !verbose_msg_clients then
-                lprintf_nl () "New BitField Registered";
-(*        for i = 1 to max_range_requests - List.length c.client_ranges do
-          (try get_from_client sock c with _ -> ())
-        done*)
+                if !verbose_msg_clients then
+                  lprintf_nl () "New BitField Registered";
+
+                (*  for i = 1 to max_range_requests - List.length 
c.client_ranges do
+                      (try get_from_client sock c with _ -> ())
+                    done
+                *)
+
+            end;
         end;
         (* Note: a bitfield must only be sent after the handshake and before 
everything else: NOT here *)
 
@@ -939,8 +934,8 @@
                       end
                   end
           | None, Some _ -> lprintf_nl () "no bitmap but client_uploader";
-         | Some _ , None ->lprintf_nl () "bitmap but no client_uploader";
-         | None, None -> lprintf_nl () "no bitmap no client_uploader";
+    | Some _ , None ->lprintf_nl () "bitmap but no client_uploader";
+    | None, None -> lprintf_nl () "no bitmap no client_uploader";
         end
 *)
         end
@@ -1295,7 +1290,7 @@
             match (key, value) with
             | String "failure reason", String failure ->
                 (* On failure, remove the faulty tracker from 
file.file_trackers list *)
-               remove_tracker t.tracker_url file;
+    remove_tracker t.tracker_url file;
                 lprintf_nl () "Failure from Tracker %s in file: %s Reason: 
%s\nBT: Tracker %s removed for failure"
                   t.tracker_url file.file_name failure t.tracker_url
             | String "warning message", String warning ->
@@ -1494,14 +1489,14 @@
       match c.client_upload_requests with
         [] -> ()
       | _ :: tail ->
-         let new_allowed_to_write =
-           c.client_allowed_to_write ++ (Int64.of_int allowed) in
-           if allowed > 0 && CommonUploads.can_write_len sock
-                             (Int64.to_int new_allowed_to_write)
-           then begin
-             CommonUploads.consume_bandwidth allowed;
-             c.client_allowed_to_write <- new_allowed_to_write;
-           end;
+    let new_allowed_to_write =
+      c.client_allowed_to_write ++ (Int64.of_int allowed) in
+      if allowed > 0 && CommonUploads.can_write_len sock
+            (Int64.to_int new_allowed_to_write)
+      then begin
+        CommonUploads.consume_bandwidth allowed;
+        c.client_allowed_to_write <- new_allowed_to_write;
+      end;
           iter_upload sock c
   )
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]