diff options
author | John Ankarström <john@ankarstrom.se> | 2022-07-19 12:36:08 +0200 |
---|---|---|
committer | John Ankarström <john@ankarstrom.se> | 2022-07-19 12:36:08 +0200 |
commit | 61f7d770dbeb5df98b94d9e8cef0c4c86e396447 (patch) | |
tree | e0a3d42d578252a7d6b8d3a3e7ced4c75c15c8a2 | |
parent | 34c32802122ff80e79d850d44cbc84624d9a5840 (diff) | |
download | EpisodeBrowser-61f7d770dbeb5df98b94d9e8cef0c4c86e396447.tar.gz |
Use Prolog string buffer marks.
Speaking of unclear documentation, it is not obvious whether it is
necessary for programs calling into Prolog to manually mark and
release strings. I suppose that it should be, if the same logic that
applies to terms apply to strings.
On the other hand, the stack in which the strings are stored belongs
to Prolog, and there is nothing that would prevent Prolog from
cleaning up the strings when called at a later time. I am not sure.
But better safe than sorry, I guess.
The Mark class acts like the Frame class. The constructor and
destructor are equivalent to the PL_STRINGS_MARK and
PL_STRINGS_RELEASE macros.
Unlike for 34c3280, I did not notice any differences in memory usage
after this change. Perhaps that is because it has no effect; perhaps
it is because Prolog's stack is very big.
-rw-r--r-- | c/episodelistview.cpp | 3 | ||||
-rw-r--r-- | c/pl.cpp | 10 | ||||
-rw-r--r-- | c/pl.h | 8 |
3 files changed, 21 insertions, 0 deletions
diff --git a/c/episodelistview.cpp b/c/episodelistview.cpp index d3abf74..d43c3a7 100644 --- a/c/episodelistview.cpp +++ b/c/episodelistview.cpp @@ -284,6 +284,7 @@ void EpisodeListView::Update() if (!Pl("episode_data","episode_count",&cEp)) return; for (iEp = 1, iItem = 0; iEp <= cEp; iEp++) { + Mark m; extern char g_szLimitScreenwriter[]; extern int g_bViewTVOriginal, g_bViewWatched; @@ -355,6 +356,7 @@ void EpisodeListView::Update() /* Update episode name and rating. */ void EpisodeListView::UpdateItem(const LVITEM* const pLvi) { + Mark m; TCHAR* tszName; int iRating; static TCHAR tszRating[3]; @@ -427,6 +429,7 @@ int CALLBACK ElvSort(const LPARAM iItem1, const LPARAM iItem2, const LPARAM lExt } case ELVSITITLE: { + Mark m; char* sz1,* sz2; int cch, cch1, cch2; if (!Pl("episode_data","episode_title",lvi1.lParam,&sz1)) @@ -28,6 +28,16 @@ void Frame::Rewind() PL_rewind_foreign_frame(m_f); } +Mark::Mark() +{ + PL_mark_string_buffers(&m_m); +} + +Mark::~Mark() +{ + PL_release_string_buffers_from_mark(m_m); +} + Query::Query(const module_t ctx, const predicate_t p, const term_t t0) { m_q = PL_open_query(ctx, PL_Q_CATCH_EXCEPTION, p, t0); @@ -18,6 +18,14 @@ private: fid_t m_f; }; +struct Mark +{ + Mark(); + ~Mark(); +private: + buf_mark_t m_m; +}; + struct Query { Query(module_t ctx, predicate_t p, term_t t0); |