51 lines
1.4 KiB
TypeScript
Raw Normal View History

2019-03-26 23:35:08 +01:00
/// <reference path="./collector/index.d.ts" />
2019-03-28 11:07:47 +01:00
import { E_NOTIMPLEMENTED } from "./util/error";
// @ts-ignore
@lazy
var GC_ROOT = new Set<usize>();
2019-03-13 22:35:47 +01:00
/** Garbage collector interface. */
export namespace gc {
2019-03-14 04:33:58 +01:00
/** Whether the garbage collector interface is implemented. */
2019-03-14 06:09:49 +01:00
// @ts-ignore: decorator
@lazy
2019-03-28 11:07:47 +01:00
export const implemented: bool = isDefined(__ref_collect);
2019-03-13 22:35:47 +01:00
/** Performs a full garbage collection cycle. */
2019-03-14 04:33:58 +01:00
export function collect(): void {
2019-03-26 23:35:08 +01:00
if (isDefined(__ref_collect)) __ref_collect();
2019-03-28 11:07:47 +01:00
else throw new Error(E_NOTIMPLEMENTED);
}
2019-04-01 22:23:11 +02:00
/** Retains a managed object externally, making sure that it doesn't become collected. */
// @ts-ignore: decorator
@unsafe
2019-03-28 11:07:47 +01:00
export function retain(ref: usize): void {
var root = GC_ROOT;
if (!root.has(ref)) {
root.add(ref);
if (implemented) {
if (isDefined(__ref_link)) __ref_link(ref, changetype<usize>(root));
else if (isDefined(__ref_retain)) __ref_retain(ref);
}
}
}
2019-04-01 22:23:11 +02:00
/** Releases a managed object externally, allowing it to become collected. */
// @ts-ignore: decorator
@unsafe
2019-03-28 11:07:47 +01:00
export function release(ref: usize): void {
var root = GC_ROOT;
if (root.has(ref)) {
root.delete(ref);
if (implemented) {
2019-04-01 22:23:11 +02:00
if (isDefined(__ref_unlink)) __ref_unlink(ref, changetype<usize>(root));
else if (isDefined(__ref_release)) __ref_release(ref);
2019-03-28 11:07:47 +01:00
}
}
2019-03-13 22:35:47 +01:00
}
}