diff options
author | Chris Adams <christopher.adams@nokia.com> | 2010-11-12 14:26:09 +1000 |
---|---|---|
committer | Chris Adams <christopher.adams@nokia.com> | 2010-11-12 14:49:08 +1000 |
commit | 0e58b3d58d0773c69b09e1a52aac4b5f29d46312 (patch) | |
tree | ebe4c0e20f4106c7320118a12f94f70c9803b2ee | |
parent | 9cf50958db0f536e2396c5005eb99394f9f6a7e8 (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
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); |