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

List:       kde-commits
Subject:    [kdelibs/frameworks] tier1/threadweaver: First version of a convenience API for queueing and creatin
From:       Mirko Boehm (Endocode) <mirko () endocode ! com>
Date:       2013-10-31 22:58:28
Message-ID: E1Vc1C8-0002CX-N7 () scm ! kde ! org
[Download RAW message or body]

Git commit 4c37ec960f2d323554aed0903e0b7eb53c5e51a5 by Mirko Boehm (Endocode).
Committed on 31/10/2013 at 22:49.
Pushed by mirko into branch 'frameworks'.

First version of a convenience API for queueing and creating jobs.

The API of the queue is supposed to be verbose and minimal. The purpose
of the convenience API is to complement the queue API with simple and
terse ways to create and queue jobs. It provides provides templates for
creating JobPointers from Jobs and functors, for queueing JobPointers,
Jobs and Functors, and a stream like API for queueing multiple jobs in
one statement.

With these extensions enqueueRaw and dequeueRaw are obsolete and have
been removed.

M  +19   -16   tier1/threadweaver/autotests/JobTests.cpp
M  +10   -7    tier1/threadweaver/autotests/QueueTests.cpp
M  +2    -1    tier1/threadweaver/benchmarks/QueueBenchmarks.cpp
M  +18   -30   tier1/threadweaver/src/Weaver/Queueing.h
M  +0    -10   tier1/threadweaver/src/Weaver/Weaver.cpp
M  +0    -2    tier1/threadweaver/src/Weaver/Weaver.h
M  +0    -10   tier1/threadweaver/src/Weaver/WeaverImpl.cpp
M  +0    -2    tier1/threadweaver/src/Weaver/WeaverImpl.h
M  +0    -11   tier1/threadweaver/src/Weaver/WeaverImplState.cpp
M  +0    -5    tier1/threadweaver/src/Weaver/WeaverImplState.h
M  +0    -11   tier1/threadweaver/src/Weaver/WeaverInterface.h

http://commits.kde.org/kdelibs/4c37ec960f2d323554aed0903e0b7eb53c5e51a5

diff --git a/tier1/threadweaver/autotests/JobTests.cpp \
b/tier1/threadweaver/autotests/JobTests.cpp index 9b23d9b..44c2f90 100644
--- a/tier1/threadweaver/autotests/JobTests.cpp
+++ b/tier1/threadweaver/autotests/JobTests.cpp
@@ -6,6 +6,7 @@
 #include <QtTest/QtTest>
 #include <QSignalSpy>
 
+#include <Queueing.h>
 #include <JobSequence.h>
 #include <Lambda.h>
 #include <ThreadWeaver.h>
@@ -159,7 +160,7 @@ void JobTests::EmptyJobSequenceTest() {
     Q_ASSERT(Weaver::instance()->isIdle());
     QSignalSpy doneSignalSpy(&sequence, SIGNAL(done(ThreadWeaver::JobPointer)));
     QCOMPARE(doneSignalSpy.count(), 0);
-    Weaver::instance()->enqueueRaw(&sequence);
+    Queueing::enqueue_raw(&sequence);
     Weaver::instance()->finish();
     QVERIFY(sequence.isFinished());
     QVERIFY(Weaver::instance()->isIdle());
@@ -183,7 +184,7 @@ void JobTests::IncompleteCollectionTest()
     QSignalSpy jobADoneSignalSpy(&jobA, SIGNAL(done(ThreadWeaver::JobPointer)));
     QCOMPARE(collectionDoneSignalSpy.count(), 0);
     QCOMPARE(jobADoneSignalSpy.count(), 0);
-    Weaver::instance()->enqueueRaw(&col);
+    Queueing::enqueue_raw(&col);
     Weaver::instance()->resume();
     QCoreApplication::processEvents();
     QCOMPARE(collectionDoneSignalSpy.count(), 0);
@@ -202,6 +203,7 @@ void JobTests::IncompleteCollectionTest()
 void JobTests::EmitStartedOnFirstElementTest()
 {
     using namespace ThreadWeaver;
+    using namespace ThreadWeaver::Queueing;
 
     WaitForIdleAndFinished w(Weaver::instance());
     Weaver::instance()->suspend();
@@ -215,7 +217,7 @@ void JobTests::EmitStartedOnFirstElementTest()
     decorated->addJob(jobA);
     decorated->addJob(jobB);
 
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&collection);
+    enqueue(make_job_raw(&collection));
     QSignalSpy collectionStartedSignalSpy(&collection, \
                SIGNAL(started(ThreadWeaver::JobPointer)));
     QSignalSpy collectionDoneSignalSpy(&collection, \
SIGNAL(done(ThreadWeaver::JobPointer)));  ThreadWeaver::Weaver::instance()->resume();
@@ -258,7 +260,7 @@ void JobTests::CollectionDependenciesTest()
     // queue collection, but not jobC, the collection should not be executed
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance()); Q_UNUSED(w);
     ThreadWeaver::Weaver::instance()->suspend();
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&col);
+    Queueing::enqueue_raw(&col);
     ThreadWeaver::Weaver::instance()->resume();
     QCoreApplication::processEvents();
     QTest::qWait(100);
@@ -594,7 +596,7 @@ void JobTests::MassiveJobSequenceTest() {
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
     QVERIFY(ThreadWeaver::Weaver::instance()->isIdle());
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&jobSequence);
+    ThreadWeaver::Queueing::enqueue_raw(&jobSequence);
     ThreadWeaver::Weaver::instance()->finish();
     QVERIFY(ThreadWeaver::Weaver::instance()->isIdle());
     QCOMPARE(sequence,in);
@@ -614,7 +616,7 @@ void JobTests::SimpleRecursiveSequencesTest() {
     jobSequence2.addRawJob(&jobC);
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&jobSequence2);
+    ThreadWeaver::Queueing::enqueue_raw(&jobSequence2);
     ThreadWeaver::Weaver::instance()->finish();
     QCOMPARE(sequence, QString("abc"));
 }
@@ -651,7 +653,7 @@ void JobTests::SequenceOfSequencesTest() {
     jobSequence4.addRawJob(&jobSequence3);
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&jobSequence4);
+    ThreadWeaver::Queueing::enqueue_raw(&jobSequence4);
     // ThreadWeaver::Job::DumpJobDependencies();
     ThreadWeaver::Weaver::instance()->finish();
     QCOMPARE(sequence,QString("abcdefghij"));
@@ -676,7 +678,7 @@ void JobTests::QueueAndStopTest() {
     jobSequence.addRawJob(&g);
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&jobSequence);
+    ThreadWeaver::Queueing::enqueue_raw(&jobSequence);
     ThreadWeaver::Weaver::instance()->finish();
     QCOMPARE(sequence, QString("abcd"));
 }
@@ -710,7 +712,7 @@ void JobTests::ResourceRestrictionPolicyBasicsTest () {
     g.assignQueuePolicy ( &restriction);
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&collection);
+    ThreadWeaver::Queueing::enqueue_raw(&collection);
     ThreadWeaver::Weaver::instance()->finish();
     QVERIFY ( ThreadWeaver::Weaver::instance()->isIdle() );
 }
@@ -747,7 +749,7 @@ void JobTests::JobSignalsAreEmittedAsynchronouslyTest()
     }
 
     WaitForIdleAndFinished w(ThreadWeaver::Weaver::instance());
-    Weaver::instance()->enqueueRaw(&collection);
+    Queueing::enqueue_raw(&collection);
     QCoreApplication::processEvents();
     ThreadWeaver::Weaver::instance()->finish();
     QVERIFY( sequence.length() == NumberOfBits );
@@ -807,10 +809,12 @@ void JobTests::JobPointerExecutionTest()
 
 void JobTests::DequeueSuspendedSequenceTest()
 {
-    QScopedPointer<ThreadWeaver::JobSequence> sequence(new \
                ThreadWeaver::JobSequence);
-    ThreadWeaver::Weaver weaver;
+    using namespace ThreadWeaver;
+
+    JobSequence sequence;
+    Weaver weaver;
     weaver.suspend();
-    weaver.enqueueRaw(sequence.data());
+    Queueing::enqueue_raw(&weaver, &sequence);
     weaver.dequeue();
     // don't crash
 }
@@ -850,7 +854,7 @@ void JobTests::IdDecoratorSingleAllocationTest()
 
     WaitForIdleAndFinished w(Weaver::instance());
     DecoratedJob job;
-    Weaver::instance()->enqueueRaw(&job);
+    Queueing::enqueue_raw(&job);
     Weaver::instance()->finish();
     QCOMPARE(job.sequence, QString::fromLatin1("a"));
 }
@@ -858,8 +862,7 @@ void JobTests::IdDecoratorSingleAllocationTest()
 struct InstanceCountedJob : public Job {
     static QAtomicInt counter;
 
-    void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread* thread) {
-        qDebug() << thread->objectName();
+    void run(ThreadWeaver::JobPointer, ThreadWeaver::Thread*) {
     }
 
     InstanceCountedJob() {
diff --git a/tier1/threadweaver/autotests/QueueTests.cpp \
b/tier1/threadweaver/autotests/QueueTests.cpp index 0e290ad..5ce01cf 100644
--- a/tier1/threadweaver/autotests/QueueTests.cpp
+++ b/tier1/threadweaver/autotests/QueueTests.cpp
@@ -9,6 +9,7 @@
 
 #include "AppendCharacterJob.h"
 
+#include <Queueing.h>
 #include <Job.h>
 #include <State.h>
 #include <QueuePolicy.h>
@@ -58,7 +59,7 @@ void SecondThreadThatQueues::run()
     QString sequence;
     AppendCharacterJob a( 'a', &sequence );
 
-    ThreadWeaver::Weaver::instance()->enqueueRaw(&a);
+    ThreadWeaver::Queueing::enqueue_raw(&a);
     ThreadWeaver::Weaver::instance()->finish();
     QCOMPARE( sequence, QString("a" ) );
 }
@@ -75,7 +76,9 @@ void QueueTests::initTestCase ()
 }
 
 void QueueTests::SimpleQueuePrioritiesTest() {
-    ThreadWeaver::Weaver weaver;
+    using namespace ThreadWeaver;
+
+    Weaver weaver;
     weaver.setMaximumNumberOfThreads ( 1 ); // just one thread
     QString sequence;
     LowPriorityAppendCharacterJob jobA ( QChar( 'a' ), &sequence );
@@ -87,9 +90,9 @@ void QueueTests::SimpleQueuePrioritiesTest() {
 
     weaver.suspend();
 
-    weaver.enqueueRaw( & jobA );
-    weaver.enqueueRaw( & jobB );
-    weaver.enqueueRaw( & jobC );
+    Queueing::enqueue_raw(&weaver, &jobA);
+    Queueing::enqueue_raw(&weaver, &jobB);
+    Queueing::enqueue_raw(&weaver, &jobC);
 
     weaver.resume();
     weaver.finish();
@@ -137,7 +140,7 @@ void QueueTests::DeleteDoneJobsFromSequenceTest()
     QVERIFY(autoDeleteJob != 0);
     QVERIFY(connect(autoDeleteJob, SIGNAL(done(ThreadWeaver::JobPointer)),
                     SLOT(deleteJob(ThreadWeaver::JobPointer))));
-    Weaver::instance()->enqueueRaw(&jobCollection);
+    Queueing::enqueue_raw(&jobCollection);
     QTest::qWait(100); // return to event queue to make sure signals are delivered
     Weaver::instance()->finish();
     QTest::qWait(100); // return to event queue to make sure signals are delivered
@@ -165,7 +168,7 @@ void QueueTests::DeleteCollectionOnDoneTest()
     autoDeleteCollection->collection()->addRawJob(&a);
     autoDeleteCollection->collection()->addRawJob(&b);
 
-    Weaver::instance()->enqueueRaw(autoDeleteCollection);
+    Queueing::enqueue_raw(autoDeleteCollection);
     // return to event queue to make sure signals are delivered
     // (otherwise, no slot calls would happen before the end of this function)
     // I assume the amount of time that we wait does not matter
diff --git a/tier1/threadweaver/benchmarks/QueueBenchmarks.cpp \
b/tier1/threadweaver/benchmarks/QueueBenchmarks.cpp index a63de8d..b858b9d 100644
--- a/tier1/threadweaver/benchmarks/QueueBenchmarks.cpp
+++ b/tier1/threadweaver/benchmarks/QueueBenchmarks.cpp
@@ -6,6 +6,7 @@
 #include <QCoreApplication>
 #include <QList>
 
+#include <Queueing.h>
 #include <Job.h>
 #include <JobCollection.h>
 #include <JobSequence.h>
@@ -161,7 +162,7 @@ void QueueBenchmarksTest::IndividualJobsBenchmark()
     QVector<AccumulateJob> jobs(n);
     for(int i = 0; i < n; ++i) {
         jobs[i].setCount(m);
-        weaver.enqueueRaw(&jobs[i]);
+        ThreadWeaver::Queueing::enqueue_raw(&weaver, &jobs[i]);
     }
 
     QBENCHMARK_ONCE {
diff --git a/tier1/threadweaver/src/Weaver/Queueing.h \
b/tier1/threadweaver/src/Weaver/Queueing.h index 919d4f6..0a1ebdb 100644
--- a/tier1/threadweaver/src/Weaver/Queueing.h
+++ b/tier1/threadweaver/src/Weaver/Queueing.h
@@ -20,9 +20,14 @@ JobPointer make_job(T t) {
 }
 
 // make a job pointer holding a pointer to a Job(Interface)
-template<>
-inline JobPointer make_job<JobInterface*>(JobInterface* job) {
-    return JobPointer(job);
+template<typename T>
+inline JobPointer make_job(T* job) {
+    return JobPointer(static_cast<JobInterface*>(job));
+}
+
+// make a job pointer holding anything resembling JobInterface
+inline JobPointer make_job_raw(JobInterface* job) {
+    return ManagedJobPointer<JobInterface>(job);
 }
 
 // enqueue any functor type to the specified queue:
@@ -33,10 +38,9 @@ JobPointer enqueue(Weaver* weaver, T t) {
     return ret;
 }
 
-// specialise for QObjectDecorator:
-template<>
-inline JobPointer enqueue<QObjectDecorator*>(Weaver* weaver, QObjectDecorator* q) {
-    JobPointer ret(q);
+template<typename T>
+JobPointer enqueue(Weaver* weaver, T* t) {
+    JobPointer ret(make_job(static_cast<JobInterface*>(t)));
     weaver->enqueue(ret);
     return ret;
 }
@@ -48,24 +52,6 @@ inline JobPointer enqueue<JobPointer>(Weaver* weaver, JobPointer \
job) {  return job;
 }
 
-//// specialise for JobInterface:
-//template<>
-//JobPointer enqueue<JobInterface*>(Weaver* weaver, JobInterface* job) {
-//    return enqueue(weaver, make_job(job));
-//}
-
-//// specialise for Collection:
-//template<>
-//JobPointer enqueue<JobCollection*>(Weaver* weaver, JobCollection* job) {
-//    return enqueue(weaver, make_job(job));
-//}
-
-//// specialise for Sequence:
-//template<>
-//JobPointer enqueue<JobSequence*>(Weaver* weaver, JobSequence* job) {
-//    return enqueue(weaver, make_job(job));
-//}
-
 // convenience overload: enqueue the functor to the global queue:
 template<typename T>
 JobPointer enqueue(T t) {
@@ -73,11 +59,13 @@ JobPointer enqueue(T t) {
 }
 
 // enqueue a raw pointer with no memory management
-template<typename T>
-JobPointer enqueue_raw(Weaver* weaver, T* t) {
-    ManagedJobPointer<T> ret(t);
-    weaver->enqueue(ret);
-    return ret;
+inline JobPointer enqueue_raw(Weaver* weaver, JobInterface* job) {
+    return enqueue(weaver, make_job_raw(job));
+}
+
+// overload to enqueue to the global pool
+inline JobPointer enqueue_raw(JobInterface* job) {
+    return enqueue(Weaver::instance(), make_job_raw(job));
 }
 
 // create a QObjectDecorator decorating the job
diff --git a/tier1/threadweaver/src/Weaver/Weaver.cpp \
b/tier1/threadweaver/src/Weaver/Weaver.cpp index 8b0db15..13b57a4 100644
--- a/tier1/threadweaver/src/Weaver/Weaver.cpp
+++ b/tier1/threadweaver/src/Weaver/Weaver.cpp
@@ -114,21 +114,11 @@ void Weaver::enqueue(const JobPointer &job)
     d->implementation->enqueue(job);
 }
 
-void Weaver::enqueueRaw(JobInterface *job)
-{
-    d->implementation->enqueueRaw(job);
-}
-
 bool Weaver::dequeue(const JobPointer& job)
 {
     return d->implementation->dequeue(job);
 }
 
-bool Weaver::dequeueRaw(JobInterface* job)
-{
-    return d->implementation->dequeueRaw(job);
-}
-
 void Weaver::dequeue ()
 {
     return d->implementation->dequeue();
diff --git a/tier1/threadweaver/src/Weaver/Weaver.h \
b/tier1/threadweaver/src/Weaver/Weaver.h index 96c93c3..94c1228 100644
--- a/tier1/threadweaver/src/Weaver/Weaver.h
+++ b/tier1/threadweaver/src/Weaver/Weaver.h
@@ -91,9 +91,7 @@ public:
     */
     static ThreadWeaver::Weaver* instance();
     void enqueue(const JobPointer&) Q_DECL_OVERRIDE;
-    void enqueueRaw(JobInterface* job) Q_DECL_OVERRIDE;
     bool dequeue(const JobPointer&) Q_DECL_OVERRIDE;
-    bool dequeueRaw(JobInterface* job) Q_DECL_OVERRIDE;
     void dequeue() Q_DECL_OVERRIDE;
     void finish() Q_DECL_OVERRIDE;
     void suspend() Q_DECL_OVERRIDE;
diff --git a/tier1/threadweaver/src/Weaver/WeaverImpl.cpp \
b/tier1/threadweaver/src/Weaver/WeaverImpl.cpp index b371923..04aaa63 100644
--- a/tier1/threadweaver/src/Weaver/WeaverImpl.cpp
+++ b/tier1/threadweaver/src/Weaver/WeaverImpl.cpp
@@ -227,11 +227,6 @@ void WeaverImpl::enqueue(const JobPointer& job)
     state()->enqueue(job);
 }
 
-void WeaverImpl::enqueueRaw(JobInterface *job)
-{
-    enqueue(ManagedJobPointer<JobInterface>(job));
-}
-
 void WeaverImpl::enqueue_p(JobPointer job)
 {
     Q_ASSERT(!m_mutex->tryLock()); //mutex has to be held when this method is called
@@ -257,11 +252,6 @@ bool WeaverImpl::dequeue(const JobPointer &job)
     return state()->dequeue(job);
 }
 
-bool WeaverImpl::dequeueRaw(JobInterface *job)
-{
-    return dequeue(ManagedJobPointer<JobInterface>(job));
-}
-
 bool WeaverImpl::dequeue_p(JobPointer job)
 {
     Q_ASSERT(!m_mutex->tryLock()); //mutex has to be held when this method is called
diff --git a/tier1/threadweaver/src/Weaver/WeaverImpl.h \
b/tier1/threadweaver/src/Weaver/WeaverImpl.h index b8700b8..b40d1f2 100644
--- a/tier1/threadweaver/src/Weaver/WeaverImpl.h
+++ b/tier1/threadweaver/src/Weaver/WeaverImpl.h
@@ -78,9 +78,7 @@ public:
     void setState( StateId );
     void registerObserver(WeaverObserver*) Q_DECL_OVERRIDE;
     void enqueue(const JobPointer& job) Q_DECL_OVERRIDE;
-    void enqueueRaw(JobInterface* job) Q_DECL_OVERRIDE;
     bool dequeue(const JobPointer& job) Q_DECL_OVERRIDE;
-    bool dequeueRaw(JobInterface* job) Q_DECL_OVERRIDE;
     void dequeue() Q_DECL_OVERRIDE;
     void finish() Q_DECL_OVERRIDE;
     void suspend() Q_DECL_OVERRIDE;
diff --git a/tier1/threadweaver/src/Weaver/WeaverImplState.cpp \
b/tier1/threadweaver/src/Weaver/WeaverImplState.cpp index a387f62..b2ce238 100644
--- a/tier1/threadweaver/src/Weaver/WeaverImplState.cpp
+++ b/tier1/threadweaver/src/Weaver/WeaverImplState.cpp
@@ -58,17 +58,6 @@ const WeaverImpl *WeaverImplState::weaver() const
     return static_cast<const WeaverImpl*> ( State::weaver() );
 }
 
-void WeaverImplState::enqueueRaw(JobInterface *)
-{
-    Q_ASSERT(false); //should not be called, handled in WeaverImpl
-}
-
-bool WeaverImplState::dequeueRaw(JobInterface*)
-{
-    Q_ASSERT(false); //should not be called, handled in WeaverImpl
-    return false;
-}
-
 void WeaverImplState::setMaximumNumberOfThreads(int cap)
 {
     weaver()->setMaximumNumberOfThreads_p(cap);
diff --git a/tier1/threadweaver/src/Weaver/WeaverImplState.h \
b/tier1/threadweaver/src/Weaver/WeaverImplState.h index f021fdc..7696e39 100644
--- a/tier1/threadweaver/src/Weaver/WeaverImplState.h
+++ b/tier1/threadweaver/src/Weaver/WeaverImplState.h
@@ -83,11 +83,6 @@ protected:
     /** Provide correct return type for WeaverImpl states. */
     WeaverImpl* weaver() Q_DECL_OVERRIDE;
     const WeaverImpl* weaver() const Q_DECL_OVERRIDE;
-private:
-    /** Enqueue a naked job. Not implemented. */
-    void enqueueRaw(JobInterface* job) Q_DECL_OVERRIDE;
-    /** Dequeue a raw job. Not implemented. */
-    bool dequeueRaw(JobInterface* job) Q_DECL_OVERRIDE;
 };
 
 }
diff --git a/tier1/threadweaver/src/Weaver/WeaverInterface.h \
b/tier1/threadweaver/src/Weaver/WeaverInterface.h index 8df9fc2..ae133e8 100644
--- a/tier1/threadweaver/src/Weaver/WeaverInterface.h
+++ b/tier1/threadweaver/src/Weaver/WeaverInterface.h
@@ -105,12 +105,6 @@ public:
     */
     virtual void enqueue(const JobPointer& job) = 0;
 
-    /** Add a job to be executed.
-     *
-     * Use this overloaded method to queue jobs that are memory-managed by the \
                caller, instead of being
-     * QSharedPointers. */
-    virtual void enqueueRaw(JobInterface* job) = 0;
-
     /** Remove a job from the queue.
      *
      * If the job was queued but not started so far, it is removed from the queue.
@@ -128,11 +122,6 @@ public:
      */
     virtual bool dequeue(const JobPointer& job) = 0;
 
-    /** Remove a raw job from the queue.
-     * @see dequeue(JobPointer)
-     */
-    virtual bool dequeueRaw(JobInterface* job) = 0;
-
     /** Remove all queued jobs.
      *
      * All waiting jobs will be dequeued. The semantics are the same as for \
dequeue(JobInterface).


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

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