Browse Source

2010-04-13 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

	Hold reference to PieceStorage when paused in order to provide
	progress information via XML-RPC.
	* src/RequestGroup.cc
	* src/RequestGroup.h
	* src/RequestGroupMan.cc
Tatsuhiro Tsujikawa 15 years ago
parent
commit
1f02b65460
4 changed files with 21 additions and 2 deletions
  1. 8 0
      ChangeLog
  2. 8 2
      src/RequestGroup.cc
  3. 2 0
      src/RequestGroup.h
  4. 3 0
      src/RequestGroupMan.cc

+ 8 - 0
ChangeLog

@@ -1,3 +1,11 @@
+2010-04-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Hold reference to PieceStorage when paused in order to provide
+	progress information via XML-RPC.
+	* src/RequestGroup.cc
+	* src/RequestGroup.h
+	* src/RequestGroupMan.cc
+
 2010-04-12  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Defined struct timespec if it is not available.

+ 8 - 2
src/RequestGroup.cc

@@ -533,6 +533,12 @@ void RequestGroup::initPieceStorage()
   _segmentMan = tempSegmentMan;
 }
 
+void RequestGroup::dropPieceStorage()
+{
+  _segmentMan.reset();
+  _pieceStorage.reset();
+}
+
 bool RequestGroup::downloadFinishedByFileLength()
 {
   // assuming that a control file doesn't exist.
@@ -891,8 +897,8 @@ void RequestGroup::releaseRuntimeResource(DownloadEngine* e)
   if(!_pieceStorage.isNull()) {
     _pieceStorage->removeAdvertisedPiece(0);
   }
-  _segmentMan.reset();
-  _pieceStorage.reset();
+  // Don't reset _segmentMan and _pieceStorage here to provide
+  // progress information via XML-RPC
   _progressInfoFile.reset();
   _downloadContext->releaseRuntimeResource();
 }

+ 2 - 0
src/RequestGroup.h

@@ -379,6 +379,8 @@ public:
   // they are not.
   void initPieceStorage();
 
+  void dropPieceStorage();
+
   bool downloadFinishedByFileLength();
 
   void loadAndOpenFile(const SharedHandle<BtProgressInfoFile>& progressInfoFile);

+ 3 - 0
src/RequestGroupMan.cc

@@ -528,6 +528,9 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e)
         temp.push_back(groupToAdd);
         continue;
       }
+      // Drop pieceStorage here because paused download holds its
+      // reference.
+      groupToAdd->dropPieceStorage();
       configureRequestGroup(groupToAdd);
       createInitialCommand(groupToAdd, commands, e);
       groupToAdd->setRequestGroupMan(this);