Remove botched transfer slave threading code

This largely resolves Bug 1670
pull/1/head
Timothy Pearson 11 years ago
parent 74807331b7
commit 7dc822e554

@ -21,7 +21,6 @@
#ifndef _COMMON_H
#define _COMMON_H
#include <kdebug.h>
#define mDebugIn mDebug << ">>>>Entering "

@ -24,7 +24,6 @@
*
***************************************************************************/
#include <twin.h>
#include <tdelocale.h>
#include <tdeaboutdata.h>
@ -102,7 +101,7 @@ class KGetApp : public KUniqueApplication
{
private:
TDEMainWidget *tdemainwidget;
public:
KGetApp() : KUniqueApplication()
{
@ -171,7 +170,7 @@ public:
for( int i=0; i < args->count(); ++i){
urls.append(KURL::fromPathOrURL( args->arg(i)));
}
// Sometimes valid filenames are not recognised by KURL::isLocalFile(), they are marked as invalid then
if ( args->count()==2 && ( urls.last().isLocalFile() || !urls.last().isValid()))
{

@ -24,9 +24,7 @@
*
***************************************************************************/
#include <tdeapplication.h>
#include <tdeio/scheduler.h>
#include "getfilejob.h"
#include "slave.h"
@ -39,6 +37,10 @@ Slave::Slave(Transfer * _parent, const KURL & _src, const KURL & _dest)
: TQObject(),
TQThread()
{
// FIXME
// KGet uses an unconventional threading model that relies on TDEIO slave execution from the main GUI thread
disableThreadPostedEvents(true);
mDebug << ">>>>Entering" << endl;
copyjob = NULL;
m_src = _src;
@ -57,8 +59,10 @@ void Slave::Op(SlaveCommand _cmd)
{
mDebugIn << " _cmd = " << _cmd << endl;
if ( !running() ) // start on demand
if ( !running() ) { // start on demand
start();
moveToThread(this);
}
mutex.lock();
stack.push(_cmd);
@ -93,8 +97,6 @@ void Slave::InfoMessage(const TQString & _msg)
mDebug << "Infor Msg:" << "_msg = " << _msg << endl;
}
void Slave::run()
{
mDebugIn << endl;
@ -102,89 +104,53 @@ void Slave::run()
SlaveCommand cmd;
bool running = true;
while (running)
while (running)
{
if (!nPendingCommand)
if (!nPendingCommand) {
worker.wait();
switch (cmd = fetch_cmd())
}
switch (cmd = fetch_cmd())
{
case RESTART:
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
// fall through
case RETR:
mDebug << " FETCHED COMMAND RETR" << endl;
assert(!copyjob);
TDEIO::Scheduler::checkSlaveOnHold( true );
copyjob = new TDEIO::GetFileJob(m_src, m_dest);
Connect();
PostMessage(SLV_RESUMED);
break;
case RETR_CACHE:
mDebug << " FETCHED COMMAND RETR_CACHE" << endl;
assert(!copyjob);
TDEIO::Scheduler::checkSlaveOnHold( true );
copyjob = new TDEIO::GetFileJob(m_src, m_dest);
copyjob->addMetaData("cache", "cacheonly");
Connect();
break;
case PAUSE:
mDebug << " FETCHED COMMAND PAUSE" << endl;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
PostMessage(SLV_PAUSED);
break;
case KILL:
mDebug << " FETCHED COMMAND KILL" << endl;
running = false;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
// no message posted
break;
case REMOVE:
mDebug << " FETCHED COMMAND REMOVE" << endl;
running = false;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
PostMessage(SLV_REMOVED);
break;
case SCHEDULE:
mDebug << " FETCHED COMMAND SCHEDULE" << endl;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
PostMessage(SLV_SCHEDULED);
break;
case DELAY:
mDebug << " FETCHED COMMAND DELAY" << endl;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
PostMessage(SLV_DELAYED);
break;
case NOOP:
mDebug << "FETCHED COMMAND NOOP, i.e. empty stack" << endl;
if (copyjob) {
copyjob->kill(true);
copyjob = 0L;
}
running = false;
break;
@ -217,7 +183,6 @@ void Slave::Connect()
{
mDebugIn << endl;
connect(copyjob, TQT_SIGNAL(canceled(TDEIO::Job *)), TQT_SLOT(slotCanceled(TDEIO::Job *)));
connect(copyjob, TQT_SIGNAL(connected(TDEIO::Job *)), TQT_SLOT(slotConnected(TDEIO::Job *)));
connect(copyjob, TQT_SIGNAL(result(TDEIO::Job *)), TQT_SLOT(slotResult(TDEIO::Job *)));
@ -253,7 +218,7 @@ void Slave::slotConnected(TDEIO::Job *)
void Slave::slotResult(TDEIO::Job * job)
{
mDebugIn << endl;
assert(copyjob == job);
copyjob=0L;
TDEIO::Error error=TDEIO::Error(job->error());

@ -100,6 +100,7 @@ private:
TQMutex mutex;
TDEIO::GetFileJob * copyjob;
friend class Transfer;
};
#endif

@ -1412,15 +1412,13 @@ void TDEMainWidget::slotAnimTimeout()
//sDebugIn << endl;
#endif
bool isTransfer;
animCounter++;
if (animCounter == myTransferList->getPhasesNum()) {
//updateStatusBar();
animCounter = 0;
}
// update status of all items of transferList
isTransfer = myTransferList->updateStatus(animCounter);
myTransferList->updateStatus(animCounter);
//if (this->isVisible()) {
updateStatusBar();
@ -2221,7 +2219,9 @@ void TDEMainWidget::onlineDisconnect()
}
}
log(i18n("Disconnecting..."));
system(TQFile::encodeName(ksettings.disconnectCommand));
if (system(TQFile::encodeName(ksettings.disconnectCommand)) < 0) {
// Error!
}
#ifdef _DEBUG
sDebugOut << endl;

@ -24,6 +24,7 @@
***************************************************************************/
#include <tqheader.h>
#include <tqtimer.h>
#include <kurl.h>
#include <tdemessagebox.h>
@ -43,11 +44,13 @@
#include "dlgIndividual.h"
#include "transferlist.h"
#include "transfer.h"
#include "getfilejob.h"
#include <tdeapplication.h>
#include <tdeio/passdlg.h>
#include <tdeio/global.h>
#include <tdeio/netaccess.h>
#include <tdeio/scheduler.h>
extern Settings ksettings;
@ -117,7 +120,6 @@ Transfer::init(const uint _id)
status = ST_STOPPED;
connect(this, TQT_SIGNAL(statusChanged(Transfer *, int)), tdemain, TQT_SLOT(slotStatusChanged(Transfer *, int)));
connect(this, TQT_SIGNAL(statusChanged(Transfer *, int)), this, TQT_SLOT(slotUpdateActions()));
@ -160,6 +162,7 @@ void Transfer::synchronousAbort()
{
if ( m_pSlave->running() )
{
destroyGetFileJob();
m_pSlave->Op(Slave::KILL);
m_pSlave->wait();
}
@ -281,14 +284,13 @@ void Transfer::updateAll()
// destination
setText(view->lv_filename, dest.fileName());
if(dlgIndividual)
{
dlgIndividual->setCopying(src, dest);
dlgIndividual->setCanResume(canResume);
dlgIndividual->setTotalSize(totalSize);
dlgIndividual->setPercent(0);
dlgIndividual->setProcessedSize(0);
}
if (dlgIndividual) {
dlgIndividual->setCopying(src, dest);
dlgIndividual->setCanResume(canResume);
dlgIndividual->setTotalSize(totalSize);
dlgIndividual->setPercent(0);
dlgIndividual->setProcessedSize(0);
}
if (totalSize != 0) {
//logMessage(i18n("Total size is %1 bytes").arg((double)totalSize));
@ -389,6 +391,7 @@ void Transfer::slotResume()
logMessage(i18n("Attempt number %1").arg(retryCount));
sDebug << "sending Resume to slave " << endl;
createGetFileJob(m_pSlave->m_src, m_pSlave->m_dest, false);
m_pSlave->Op(Slave::RETR);
sDebugOut << endl;
@ -403,6 +406,7 @@ void Transfer::slotResume()
assert(status <= ST_RUNNING && ksettings.b_offline);
destroyGetFileJob();
m_pSlave->Op(Slave::KILL); // KILL doesn't post a Message
sDebug << "Killing Slave" << endl;
@ -430,7 +434,7 @@ void Transfer::slotRequestPause()
m_paPause->setEnabled(false);
m_paRestart->setEnabled(false);
destroyGetFileJob();
m_pSlave->Op(Slave::PAUSE);
sDebug << "Requesting Pause.." << endl;
@ -443,6 +447,8 @@ void Transfer::slotRequestPause()
void Transfer::slotRequestRestart()
{
sDebugIn << endl;
destroyGetFileJob();
createGetFileJob(m_pSlave->m_src, m_pSlave->m_dest, true);
m_pSlave->Op(Slave::RESTART);
slotSpeed(0);
sDebugOut << endl;
@ -477,10 +483,13 @@ void Transfer::slotRequestRemove()
SafeDelete::deleteFile( file ); // ### messagebox on failure?
}
}
if (status == ST_RUNNING)
if (status == ST_RUNNING) {
destroyGetFileJob();
m_pSlave->Op(Slave::REMOVE);
else
}
else {
emit statusChanged(this, OP_REMOVED);
}
sDebugOut << endl;
}
@ -517,6 +526,7 @@ void Transfer::slotRequestSchedule()
if (status == ST_RUNNING) {
m_paPause->setEnabled(false);
m_paRestart->setEnabled(false);
destroyGetFileJob();
m_pSlave->Op(Slave::SCHEDULE);
} else
@ -535,6 +545,7 @@ void Transfer::slotRequestDelay()
if (status == ST_RUNNING) {
m_paPause->setEnabled(false);
m_paRestart->setEnabled(false);
destroyGetFileJob();
m_pSlave->Op(Slave::DELAY);
} else
slotExecDelay();
@ -894,6 +905,7 @@ void Transfer::slotExecConnected()
if (ksettings.b_offline)// when we're offline and arrive here, then the file is in cache
return; // Slave::slotResult will be called immediately, so we do nothing here
status = ST_STOPPED;
destroyGetFileJob();
m_pSlave->Op(Slave::KILL);
if (ksettings.b_addQueued)
{
@ -1006,6 +1018,7 @@ void Transfer::checkCache()
if (src.protocol()=="http")
{
status = ST_TRYING;
createGetFileJob(m_pSlave->m_src, m_pSlave->m_dest, true);
m_pSlave->Op(Slave::RETR_CACHE);
}
else
@ -1021,5 +1034,24 @@ void Transfer::NotInCache()
mode = MD_DELAYED;
status = ST_STOPPED;
}
void Transfer::destroyGetFileJob()
{
if (m_pSlave->copyjob) {
m_pSlave->copyjob->kill(true);
m_pSlave->copyjob = 0L;
}
}
void Transfer::createGetFileJob(KURL m_src, KURL m_dest, bool cache)
{
TDEIO::Scheduler::checkSlaveOnHold( true );
m_pSlave->copyjob = new TDEIO::GetFileJob(m_src, m_dest);
if (cache) {
m_pSlave->copyjob->addMetaData("cache", "cacheonly");
}
m_pSlave->Connect();
}
#include "transfer.moc"

@ -188,13 +188,15 @@ public slots:
void slotStartTime(const TQDateTime &);
void slotStop(); // stop all transfers when going offline
signals:
void statusChanged(Transfer *, int _operation);
void log(uint, const TQString &, const TQString &);
private:
void init(const uint _id);
void destroyGetFileJob();
void createGetFileJob(KURL, KURL, bool);
Slave *m_pSlave;
@ -208,7 +210,7 @@ private:
// log
TQString transferLog;
// schedule time
TQDateTime startTime;

Loading…
Cancel
Save