mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-21 18:06:46 +00:00
nicer API -- you don't have to shuffle the shares into place before calling decode_all()
Instead it does that shuffling in C inside fecmodule.
This commit is contained in:
parent
2b03427f19
commit
06835e5a2b
@ -322,6 +322,8 @@ Decoder_init(Encoder *self, PyObject *args, PyObject *kwdict) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SWAP(a,b,t) {t tmp; tmp=a; a=b; b=tmp;}
|
||||||
|
|
||||||
static char Decoder_decode__doc__[] = "\
|
static char Decoder_decode__doc__[] = "\
|
||||||
Decode a list shares into a list of segments.\n\
|
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\
|
@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;
|
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. */
|
/* Allocate space for all of the recovered shares. */
|
||||||
for (i=0; i<needtorecover; i++) {
|
for (i=0; i<needtorecover; i++) {
|
||||||
recoveredpystrs[i] = PyString_FromStringAndSize(NULL, sz);
|
recoveredpystrs[i] = PyString_FromStringAndSize(NULL, sz);
|
||||||
|
@ -7,18 +7,6 @@ import sys
|
|||||||
|
|
||||||
import fec
|
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):
|
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()
|
# 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)
|
encer = fec.Encoder(k, m)
|
||||||
@ -28,7 +16,6 @@ def _h(k, m, ss):
|
|||||||
_assert(isinstance(nums_and_shares, list), nums_and_shares)
|
_assert(isinstance(nums_and_shares, list), nums_and_shares)
|
||||||
_assert(len(nums_and_shares) == m, len(nums_and_shares), m)
|
_assert(len(nums_and_shares) == m, len(nums_and_shares), m)
|
||||||
nums_and_shares = random.sample(nums_and_shares, k)
|
nums_and_shares = random.sample(nums_and_shares, k)
|
||||||
shuffle(nums_and_shares)
|
|
||||||
shares = [ x[1] for x in nums_and_shares ]
|
shares = [ x[1] for x in nums_and_shares ]
|
||||||
nums = [ x[0] 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()
|
# sys.stdout.write("about to construct Decoder.\n") ; sys.stdout.flush()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user