Hello !
J'ai un dead lock lors de l'utilisation de QxOrm 1.2.3 beta 08, il m'est définitivement impossible de reproduire ça dans QxBlog, je pense que mon modèle de classes est devenu trop compliqué pour que j'arrive à extraire ça et le transposer.
Mais j'ai quand même regardé un peu et il y a des choses étranges:
J'ai inséré des qDebug() avec des numéros, dans mon analyse, j'appelerais chacun qN avec N le numéro donné en argument.
Voici le code où ça bloque (QxSqlRelation.h:100):
Il semblerait que ma trace d'execution fasse:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 virtual void init() { qDebug() << "1"; if (m_bInitInEvent) { return; }; m_bInitInEvent = true; qDebug() << "2"; QMutexLocker locker(& QxSqlRelation<DataType, Owner>::m_oMutex); qDebug() << "3"; m_pClass = QxClass<type_data>::getSingleton(); qDebug() << "4"; m_pClassOwner = QxClass<type_owner>::getSingleton(); qDebug() << "5"; m_pDataMemberX = (m_pClass ? m_pClass->getDataMemberX() : NULL); qDebug() << "6"; m_pDataMemberId = (m_pDataMemberX ? m_pDataMemberX->getId_WithDaoStrategy() : NULL); qDebug() << "7"; m_pDataMemberIdOwner = ((m_pClassOwner && m_pClassOwner->getDataMemberX()) ? m_pClassOwner->getDataMemberX()->getId_WithDaoStrategy() : NULL); qDebug() << "8"; m_lstDataMemberPtr = (& QxSqlRelation<DataType, Owner>::m_lstDataMember); qDebug() << "9"; m_lstSqlRelationPtr = (& QxSqlRelation<DataType, Owner>::m_lstSqlRelation); qDebug() << "10"; if (m_pClass) { m_oSoftDelete = m_pClass->getSoftDelete(); } qDebug() << "11"; qAssert(m_pClass && m_pClassOwner && m_pDataMember && m_pDataMemberX && m_pDataMemberId); qDebug() << "12"; if (getDataCount() > 0 || getRelationCount() > 0) { m_bInitInEvent = false; return; } qDebug() << "13"; IxDataMember * p = NULL; long lCount = m_pDataMemberX->count_WithDaoStrategy(); qDebug() << "14"; for (long l = 0; l < lCount; ++l) { if ((p = isValid_DataMember(l))) { m_lstDataMember.insert(p->getKey(), p); } } qDebug() << "15"; for (long l = 0; l < lCount; ++l) { if ((p = isValid_SqlRelation(l))) { m_lstSqlRelation.insert(p->getKey(), p->getSqlRelation()); } } qDebug() << "16"; m_bInitInEvent = false; qDebug() << "17"; }
q1.....q15 puis on rentre dans la boucle et à l'appel de isValid_SqlRelation, on rerentre dans le init(), sauf qu'on passe dans le if juste après q12, ce qui met le booléen m_bInitInEvent à false, et donc, au prochain élément de la boucle q15, le mutex va donc être re-bloqué -> dead lock.
D'une façon générale, pourquoi avoir mis le mutex en static ? Si c'est pour éviter d'avoir des problèmes de constantness, mieux vaut mettre le mot clé mutable devant.
Partager