fune/xpcom/string/nsStringStats.cpp
Emilio Cobos Álvarez de27e73e27 Bug 1893668 - Make string stats more obviously debug-only. r=xpcom-reviewers,mccr8
Also, make them relaxed atomic. Sequentially consistent atomics might
help paper concurrency issues in debug builds, and there's really no
good reason these counts need to be sequentially consistent.

Differential Revision: https://phabricator.services.mozilla.com/D208759
2024-04-26 17:25:51 +00:00

68 lines
2 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsStringStats.h"
#ifdef DEBUG
# include "mozilla/IntegerPrintfMacros.h"
# include "mozilla/MemoryReporting.h"
# include "nsString.h"
# include <stdint.h>
# include <stdio.h>
# ifdef XP_WIN
# include <windows.h>
# include <process.h>
# else
# include <unistd.h>
# include <pthread.h>
# endif
nsStringStats gStringStats;
nsStringStats::~nsStringStats() {
// this is a hack to suppress duplicate string stats printing
// in seamonkey as a result of the string code being linked
// into seamonkey and libxpcom! :-(
if (!mAllocCount && !mAdoptCount) {
return;
}
// Only print the stats if we detect a leak.
if (mAllocCount <= mFreeCount && mAdoptCount <= mAdoptFreeCount) {
return;
}
printf("nsStringStats\n");
printf(" => mAllocCount: % 10d\n", int(mAllocCount));
printf(" => mReallocCount: % 10d\n", int(mReallocCount));
printf(" => mFreeCount: % 10d", int(mFreeCount));
if (mAllocCount > mFreeCount) {
printf(" -- LEAKED %d !!!\n", mAllocCount - mFreeCount);
} else {
printf("\n");
}
printf(" => mShareCount: % 10d\n", int(mShareCount));
printf(" => mAdoptCount: % 10d\n", int(mAdoptCount));
printf(" => mAdoptFreeCount: % 10d", int(mAdoptFreeCount));
if (mAdoptCount > mAdoptFreeCount) {
printf(" -- LEAKED %d !!!\n", mAdoptCount - mAdoptFreeCount);
} else {
printf("\n");
}
# ifdef XP_WIN
auto pid = uintptr_t(_getpid());
auto tid = uintptr_t(GetCurrentThreadId());
# else
auto pid = uintptr_t(getpid());
auto tid = uintptr_t(pthread_self());
# endif
printf(" => Process ID: %" PRIuPTR ", Thread ID: %" PRIuPTR "\n", pid, tid);
}
#endif