Author: nextgens
Date: 2007-03-24 12:02:47 +0000 (Sat, 24 Mar 2007)
New Revision: 12302

Modified:
   trunk/freenet/src/freenet/client/StandardOnionFECCodec.java
Log:
Next step: now every fec operation is serialized... I'm not sure what to do 
with old methods : shall they be removed altogether or is marking them 
decapreted enough?

Have I mention it needs to be tested? :p

Modified: trunk/freenet/src/freenet/client/StandardOnionFECCodec.java
===================================================================
--- trunk/freenet/src/freenet/client/StandardOnionFECCodec.java 2007-03-24 
02:59:23 UTC (rev 12301)
+++ trunk/freenet/src/freenet/client/StandardOnionFECCodec.java 2007-03-24 
12:02:47 UTC (rev 12302)
@@ -13,7 +13,6 @@
 import com.onionnetworks.fec.PureCode;
 import com.onionnetworks.util.Buffer;

-import freenet.client.async.SplitFileFetcher;
 import freenet.support.LRUHashtable;
 import freenet.support.Logger;
 import freenet.support.api.Bucket;
@@ -459,17 +458,19 @@
        }

        public void addToQueue(SplitfileBlock[] dataBlockStatus, 
SplitfileBlock[] checkBlockStatus, int blockLength, BucketFactory 
bucketFactory, StandardOnionFECCodecEncoderCallback callback, boolean 
isADecodingJob){
-               Bucket[] dataBlocks = new Bucket[dataBlockStatus.length];
-               Bucket[] checkBlocks = new Bucket[checkBlockStatus.length];
-               for(int i=0;i<dataBlocks.length;i++)
-                       dataBlocks[i] = dataBlockStatus[i].getData();
-               for(int i=0;i<checkBlocks.length;i++)
-                       checkBlocks[i] = checkBlockStatus[i].getData();
-               addToQueue(dataBlocks, checkBlocks, blockLength, bucketFactory, 
callback, isADecodingJob);
-               for(int i=0;i<dataBlocks.length;i++)
-                       dataBlockStatus[i].setData(dataBlocks[i]);
-               for(int i=0;i<checkBlocks.length;i++)
-                       checkBlockStatus[i].setData(checkBlocks[i]);
+               addToQueue(dataBlockStatus, checkBlockStatus, blockLength, 
bucketFactory, callback, isADecodingJob);
+               if(logMINOR) {
+                       if(isADecodingJob)
+                               Logger.minor(this, "Queueing decode: " + 
dataBlockStatus.length
+                                       + " data blocks, " + 
checkBlockStatus.length
+                                       + " check blocks, block length " + 
blockLength + " with "
+                                       + this, new Exception("debug"));
+                       else
+                               Logger.minor(this, "Queueing encode: " + 
dataBlockStatus.length
+                                       + " data blocks, " + 
checkBlockStatus.length
+                                       + " check blocks, block length " + 
blockLength + " with "
+                                       + this, new Exception("debug"));
+               }
        }

        private final LinkedList _awaitingJobs = new LinkedList();
@@ -483,14 +484,34 @@

        private class FECJob {
                final Bucket[] dataBlocks, checkBlocks;
+               final SplitfileBlock[] dataBlockStatus, checkBlockStatus;
                final BucketFactory bucketFactory;
                final int blockLength;
                final StandardOnionFECCodecEncoderCallback callback;
                final boolean isADecodingJob;

+               FECJob(SplitfileBlock[] dataBlockStatus, SplitfileBlock[] 
checkBlockStatus,  int blockLength, BucketFactory bucketFactory, 
StandardOnionFECCodecEncoderCallback callback, boolean isADecodingJob) {
+                       this.dataBlockStatus = dataBlockStatus;
+                       this.checkBlockStatus = checkBlockStatus;
+                       
+                       this.dataBlocks = new Bucket[dataBlockStatus.length];
+                       this.checkBlocks = new Bucket[checkBlockStatus.length];
+                       for(int i=0;i<dataBlocks.length;i++)
+                               this.dataBlocks[i] = 
dataBlockStatus[i].getData();
+                       for(int i=0;i<checkBlocks.length;i++)
+                               this.checkBlocks[i] = 
checkBlockStatus[i].getData();
+                       
+                       this.blockLength = blockLength;
+                       this.bucketFactory = bucketFactory;
+                       this.callback = callback;
+                       this.isADecodingJob = isADecodingJob;                   
+               }
+               
                FECJob(Bucket[] dataBlocks, Bucket[] checkBlocks, int 
blockLength, BucketFactory bucketFactory, StandardOnionFECCodecEncoderCallback 
callback, boolean isADecodingJob) {
                        this.dataBlocks = dataBlocks;
                        this.checkBlocks = checkBlocks;
+                       this.dataBlockStatus = null;
+                       this.checkBlockStatus = null;
                        this.blockLength = blockLength;
                        this.bucketFactory = bucketFactory;
                        this.callback = callback;
@@ -511,9 +532,19 @@
                                        // Encode it
                                        try {
                                                if(job.isADecodingJob)
-                                                       
realDecode(job.dataBlocks, job.checkBlocks, job.blockLength, job.bucketFactory);
-                                               else
+                                                       
realDecode(job.dataBlockStatus, job.checkBlockStatus, job.blockLength, 
job.bucketFactory);
+                                               else {
                                                        
realEncode(job.dataBlocks, job.checkBlocks, job.blockLength, job.bucketFactory);
+                                               }
+                                               
+                                               // Update SplitFileBlocks from 
buckets if necessary
+                                               if(job.dataBlockStatus != null){
+                                                       for(int 
i=0;i<job.dataBlocks.length;i++)
+                                                               
job.dataBlockStatus[i].setData(job.dataBlocks[i]);
+                                                       for(int 
i=0;i<job.checkBlocks.length;i++)
+                                                               
job.checkBlockStatus[i].setData(job.checkBlocks[i]);
+                                               }
+                                               
                                        } catch (IOException e) {
                                                Logger.error(this, "BOH! ioe:" 
+ e.getMessage());
                                        }
@@ -523,6 +554,7 @@
                                                        
job.callback.onDecodedSegment();
                                                else
                                                        
job.callback.onEncodedSegment();
+                                               
                                        } catch (Throwable e) {
                                                Logger.error(this, "The 
callback failed!" + e.getMessage());
                                        }


Reply via email to