问题标签 [xs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在 XS 代码中安全地释放资源(在范围退出时运行析构函数)
我正在编写一个 XS 模块。我分配一些资源(例如malloc()
or SvREFCNT_inc()
)然后做一些涉及 Perl API 的操作,然后释放资源。这在普通 C 中很好,因为 C 没有异常,但使用 Perl API 的代码可能会croak()
,从而防止正常清理和泄漏资源。因此,除了相当简单的情况外,似乎不可能编写正确的 XS 代码。
当我croak()
自己时,我可以清理到目前为止分配的任何资源,但我可能会croak()
直接调用函数,这会避开我编写的任何清理代码。
伪代码来说明我的担忧:
那么如何安全地清理 XS 代码中的资源呢?如何注册一些在抛出异常或从 XS 代码返回到 Perl 代码时运行的析构函数?
到目前为止我的想法和发现:
我可以创建一个在析构函数中运行必要清理的类,然后创建一个包含此类实例的凡人 SV。在未来的某个时候,Perl 将释放那个 SV 并运行我的析构函数。然而,这似乎相当倒退,必须有更好的方法。
XSAWYERX 的XS Fun小册子似乎详细讨论了 DESTROY 方法,但没有讨论源自XS 代码的异常的处理。
LEONT 的
Scope::OnExit
模块具有XS 代码使用SAVEDESTRUCTOR()
和SAVEDESTRUCTOR_X()
宏。这些似乎没有记录。Perl API将其列为公共但未记录的函数
save_destructor()
。save_destructor_x()
Perl 的
scope.h
头文件(由 包含perl.h
)声明SAVEDESTRUCTOR(f,p)
和SAVEDESTRUCTOR_X(f,p)
宏,没有任何进一步的解释。从上下文和Scope::OnExit
代码来看,f
是一个函数指针和p
一个将传递给f
.pTHX_
_X 版本适用于使用宏参数声明的函数。
我在正确的轨道上吗?我应该酌情使用这些宏吗?它们是在哪个 Perl 版本中引入的?关于它们的使用是否有任何进一步的指导?究竟什么时候触发析构函数?大概在与FREETMPS
orLEAVE
宏相关的地方?
c++ - Perl newXS() 添加了闭包
我想将 Perl 嵌入到 c++ 应用程序中,并且正在寻找一种通过 newXS() 从 perl 调用 c++ 的方法。除了函数指针之外,我还需要将自定义指针关联到由 newXS() 创建的 CV。该指针包含一个 C++ 上下文。我不想为此使用全局变量。有没有一种通用的方法可以做到这一点?
在更广泛的范围内,问题可能是天气有可能向newXS() 创建的 CV 添加一个闭包,以及在调用注册的 c 函数时如何引用它。CvPADLIST () 似乎是一个完美的地方,但是对于 XSubs 来说,当设置 PERL_IMPLICIT_CONTEXT 时使用它似乎是无效的(在 perl 的 pad.c 开头的注释。可以忽略它吗?)。还有其他地方可以放 CV 本地数据吗?
c - Perl、C、XS - 解压浮点数组
我有 Perl 代码和 C 代码,我在我的 Perl 代码中调用 C 函数。我已经通过打包将一个浮点数组从 Perl 传递给 C(就像这个http://www.perlmonks.org/?node_id=39697),它工作得很好!
但现在我试图将该数组从我的 C 函数返回到 Perl,我希望能够用它做一些事情,例如读取值、打印......
我试图用
但这根本不起作用,当我打印@array 时,我总是看到相同的不合理值。
所以我想我做错了,有人知道如何正确解包数组吗?
c - perl xs 模块编写 - 使用同一个 xs 文件中的另一个函数
我是 XS 的初学者,花了一些时间在网上寻找这个答案,但没有运气。问题是 XS 改变了函数的名称,当它编译时,我会得到一个未定义的引用错误。例如考虑下面的 XS 代码:
然后我尝试在下面的函数中使用它
然后我运行make
它并通过编译过程,我在似乎是链接阶段的undefined reference to 'matrixIndex'
.
所以我想知道从同一个 XS 文件中调用函数的标准 XS 方法是什么?
c++ - perl xs - 无法从方法调用返回新的自定义 C++ 对象 - 而是返回标量值
在我的 XS 文件中,我有:
作为我的新方法:
它返回一个matrix
像它应该的对象,我可以调用方法。
然后我有一个方法调用,它创建一个新的矩阵对象并应该将它作为一个新矩阵返回:
但是返回的类型是matrix=SCALAR(0x122f81c)
,因此我无法从该对象调用任何方法调用,因为 perl 解释器似乎将返回的类型视为标量值类型而不是“矩阵”对象。这是一个测试脚本:
这是我的类型图:
我必须在我的 XS 文件或任何其他文件中进行哪些更改以确保matrix
返回纯对象?
arrays - perl xs - 从 c 数组返回 perl 数组
使用 XS 我试图将 C 数组中的值传递到可以在脚本中使用的 Perl 数组中。
这是我的 xs 文件中的代码:
它编译得很好,但是当我在 perl 中运行以下命令时:
它只是ARRAY(0x1408cdc)
在我期望它打印数字列表时打印。
如何修改我的代码以正确传回 perl 数组?
perl - 我可以使用一个模块,然后将其卸载以缩小 optree 吗?
免责声明我不确定我是否使用了正确的术语。它可能不是导致下面提到的膨胀的 optree:它可能是加载的符号DynaLoader
没有被释放。
是否可以使用一个模块,例如POSIX.pm
,卸载它并减少(缩小或修剪)optree,而无需任何一个
- 执行perl
- 分叉
我尝试过的事情,
这是一个简单的测试,创建一个文件 test.pl
外壳命令
您可能会也可能不会看到 RSS 大小的增加(POSIX 可能会在watch
spawns之前加载ps
)。但是,我想看到它缩回去。
追踪POSIX.pm
我看到它使用XSLoader
的到底是什么DynaLoader
。
进行一些快速比较检查后,/proc/$$/smaps
我确定使用 POSIX.pm 会导致堆分配表示空间差异。使用 POSIX.pm 时,堆上的第一个分配要大得多:
对比
我已经确认了一些事情,对命名空间进行核对不会将打开的文件句柄删除到POSIX.so
并且Fnctl.so
- 我用lsof
. 这本身就有些令人担忧。我认为在被调用者的包上分配句柄是有意义的。XSLoader
还掩盖了您可以释放该文件句柄 - DynaLoader
.
此外,似乎在libc
/dlfcn.h
我有
dlclose()
函数 dlclose() 减少句柄引用的动态加载的共享对象的引用计数。如果引用计数降至零,则对象被卸载。在句柄引用的对象上调用 dlopen() 时自动加载的所有共享对象都以相同的方式递归关闭。
从 dlclose() 成功返回并不能保证与句柄关联的符号已从调用者的地址空间中删除。除了由显式 dlopen() 调用产生的引用之外,由于其他共享对象中的依赖关系,共享对象可能已被隐式加载(并且引用计数)。只有当所有引用都被释放后,才能从地址空间中删除共享对象。
所以我猜这可能是可疑的,DynaLoader::dl_unload_file
正在调用dlclose
并且它似乎确实有效。
在我对所有加载的文件进行核对DynaLoader
并XSLoader
通过执行上述操作后,RSS 仍然没有下降。
c++ - Perl XS 未使用的变量“Perl___notused”警告
我正在学习如何从 Perl 调用 C++ 代码并开始尝试从 Perl 脚本创建一个基本的 C++ 对象。
为此,我首先执行以下h2xs
命令:
h2xs -A -nMyClass
然后我将以下两个参数添加到生成Makefile.PL
的以使用g++
编译器。
我在文件中创建了我的简单类.xs
并编写了 XS 代码以将其映射到 Perl
MyClass.xs
然后我创建了类型映射文件以将新类型映射到 Perl。
类型图
最后我创建了一个简单的测试。
t/MyClass.t
然后我成功地构建了代码并运行了测试。
尽管一切正常,但我在构建时收到了一些警告:
我到处搜索试图找到这些警告的原因,但无法弄清楚发生了什么。所有警告似乎都来自每个函数定义开头出现的代码中相同的重复部分。
在 MyClass.c 中
有人可以告诉我这些警告的根本原因吗?
我正在使用 Perl v5.10.1 和 g++ 版本 4.4.7
perl - 如何使用本地库中的模块而不安装它?
我有一个 XS 模块。构建后将其./Build
放入Module.so
目录blib/arch/auto/XS
中。
在我的Module.pm
我有:
我运行程序为:
或者
在这两种情况下,都会使用之前安装到系统中的模块。
我应该使用哪个选项来运行代码Module.so
from blib/arch/auto
?
UPD
我尝试使用模块,blib
因为在开发和实验过程中我不需要安装它XS
perl - 标志“pIOK”是什么意思?
当倾倒 perl SV 时,Devel::Peek
我可以看到:
但找不到描述是什么pIOK
意思。
我试着看它,,,,Devel::Peek
......在我发现的来源perlapi
中perlguts
:perlxs
但还是找不到是什么SVp_IOK
。它是什么?
UPD
我找到了这个文件。它阐明了标志的含义以及它们的位置。(注意这个 DOC 有点过时了)
此标志指示对象具有有效的非公共 IVX 字段值。它只能为值类型 SvIV 或其子类型设置。
UPD