diff --git a/dexed-d/src/common.d b/dexed-d/src/common.d index 64921b3e..970ec5ba 100644 --- a/dexed-d/src/common.d +++ b/dexed-d/src/common.d @@ -18,11 +18,11 @@ export extern(C) void setRtOptions() //config.gc = "precise"; } -export extern(C) void minimizeGcHeap() +export extern(C) void minimizeGcHeap(bool now = false) { import core.memory : GC; __gshared ubyte c; - if (c++ > 31) + if (c++ > 31 || now) { GC.collect(); GC.minimize(); diff --git a/src/u_dexed_d.pas b/src/u_dexed_d.pas index 0c8b7c63..2a762adf 100644 --- a/src/u_dexed_d.pas +++ b/src/u_dexed_d.pas @@ -56,9 +56,9 @@ function d_rt_init(): integer; cdecl; external libdexedd_name; function d_rt_term(): integer; cdecl; external libdexedd_name; // Used to release memroy allocated in external D functions that are called in a thread, // because managing the GC only works from the main thread. -// Memory is released every 32 calls. +// Memory is released every 32 calls unless `now` is true. // This function must be called from the main thread. -procedure minimizeGcHeap(); cdecl; external libdexedd_name; +procedure minimizeGcHeap(const now: boolean = false); cdecl; external libdexedd_name; // noop procedure setRtOptions(); cdecl; external libdexedd_name; // Demangle a line possibly containing a D mangled name. diff --git a/src/u_synmemo.pas b/src/u_synmemo.pas index 31429232..fe159c12 100644 --- a/src/u_synmemo.pas +++ b/src/u_synmemo.pas @@ -1247,6 +1247,8 @@ begin if fTempFileName.fileExists then sysutils.DeleteFile(fTempFileName); + minimizeGcHeap(true); + inherited; end;