Cleanup reference counting in internal::Base class (qtconcurrent)

It is better to use QSharedData and QExplicitlySharedDataPointer then
doing manual ref counting.

Change-Id: I5674046141701bd48a53415ab96fcb6b538e79e6
Reviewed-on: http://codereview.qt.nokia.com/1440
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Olivier Goffart <olivier.goffart@nokia.com>
This commit is contained in:
Jedrzej Nowacki 2011-06-10 09:06:32 +02:00 committed by Qt by Nokia
parent d1f080138a
commit 12d9436522
2 changed files with 7 additions and 18 deletions

View File

@ -40,6 +40,7 @@
****************************************************************************/
#include "qtconcurrentexception.h"
#include "QtCore/qshareddata.h"
#ifndef QT_NO_QFUTURE
#ifndef QT_NO_EXCEPTIONS
@ -141,15 +142,14 @@ Exception *UnhandledException::clone() const
namespace internal {
class Base
class Base : public QSharedData
{
public:
Base(Exception *exception)
: exception(exception), refCount(1), hasThrown(false) { }
: exception(exception), hasThrown(false) { }
~Base() { delete exception; }
Exception *exception;
QAtomicInt refCount;
bool hasThrown;
};
@ -158,27 +158,15 @@ ExceptionHolder::ExceptionHolder(Exception *exception)
ExceptionHolder::ExceptionHolder(const ExceptionHolder &other)
: base(other.base)
{
base->refCount.ref();
}
{}
void ExceptionHolder::operator=(const ExceptionHolder &other)
{
if (base == other.base)
return;
if (base->refCount.deref() == false)
delete base;
base = other.base;
base->refCount.ref();
}
ExceptionHolder::~ExceptionHolder()
{
if (base->refCount.deref() == 0)
delete base;
}
{}
Exception *ExceptionHolder::exception() const
{

View File

@ -47,6 +47,7 @@
#ifndef QT_NO_QFUTURE
#include <QtCore/qatomic.h>
#include <QtCore/qshareddata.h>
#ifndef QT_NO_EXCEPTIONS
# include <exception>
@ -87,7 +88,7 @@ public:
void operator=(const ExceptionHolder &other);
~ExceptionHolder();
Exception *exception() const;
Base *base;
QExplicitlySharedDataPointer<Base> base;
};
class Q_CORE_EXPORT ExceptionStore