mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-28 23:15:52 +00:00
Fix File::nonexistent false leak using SharedSingleton
This commit is contained in:
@@ -21,6 +21,32 @@
|
||||
*/
|
||||
//==============================================================================
|
||||
|
||||
// We need to make a shared singleton or else there are
|
||||
// issues with the leak detector and order of detruction.
|
||||
//
|
||||
class NonexistentHolder : public SharedSingleton <NonexistentHolder>
|
||||
{
|
||||
public:
|
||||
NonexistentHolder ()
|
||||
: SharedSingleton <NonexistentHolder> (SingletonLifetime::persistAfterCreation)
|
||||
{
|
||||
}
|
||||
|
||||
static NonexistentHolder* createInstance ()
|
||||
{
|
||||
return new NonexistentHolder;
|
||||
}
|
||||
|
||||
File const file;
|
||||
};
|
||||
|
||||
File const& File::nonexistent ()
|
||||
{
|
||||
return NonexistentHolder::getInstance ()->file;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
File::File (const String& fullPathName)
|
||||
: fullPath (parseAbsolutePath (fullPathName))
|
||||
{
|
||||
@@ -67,9 +93,6 @@ File& File::operator= (File&& other) noexcept
|
||||
}
|
||||
#endif
|
||||
|
||||
const File File::nonexistent;
|
||||
|
||||
|
||||
//==============================================================================
|
||||
String File::parseAbsolutePath (const String& p)
|
||||
{
|
||||
@@ -321,7 +344,7 @@ String File::getFileNameWithoutExtension() const
|
||||
|
||||
bool File::isAChildOf (const File& potentialParent) const
|
||||
{
|
||||
if (potentialParent == File::nonexistent)
|
||||
if (potentialParent == File::nonexistent ())
|
||||
return false;
|
||||
|
||||
const String ourPath (getPathUpToLastSlash());
|
||||
@@ -633,7 +656,7 @@ bool File::hasFileExtension (const String& possibleSuffix) const
|
||||
File File::withFileExtension (const String& newExtension) const
|
||||
{
|
||||
if (fullPath.isEmpty())
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
|
||||
String filePart (getFileName());
|
||||
|
||||
@@ -914,7 +937,7 @@ public:
|
||||
const File home (File::getSpecialLocation (File::userHomeDirectory));
|
||||
const File temp (File::getSpecialLocation (File::tempDirectory));
|
||||
|
||||
expect (! File::nonexistent.exists());
|
||||
expect (! File::nonexistent ().exists());
|
||||
expect (home.isDirectory());
|
||||
expect (home.exists());
|
||||
expect (! home.existsAsFile());
|
||||
|
||||
@@ -53,7 +53,7 @@ public:
|
||||
/** Creates an (invalid) file object.
|
||||
|
||||
The file is initially set to an empty path, so getFullPath() will return
|
||||
an empty string, and comparing the file to File::nonexistent will return
|
||||
an empty string, and comparing the file to File::nonexistent() will return
|
||||
true.
|
||||
|
||||
You can use its operator= method to point it at a proper file.
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
|
||||
//==============================================================================
|
||||
/** This static constant is used for referring to an 'invalid' file. */
|
||||
static const File nonexistent;
|
||||
static File const& nonexistent ();
|
||||
|
||||
//==============================================================================
|
||||
/** Checks whether the file actually exists.
|
||||
|
||||
@@ -45,7 +45,7 @@ TemporaryFile::TemporaryFile (const File& target, const int optionFlags)
|
||||
targetFile (target)
|
||||
{
|
||||
// If you use this constructor, you need to give it a valid target file!
|
||||
bassert (targetFile != File::nonexistent);
|
||||
bassert (targetFile != File::nonexistent ());
|
||||
}
|
||||
|
||||
TemporaryFile::TemporaryFile (const File& target, const File& temporary)
|
||||
@@ -74,7 +74,7 @@ bool TemporaryFile::overwriteTargetFileWithTemporary() const
|
||||
{
|
||||
// This method only works if you created this object with the constructor
|
||||
// that takes a target file!
|
||||
bassert (targetFile != File::nonexistent);
|
||||
bassert (targetFile != File::nonexistent ());
|
||||
|
||||
if (temporaryFile.exists())
|
||||
{
|
||||
|
||||
@@ -127,7 +127,7 @@ File File::getSpecialLocation (const SpecialLocationType type)
|
||||
break;
|
||||
}
|
||||
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
@@ -213,7 +213,7 @@ File File::getSpecialLocation (const SpecialLocationType type)
|
||||
break;
|
||||
}
|
||||
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
@@ -213,7 +213,7 @@ File File::getSpecialLocation (const SpecialLocationType type)
|
||||
break;
|
||||
}
|
||||
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
@@ -251,7 +251,7 @@ File File::getSpecialLocation (const SpecialLocationType type)
|
||||
return File (resultPath.convertToPrecomposedUnicode());
|
||||
}
|
||||
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
||||
@@ -88,7 +88,7 @@ namespace WindowsFileHelpers
|
||||
if (SHGetSpecialFolderPath (0, path, type, FALSE))
|
||||
return File (String (path));
|
||||
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
File getModuleFileName (HINSTANCE moduleHandle)
|
||||
@@ -536,7 +536,7 @@ File BEAST_CALLTYPE File::getSpecialLocation (const SpecialLocationType type)
|
||||
|
||||
default:
|
||||
bassertfalse; // unknown type?
|
||||
return File::nonexistent;
|
||||
return File::nonexistent ();
|
||||
}
|
||||
|
||||
return WindowsFileHelpers::getSpecialFolderPath (csidlType);
|
||||
|
||||
@@ -30,7 +30,7 @@ PerformanceCounter::PerformanceCounter (const String& name_,
|
||||
totalTime (0),
|
||||
outputFile (loggingFile)
|
||||
{
|
||||
if (outputFile != File::nonexistent)
|
||||
if (outputFile != File::nonexistent ())
|
||||
{
|
||||
String s ("**** Counter for \"");
|
||||
s << name_ << "\" started at: "
|
||||
@@ -81,7 +81,7 @@ void PerformanceCounter::printStatistics()
|
||||
|
||||
s << newLine;
|
||||
|
||||
if (outputFile != File::nonexistent)
|
||||
if (outputFile != File::nonexistent ())
|
||||
outputFile.appendText (s, false, false);
|
||||
|
||||
numRuns = 0;
|
||||
|
||||
@@ -57,12 +57,13 @@ public:
|
||||
@param counterName the name used when printing out the statistics
|
||||
@param runsPerPrintout the number of start/stop iterations before calling
|
||||
printStatistics()
|
||||
@param loggingFile a file to dump the results to - if this is File::nonexistent,
|
||||
the results are just written to the debugger output
|
||||
@param loggingFile a file to dump the results to - if this is
|
||||
File::nonexistent (), the results are just written
|
||||
to the debugger output
|
||||
*/
|
||||
PerformanceCounter (const String& counterName,
|
||||
int runsPerPrintout = 100,
|
||||
const File& loggingFile = File::nonexistent);
|
||||
const File& loggingFile = File::nonexistent ());
|
||||
|
||||
/** Destructor. */
|
||||
~PerformanceCounter();
|
||||
|
||||
@@ -141,9 +141,9 @@ int rippleMain (int argc, char** argv)
|
||||
//
|
||||
Debug::setHeapReportLeaks (true);
|
||||
|
||||
//ThreadWithCallQueue t ("test");
|
||||
//GlobalPagedFreeStore::getInstance ();
|
||||
//t.start ();
|
||||
ThreadWithCallQueue t ("test");
|
||||
GlobalPagedFreeStore::getInstance ();
|
||||
t.start ();
|
||||
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user