Leave the old name as a deprecated typedef; adapt users.
This is a prerequisite for moving QFuture back to QtCore.
Change-Id: I81dcee2c7e6eb234c16f3f42e2415ca0da3dc4f8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
QT += concurrent
to include the new library.
+* QtConcurrent::Exception has been renamed to QException, and is still in QtCore.
+ Ditto QtConcurrent::UnhandledException.
+
QtOpenGL
--------
qtconcurrentresultstore.cpp \
qtconcurrentthreadengine.cpp \
qtconcurrentiteratekernel.cpp \
- qtconcurrentexception.cpp
HEADERS += \
qtconcurrent_global.h \
}
#ifndef QT_NO_EXCEPTIONS
-void QFutureInterfaceBase::reportException(const QtConcurrent::Exception &exception)
+void QFutureInterfaceBase::reportException(const QException &exception)
{
QMutexLocker locker(&d->m_mutex);
if ((d->state & Canceled) || (d->state & Finished))
return &d->m_mutex;
}
-QtConcurrent::internal::ExceptionStore &QFutureInterfaceBase::exceptionStore()
+QtPrivate::ExceptionStore &QFutureInterfaceBase::exceptionStore()
{
return d->m_exceptionStore;
}
#ifndef QT_NO_QFUTURE
#include <QtCore/qmutex.h>
-#include <QtConcurrent/qtconcurrentexception.h>
+#include <QtCore/qexception.h>
#include <QtConcurrent/qtconcurrentresultstore.h>
QT_BEGIN_HEADER
void reportFinished();
void reportCanceled();
#ifndef QT_NO_EXCEPTIONS
- void reportException(const QtConcurrent::Exception &e);
+ void reportException(const QException &e);
#endif
void reportResultsReady(int beginIndex, int endIndex);
void waitForResume();
QMutex *mutex() const;
- QtConcurrent::internal::ExceptionStore &exceptionStore();
+ QtPrivate::ExceptionStore &exceptionStore();
QtConcurrent::ResultStoreBase &resultStoreBase();
const QtConcurrent::ResultStoreBase &resultStoreBase() const;
QtConcurrent::ResultStoreBase m_results;
bool manualProgress;
int m_expectedResultCount;
- QtConcurrent::internal::ExceptionStore m_exceptionStore;
+ QtPrivate::ExceptionStore m_exceptionStore;
QString m_progressText;
QRunnable *runnable;
#ifndef QT_NO_QFUTURE
-#include <QtCore/qatomic.h>
-#include <QtCore/qshareddata.h>
-
-#ifndef QT_NO_EXCEPTIONS
-# include <exception>
-#endif
+#include <QtCore/qexception.h>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
#ifndef QT_NO_EXCEPTIONS
-class Q_CONCURRENT_EXPORT Exception : public std::exception
-{
-public:
- virtual void raise() const;
- virtual Exception *clone() const;
-};
-
-class Q_CONCURRENT_EXPORT UnhandledException : public Exception
-{
-public:
- void raise() const;
- Exception *clone() const;
-};
-
-namespace internal {
-
-class Base;
-class ExceptionHolder
-{
-public:
- ExceptionHolder(Exception *exception = 0);
- ExceptionHolder(const ExceptionHolder &other);
- void operator=(const ExceptionHolder &other);
- ~ExceptionHolder();
- Exception *exception() const;
- QExplicitlySharedDataPointer<Base> base;
-};
-
-class Q_CONCURRENT_EXPORT ExceptionStore
-{
-public:
- void setException(const Exception &e);
- bool hasException() const;
- ExceptionHolder exception();
- void throwPossibleException();
- bool hasThrown() const;
- ExceptionHolder exceptionHolder;
-};
-
-} // namespace internal
-
-#else // QT_NO_EXCEPTIONS
-
-namespace internal {
-
-class Q_CONCURRENT_EXPORT ExceptionStore
-{
-public:
- ExceptionStore() { }
- inline void throwPossibleException() const {}
-};
-
-} // namespace internal
+typedef Q_DECL_DEPRECATED QException Exception;
+typedef Q_DECL_DEPRECATED QUnhandledException UnhandledException;
#endif
QT_END_NAMESPACE
QT_END_HEADER
-#endif // QT_NO_CONCURRENT
+#endif // QT_NO_QFUTURE
#endif
*/
/*!
- \namespace QtConcurrent::internal
- \internal
-
- \brief The QtConcurrent::internal namespace contains QtConcurrent
- implementation details.
-*/
-
-/*!
\enum QtConcurrent::ReduceOption
This enum specifies the order of which results from the map or filter
function are passed to the reduce function.
#endif
this->runFunctor();
#ifndef QT_NO_EXCEPTIONS
- } catch (QtConcurrent::Exception &e) {
+ } catch (QException &e) {
QFutureInterface<T>::reportException(e);
} catch (...) {
- QFutureInterface<T>::reportException(QtConcurrent::UnhandledException());
+ QFutureInterface<T>::reportException(QUnhandledException());
}
#endif
#endif
this->runFunctor();
#ifndef QT_NO_EXCEPTIONS
- } catch (QtConcurrent::Exception &e) {
+ } catch (QException &e) {
QFutureInterface<void>::reportException(e);
} catch (...) {
- QFutureInterface<void>::reportException(QtConcurrent::UnhandledException());
+ QFutureInterface<void>::reportException(QUnhandledException());
}
#endif
this->reportFinished();
}
}
#ifndef QT_NO_EXCEPTIONS
- } catch (QtConcurrent::Exception &e) {
+ } catch (QException &e) {
handleException(e);
} catch (...) {
- handleException(QtConcurrent::UnhandledException());
+ handleException(QUnhandledException());
}
#endif
}
#ifndef QT_NO_EXCEPTIONS
- } catch (QtConcurrent::Exception &e) {
+ } catch (QException &e) {
handleException(e);
} catch (...) {
- handleException(QtConcurrent::UnhandledException());
+ handleException(QUnhandledException());
}
#endif
threadExit();
#ifndef QT_NO_EXCEPTIONS
-void ThreadEngineBase::handleException(const QtConcurrent::Exception &exception)
+void ThreadEngineBase::handleException(const QException &exception)
{
if (futureInterface)
futureInterface->reportException(exception);
#include <QtCore/qthreadpool.h>
#include <QtConcurrent/qfuture.h>
#include <QtCore/qdebug.h>
-#include <QtConcurrent/qtconcurrentexception.h>
+#include <QtCore/qexception.h>
#include <QtCore/qwaitcondition.h>
#include <QtCore/qatomic.h>
#include <QtCore/qsemaphore.h>
void run();
virtual void asynchronousFinish() = 0;
#ifndef QT_NO_EXCEPTIONS
- void handleException(const QtConcurrent::Exception &exception);
+ void handleException(const QException &exception);
#endif
protected:
QFutureInterfaceBase *futureInterface;
QThreadPool *threadPool;
ThreadEngineBarrier barrier;
- QtConcurrent::internal::ExceptionStore exceptionStore;
+ QtPrivate::ExceptionStore exceptionStore;
};
//! [0]
-class MyException : public QtConcurrent::Exception
+class MyException : public QException
{
public:
void raise() const { throw *this; }
- Exception *clone() const { return new MyException(*this); }
+ MyException *clone() const { return new MyException(*this); }
};
//! [0]
**
****************************************************************************/
-#include "qtconcurrentexception.h"
+#include "qexception.h"
#include "QtCore/qshareddata.h"
#ifndef QT_NO_QFUTURE
QT_BEGIN_NAMESPACE
/*!
- \class QtConcurrent::Exception
- \brief The Exception class provides a base class for exceptions that can transferred across threads.
- \since 4.4
+ \class QException
+ \brief The QException class provides a base class for exceptions that can transferred across threads.
+ \since 5.0
Qt Concurrent supports throwing and catching exceptions across thread
- boundaries, provided that the exception inherit from QtConcurrent::Exception
+ boundaries, provided that the exception inherit from QException
and implement two helper functions:
- \snippet code/src_concurrent_qtconcurrentexception.cpp 0
+ \snippet code/src_corelib_thread_qexception.cpp 0
- QtConcurrent::Exception subclasses must be thrown by value and
+ QException subclasses must be thrown by value and
caught by reference:
- \snippet code/src_concurrent_qtconcurrentexception.cpp 1
+ \snippet code/src_corelib_thread_qexception.cpp 1
- If you throw an exception that is not a subclass of QtConcurrent::Exception,
- the Qt Concurrent functions will throw a QtConcurrent::UnhandledException
+ If you throw an exception that is not a subclass of QException,
+ the Qt functions will throw a QUnhandledException
in the receiver thread.
When using QFuture, transferred exceptions will be thrown when calling the following functions:
*/
/*!
- \fn QtConcurrent::Exception::raise() const
- In your QtConcurrent::Exception subclass, reimplement raise() like this:
-
- \snippet code/src_concurrent_qtconcurrentexception.cpp 2
+ \fn QException::raise() const
+ In your QException subclass, reimplement raise() like this:
+
+ \snippet code/src_corelib_thread_qexception.cpp 2
*/
/*!
- \fn QtConcurrent::Exception::clone() const
- In your QtConcurrent::Exception subclass, reimplement clone() like this:
-
- \snippet code/src_concurrent_qtconcurrentexception.cpp 3
+ \fn QException::clone() const
+ In your QException subclass, reimplement clone() like this:
+
+ \snippet code/src_corelib_thread_qexception.cpp 3
*/
/*!
- \class QtConcurrent::UnhandledException
+ \class QUnhandledException
\brief The UnhandledException class represents an unhandled exception in a worker thread.
- \since 4.4
+ \since 5.0
- If a worker thread throws an exception that is not a subclass of QtConcurrent::Exception,
- the Qt Concurrent functions will throw a QtConcurrent::UnhandledException
+ If a worker thread throws an exception that is not a subclass of QException,
+ the Qt functions will throw a QUnhandledException
on the receiver thread side.
Inheriting from this class is not supported.
*/
/*!
- \fn QtConcurrent::UnhandledException::raise() const
+ \fn QUnhandledException::raise() const
\internal
*/
/*!
- \fn QtConcurrent::UnhandledException::clone() const
+ \fn QUnhandledException::clone() const
\internal
*/
-namespace QtConcurrent
+void QException::raise() const
{
-
-void Exception::raise() const
-{
- Exception e = *this;
+ QException e = *this;
throw e;
}
-Exception *Exception::clone() const
+QException *QException::clone() const
{
- return new Exception(*this);
+ return new QException(*this);
}
-void UnhandledException::raise() const
+void QUnhandledException::raise() const
{
- UnhandledException e = *this;
+ QUnhandledException e = *this;
throw e;
}
-Exception *UnhandledException::clone() const
+QUnhandledException *QUnhandledException::clone() const
{
- return new UnhandledException(*this);
+ return new QUnhandledException(*this);
}
#ifndef qdoc
-namespace internal {
+namespace QtPrivate {
class Base : public QSharedData
{
public:
- Base(Exception *exception)
+ Base(QException *exception)
: exception(exception), hasThrown(false) { }
~Base() { delete exception; }
- Exception *exception;
+ QException *exception;
bool hasThrown;
};
-ExceptionHolder::ExceptionHolder(Exception *exception)
+ExceptionHolder::ExceptionHolder(QException *exception)
: base(new Base(exception)) {}
ExceptionHolder::ExceptionHolder(const ExceptionHolder &other)
ExceptionHolder::~ExceptionHolder()
{}
-Exception *ExceptionHolder::exception() const
+QException *ExceptionHolder::exception() const
{
return base->exception;
}
-void ExceptionStore::setException(const Exception &e)
+void ExceptionStore::setException(const QException &e)
{
if (hasException() == false)
exceptionHolder = ExceptionHolder(e.clone());
bool ExceptionStore::hasThrown() const { return exceptionHolder.base->hasThrown; }
-} // namespace internal
+} // namespace QtPrivate
#endif //qdoc
-} // namespace QtConcurrent
-
QT_END_NAMESPACE
#endif // QT_NO_EXCEPTIONS
-#endif // QT_NO_CONCURRENT
+#endif // QT_NO_QFUTURE
--- /dev/null
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTCORE_QEXCEPTION_H
+#define QTCORE_QEXCEPTION_H
+
+#include <QtCore/qglobal.h>
+
+#ifndef QT_NO_QFUTURE
+
+#include <QtCore/qatomic.h>
+#include <QtCore/qshareddata.h>
+
+#ifndef QT_NO_EXCEPTIONS
+# include <exception>
+#endif
+
+QT_BEGIN_HEADER
+QT_BEGIN_NAMESPACE
+
+
+#ifndef QT_NO_EXCEPTIONS
+
+class Q_CORE_EXPORT QException : public std::exception
+{
+public:
+ virtual void raise() const;
+ virtual QException *clone() const;
+};
+
+class Q_CORE_EXPORT QUnhandledException : public QException
+{
+public:
+ void raise() const;
+ QUnhandledException *clone() const;
+};
+
+namespace QtPrivate {
+
+class Base;
+class Q_CORE_EXPORT ExceptionHolder
+{
+public:
+ ExceptionHolder(QException *exception = 0);
+ ExceptionHolder(const ExceptionHolder &other);
+ void operator=(const ExceptionHolder &other);
+ ~ExceptionHolder();
+ QException *exception() const;
+ QExplicitlySharedDataPointer<Base> base;
+};
+
+class Q_CORE_EXPORT ExceptionStore
+{
+public:
+ void setException(const QException &e);
+ bool hasException() const;
+ ExceptionHolder exception();
+ void throwPossibleException();
+ bool hasThrown() const;
+ ExceptionHolder exceptionHolder;
+};
+
+} // namespace QtPrivate
+
+#else // QT_NO_EXCEPTIONS
+
+namespace QtPrivate {
+
+class Q_CORE_EXPORT ExceptionStore
+{
+public:
+ ExceptionStore() { }
+ inline void throwPossibleException() const {}
+};
+
+} // namespace QtPrivate
+
+#endif // QT_NO_EXCEPTIONS
+
+QT_END_NAMESPACE
+QT_END_HEADER
+
+#endif // QT_NO_QFUTURE
+
+#endif
thread/qthreadstorage.h \
thread/qwaitcondition.h \
thread/qatomic.h \
+ thread/qexception.h \
thread/qbasicatomic.h \
thread/qgenericatomic.h \
thread/qoldbasicatomic.h
thread/qthreadpool_p.h
SOURCES += thread/qatomic.cpp \
+ thread/qexception.cpp \
thread/qmutex.cpp \
thread/qreadwritelock.cpp \
thread/qrunnable.cpp \
i.reportStarted();
QFuture<void> f = i.future();
- Exception e;
+ QException e;
i.reportException(e);
i.reportFinished();
return f;
int r = 0;
i.reportResult(r);
- Exception e;
+ QException e;
i.reportException(e);
i.reportFinished();
return f;
}
-class DerivedException : public Exception
+class DerivedException : public QException
{
public:
void raise() const { throw *this; }
- Exception *clone() const { return new DerivedException(*this); }
+ DerivedException *clone() const { return new DerivedException(*this); }
};
QFuture<void> createDerivedExceptionFuture()
bool caught = false;
try {
f.waitForFinished();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
bool caught = false;
try {
f.result();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
bool caught = false;
try {
createExceptionResultFuture().result();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
bool caught = false;
try {
f.results();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
Q_UNUSED(e);
QFAIL("did not get exception");
}
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
bool caught = false;
try {
createDerivedExceptionFuture().waitForFinished();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
QVERIFY(caught);
QFuture<void> f = createExceptionFuture();
try {
f.waitForFinished();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
}
void throwMapper(int &e)
{
Q_UNUSED(e);
- throw QtConcurrent::Exception();
+ throw QException();
}
void tst_QtConcurrentMap::exceptions()
try {
QList<int> list = QList<int>() << 1 << 2 << 3;
QtConcurrent::map(list, throwMapper).waitForFinished();
- } catch (const Exception &) {
+ } catch (const QException &) {
caught = true;
}
if (!caught)
#ifndef QT_NO_EXCEPTIONS
void throwFunction()
{
- throw QtConcurrent::Exception();
+ throw QException();
}
int throwFunctionReturn()
{
- throw QtConcurrent::Exception();
+ throw QException();
return 0;
}
bool caught = false;
try {
QtConcurrent::run(throwFunction).waitForFinished();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
if (!caught)
caught = false;
try {
QtConcurrent::run(throwFunctionReturn).waitForFinished();
- } catch (Exception &) {
+ } catch (QException &) {
caught = true;
}
if (!caught)
ThreadFunctionResult threadFunction()
{
QTest::qSleep(50);
- throw QtConcurrent::Exception();
+ throw QException();
return ThreadFinished;
}
QThread *blockThread;
QtConcurrentExceptionThrower *e = new QtConcurrentExceptionThrower();
QFuture<void> f = e->startAsynchronously();
f.waitForFinished();
- } catch (const Exception &) {
+ } catch (const QException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");
try {
QtConcurrentExceptionThrower e(QThread::currentThread());
e.startBlocking();
- } catch (const Exception &) {
+ } catch (const QException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");
try {
QtConcurrentExceptionThrower e(0);
e.startBlocking();
- } catch (const Exception &) {
+ } catch (const QException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");
UnrelatedExceptionThrower *e = new UnrelatedExceptionThrower();
QFuture<void> f = e->startAsynchronously();
f.waitForFinished();
- } catch (const QtConcurrent::UnhandledException &) {
+ } catch (const QUnhandledException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");
try {
UnrelatedExceptionThrower e(QThread::currentThread());
e.startBlocking();
- } catch (const QtConcurrent::UnhandledException &) {
+ } catch (const QUnhandledException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");
try {
UnrelatedExceptionThrower e(0);
e.startBlocking();
- } catch (const QtConcurrent::UnhandledException &) {
+ } catch (const QUnhandledException &) {
caught = true;
}
QVERIFY2(caught, "did not get exception");