summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Adams <christopher.adams@nokia.com>2010-11-12 14:26:09 +1000
committerChris Adams <christopher.adams@nokia.com>2010-11-12 14:49:08 +1000
commit0e58b3d58d0773c69b09e1a52aac4b5f29d46312 (patch)
treeebe4c0e20f4106c7320118a12f94f70c9803b2ee
parent9cf50958db0f536e2396c5005eb99394f9f6a7e8 (diff)
Fix race condition in request-class destruction
Previously, the vtable of the request could be that of the base class instead of the derived class during a small window of time during which the engine could attempt to access some of the meta-object properties. This commit ensures that each request notifies the engine of its destruction in its destructor rather than in the destructor of the base class, which prevents this race condition. Task-number: QTMOBILITY-711 Reviewed-by: Michael Goddard
-rw-r--r--src/organizer/qorganizerabstractrequest.cpp9
-rw-r--r--src/organizer/requests/qorganizercollectionfetchrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizercollectionfetchrequest.h1
-rw-r--r--src/organizer/requests/qorganizercollectionremoverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizercollectionremoverequest.h1
-rw-r--r--src/organizer/requests/qorganizercollectionsaverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizercollectionsaverequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemfetchforexportrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemfetchforexportrequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemfetchrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemfetchrequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemidfetchrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemidfetchrequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemoccurrencefetchrequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemoccurrencefetchrequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemremoverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemremoverequest.h1
-rw-r--r--src/organizer/requests/qorganizeritemsaverequest.cpp6
-rw-r--r--src/organizer/requests/qorganizeritemsaverequest.h1
25 files changed, 85 insertions, 8 deletions
diff --git a/src/organizer/qorganizerabstractrequest.cpp b/src/organizer/qorganizerabstractrequest.cpp
index 99eefb19f0..6afb8ca29d 100644
--- a/src/organizer/qorganizerabstractrequest.cpp
+++ b/src/organizer/qorganizerabstractrequest.cpp
@@ -135,14 +135,7 @@ QOrganizerAbstractRequest::QOrganizerAbstractRequest(QOrganizerAbstractRequestPr
/*! Cleans up the memory used by this request */
QOrganizerAbstractRequest::~QOrganizerAbstractRequest()
{
- if (d_ptr) {
- QOrganizerManagerEngine *engine = QOrganizerManagerData::engine(d_ptr->m_manager);
- if (engine) {
- engine->requestDestroyed(this);
- }
-
- delete d_ptr;
- }
+ delete d_ptr;
}
/*!
diff --git a/src/organizer/requests/qorganizercollectionfetchrequest.cpp b/src/organizer/requests/qorganizercollectionfetchrequest.cpp
index 9206f24148..67d318b7b8 100644
--- a/src/organizer/requests/qorganizercollectionfetchrequest.cpp
+++ b/src/organizer/requests/qorganizercollectionfetchrequest.cpp
@@ -63,6 +63,12 @@ QOrganizerCollectionFetchRequest::QOrganizerCollectionFetchRequest(QObject* pare
{
}
+/*! Frees memory in use by this request */
+QOrganizerCollectionFetchRequest::~QOrganizerCollectionFetchRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Returns the collections retrieved by this request */
QList<QOrganizerCollection> QOrganizerCollectionFetchRequest::collections() const
{
diff --git a/src/organizer/requests/qorganizercollectionfetchrequest.h b/src/organizer/requests/qorganizercollectionfetchrequest.h
index 7da427c4d5..697037ffb7 100644
--- a/src/organizer/requests/qorganizercollectionfetchrequest.h
+++ b/src/organizer/requests/qorganizercollectionfetchrequest.h
@@ -59,6 +59,7 @@ class Q_ORGANIZER_EXPORT QOrganizerCollectionFetchRequest : public QOrganizerAbs
public:
QOrganizerCollectionFetchRequest(QObject* parent = 0);
+ ~QOrganizerCollectionFetchRequest();
/* Selection, restriction and sorting */
// none. you get all collections from the manager.
diff --git a/src/organizer/requests/qorganizercollectionremoverequest.cpp b/src/organizer/requests/qorganizercollectionremoverequest.cpp
index 0b99cc03e4..c352a83f0f 100644
--- a/src/organizer/requests/qorganizercollectionremoverequest.cpp
+++ b/src/organizer/requests/qorganizercollectionremoverequest.cpp
@@ -63,6 +63,12 @@ QOrganizerCollectionRemoveRequest::QOrganizerCollectionRemoveRequest(QObject* pa
{
}
+/*! Frees memory in use by this request */
+QOrganizerCollectionRemoveRequest::~QOrganizerCollectionRemoveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the list of ids of collections which will be removed by this request to a list containing the single element \a collectionId */
void QOrganizerCollectionRemoveRequest::setCollectionId(const QOrganizerCollectionId& collectionId)
{
diff --git a/src/organizer/requests/qorganizercollectionremoverequest.h b/src/organizer/requests/qorganizercollectionremoverequest.h
index 9a3d8b7e9f..ac2252a605 100644
--- a/src/organizer/requests/qorganizercollectionremoverequest.h
+++ b/src/organizer/requests/qorganizercollectionremoverequest.h
@@ -58,6 +58,7 @@ class Q_ORGANIZER_EXPORT QOrganizerCollectionRemoveRequest : public QOrganizerAb
public:
QOrganizerCollectionRemoveRequest(QObject* parent = 0);
+ ~QOrganizerCollectionRemoveRequest();
/* Selection */
void setCollectionId(const QOrganizerCollectionId& collectionId);
diff --git a/src/organizer/requests/qorganizercollectionsaverequest.cpp b/src/organizer/requests/qorganizercollectionsaverequest.cpp
index a668f160e2..19df3b4144 100644
--- a/src/organizer/requests/qorganizercollectionsaverequest.cpp
+++ b/src/organizer/requests/qorganizercollectionsaverequest.cpp
@@ -63,6 +63,12 @@ QOrganizerCollectionSaveRequest::QOrganizerCollectionSaveRequest(QObject* parent
{
}
+/*! Frees memory in use by this request */
+QOrganizerCollectionSaveRequest::~QOrganizerCollectionSaveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Clears the list of collections which will be saved, and sets the collection which will be saved to \a collection */
void QOrganizerCollectionSaveRequest::setCollection(const QOrganizerCollection& collection)
{
diff --git a/src/organizer/requests/qorganizercollectionsaverequest.h b/src/organizer/requests/qorganizercollectionsaverequest.h
index 8e0b10815f..ae7177827c 100644
--- a/src/organizer/requests/qorganizercollectionsaverequest.h
+++ b/src/organizer/requests/qorganizercollectionsaverequest.h
@@ -59,6 +59,7 @@ class Q_ORGANIZER_EXPORT QOrganizerCollectionSaveRequest : public QOrganizerAbst
public:
QOrganizerCollectionSaveRequest(QObject* parent = 0);
+ ~QOrganizerCollectionSaveRequest();
/* Selection */
void setCollection(const QOrganizerCollection& collection);
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.cpp b/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.cpp
index af07bcaac9..37d91392fc 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.cpp
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemDetailDefinitionFetchRequest::QOrganizerItemDetailDefinitionFetchR
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemDetailDefinitionFetchRequest::~QOrganizerItemDetailDefinitionFetchRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the name of the detail definition to retrieve to \a definitionName.
Equivalent to calling
\code
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.h b/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.h
index f00c64f59f..a16b3ae098 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.h
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionfetchrequest.h
@@ -59,6 +59,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemDetailDefinitionFetchRequest : public QOr
public:
QOrganizerItemDetailDefinitionFetchRequest(QObject* parent = 0);
+ ~QOrganizerItemDetailDefinitionFetchRequest();
/* Selection */
void setDefinitionName(const QString& definitionName);
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.cpp b/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.cpp
index 01020e0b15..bd7db04303 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.cpp
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemDetailDefinitionRemoveRequest::QOrganizerItemDetailDefinitionRemov
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemDetailDefinitionRemoveRequest::~QOrganizerItemDetailDefinitionRemoveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*!
Sets the name of the detail definition to remove from the manager to \a definitionName.
Managers may store different definitions which are valid for different organizer item types, and so attempting to remove definitions with certain names may fail if no such
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.h b/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.h
index cb6a8141da..f653109532 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.h
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionremoverequest.h
@@ -56,6 +56,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemDetailDefinitionRemoveRequest : public QO
public:
QOrganizerItemDetailDefinitionRemoveRequest(QObject* parent = 0);
+ ~QOrganizerItemDetailDefinitionRemoveRequest();
/* Selection */
void setDefinitionName(const QString& definitionName);
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.cpp b/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.cpp
index fccc660d9b..2a5cc5d998 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.cpp
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.cpp
@@ -65,6 +65,12 @@ QOrganizerItemDetailDefinitionSaveRequest::QOrganizerItemDetailDefinitionSaveReq
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemDetailDefinitionSaveRequest::~QOrganizerItemDetailDefinitionSaveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*!
Sets the definition to save to be the given \a definition.
Equivalent to calling:
diff --git a/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.h b/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.h
index 2d565ad0d9..565110fcd8 100644
--- a/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.h
+++ b/src/organizer/requests/qorganizeritemdetaildefinitionsaverequest.h
@@ -58,6 +58,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemDetailDefinitionSaveRequest : public QOrg
public:
QOrganizerItemDetailDefinitionSaveRequest(QObject* parent = 0);
+ ~QOrganizerItemDetailDefinitionSaveRequest();
/* Selection */
void setDefinition(const QOrganizerItemDetailDefinition& definition);
diff --git a/src/organizer/requests/qorganizeritemfetchforexportrequest.cpp b/src/organizer/requests/qorganizeritemfetchforexportrequest.cpp
index 916ecc42bf..d87e64ff26 100644
--- a/src/organizer/requests/qorganizeritemfetchforexportrequest.cpp
+++ b/src/organizer/requests/qorganizeritemfetchforexportrequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemFetchForExportRequest::QOrganizerItemFetchForExportRequest(QObject
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemFetchForExportRequest::~QOrganizerItemFetchForExportRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the organizer item filter used to determine which organizer items will be retrieved to \a filter */
void QOrganizerItemFetchForExportRequest::setFilter(const QOrganizerItemFilter& filter)
{
diff --git a/src/organizer/requests/qorganizeritemfetchforexportrequest.h b/src/organizer/requests/qorganizeritemfetchforexportrequest.h
index f625197c6e..a462f50a88 100644
--- a/src/organizer/requests/qorganizeritemfetchforexportrequest.h
+++ b/src/organizer/requests/qorganizeritemfetchforexportrequest.h
@@ -61,6 +61,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemFetchForExportRequest : public QOrganizer
public:
QOrganizerItemFetchForExportRequest(QObject* parent = 0);
+ ~QOrganizerItemFetchForExportRequest();
/* Selection, restriction and sorting */
void setFilter(const QOrganizerItemFilter& filter);
diff --git a/src/organizer/requests/qorganizeritemfetchrequest.cpp b/src/organizer/requests/qorganizeritemfetchrequest.cpp
index d07a066e7f..b9cb8b7810 100644
--- a/src/organizer/requests/qorganizeritemfetchrequest.cpp
+++ b/src/organizer/requests/qorganizeritemfetchrequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemFetchRequest::QOrganizerItemFetchRequest(QObject* parent)
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemFetchRequest::~QOrganizerItemFetchRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the organizer item filter used to determine which organizer items will be retrieved to \a filter */
void QOrganizerItemFetchRequest::setFilter(const QOrganizerItemFilter& filter)
{
diff --git a/src/organizer/requests/qorganizeritemfetchrequest.h b/src/organizer/requests/qorganizeritemfetchrequest.h
index 77d1314995..32a1851af1 100644
--- a/src/organizer/requests/qorganizeritemfetchrequest.h
+++ b/src/organizer/requests/qorganizeritemfetchrequest.h
@@ -61,6 +61,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemFetchRequest : public QOrganizerAbstractR
public:
QOrganizerItemFetchRequest(QObject* parent = 0);
+ ~QOrganizerItemFetchRequest();
/* Selection, restriction and sorting */
void setFilter(const QOrganizerItemFilter& filter);
diff --git a/src/organizer/requests/qorganizeritemidfetchrequest.cpp b/src/organizer/requests/qorganizeritemidfetchrequest.cpp
index 6977f657cf..c59a9d6d30 100644
--- a/src/organizer/requests/qorganizeritemidfetchrequest.cpp
+++ b/src/organizer/requests/qorganizeritemidfetchrequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemIdFetchRequest::QOrganizerItemIdFetchRequest(QObject* parent)
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemIdFetchRequest::~QOrganizerItemIdFetchRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the filter which will be used to select the organizer items whose ids will be returned to \a filter */
void QOrganizerItemIdFetchRequest::setFilter(const QOrganizerItemFilter& filter)
{
diff --git a/src/organizer/requests/qorganizeritemidfetchrequest.h b/src/organizer/requests/qorganizeritemidfetchrequest.h
index bcd16fe31f..fc7011dae4 100644
--- a/src/organizer/requests/qorganizeritemidfetchrequest.h
+++ b/src/organizer/requests/qorganizeritemidfetchrequest.h
@@ -59,6 +59,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemIdFetchRequest : public QOrganizerAbstrac
public:
QOrganizerItemIdFetchRequest(QObject* parent = 0);
+ ~QOrganizerItemIdFetchRequest();
/* Selection, restriction and sorting */
void setFilter(const QOrganizerItemFilter& filter);
diff --git a/src/organizer/requests/qorganizeritemoccurrencefetchrequest.cpp b/src/organizer/requests/qorganizeritemoccurrencefetchrequest.cpp
index c755a0073c..90e6d38da8 100644
--- a/src/organizer/requests/qorganizeritemoccurrencefetchrequest.cpp
+++ b/src/organizer/requests/qorganizeritemoccurrencefetchrequest.cpp
@@ -63,6 +63,12 @@ QOrganizerItemOccurrenceFetchRequest::QOrganizerItemOccurrenceFetchRequest(QObje
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemOccurrenceFetchRequest::~QOrganizerItemOccurrenceFetchRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*! Sets the parent item, whose occurrences are to be fetched to \a item. */
void QOrganizerItemOccurrenceFetchRequest::setParentItem(const QOrganizerItem &item)
{
diff --git a/src/organizer/requests/qorganizeritemoccurrencefetchrequest.h b/src/organizer/requests/qorganizeritemoccurrencefetchrequest.h
index 662768347e..0f35e15b87 100644
--- a/src/organizer/requests/qorganizeritemoccurrencefetchrequest.h
+++ b/src/organizer/requests/qorganizeritemoccurrencefetchrequest.h
@@ -61,6 +61,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemOccurrenceFetchRequest : public QOrganize
public:
QOrganizerItemOccurrenceFetchRequest(QObject* parent = 0);
+ ~QOrganizerItemOccurrenceFetchRequest();
void setParentItem(const QOrganizerItem& item);
void setStartDate(const QDateTime& date);
diff --git a/src/organizer/requests/qorganizeritemremoverequest.cpp b/src/organizer/requests/qorganizeritemremoverequest.cpp
index 57e9efad11..e48e302e05 100644
--- a/src/organizer/requests/qorganizeritemremoverequest.cpp
+++ b/src/organizer/requests/qorganizeritemremoverequest.cpp
@@ -63,6 +63,12 @@ QOrganizerItemRemoveRequest::QOrganizerItemRemoveRequest(QObject* parent)
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemRemoveRequest::~QOrganizerItemRemoveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*!
Sets the id of the organizer item which will be removed to \a organizeritemId.
Equivalent to calling:
diff --git a/src/organizer/requests/qorganizeritemremoverequest.h b/src/organizer/requests/qorganizeritemremoverequest.h
index 48f7682e49..80776e1fab 100644
--- a/src/organizer/requests/qorganizeritemremoverequest.h
+++ b/src/organizer/requests/qorganizeritemremoverequest.h
@@ -57,6 +57,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemRemoveRequest : public QOrganizerAbstract
public:
QOrganizerItemRemoveRequest(QObject* parent = 0);
+ ~QOrganizerItemRemoveRequest();
/* Selection */
void setItemId(const QOrganizerItemId& organizeritemId);
diff --git a/src/organizer/requests/qorganizeritemsaverequest.cpp b/src/organizer/requests/qorganizeritemsaverequest.cpp
index 0595531b9e..bff305e483 100644
--- a/src/organizer/requests/qorganizeritemsaverequest.cpp
+++ b/src/organizer/requests/qorganizeritemsaverequest.cpp
@@ -64,6 +64,12 @@ QOrganizerItemSaveRequest::QOrganizerItemSaveRequest(QObject* parent)
{
}
+/*! Frees memory in use by this request */
+QOrganizerItemSaveRequest::~QOrganizerItemSaveRequest()
+{
+ QOrganizerAbstractRequestPrivate::notifyEngine(this);
+}
+
/*!
Sets the organizer item to be saved to \a organizeritem.
Equivalent to calling:
diff --git a/src/organizer/requests/qorganizeritemsaverequest.h b/src/organizer/requests/qorganizeritemsaverequest.h
index 735851e911..245b13835b 100644
--- a/src/organizer/requests/qorganizeritemsaverequest.h
+++ b/src/organizer/requests/qorganizeritemsaverequest.h
@@ -57,6 +57,7 @@ class Q_ORGANIZER_EXPORT QOrganizerItemSaveRequest : public QOrganizerAbstractRe
public:
QOrganizerItemSaveRequest(QObject* parent = 0);
+ ~QOrganizerItemSaveRequest();
/* Selection */
void setItem(const QOrganizerItem& organizeritem);