[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: KIO: Mass Copy of Files from Different Sources to Different
From:       David Faure <faure () kde ! org>
Date:       2009-08-19 15:12:12
Message-ID: 200908191712.12871.faure () kde ! org
[Download RAW message or body]

On Thursday 18 June 2009, Alejandro Wainzinger wrote:
> Using KIO::copy( ... ) to generate more than 150 jobs causes the KIO
> scheduler to complain:
>
> "WARNING - KIO::Scheduler got more than 150 jobs! This shows a misuse
> in your app (yes, a job is a QObject)."
>
> What misuse is this, isn't the KIO::Scheduler supposed to schedule
> jobs?  I notice that you can directly tell the scheduler to schedule a
> job with KIO::Scheduler::scheduleJob(...) which will queue jobs when
> no slaves are left over and possibly avoid this error, but that only
> works for SimpleJobs, and a CopyJob is not a SimpleJob.
>
> Up until now I've worked around it by manually keeping track of jobs I
> create and jobs that finish so as not to make the Scheduler angry, but
> shouldn't this be part of the Scheduler's job?
>
> I notice most applications don't run into this issue because they use
> KIO to copy a folder that could contain more than 150 files which is
> fine, or copy more than 150 files to a single destination, but in my
> case each file I copy can come from a different source and go to a
> different destination so I can not aggregate the jobs.

This could be another reason for "all jobs should be scheduled",
as we were discussing in another thread ("Patch KIO::AccessManager").

I just gave it a try, as an experiment. Shows that scheduleJob has to support
being called twice for a job, but apart from that, the unittest "jobtest" 
still passes, which is good enough for me :-)

Can you give the attached patch a try?

-- 
David Faure, faure@kde.org, sponsored by Qt Software @ Nokia to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).

["schedule_all.diff" (text/x-patch)]

Index: job.cpp
===================================================================
--- job.cpp	(revision 1012540)
+++ job.cpp	(working copy)
@@ -308,6 +308,7 @@
     }
 
     Scheduler::doJob(q);
+    Scheduler::scheduleJob(q); // experiment
 }
 
 
Index: scheduler.cpp
===================================================================
--- scheduler.cpp	(revision 1012540)
+++ scheduler.cpp	(working copy)
@@ -401,15 +401,17 @@
 }
 
 void SchedulerPrivate::scheduleJob(SimpleJob *job) {
+
     newJobs.removeOne(job);
     const JobData& jobData = extraJobData.value(job);
 
     QString protocol = jobData.protocol;
 //    kDebug(7006) << "protocol=" << protocol;
     ProtocolInfo *protInfo = protInfoDict.get(protocol);
-    protInfo->joblist.append(job);
-
-    slaveTimer.start(0);
+    if (!protInfo->joblist.contains(job)) { // scheduleJob already called for this job?
+        protInfo->joblist.append(job);
+        slaveTimer.start(0);
+    }
 }
 
 void SchedulerPrivate::cancelJob(SimpleJob *job) {


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic