Qt 4.8
Public Functions | Properties | List of all members
QProcessManager Class Reference
Inheritance diagram for QProcessManager:
QThread QObject

Public Functions

void add (pid_t pid, QProcess *process)
 
void catchDeadChildren ()
 
void lock ()
 
 QProcessManager ()
 
void remove (QProcess *process)
 
void run ()
 The starting point for the thread. More...
 
void unlock ()
 
 ~QProcessManager ()
 
- Public Functions inherited from QThread
void exit (int retcode=0)
 Tells the thread's event loop to exit with a return code. More...
 
bool isFinished () const
 Returns true if the thread is finished; otherwise returns false. More...
 
bool isRunning () const
 Returns true if the thread is running; otherwise returns false. More...
 
Priority priority () const
 Returns the priority for a running thread. More...
 
 QThread (QObject *parent=0)
 Constructs a new QThread to manage a new thread. More...
 
void setPriority (Priority priority)
 This function sets the priority for a running thread. More...
 
void setStackSize (uint stackSize)
 Sets the maximum stack size for the thread to stackSize. More...
 
uint stackSize () const
 Returns the maximum stack size for the thread (if set with setStackSize()); otherwise returns zero. More...
 
bool wait (unsigned long time=ULONG_MAX)
 Blocks the thread until either of these conditions is met: More...
 
 ~QThread ()
 Destroys the QThread. More...
 
- Public Functions inherited from QObject
bool blockSignals (bool b)
 If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke anything connected to it). More...
 
const QObjectListchildren () const
 Returns a list of child objects. More...
 
bool connect (const QObject *sender, const char *signal, const char *member, Qt::ConnectionType type=Qt::AutoConnection) const
 
bool disconnect (const char *signal=0, const QObject *receiver=0, const char *member=0)
 
bool disconnect (const QObject *receiver, const char *member=0)
 
void dumpObjectInfo ()
 Dumps information about signal connections, etc. More...
 
void dumpObjectTree ()
 Dumps a tree of children to the debug output. More...
 
QList< QByteArraydynamicPropertyNames () const
 Returns the names of all properties that were dynamically added to the object using setProperty(). More...
 
virtual bool event (QEvent *)
 This virtual function receives events to an object and should return true if the event e was recognized and processed. More...
 
virtual bool eventFilter (QObject *, QEvent *)
 Filters events if this object has been installed as an event filter for the watched object. More...
 
template<typename T >
findChild (const QString &aName=QString()) const
 Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. More...
 
template<typename T >
QList< T > findChildren (const QString &aName=QString()) const
 Returns all children of this object with the given name that can be cast to type T, or an empty list if there are no such objects. More...
 
template<typename T >
QList< T > findChildren (const QRegExp &re) const
 
bool inherits (const char *classname) const
 Returns true if this object is an instance of a class that inherits className or a QObject subclass that inherits className; otherwise returns false. More...
 
void installEventFilter (QObject *)
 Installs an event filter filterObj on this object. More...
 
bool isWidgetType () const
 Returns true if the object is a widget; otherwise returns false. More...
 
void killTimer (int id)
 Kills the timer with timer identifier, id. More...
 
virtual const QMetaObjectmetaObject () const
 Returns a pointer to the meta-object of this object. More...
 
void moveToThread (QThread *thread)
 Changes the thread affinity for this object and its children. More...
 
QString objectName () const
 
QObjectparent () const
 Returns a pointer to the parent object. More...
 
QVariant property (const char *name) const
 Returns the value of the object's name property. More...
 
Q_INVOKABLE QObject (QObject *parent=0)
 Constructs an object with parent object parent. More...
 
void removeEventFilter (QObject *)
 Removes an event filter object obj from this object. More...
 
void setObjectName (const QString &name)
 
void setParent (QObject *)
 Makes the object a child of parent. More...
 
bool setProperty (const char *name, const QVariant &value)
 Sets the value of the object's name property to value. More...
 
void setUserData (uint id, QObjectUserData *data)
 
bool signalsBlocked () const
 Returns true if signals are blocked; otherwise returns false. More...
 
int startTimer (int interval)
 Starts a timer and returns a timer identifier, or returns zero if it could not start a timer. More...
 
QThreadthread () const
 Returns the thread in which the object lives. More...
 
QObjectUserDatauserData (uint id) const
 
virtual ~QObject ()
 Destroys the object, deleting all its child objects. More...
 

Properties

QHash< int, QProcessInfo * > children
 
QMutex mutex
 

Additional Inherited Members

- Public Types inherited from QThread
enum  Priority {
  IdlePriority, LowestPriority, LowPriority, NormalPriority,
  HighPriority, HighestPriority, TimeCriticalPriority, InheritPriority
}
 This enum type indicates how the operating system should schedule newly created threads. More...
 
- Public Slots inherited from QThread
void quit ()
 Tells the thread's event loop to exit with return code 0 (success). More...
 
void start (Priority=InheritPriority)
 Begins execution of the thread by calling run(). More...
 
void terminate ()
 Terminates the execution of the thread. More...
 
- Public Slots inherited from QObject
void deleteLater ()
 Schedules this object for deletion. More...
 
- Signals inherited from QThread
void finished ()
 This signal is emitted when the thread has finished executing. More...
 
void started ()
 This signal is emitted when the thread starts executing. More...
 
void terminated ()
 This signal is emitted when the thread is terminated. More...
 
- Signals inherited from QObject
void destroyed (QObject *=0)
 This signal is emitted immediately before the object obj is destroyed, and can not be blocked. More...
 
- Static Public Functions inherited from QThread
static QThreadcurrentThread ()
 Returns a pointer to a QThread which manages the currently executing thread. More...
 
static Qt::HANDLE currentThreadId ()
 Returns the thread handle of the currently executing thread. More...
 
static int idealThreadCount ()
 Returns the ideal number of threads that can be run on the system. More...
 
static void yieldCurrentThread ()
 Yields execution of the current thread to another runnable thread, if any. More...
 
- Static Public Functions inherited from QObject
static bool connect (const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
 Creates a connection of the given type from the signal in the sender object to the method in the receiver object. More...
 
static bool connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type=Qt::AutoConnection)
 
static bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *member)
 Disconnects signal in object sender from method in object receiver. More...
 
static bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &member)
 
static uint registerUserData ()
 
static QString tr (const char *sourceText, const char *comment=0, int n=-1)
 
static QString trUtf8 (const char *sourceText, const char *comment=0, int n=-1)
 
- Static Public Variables inherited from QObject
static const QMetaObject staticMetaObject
 This variable stores the meta-object for the class. More...
 
- Protected Functions inherited from QThread
int exec ()
 Enters the event loop and waits until exit() is called, returning the value that was passed to exit(). More...
 
 QThread (QThreadPrivate &dd, QObject *parent=0)
 
- Protected Functions inherited from QObject
virtual void childEvent (QChildEvent *)
 This event handler can be reimplemented in a subclass to receive child events. More...
 
virtual void connectNotify (const char *signal)
 This virtual function is called when something has been connected to signal in this object. More...
 
virtual void customEvent (QEvent *)
 This event handler can be reimplemented in a subclass to receive custom events. More...
 
virtual void disconnectNotify (const char *signal)
 This virtual function is called when something has been disconnected from signal in this object. More...
 
 QObject (QObjectPrivate &dd, QObject *parent=0)
 
int receivers (const char *signal) const
 Returns the number of receivers connected to the signal. More...
 
QObjectsender () const
 Returns a pointer to the object that sent the signal, if called in a slot activated by a signal; otherwise it returns 0. More...
 
int senderSignalIndex () const
 
virtual void timerEvent (QTimerEvent *)
 This event handler can be reimplemented in a subclass to receive timer events for the object. More...
 
- Static Protected Functions inherited from QThread
static void msleep (unsigned long)
 Forces the current thread to sleep for msecs milliseconds. More...
 
static void setTerminationEnabled (bool enabled=true)
 Enables or disables termination of the current thread based on the enabled parameter. More...
 
static void sleep (unsigned long)
 Forces the current thread to sleep for secs seconds. More...
 
static void usleep (unsigned long)
 Forces the current thread to sleep for usecs microseconds. More...
 
- Protected Variables inherited from QObject
QScopedPointer< QObjectDatad_ptr
 
- Static Protected Variables inherited from QObject
static const QMetaObject staticQtMetaObject
 

Detailed Description

Definition at line 176 of file qprocess_unix.cpp.

Constructors and Destructors

◆ QProcessManager()

QProcessManager::QProcessManager ( )

Definition at line 207 of file qprocess_unix.cpp.

208 {
209 #if defined (QPROCESS_DEBUG)
210  qDebug() << "QProcessManager::QProcessManager()";
211 #endif
212  // initialize the dead child pipe and make it non-blocking. in the
213  // extremely unlikely event that the pipe fills up, we do not under any
214  // circumstances want to block.
216 
217  // set up the SIGCHLD handler, which writes a single byte to the dead
218  // child pipe every time a child dies.
219 
220  struct sigaction action;
221  // use the old handler as template, i.e., preserve the signal mask
222  // otherwise the original signal handler might be interrupted although it
223  // was marked to never be interrupted
224  ::sigaction(SIGCHLD, NULL, &action);
225  action.sa_sigaction = qt_sa_sigchld_sigaction;
226  // set the SA_SIGINFO flag such that we can use the three argument handler
227  // function
228  action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
229  ::sigaction(SIGCHLD, &action, &qt_sa_old_sigchld_handler);
230 }
static int qt_qprocess_deadChild_pipe[2]
static struct sigaction qt_sa_old_sigchld_handler
Q_CORE_EXPORT void qDebug(const char *,...)
static int qt_safe_pipe(int pipefd[2], int flags=0)
Definition: qcore_unix_p.h:191
static void qt_sa_sigchld_sigaction(int signum, siginfo_t *info, void *context)
int sigaction(int, const struct sigaction *, struct sigaction *)

◆ ~QProcessManager()

QProcessManager::~QProcessManager ( )

Definition at line 232 of file qprocess_unix.cpp.

233 {
234  // notify the thread that we're shutting down.
237  wait();
238 
239  // on certain unixes, closing the reading end of the pipe will cause
240  // select in run() to block forever, rather than return with EBADF.
242 
245 
246  qDeleteAll(children.values());
247  children.clear();
248 
249  struct sigaction currentAction;
250  ::sigaction(SIGCHLD, 0, &currentAction);
251  if (currentAction.sa_sigaction == qt_sa_sigchld_sigaction) {
253  }
254 }
static int qt_qprocess_deadChild_pipe[2]
static struct sigaction qt_sa_old_sigchld_handler
static int qt_safe_close(int fd)
Definition: qcore_unix_p.h:297
void clear()
Removes all items from the list.
Definition: qlist.h:764
static void qt_sa_sigchld_sigaction(int signum, siginfo_t *info, void *context)
int sigaction(int, const struct sigaction *, struct sigaction *)
bool wait(unsigned long time=ULONG_MAX)
Blocks the thread until either of these conditions is met:
const QObjectList & children() const
Returns a list of child objects.
Definition: qobject.h:197
Q_OUTOFLINE_TEMPLATE void qDeleteAll(ForwardIterator begin, ForwardIterator end)
Definition: qalgorithms.h:319
static qint64 qt_safe_write(int fd, const void *data, qint64 len)
Definition: qcore_unix_p.h:282

Functions

◆ add()

void QProcessManager::add ( pid_t  pid,
QProcess process 
)

Definition at line 311 of file qprocess_unix.cpp.

Referenced by QProcessPrivate::startProcess().

312 {
313 #if defined (QPROCESS_DEBUG)
314  qDebug() << "QProcessManager::add() adding pid" << pid << "process" << process;
315 #endif
316 
317  // insert a new info structure for this process
319  info->process = process;
320  info->deathPipe = process->d_func()->deathPipe[1];
321  info->exitResult = 0;
322  info->pid = pid;
323 
324  int serial = idCounter.fetchAndAddRelaxed(1);
325  process->d_func()->serial = serial;
326  children.insert(serial, info);
327 }
static mach_timebase_info_data_t info
void insert(int i, const T &t)
Inserts value at index position i in the list.
Definition: qlist.h:575
Q_CORE_EXPORT void qDebug(const char *,...)
static QBasicAtomicInt idCounter
int fetchAndAddRelaxed(int valueToAdd)
const QObjectList & children() const
Returns a list of child objects.
Definition: qobject.h:197
QProcess * process

◆ catchDeadChildren()

void QProcessManager::catchDeadChildren ( )

Definition at line 289 of file qprocess_unix.cpp.

290 {
291  QMutexLocker locker(&mutex);
292 
293  // try to catch all children whose pid we have registered, and whose
294  // deathPipe is still valid (i.e, we have not already notified it).
296  while (it != children.end()) {
297  // notify all children that they may have died. they need to run
298  // waitpid() in their own thread.
299  QProcessInfo *info = it.value();
300  qt_safe_write(info->deathPipe, "", 1);
301 
302 #if defined (QPROCESS_DEBUG)
303  qDebug() << "QProcessManager::run() sending death notice to" << info->process;
304 #endif
305  ++it;
306  }
307 }
static mach_timebase_info_data_t info
#define it(className, varName)
iterator begin()
Returns an STL-style iterator pointing to the first item in the list.
Definition: qlist.h:267
T & value() const
Returns a modifiable reference to the current item&#39;s value.
Definition: qhash.h:348
Q_CORE_EXPORT void qDebug(const char *,...)
iterator end()
Returns an STL-style iterator pointing to the imaginary item after the last item in the list...
Definition: qlist.h:270
The QMutexLocker class is a convenience class that simplifies locking and unlocking mutexes...
Definition: qmutex.h:101
The QHash::iterator class provides an STL-style non-const iterator for QHash and QMultiHash.
Definition: qhash.h:330
const QObjectList & children() const
Returns a list of child objects.
Definition: qobject.h:197
QProcess * process
static qint64 qt_safe_write(int fd, const void *data, qint64 len)
Definition: qcore_unix_p.h:282

◆ lock()

void QProcessManager::lock ( )

Definition at line 342 of file qprocess_unix.cpp.

Referenced by QProcessPrivate::startProcess().

343 {
344  mutex.lock();
345 }
void lock()
Locks the mutex.
Definition: qmutex.cpp:151

◆ remove()

void QProcessManager::remove ( QProcess process)

Definition at line 329 of file qprocess_unix.cpp.

Referenced by QProcessPrivate::findExitCode(), and QProcessPrivate::waitForDeadChild().

330 {
331  QMutexLocker locker(&mutex);
332 
333  int serial = process->d_func()->serial;
334  QProcessInfo *info = children.take(serial);
335 #if defined (QPROCESS_DEBUG)
336  if (info)
337  qDebug() << "QProcessManager::remove() removing pid" << info->pid << "process" << info->process;
338 #endif
339  delete info;
340 }
static mach_timebase_info_data_t info
Q_CORE_EXPORT void qDebug(const char *,...)
The QMutexLocker class is a convenience class that simplifies locking and unlocking mutexes...
Definition: qmutex.h:101
const QObjectList & children() const
Returns a list of child objects.
Definition: qobject.h:197
QProcess * process

◆ run()

void QProcessManager::run ( void  )
virtual

The starting point for the thread.

After calling start(), the newly created thread calls this function. The default implementation simply calls exec().

You can reimplement this function to facilitate advanced thread management. Returning from this method will end the execution of the thread.

See also
start() wait()

Reimplemented from QThread.

Definition at line 256 of file qprocess_unix.cpp.

257 {
258  forever {
259  fd_set readset;
260  FD_ZERO(&readset);
261  FD_SET(qt_qprocess_deadChild_pipe[0], &readset);
262 
263 #if defined (QPROCESS_DEBUG)
264  qDebug() << "QProcessManager::run() waiting for children to die";
265 #endif
266 
267  // block forever, or until activity is detected on the dead child
268  // pipe. the only other peers are the SIGCHLD signal handler, and the
269  // QProcessManager destructor.
270  int nselect = select(qt_qprocess_deadChild_pipe[0] + 1, &readset, 0, 0, 0);
271  if (nselect < 0) {
272  if (errno == EINTR)
273  continue;
274  break;
275  }
276 
277  // empty only one byte from the pipe, even though several SIGCHLD
278  // signals may have been delivered in the meantime, to avoid race
279  // conditions.
280  char c;
281  if (qt_safe_read(qt_qprocess_deadChild_pipe[0], &c, 1) < 0 || c == '@')
282  break;
283 
284  // catch any and all children that we can.
286  }
287 }
static int qt_qprocess_deadChild_pipe[2]
unsigned char c[8]
Definition: qnumeric_p.h:62
int select(int, fd_set *, fd_set *, fd_set *, struct timeval *)
Q_CORE_EXPORT void qDebug(const char *,...)
static qint64 qt_safe_read(int fd, void *data, qint64 maxlen)
Definition: qcore_unix_p.h:273
int errno
#define forever
This macro is provided for convenience for writing infinite loops.
Definition: qglobal.h:2452

◆ unlock()

void QProcessManager::unlock ( )

Definition at line 347 of file qprocess_unix.cpp.

Referenced by QProcessPrivate::startProcess().

348 {
349  mutex.unlock();
350 }
void unlock()
Unlocks the mutex.
Definition: qmutex.cpp:296

Properties

◆ children

QHash<int, QProcessInfo *> QProcessManager::children
private

Definition at line 192 of file qprocess_unix.cpp.

◆ mutex

QMutex QProcessManager::mutex
private

Definition at line 191 of file qprocess_unix.cpp.


The documentation for this class was generated from the following file: