繁体   English   中英

如何确保 wasm memory 从 JavaScript 使用时被释放

[英]How to ensure wasm memory is freed when using it from JavaScript

我有一个 C 库,如下所示:

struct timeseries *ts_create(void) {
    /* Allocate some memory and return a pointer. */
}

void ts_free(struct timeseries *p) {
    /* Free the memory block pointed to by p. */
}

/* And many other functions that receive a struct timeseries * and
 * do things to it.
 */

我用emscripten编译了它,我正在为它创建一个 JavaScript 接口(包装器),如下所示:

const timeseries = {
  ptimeseries: 0,

  initialize() {
    this.ptimeseries = cfunctions.ts_create();
  },

  destroy() {
    cfunctions.ts_free(this.ptimeseries);
  },

  // And many other functions
}

你可以这样使用它:

const myTimeseries = Object.create(timeseries);
try {
  myTimeseries.initialize();
  // do more things
} finally {
  myTimeseries.destroy();
}

问题是我想在 C(或 JavaScript 包装器)中保留“危险”的东西,即 memory 分配和释放,以便 JavaScript 程序员可以安全地使用生成的库。 JavaScript 程序员习惯于对象自动释放自己,并要求他们添加某种try... finally语句很容易出错。

但据我所知,JavaScript 没有任何 object 析构函数或任何类型的onGarbageCollect(object)事件。

我该怎么办?

有一个名为 FinalizationRegistry 的新功能 JavaScript,您可以将其用于此功能,但请注意,并非所有浏览器都支持它 ( https://caniuse.com/mdn-javascript_builtins_finalizationregistry )

const registry = new FinalizationRegistry((heldValue) => {
  cfunctions.ts_free(heldValue);
});

class Timeseries {
  constructor() {
    this.ptimeseries = cfunctions.ts_create();
    registry.register(this, this.ptimeseries, this);
  }

  destroy() { // manual destructor for backup, you don't have to call this
    registry.unregister(this);
    cfunctions.ts_free(this.ptimeseries);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM