/usr/include/threadweaver/Job.h is in kdelibs5-dev 4:4.14.2-5+deb8u2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | /* -*- C++ -*-
This file declares the Job class.
$ Author: Mirko Boehm $
$ Copyright: (C) 2004-2013 Mirko Boehm $
$ Contact: mirko@kde.org
http://www.kde.org
http://creative-destruction.me $
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
$Id: Job.h 32 2005-08-17 08:38:01Z mirko $
*/
#ifndef THREADWEAVER_JOB_H
#define THREADWEAVER_JOB_H
#include <QtCore/QObject>
#include <threadweaver/threadweaver_export.h>
class QMutex;
class QWaitCondition;
namespace ThreadWeaver {
class Thread;
class QueuePolicy;
class JobRunHelper;
class WeaverInterface;
class QueuePolicyList;
/** A Job is a simple abstraction of an action that is to be
executed in a thread context.
It is essential for the ThreadWeaver library that as a kind of
convention, the different creators of Job objects do not touch the
protected data members of the Job until somehow notified by the
Job.
Also, please note that Jobs may not be executed twice. Create two
different objects to perform two consecutive or parallel runs.
Jobs may declare dependencies. If Job B depends on Job A, B may not be
executed before A is finished. To learn about dependencies, see
DependencyPolicy.
Job objects finish by emitting the done(Job*) signal. Once this has been emitted,
ThreadWeaver is no longer using the Job which may then be deleted.
*/
class THREADWEAVER_EXPORT Job : public QObject
{
Q_OBJECT
public:
friend class JobRunHelper;
/** Construct a Job.
@param parent the parent QObject
*/
explicit Job ( QObject* parent = 0 );
/** Destructor. */
virtual ~Job();
/** Perform the job. The thread in which this job is executed
is given as a parameter.
Do not overload this method to create your own Job
implementation, overload run(). */
virtual void execute(Thread*);
/** The queueing priority of the job.
Jobs will be sorted by their queueing priority when
enqueued. A higher queueing priority will place the job in
front of all lower-priority jobs in the queue.
Note: A higher or lower priority does not influence queue
policies. For example, a high-priority job that has an
unresolved dependency will not be executed, which means an
available lower-priority job will take precedence.
The default implementation returns zero. Only if this method
is overloaded for some job classes, priorities will
influence the execution order of jobs.
*/
virtual int priority() const;
/** Return whether the Job finished successfully or not.
The default implementation simply returns true. Overload in
derived classes if the derived Job class can fail.
If a job fails (success() returns false), it will *NOT* resolve
its dependencies when it finishes. This will make sure that Jobs
that depend on the failed job will not be started.
There is an important gotcha: When a Job object is deleted, it
will always resolve its dependencies. If dependent jobs should
not be executed after a failure, it is important to dequeue those
before deleting the failed Job.
A JobSequence may be helpful for that purpose.
*/
virtual bool success () const;
/** Abort the execution of the job.
Call this method to ask the Job to abort if it is currently executed.
Please note that the default implementation of the method does
nothing (!). This is due to the fact that there is no generic
method to abort a processing Job. Not even a default boolean flag
makes sense, as Job could, for example, be in an event loop and
will need to create an exit event.
You have to reimplement the method to actually initiate an abort
action.
The method is not pure virtual because users are not supposed to
be forced to always implement requestAbort().
Also, this method is supposed to return immediately, not after the
abort has completed. It requests the abort, the Job has to act on
the request. */
virtual void requestAbort () {}
/** The job is about to be added to the weaver's job queue.
The job will be added right after this method finished. The
default implementation does nothing.
Use this method to, for example, queue sub-operations as jobs
before the job itself is queued.
Note: When this method is called, the associated Weaver object's
thread holds a lock on the weaver's queue. Therefore, it is save
to assume that recursive queueing is atomic from the queues
perspective.
@param weaver the Weaver object the job will be queued in
*/
virtual void aboutToBeQueued ( WeaverInterface *weaver );
/** This Job is about the be dequeued from the weaver's job queue.
The job will be removed from the queue right after this method
returns.
Use this method to dequeue, if necessary, sub-operations (jobs) that this job
has enqueued.
Note: When this method is called, the associated Weaver object's
thread does hold a lock on the weaver's queue.
Note: The default implementation does nothing.
@param weaver the Weaver object from which the job will be dequeued
*/
virtual void aboutToBeDequeued ( WeaverInterface *weaver );
/** canBeExecuted() returns true if all the jobs queue policies agree to it.
If it returns true, it expects that the job is executed right
after that. The done() methods of the queue policies will be
automatically called when the job is finished.
If it returns false, all queue policy resources have been freed,
and the method can be called again at a later time.
*/
virtual bool canBeExecuted();
/** Returns true if the jobs's execute method finished. */
bool isFinished() const;
/** Assign a queue policy.
Queue Policies customize the queueing (running) behaviour of sets
of jobs. Examples for queue policies are dependencies and resource
restrictions.
Every queue policy object can only be assigned once to a job,
multiple assignments will be IGNORED.
*/
void assignQueuePolicy ( QueuePolicy* );
/** Remove a queue policy from this job.
*/
void removeQueuePolicy ( QueuePolicy* );
Q_SIGNALS:
/** This signal is emitted when this job is being processed by a
thread. */
void started ( ThreadWeaver::Job* );
/**
* This signal is emitted when the job has been finished (no matter if it succeeded or not).
* After this signal has been emitted, ThreadWeaver no longer references the Job internally
* and the Job can be deleted.
*/
void done ( ThreadWeaver::Job* );
/** This job has failed.
This signal is emitted when success() returns false after the job
is executed.
*/
void failed( ThreadWeaver::Job* );
protected:
class Private;
Private* d;
/** Free the queue policies acquired before this job has been
executed. */
void freeQueuePolicyResources();
/** The method that actually performs the job. It is called from
execute(). This method is the one to overload it with the
job's task. */
virtual void run () = 0;
/** Return the thread that executes this job.
Returns zero of the job is not currently executed.
Do not confuse with QObject::thread() const !
// @todo rename to executingThread()
*/
Thread *thread();
/** Call with status = true to mark this job as done. */
void setFinished ( bool status );
/** The mutex used to protect this job. */
// QMutex& mutex();
};
}
#endif // THREADWEAVER_JOB_H
|