Module Name: src Committed By: christos Date: Wed Apr 11 18:33:48 UTC 2018
Modified Files: src/external/apache2/mDNSResponder/dist/mDNSCore: DNSCommon.c DNSCommon.h mDNSEmbeddedAPI.h Log Message: Add the location of the last lock to help debugging. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 \ src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c \ src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h cvs rdiff -u -r1.1.1.5 -r1.2 \ src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c diff -u src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c:1.8 src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c:1.9 --- src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c:1.8 Sun Jan 14 15:04:55 2018 +++ src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.c Wed Apr 11 14:33:48 2018 @@ -3838,7 +3838,7 @@ mDNSexport mStatus mDNSSendDNSMessage(mD #pragma mark - RR List Management & Task Management #endif -mDNSexport void mDNS_Lock_(mDNS *const m, const char * const functionname) +mDNSexport void mDNS_Lock_(mDNS *const m, const char * const functionname, int lineno) { // MUST grab the platform lock FIRST! mDNSPlatformLock(m); @@ -3848,20 +3848,20 @@ mDNSexport void mDNS_Lock_(mDNS *const m // If that client callback does mDNS API calls, mDNS_reentrancy and mDNS_busy will both be one // If mDNS_busy != mDNS_reentrancy that's a bad sign if (m->mDNS_busy != m->mDNS_reentrancy) - LogFatalError("%s: mDNS_Lock: Locking failure! mDNS_busy (%ld) != mDNS_reentrancy (%ld)", functionname, m->mDNS_busy, m->mDNS_reentrancy); + LogFatalError("%s,%d: mDNS_Lock: Locking failure! mDNS_busy (%ld) != mDNS_reentrancy (%ld) (last %s,%d)", functionname, lineno, m->mDNS_busy, m->mDNS_reentrancy, m->mDNS_Lock_functionname, m->mDNS_Lock_lineno); // If this is an initial entry into the mDNSCore code, set m->timenow // else, if this is a re-entrant entry into the mDNSCore code, m->timenow should already be set if (m->mDNS_busy == 0) { if (m->timenow) - LogMsg("%s: mDNS_Lock: m->timenow already set (%ld/%ld)", functionname, m->timenow, mDNS_TimeNow_NoLock(m)); + LogMsg("%s,%d: mDNS_Lock: m->timenow already set (%ld/%ld)", functionname, lineno, m->timenow, mDNS_TimeNow_NoLock(m)); m->timenow = mDNS_TimeNow_NoLock(m); if (m->timenow == 0) m->timenow = 1; } else if (m->timenow == 0) { - LogMsg("%s: mDNS_Lock: m->mDNS_busy is %ld but m->timenow not set", functionname, m->mDNS_busy); + LogMsg("%s,%d: mDNS_Lock: m->mDNS_busy is %ld but m->timenow not set", functionname, lineno, m->mDNS_busy); m->timenow = mDNS_TimeNow_NoLock(m); if (m->timenow == 0) m->timenow = 1; } @@ -3869,13 +3869,15 @@ mDNSexport void mDNS_Lock_(mDNS *const m if (m->timenow_last - m->timenow > 0) { m->timenow_adjust += m->timenow_last - m->timenow; - LogMsg("%s: mDNSPlatformRawTime went backwards by %ld ticks; setting correction factor to %ld", functionname, m->timenow_last - m->timenow, m->timenow_adjust); + LogMsg("%s,%d: mDNSPlatformRawTime went backwards by %ld ticks; setting correction factor to %ld", functionname, lineno, m->timenow_last - m->timenow, m->timenow_adjust); m->timenow = m->timenow_last; } m->timenow_last = m->timenow; // Increment mDNS_busy so we'll recognise re-entrant calls m->mDNS_busy++; + m->mDNS_Lock_functionname = functionname; + m->mDNS_Lock_lineno = lineno; } mDNSlocal AuthRecord *AnyLocalRecordReady(const mDNS *const m) @@ -4011,20 +4013,21 @@ mDNSexport void ShowTaskSchedulingError( mDNS_Unlock(m); } -mDNSexport void mDNS_Unlock_(mDNS *const m, const char *const functionname) +mDNSexport void mDNS_Unlock_(mDNS *const m, const char *const functionname, int lineno) { // Decrement mDNS_busy m->mDNS_busy--; // Check for locking failures if (m->mDNS_busy != m->mDNS_reentrancy) - LogFatalError("%s: mDNS_Unlock: Locking failure! mDNS_busy (%ld) != mDNS_reentrancy (%ld)", functionname, m->mDNS_busy, m->mDNS_reentrancy); + LogFatalError("%s,%d: mDNS_Unlock: Locking failure! mDNS_busy (%ld) != mDNS_reentrancy (%ld) (last %s,%d)", functionname, lineno, m->mDNS_busy, + m->mDNS_reentrancy, m->mDNS_Lock_functionname, m->mDNS_Lock_lineno); // If this is a final exit from the mDNSCore code, set m->NextScheduledEvent and clear m->timenow if (m->mDNS_busy == 0) { m->NextScheduledEvent = GetNextScheduledEvent(m); - if (m->timenow == 0) LogMsg("%s: mDNS_Unlock: ERROR! m->timenow aready zero", functionname); + if (m->timenow == 0) LogMsg("%s,%d: mDNS_Unlock: ERROR! m->timenow aready zero", functionname, lineno); m->timenow = 0; } Index: src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h diff -u src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h:1.8 src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h:1.9 --- src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h:1.8 Sun Feb 25 15:04:56 2018 +++ src/external/apache2/mDNSResponder/dist/mDNSCore/mDNSEmbeddedAPI.h Wed Apr 11 14:33:48 2018 @@ -2319,6 +2319,8 @@ struct mDNS_struct // For debugging: To catch and report locking failures mDNSu32 mDNS_busy; // Incremented between mDNS_Lock/mDNS_Unlock section mDNSu32 mDNS_reentrancy; // Incremented when calling a client callback + const char *mDNS_Lock_functionname; // Where was the last lock taken + int mDNS_Lock_lineno; // and line number: mDNSu8 lock_rrcache; // For debugging: Set at times when these lists may not be modified mDNSu8 lock_Questions; mDNSu8 lock_Records; Index: src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h diff -u src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h:1.1.1.5 src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h:1.2 --- src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h:1.1.1.5 Sun Jan 14 14:40:51 2018 +++ src/external/apache2/mDNSResponder/dist/mDNSCore/DNSCommon.h Wed Apr 11 14:33:48 2018 @@ -288,16 +288,16 @@ extern mStatus mDNSSendDNSMessage(mDNS * #endif extern void ShowTaskSchedulingError(mDNS *const m); -extern void mDNS_Lock_(mDNS *const m, const char * const functionname); -extern void mDNS_Unlock_(mDNS *const m, const char * const functionname); +extern void mDNS_Lock_(mDNS *const m, const char * const functionname, int lineno); +extern void mDNS_Unlock_(mDNS *const m, const char * const functionname, int lineno); #if defined(_WIN32) #define __func__ __FUNCTION__ #endif -#define mDNS_Lock(X) mDNS_Lock_((X), __func__) +#define mDNS_Lock(X) mDNS_Lock_((X), __func__, __LINE__) -#define mDNS_Unlock(X) mDNS_Unlock_((X), __func__) +#define mDNS_Unlock(X) mDNS_Unlock_((X), __func__, __LINE__) #define mDNS_CheckLock(X) \ if ((X)->mDNS_busy != (X)->mDNS_reentrancy+1) LogMsg("%s: Lock not held! mDNS_busy (%ld) mDNS_reentrancy (%ld)", __func__, (X)->mDNS_busy, (X)->mDNS_reentrancy)