Skip to content

Commit c6b3dae

Browse files
committed
Refactoring: reduce lock contention when adding cross references
1 parent a5f36b2 commit c6b3dae

File tree

6 files changed

+56
-56
lines changed

6 files changed

+56
-56
lines changed

src/definition.cpp

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,52 +1255,19 @@ bool DefinitionImpl::hasUserDocumentation() const
12551255
return hasDocs;
12561256
}
12571257

1258-
1259-
void DefinitionImpl::addSourceReferencedBy(MemberDef *md)
1258+
void DefinitionImpl::addSourceReferencedBy(MemberDef *md,const QCString &sourceRefName)
12601259
{
12611260
if (md)
12621261
{
1263-
QCString name = md->name();
1264-
QCString scope = md->getScopeString();
1265-
1266-
if (!scope.isEmpty())
1267-
{
1268-
name.prepend(scope+"::");
1269-
}
1270-
else if (md->isStatic() && md->getFileDef())
1271-
{
1272-
name.prepend(md->getFileDef()->name()+":");
1273-
}
1274-
if (md->isCallable())
1275-
{
1276-
name.append(md->argsString());
1277-
}
1278-
1279-
m_impl->sourceRefByDict.insert({name.str(),md});
1262+
m_impl->sourceRefByDict.insert({sourceRefName.str(),md});
12801263
}
12811264
}
12821265

1283-
void DefinitionImpl::addSourceReferences(MemberDef *md)
1266+
void DefinitionImpl::addSourceReferences(MemberDef *md,const QCString &sourceRefName)
12841267
{
12851268
if (md)
12861269
{
1287-
QCString name = md->name();
1288-
QCString scope = md->getScopeString();
1289-
1290-
if (!scope.isEmpty())
1291-
{
1292-
name.prepend(scope+"::");
1293-
}
1294-
else if (md->isStatic() && md->getFileDef())
1295-
{
1296-
name.prepend(md->getFileDef()->name()+":");
1297-
}
1298-
if (md->isCallable())
1299-
{
1300-
name.append(md->argsString());
1301-
}
1302-
1303-
m_impl->sourceRefsDict.insert({name.str(),md});
1270+
m_impl->sourceRefsDict.insert({sourceRefName.str(),md});
13041271
}
13051272
}
13061273

src/definition.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ class Definition
277277
virtual bool hasSections() const = 0;
278278
virtual bool hasSources() const = 0;
279279

280+
280281
/** returns TRUE if this class has a brief description */
281282
virtual bool hasBriefDescription() const = 0;
282283

@@ -360,8 +361,8 @@ class DefinitionMutable
360361
* documentation.
361362
*/
362363
virtual void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList) = 0;
363-
virtual void addSourceReferencedBy(MemberDef *d) = 0;
364-
virtual void addSourceReferences(MemberDef *d) = 0;
364+
virtual void addSourceReferencedBy(MemberDef *d,const QCString &sourceRefName) = 0;
365+
virtual void addSourceReferences(MemberDef *d,const QCString &sourceRefName) = 0;
365366
virtual void mergeRefItems(Definition *d) = 0;
366367
virtual void addInnerCompound(Definition *d) = 0;
367368
virtual void addSectionsToIndex() = 0;

src/definitionimpl.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ class DefinitionImpl
9696
void addSectionsToDefinition(const std::vector<const SectionInfo*> &anchorList);
9797
void setBodySegment(int defLine,int bls,int ble);
9898
void setBodyDef(const FileDef *fd);
99-
void addSourceReferencedBy(MemberDef *d);
100-
void addSourceReferences(MemberDef *d);
99+
void addSourceReferencedBy(MemberDef *d,const QCString &sourceRefName);
100+
void addSourceReferences(MemberDef *d,const QCString &sourceRefName);
101101
void setRefItems(const RefItemVector &sli);
102102
void mergeRefItems(Definition *d);
103103
void mergeReferences(const Definition *other);
@@ -230,10 +230,10 @@ class DefinitionMixin : public Base
230230
{ m_impl.setBodySegment(defLine,bls,ble); }
231231
void setBodyDef(const FileDef *fd) override
232232
{ m_impl.setBodyDef(fd); }
233-
void addSourceReferencedBy(MemberDef *md) override
234-
{ m_impl.addSourceReferencedBy(md); }
235-
void addSourceReferences(MemberDef *md) override
236-
{ m_impl.addSourceReferences(md); }
233+
void addSourceReferencedBy(MemberDef *md,const QCString &sourceRefName) override
234+
{ m_impl.addSourceReferencedBy(md,sourceRefName); }
235+
void addSourceReferences(MemberDef *md,const QCString &sourceRefName) override
236+
{ m_impl.addSourceReferences(md,sourceRefName); }
237237
void setRefItems(const RefItemVector &sli) override
238238
{ m_impl.setRefItems(sli); }
239239
void mergeRefItems(Definition *def) override

src/memberdef.cpp

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
227227
bool hasReferencedByRelation() const override;
228228
bool hasEnumValues() const override;
229229
bool hasInlineSource() const override;
230+
QCString sourceRefName() const override;
230231
const MemberDef *templateMaster() const override;
231232
QCString getScopeString() const override;
232233
ClassDef *getClassDefOfAnonymousType() const override;
@@ -867,6 +868,8 @@ class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
867868
{ return getMdAlias()->hasReferencedByRelation(); }
868869
bool hasInlineSource() const override
869870
{ return getMdAlias()->hasInlineSource(); }
871+
QCString sourceRefName() const override
872+
{ return getMdAlias()->sourceRefName(); }
870873
bool hasEnumValues() const override
871874
{ return getMdAlias()->hasEnumValues(); }
872875
StringVector getQualifiers() const override
@@ -1623,6 +1626,26 @@ bool MemberDefImpl::hasExamples() const
16231626
return !m_examples.empty();
16241627
}
16251628

1629+
QCString MemberDefImpl::sourceRefName() const
1630+
{
1631+
QCString n = name();
1632+
QCString s = getScopeString();
1633+
1634+
if (!s.isEmpty())
1635+
{
1636+
n.prepend(s+"::");
1637+
}
1638+
else if (isStatic() && getFileDef())
1639+
{
1640+
n.prepend(getFileDef()->name()+":");
1641+
}
1642+
if (isCallable())
1643+
{
1644+
n.append(argsString());
1645+
}
1646+
return n;
1647+
}
1648+
16261649
QCString MemberDefImpl::getOutputFileBase() const
16271650
{
16281651
bool separateMemberPages = Config_getBool(SEPARATE_MEMBER_PAGES);
@@ -6327,39 +6350,46 @@ void addDocCrossReference(const MemberDef *s,const MemberDef *d)
63276350
MemberDefMutable *src = toMemberDefMutable(const_cast<MemberDef*>(s));
63286351
MemberDefMutable *dst = toMemberDefMutable(const_cast<MemberDef*>(d));
63296352
if (src==nullptr || dst==nullptr) return;
6330-
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
63316353
//printf("--> addDocCrossReference src=%s,dst=%s\n",qPrint(src->name()),qPrint(dst->name()));
63326354
if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
63336355
if ((dst->hasReferencedByRelation() || dst->hasCallerGraph()) &&
63346356
src->isCallable()
63356357
)
63366358
{
6337-
dst->addSourceReferencedBy(src);
6359+
QCString sourceRefName = src->sourceRefName();
63386360
MemberDefMutable *mdDef = toMemberDefMutable(dst->memberDefinition());
6361+
MemberDefMutable *mdDecl = toMemberDefMutable(dst->memberDeclaration());
6362+
6363+
// critical section
6364+
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6365+
dst->addSourceReferencedBy(src,sourceRefName);
63396366
if (mdDef)
63406367
{
6341-
mdDef->addSourceReferencedBy(src);
6368+
mdDef->addSourceReferencedBy(src,sourceRefName);
63426369
}
6343-
MemberDefMutable *mdDecl = toMemberDefMutable(dst->memberDeclaration());
63446370
if (mdDecl)
63456371
{
6346-
mdDecl->addSourceReferencedBy(src);
6372+
mdDecl->addSourceReferencedBy(src,sourceRefName);
63476373
}
63486374
}
63496375
if ((src->hasReferencesRelation() || src->hasCallGraph()) &&
63506376
src->isCallable()
63516377
)
63526378
{
6353-
src->addSourceReferences(dst);
6379+
QCString sourceRefName = dst->sourceRefName();
63546380
MemberDefMutable *mdDef = toMemberDefMutable(src->memberDefinition());
6381+
MemberDefMutable *mdDecl = toMemberDefMutable(src->memberDeclaration());
6382+
6383+
// critical section
6384+
std::lock_guard<std::mutex> lock(g_docCrossReferenceMutex);
6385+
src->addSourceReferences(dst,sourceRefName);
63556386
if (mdDef)
63566387
{
6357-
mdDef->addSourceReferences(dst);
6388+
mdDef->addSourceReferences(dst,sourceRefName);
63586389
}
6359-
MemberDefMutable *mdDecl = toMemberDefMutable(src->memberDeclaration());
63606390
if (mdDecl)
63616391
{
6362-
mdDecl->addSourceReferences(dst);
6392+
mdDecl->addSourceReferences(dst,sourceRefName);
63636393
}
63646394
}
63656395
}

src/memberdef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ class MemberDef : public Definition
243243
virtual bool hasInlineSource() const = 0;
244244
virtual bool hasEnumValues() const = 0;
245245

246+
virtual QCString sourceRefName() const = 0;
247+
246248
virtual const MemberDef *templateMaster() const = 0;
247249
virtual QCString getScopeString() const = 0;
248250
virtual ClassDef *getClassDefOfAnonymousType() const = 0;

src/symbolresolver.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,10 +534,10 @@ const Definition *SymbolResolver::Private::getResolvedSymbolRec(
534534
}
535535

536536
{
537+
LookupInfo lookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType);
537538
std::lock_guard lock(g_cacheMutex);
538539
// we need to insert the item in the cache again, as it could be removed in the meantime
539-
Doxygen::symbolLookupCache->insert(key,
540-
LookupInfo(bestMatch,bestTypedef,bestTemplSpec,bestResolvedType));
540+
Doxygen::symbolLookupCache->insert(key,std::move(lookupInfo));
541541
}
542542
visitedKeys.erase(std::remove(visitedKeys.begin(),visitedKeys.end(),key),visitedKeys.end());
543543

0 commit comments

Comments
 (0)