-
Notifications
You must be signed in to change notification settings - Fork 314
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Avoid allocations during global initialization
Instead, explicitly start lifetime of globals on library initialization. This is achieved by using the new ControlledLifetimeResource class. This can be used as a wrapper around globals to explicitly initialize and shutdown the objects. This wrapper has been applied to all non-trivial global data in RmlUi. Thus, there should no longer be any memory allocations occurring before `main()` when linking in RmlUi. We now give a warning if there are objects in user space that refer to any RmlUi resources at the end of `Rml::Shutdown`, as this prevents the library from cleaning up memory pools. Other than the warning, the behavior should be the same as previously. Breaking change: `Rml::ReleaseMemoryPools` is no longer exposed publicly. This function is automatically called during shutdown and should not be used manually.
- Loading branch information
Showing
41 changed files
with
982 additions
and
592 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* This source file is part of RmlUi, the HTML/CSS Interface Middleware | ||
* | ||
* For the latest information, see http://github.com/mikke89/RmlUi | ||
* | ||
* Copyright (c) 2019-2024 The RmlUi Team, and contributors | ||
* | ||
* Permission is hereby granted, free of charge, to any person obtaining a copy | ||
* of this software and associated documentation files (the "Software"), to deal | ||
* in the Software without restriction, including without limitation the rights | ||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
* copies of the Software, and to permit persons to whom the Software is | ||
* furnished to do so, subject to the following conditions: | ||
* | ||
* The above copyright notice and this permission notice shall be included in | ||
* all copies or substantial portions of the Software. | ||
* | ||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
* THE SOFTWARE. | ||
* | ||
*/ | ||
|
||
#ifndef RMLUI_CORE_CONTROLLEDLIFETIMERESOURCE_H | ||
#define RMLUI_CORE_CONTROLLEDLIFETIMERESOURCE_H | ||
|
||
#include "../../Include/RmlUi/Core/Debug.h" | ||
#include "../../Include/RmlUi/Core/Traits.h" | ||
|
||
namespace Rml { | ||
|
||
template <typename T> | ||
class ControlledLifetimeResource : NonCopyMoveable { | ||
public: | ||
ControlledLifetimeResource() = default; | ||
~ControlledLifetimeResource() noexcept { RMLUI_ASSERTMSG(!pointer || intentionally_leaked, "Resource was not properly shut down."); } | ||
|
||
explicit operator bool() const noexcept { return pointer != nullptr; } | ||
|
||
void Initialize() | ||
{ | ||
RMLUI_ASSERTMSG(!pointer, "Resource already initialized."); | ||
pointer = new T(); | ||
} | ||
|
||
void InitializeIfEmpty() | ||
{ | ||
if (!pointer) | ||
Initialize(); | ||
else | ||
SetIntentionallyLeaked(false); | ||
} | ||
|
||
void Leak() { SetIntentionallyLeaked(true); } | ||
|
||
void Shutdown() | ||
{ | ||
RMLUI_ASSERTMSG(pointer, "Shutting down resource that was not initialized, or has been shut down already."); | ||
RMLUI_ASSERTMSG(!intentionally_leaked, "Shutting down resource that was marked as leaked."); | ||
delete pointer; | ||
pointer = nullptr; | ||
} | ||
|
||
T* operator->() | ||
{ | ||
RMLUI_ASSERTMSG(pointer, "Resource used before it was initialized, or after it was shut down."); | ||
return pointer; | ||
} | ||
|
||
private: | ||
#ifdef RMLUI_DEBUG | ||
void SetIntentionallyLeaked(bool leaked) { intentionally_leaked = leaked; } | ||
bool intentionally_leaked = false; | ||
#else | ||
void SetIntentionallyLeaked(bool /*leaked*/) {} | ||
#endif | ||
|
||
T* pointer = nullptr; | ||
}; | ||
|
||
} // namespace Rml | ||
#endif |
Oops, something went wrong.