module xdiff_init; import core.stdc.stdlib : malloc, free, realloc; import std.exception : enforce; import xdiff; // твой низкоуровневый биндинг (xdiff.d) extern (C) private void* wrap_malloc(void*, uint size) { return malloc(size); } extern (C) private void wrap_free (void*, void* p) { free(p); } extern (C) private void* wrap_realloc(void*, void* p, uint size){ return realloc(p, size); } void ensureInit() { // локальная статика инициализируется один раз на процесс static bool done = false; if (done) return; memallocator_t m; m.priv = null; m.malloc = &wrap_malloc; m.free = &wrap_free; m.realloc = &wrap_realloc; enforce(xdl_set_allocator(&m) == 0, "xdl_set_allocator failed"); done = true; } mmfile_t initMmfile(size_t len) { ensureInit(); mmfile_t mf; enforce(xdl_init_mmfile(&mf, cast(long)len, XDL_MMF_ATOMIC) == 0, "xdl_init_mmfile failed"); return mf; }