Tracking memory usage
Cauterite via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Mon Aug 8 02:26:55 PDT 2016
On Sunday, 7 August 2016 at 00:28:40 UTC, Alfred Pincher wrote:
> this is a very nice feature. I hope D has something similar?
If you want to implement that kind of allocation tracking you'll
probably want to use gc_getProxy()+gc_setProxy(). They're global
C functions you can access by declaring:
extern(C) gc.gcinterface.GC gc_getProxy() nothrow;
extern(C) void gc_setProxy(gc.gcinterface.GC);
First call gc_getProxy() to get the real GC instance and save it
somewhere.
Then call gc_setProxy() with your object implementing the GC
interface functions, and in each function forward to the
corresponding function of the real GC instance, after any
statistic-gathering code you want run.
Something like this:
__gshared GC RealGcInstance = gc_getProxy();
__gshared GC MyProxy = new class GC {
// ...
extern(C) void gc_free(void* Ptr) nothrow {
printf("freeing pointer %x\n", Ptr); // or whatever
return RealGcInstance.free(Ptr);
};
// ... etc.
};
gc_setProxy(MyProxy);
I haven't tested this method myself, but it will probably work.
Refer to
https://github.com/dlang/druntime/blob/master/src/gc/proxy.d and
https://github.com/dlang/druntime/blob/master/src/gc/gcinterface.d
Also remember that you can't invoke the GC from inside the proxy
functions. Using helper functions marked @nogc might make it
easier to avoid.
More information about the Digitalmars-d-learn
mailing list