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:
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user