杂项

类型

内省 introspector

(查看(类、函数等)内部情况)

Koffi 2.0 中的新功能:koffi.resolve()、Koffi 2.2 中的新功能:koffi.offsetof()

用于koffi.introspect(type)获取有关类型的详细信息:名称、基元、大小、对齐方式、成员(记录类型)、引用类型(数组、指针)和长度(数组)。

const FoobarType = koffi.struct('FoobarType', {
    a: 'int',
    b: 'char *',
    c: 'double'
});

console.log(koffi.introspect(FoobarType));

// Expected result on 64-bit machines:
// {
//     name: 'FoobarType',
//     primitive: 'Record',
//     size: 24,
//     alignment: 8,
//     members: {
//         a: { name: 'a', type: [External: 4b28a60], offset: 0 },
//         b: { name: 'b', type: [External: 4b292e0], offset: 8 },
//         c: { name: 'c', type: [External: 4b29260], offset: 16 }
//     }
// }

Koffi 还公开了更多实用函数来获取此信息的子集:

  • koffi.sizeof(type)获取类型的大小

  • koffi.alignof(type)获取类型的对齐方式

  • koffi.offsetof(type, member_name)获取记录成员的偏移量

  • koffi.resolve(type)从类型字符串中获取已解析的类型对象

就像以前一样,您可以通过名称或通过以下方式koffi.types引用原始类型:

// These two lines do the same:
console.log(koffi.sizeof('long'));
console.log(koffi.sizeof(koffi.types.long));

别名 Aliases

Koffi 2.0 中的新功能

您可以使用koffi.alias(name, type)为类型别名。别名类型是完全等价的。

设置

内存使用情况

对于同步/普通调用,Koffi 使用两个预分配的内存块:

  • 用于构造 C 堆栈并分配寄存器,随后由特定于平台的汇编代码使用(默认情况下为 1 MiB)

  • 用于分配字符串和大对象/结构(默认为 2 MiB)

除非使用非常大的字符串或对象(至少超过一页内存),否则 Koffi 在调用或回调期间不会直接分配任何额外的内存。但是,请注意 JS 引擎 (V8) 可能会这样。

这些预分配块的大小(以字节为单位)可以更改。用于koffi.config()获取具有设置的对象,并koffi.config(obj)应用新设置。

let config = koffi.config();
console.log(config);

异步调用也是如此。当进行异步调用时,Koffi 将分配新块,除非仍有未使用(常驻)的块集可用。异步调用完成后,如果周围剩下的块超过 resident_async_pools 组,这些块将被释放。

同一时间不能运行超过 max_async_calls 个异步调用。

默认设置

Setting
Default
Description

sync_stack_size

1 MiB

Stack size for synchronous calls

sync_heap_size

2 MiB

Heap size for synchronous calls

async_stack_size

256 kiB

Stack size for asynchronous calls

async_heap_size

512 kiB

Heap size for asynchronous calls

resident_async_pools

2

Number of resident pools for asynchronous calls

max_async_calls

64

Maximum number of ongoing asynchronous calls

max_type_size

64 MiB

Maximum size of Koffi types (for arrays and structs)

使用统计

Koffi 2.3.2 中的新功能

您可以用来koffi.stats()获取一些与 Koffi 相关的统计数据。

POSIX 错误代码

Koffi 2.3.14 中的新功能

您可以使用koffi.errno()获取当前 errno 值并koffi.errno(value)更改它。

标准的 POSIX 错误代码可在 中找到koffi.os.errno,如下所示

const assert = require('assert');

// ES6 syntax: import koffi from 'koffi';
const koffi = require('koffi');

const lib = koffi.load('libc.so.6');

const close = lib.func('int close(int fd)');

close(-1);
assert.equal(koffi.errno(), koffi.os.errno.EBADF);

console.log('close() with invalid FD is POSIX compliant!');

重置内部状态

Koffi 2.5.19 中的新功能

您可以使用koffi.reset()清除一些 Koffi 内部状态,例如:

  • 解析器类型名称

  • 异步函数代理(jest --detectOpenHandles有助于避免误报)

此函数主要用于测试代码,当您一遍又一遍地执行相同的代码并且需要重用类型名称时。

尝试使用在重置之前定义的函数或类型是未定义行为,很可能会导致崩溃!

Last updated