This repository has been archived by the owner on Jan 16, 2023. It is now read-only.
Fix a memory leak occuring whenever win_res() is called #372
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
win_res()
is called multiple times whensxiv
initializes, whenever an Xresource value is needed. For each call,win_res()
creates an Xresources database from a specified window display.XrmInitialize()
to initialize the Xresources managerXResourceManagerString()
to get a pointer to the XrmXrmGetStringDatabase()
with the pointer to get a pointer to a new Xresources databaseXrmGetResource()
with the database pointer to get theXrmValue
.The leak occurs because
win_res()
stores the database pointer as an automatic and does not callXrmDestroyDatabase()
before the pointer goes out of scope. The obvious fix is to callXrmDestroyDatabase()
before returning. But this is not performant; sincewin_res()
is called multiple times, we should avoid creating and destroying a database for each call.The proposed fix is to have
win_res()
store the Xresources manager pointer and the database pointer as local statics.win_res()
callsXrmInitialize()
,XResourceManagerString()
, andXrmGetStringDatabase()
once, if the Xresources manager pointer has never been set. Thereafter,win_res()
callsXrmGetResource()
with the static database pointer for whatever value is needed. The end result is the database is created once and all memory will be collected whensxiv
quits.If
XResourceManagerString()
returns a null pointer,win_res()
will continue to try to create a database for each call, but this will not be worse than the current situation.If
XrmGetStringDatabase()
returns a null pointer,win_res()
will return the given default value, as before, but a?:
operator is used instead of anif-else
statement.