summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-14 13:43:34 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-14 13:43:34 +0000
commit0680ac5e5ed2426ed01d735bca5fbb57d6c925bb (patch)
tree0763565d76353f8a29f5bc2dddfaa7595bb88112 /src
parent81b2e6e1089f7765c246a7476df080db2f3499c6 (diff)
2008-09-14 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
If error event is received in epoll, then abort download immediately. * src/AbstractCommand.cc * src/Command.cc * src/Command.h * src/DownloadEngine.cc * src/PeerAbstractCommand.cc
Diffstat (limited to 'src')
-rw-r--r--src/AbstractCommand.cc4
-rw-r--r--src/Command.cc11
-rw-r--r--src/Command.h5
-rw-r--r--src/DownloadEngine.cc7
-rw-r--r--src/PeerAbstractCommand.cc4
5 files changed, 24 insertions, 7 deletions
diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc
index 874fe5aa..fa4d790f 100644
--- a/src/AbstractCommand.cc
+++ b/src/AbstractCommand.cc
@@ -107,7 +107,7 @@ bool AbstractCommand::execute() {
}
if((checkSocketIsReadable && _readEvent) ||
(checkSocketIsWritable && _writeEvent) ||
- _errorEvent ||
+ _hupEvent ||
#ifdef ENABLE_ASYNC_DNS
(nameResolverCheck && nameResolveFinished()) ||
#endif // ENABLE_ASYNC_DNS
@@ -136,6 +136,8 @@ bool AbstractCommand::execute() {
}
}
return executeInternal();
+ } else if(_errorEvent) {
+ throw DlRetryEx("Network problem has occurred.");
} else {
if(checkPoint.elapsed(timeout)) {
// timeout triggers ServerStat error state.
diff --git a/src/Command.cc b/src/Command.cc
index 116e7d5b..acc46638 100644
--- a/src/Command.cc
+++ b/src/Command.cc
@@ -46,7 +46,8 @@ Command::Command(int32_t cuid):uuid(uuidGen++),
logger(LogFactory::getInstance()),
_readEvent(false),
_writeEvent(false),
- _errorEvent(false) {}
+ _errorEvent(false),
+ _hupEvent(false) {}
void Command::transitStatus()
{
@@ -73,16 +74,22 @@ void Command::writeEventReceived()
_writeEvent = true;
}
-void Command::errorEventRecieved()
+void Command::errorEventReceived()
{
_errorEvent = true;
}
+void Command::hupEventReceived()
+{
+ _hupEvent = true;
+}
+
void Command::clearIOEvents()
{
_readEvent = false;
_writeEvent = false;
_errorEvent = false;
+ _hupEvent = false;
}
} // namespace aria2
diff --git a/src/Command.h b/src/Command.h
index 772b916d..ffcdf83e 100644
--- a/src/Command.h
+++ b/src/Command.h
@@ -65,6 +65,7 @@ protected:
bool _readEvent;
bool _writeEvent;
bool _errorEvent;
+ bool _hupEvent;
public:
Command(int32_t cuid);
@@ -95,7 +96,9 @@ public:
void writeEventReceived();
- void errorEventRecieved();
+ void errorEventReceived();
+
+ void hupEventReceived();
void clearIOEvents();
};
diff --git a/src/DownloadEngine.cc b/src/DownloadEngine.cc
index f8cd1287..48e6b464 100644
--- a/src/DownloadEngine.cc
+++ b/src/DownloadEngine.cc
@@ -109,8 +109,11 @@ void CommandEvent::processEvents(int events)
if(SocketEntry::EVENT_WRITE&events) {
_command->writeEventReceived();
}
- if((SocketEntry::EVENT_ERROR|SocketEntry::EVENT_HUP)&events) {
- _command->errorEventRecieved();
+ if(SocketEntry::EVENT_ERROR&events) {
+ _command->errorEventReceived();
+ }
+ if(SocketEntry::EVENT_HUP&events) {
+ _command->hupEventReceived();
}
}
diff --git a/src/PeerAbstractCommand.cc b/src/PeerAbstractCommand.cc
index bd525db8..26f9e7d9 100644
--- a/src/PeerAbstractCommand.cc
+++ b/src/PeerAbstractCommand.cc
@@ -81,8 +81,10 @@ bool PeerAbstractCommand::execute()
if(noCheck ||
(checkSocketIsReadable && _readEvent) ||
(checkSocketIsWritable && _writeEvent) ||
- _errorEvent) {
+ _hupEvent) {
checkPoint.reset();
+ } else if(_errorEvent) {
+ throw DlAbortEx("Network problem has occurred.");
}
if(checkPoint.elapsed(timeout)) {
throw DlAbortEx(EX_TIME_OUT);