nicer API -- you don't have to shuffle the shares into place before calling decode_all()
authorZooko O'Whielacronx zooko@zooko.com <zooko@zooko.com>
Wed, 24 Jan 2007 21:20:53 +0000 (02:50 +0530)
committerZooko O'Whielacronx zooko@zooko.com <zooko@zooko.com>
Wed, 24 Jan 2007 21:20:53 +0000 (02:50 +0530)
Instead it does that shuffling in C inside fecmodule.

darcs-hash:ea6a582d227615043c682aac3647560ac0da2125

pyfec/fec/fecmodule.c
pyfec/fec/test/test_pyfec.py

index 50dc69518f674fca01d007ed3b3dd8058c68f90f..7758ee71b869eb245fd93fc7846f3294fdac2a2b 100644 (file)
@@ -322,6 +322,8 @@ Decoder_init(Encoder *self, PyObject *args, PyObject *kwdict) {
     return 0;
 }
 
+#define SWAP(a,b,t) {t tmp; tmp=a; a=b; b=tmp;}
+
 static char Decoder_decode__doc__[] = "\
 Decode a list shares into a list of segments.\n\
 @param shares a sequence of buffers containing share data (for best performance, make it a tuple instead of a list)\n\
@@ -394,6 +396,20 @@ Decoder_decode(Decoder *self, PyObject *args) {
         oldsz = sz;
     }
 
+    /* move src packets into position */
+    for (i=0; i<self->kk;) {
+        if (csharenums[i] >= self->kk || csharenums[i] == i)
+            i++;
+        else {
+            /* put pkt in the right position. */
+            unsigned char c = csharenums[i];
+
+            SWAP (csharenums[i], csharenums[c], int);
+            SWAP (cshares[i], cshares[c], gf*);
+            SWAP (fastsharesitems[i], fastsharesitems[c], PyObject*);
+        }
+    }
+
     /* Allocate space for all of the recovered shares. */
     for (i=0; i<needtorecover; i++) {
         recoveredpystrs[i] = PyString_FromStringAndSize(NULL, sz);
index c84d0b2e4ea53620940b36393d975a1797629adc..b135d952b03e091502f7f43cbfc818643344f02c 100755 (executable)
@@ -7,18 +7,6 @@ import sys
 
 import fec
 
-def shuffle(nums_and_shares):
-    """ Make sure that if nums_and_shares[i][0] < len(nums_and_shares), that i == nums_and_shares[i][0]. """
-    i = 0
-    while i < len(nums_and_shares):
-        num, share = nums_and_shares[i]
-        if num >= len(nums_and_shares) or num == i:
-            i += 1
-        else:
-            nums_and_shares[i] = nums_and_shares[num]
-            nums_and_shares[num] = (num, share,)
-    _assert([ (i, (num, share,),) for (i, (num, share,),) in enumerate(nums_and_shares) if num < len(nums_and_shares) and num != i ] == [], [ (i, (num, share,),) for (i, (num, share,),) in enumerate(nums_and_shares) if num < len(nums_and_shares) and num != i ])
-
 def _h(k, m, ss):
     # sys.stdout.write("k: %s, m: %s,  len(ss): %r, len(ss[0]): %r" % (k, m, len(ss), len(ss[0]),)) ; sys.stdout.flush()
     encer = fec.Encoder(k, m)
@@ -28,7 +16,6 @@ def _h(k, m, ss):
     _assert(isinstance(nums_and_shares, list), nums_and_shares)
     _assert(len(nums_and_shares) == m, len(nums_and_shares), m)
     nums_and_shares = random.sample(nums_and_shares, k)
-    shuffle(nums_and_shares)
     shares = [ x[1] for x in nums_and_shares ]
     nums = [ x[0] for x in nums_and_shares ]
     # sys.stdout.write("about to construct Decoder.\n") ; sys.stdout.flush()