Tatsuhiro Tsujikawa 19 years ago
parent
commit
5a624f5a3d

+ 46 - 0
src/SegmentSplitter.cc

@@ -0,0 +1,46 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#include "SegmentSplitter.h"
+#include "Util.h"
+
+void SegmentSplitter::split(Segment& seg, int cuid, Segment& s) const {
+  long long int nep = (s.ep-(s.sp+s.ds))/2+(s.sp+s.ds);
+  seg.cuid = cuid;
+  seg.sp = nep+1;
+  seg.ep = s.ep;
+  seg.ds = 0;
+  seg.speed = s.speed;
+  seg.finish = false;
+  s.ep = nep;
+  logger->debug("return new segment { "
+		"sp = "+Util::llitos(seg.sp)+", "+
+		"ep = "+Util::llitos(seg.ep)+", "+
+		"ds = "+Util::llitos(seg.ds)+", "+
+		"speed = "+Util::itos(seg.speed)+" } to "+
+		"cuid "+Util::llitos(cuid));
+  logger->debug("update segment { "
+		"sp = "+Util::llitos(s.sp)+", "+
+		"ep = "+Util::llitos(s.ep)+", "+
+		"ds = "+Util::llitos(s.ds)+", "+
+		"speed = "+Util::itos(s.speed)+" } of "+
+		"cuid "+Util::llitos(s.cuid));
+}

+ 42 - 0
src/SegmentSplitter.h

@@ -0,0 +1,42 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#ifndef _D_SEGMENT_SPLITTER_H_
+#define _D_SEGMENT_SPLITTER_H_
+
+#include "Segment.h"
+#include "Logger.h"
+
+class SegmentSplitter {
+protected:
+  long long int minSegmentSize;
+  
+  void split(Segment& seg, int cuid, Segment& s) const;
+public:
+  const Logger* logger;
+
+  virtual ~SegmentSplitter() {}
+  virtual bool splitSegment(Segment& newSegment, int cuid, Segments& segments) = 0;
+  void setMinSegmentSize(long long int size) { minSegmentSize = size; }
+  long long int getMinSegmentSize() const { return minSegmentSize; }
+};
+
+#endif // _D_SEGMENT_SPLITTER_H_

+ 37 - 0
src/SplitFirstSegmentSplitter.cc

@@ -0,0 +1,37 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#include "SplitFirstSegmentSplitter.h"
+
+bool SplitFirstSegmentSplitter::splitSegment(Segment& seg, int cuid, Segments& segments) {
+  for(vector<Segment>::iterator itr = segments.begin(); itr != segments.end(); itr++) {
+    Segment& s = *itr;
+    if(s.finish) {
+      continue;
+    }
+    if(s.ep-(s.sp+s.ds) > minSegmentSize) {
+      split(seg, cuid,  s);
+      segments.push_back(seg);
+      return true;
+    }
+  }
+  return false;
+}

+ 34 - 0
src/SplitFirstSegmentSplitter.h

@@ -0,0 +1,34 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#ifndef _D_SPLIT_FIRST_SEGMENT_SPLITTER_H_
+#define _D_SPLIT_FIRST_SEGMENT_SPLITTER_H_
+
+#include "SegmentSplitter.h"
+
+class SplitFirstSegmentSplitter : public SegmentSplitter {
+public:
+  SplitFirstSegmentSplitter() {}
+  ~SplitFirstSegmentSplitter() {}
+  bool splitSegment(Segment& newSegment, int cuid, Segments& segments);
+};
+
+#endif // _D_SPLIT_FIRST_SEGMENT_SPLITTER_H_

+ 50 - 0
src/SplitSlowestSegmentSplitter.cc

@@ -0,0 +1,50 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#include "SplitSlowestSegmentSplitter.h"
+
+bool SplitSlowestSegmentSplitter::splitSegment(Segment& seg, int cuid, Segments& segments) {
+  vector<Segment>::iterator slowest = segments.end();;
+  for(vector<Segment>::iterator itr = segments.begin(); itr != segments.end(); itr++) {
+    Segment& s = *itr;
+    if(s.finish) {
+      continue;
+    }
+    if(s.ep-(s.sp+s.ds) <= minSegmentSize) {
+      continue;
+    }
+    if(slowest == segments.end()) {
+      slowest = itr;
+    } else {
+      Segment sl = *slowest;
+      if((sl.ep-(sl.sp+sl.ds))/(sl.speed+1) < (s.ep-(s.sp+s.ds))/(s.speed+1)) {
+	slowest = itr;
+      }
+    }
+  }
+  if(slowest == segments.end()) {
+    return false;
+  } else {
+    split(seg, cuid, *slowest);
+    segments.push_back(seg);
+    return true;
+  }
+}

+ 35 - 0
src/SplitSlowestSegmentSplitter.h

@@ -0,0 +1,35 @@
+/* <!-- copyright */
+/*
+ * aria2 - a simple utility for downloading files faster
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* copyright --> */
+#ifndef _D_SPLIT_SLOWEST_SEGMENT_SPLITTER_H_
+#define _D_SPLIT_SLOWEST_SEGMENT_SPLITTER_H_
+
+#include "SegmentSplitter.h"
+
+class SplitSlowestSegmentSplitter : public SegmentSplitter {
+public:
+  SplitSlowestSegmentSplitter() {}
+  ~SplitSlowestSegmentSplitter() {}
+
+  bool splitSegment(Segment& segment, int cuid, Segments& segments);
+};
+
+#endif // _D_SPLIT_SLOWEST_SEGMENT_SPLITTER_H_