Bug 1961714 - Fix reenterant calls in logalloc r=glandium

TLS was causing a reenterant call to malloc which would deadlock in
logalloc.  If we take the logalloc lock after the call to the allocator we
avoid this.

Differential Revision: https://phabricator.services.mozilla.com/D246167
This commit is contained in:
Paul Bone
2025-04-30 05:26:59 +00:00
parent 875344009d
commit 347c0ac1ff

View File

@@ -62,70 +62,72 @@ class LogAllocBridge : public ReplaceMallocBridge {
*/
static void* replace_malloc(size_t aSize) {
MutexAutoLock lock(sMutex);
void* ptr = sFuncs.malloc(aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu malloc(%zu)=%p\n", GetPid(), GetTid(), aSize, ptr);
return ptr;
}
static int replace_posix_memalign(void** aPtr, size_t aAlignment,
size_t aSize) {
MutexAutoLock lock(sMutex);
int ret = sFuncs.posix_memalign(aPtr, aAlignment, aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu posix_memalign(%zu,%zu)=%p\n", GetPid(), GetTid(),
aAlignment, aSize, (ret == 0) ? *aPtr : nullptr);
return ret;
}
static void* replace_aligned_alloc(size_t aAlignment, size_t aSize) {
MutexAutoLock lock(sMutex);
void* ptr = sFuncs.aligned_alloc(aAlignment, aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu aligned_alloc(%zu,%zu)=%p\n", GetPid(), GetTid(),
aAlignment, aSize, ptr);
return ptr;
}
static void* replace_calloc(size_t aNum, size_t aSize) {
MutexAutoLock lock(sMutex);
void* ptr = sFuncs.calloc(aNum, aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu calloc(%zu,%zu)=%p\n", GetPid(), GetTid(), aNum, aSize,
ptr);
return ptr;
}
static void* replace_realloc(void* aPtr, size_t aSize) {
MutexAutoLock lock(sMutex);
void* new_ptr = sFuncs.realloc(aPtr, aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu realloc(%p,%zu)=%p\n", GetPid(), GetTid(), aPtr, aSize,
new_ptr);
return new_ptr;
}
static void replace_free(void* aPtr) {
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu free(%p)\n", GetPid(), GetTid(), aPtr);
{
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu free(%p)\n", GetPid(), GetTid(), aPtr);
}
sFuncs.free(aPtr);
}
static void* replace_memalign(size_t aAlignment, size_t aSize) {
MutexAutoLock lock(sMutex);
void* ptr = sFuncs.memalign(aAlignment, aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu memalign(%zu,%zu)=%p\n", GetPid(), GetTid(),
aAlignment, aSize, ptr);
return ptr;
}
static void* replace_valloc(size_t aSize) {
MutexAutoLock lock(sMutex);
void* ptr = sFuncs.valloc(aSize);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu valloc(%zu)=%p\n", GetPid(), GetTid(), aSize, ptr);
return ptr;
}
static void replace_jemalloc_stats(jemalloc_stats_t* aStats,
jemalloc_bin_stats_t* aBinStats) {
MutexAutoLock lock(sMutex);
sFuncs.jemalloc_stats_internal(aStats, aBinStats);
MutexAutoLock lock(sMutex);
FdPrintf(sFd, "%zu %zu jemalloc_stats()\n", GetPid(), GetTid());
}