gecko-dev/mfbt/RefCounted.cpp
Jan de Mooij d50f648d3e Bug 1903037 part 1 - Support leak checking in MFBT code when included in SpiderMonkey. r=mccr8,glandium
`mozilla::StringBuffer` uses `RefCountLogger`, but this was a no-op when included in
SpiderMonkey code (`MOZILLA_INTERNAL_API` is not defined in that case). This resulted
in leakcheck failures when string buffers are used directly in SpiderMonkey.

This patch changes the calls to `NS_LogAddRef` and `NS_LogRelease` to go through a
function pointer. This also makes it possible to use a different implementation in
SpiderMonkey shell builds if we ever want to.

Differential Revision: https://phabricator.services.mozilla.com/D213968
2024-06-26 11:03:16 +00:00

37 lines
1.4 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 "mozilla/RefCounted.h"
namespace mozilla::detail {
#ifdef MOZ_REFCOUNTED_LEAK_CHECKING
MFBT_DATA LogAddRefFunc gLogAddRefFunc = nullptr;
MFBT_DATA LogReleaseFunc gLogReleaseFunc = nullptr;
MFBT_DATA size_t gNumStaticCtors = 0;
MFBT_DATA const char* gLastStaticCtorTypeName = nullptr;
MFBT_API void RefCountLogger::SetLeakCheckingFunctions(
LogAddRefFunc aLogAddRefFunc, LogReleaseFunc aLogReleaseFunc) {
if (gNumStaticCtors > 0) {
// RefCountLogger was used before this point. Print a warning, similar to
// ASSERT_ACTIVITY_IS_LEGAL. We do this here because SpiderMonkey standalone
// and shell builds don't call this function and we don't want to report any
// warnings in that case.
fprintf(stderr,
"RefCounted objects addrefed/released (static ctor?) total: %zu, "
"last type: %s\n",
gNumStaticCtors, gLastStaticCtorTypeName);
gNumStaticCtors = 0;
gLastStaticCtorTypeName = nullptr;
}
gLogAddRefFunc = aLogAddRefFunc;
gLogReleaseFunc = aLogReleaseFunc;
}
#endif // MOZ_REFCOUNTED_LEAK_CHECKING
} // namespace mozilla::detail