我正在为Ubuntu Linux上的Oracle Outside In PDF Export
库周围的Node.js编写一个C ++包装器。 Node.js有一个单线程事件循环,因此任何长时间运行的处理都在一个工作线程上完成。所以,我的包装器调用了这个工作线程中的所有PDF Export方法。我提到这一点,以便您可以确定两件事:这是一个线程环境,并且所有PDF Export函数都在同一个工作线程上调用。此外,我没有使用任何重定向的IO或PDF导出处理的线程。我初始化了库,指定不使用线程。因此,所有这些处理都应该在我称之为函数的线程中进行。
出口单个PDF甚至可能快速连续两到三个时,一切似乎都很顺利。当我尝试导出到5+的PDF数量时,我从OIT库中收到SIGSEGV分段错误。后面的跟踪如下:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4fd0700 (LWP 1577)]
0x00007fffeef1da26 in HandlePoolCreateHandle () from /usr/local/lib/pdfexport/libwv_core.so
(gdb) bt
#0 0x00007fffeef1da26 in HandlePoolCreateHandle () from /usr/local/lib/pdfexport/libwv_core.so
#1 0x00007fffeef1925d in Win32VCreateHandle () from /usr/local/lib/pdfexport/libwv_core.so
#2 0x00007fffed49046b in WrapBrush(void*, GdiBrush*) () from /usr/local/lib/pdfexport/libos_pdf.so
#3 0x00007fffed46e8c8 in ?? () from /usr/local/lib/pdfexport/libos_pdf.so
#4 0x00007fffed46df63 in GNGetOutputSolutionInfoAt () from /usr/local/lib/pdfexport/libos_pdf.so
#5 0x00007fffeef1e32a in ?? () from /usr/local/lib/pdfexport/libwv_core.so
#6 0x00007fffeef1e214 in ?? () from /usr/local/lib/pdfexport/libwv_core.so
#7 0x00007fffeef18ed3 in Win32VLoadOS () from /usr/local/lib/pdfexport/libwv_core.so
#8 0x00007fffeddffb24 in VwExportOpen () from /usr/local/lib/pdfexport/libex_pagelayout.so
#9 0x00007ffff4062c4d in FAOpenExport () from /usr/local/lib/pdfexport/libsc_fa.so
#10 0x00007ffff7e53270 in EXOpenExport () from /usr/local/lib/pdfexport/libsc_ex.so
#11 0x00007ffff43c0a4d in topdf_convert(uv_work_s*) ()
from /home/ryan/repos/pdf-service/node_modules/topdf/build/Release/topdf.node
#12 0x00000000006e2ec7 in worker (arg=<optimized out>) at ../deps/uv/src/unix/threadpool.c:65
#13 0x00007ffff6fa6e9a in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#14 0x00007ffff6cd3cbd in clone () from /lib/x86_64-linux-gnu/libc.so.6
#15 0x0000000000000000 in ?? ()
我会稍微解释一下后面的痕迹。 #11上的函数是我的代码中的函数。这是我调用所有OIT lib函数的函数。第12行及以上的函数是Node.js相关的线程函数,设置线程来运行我的代码函数。第10行到第1行的函数都是OIT调用的函数。
在PDF Export的文档中,它说如果你要在线程环境中使用这个库,那么你需要每次在工作线程中调用init和deinit函数。我在我的代码中执行此操作,您可以在此处看到:https://github.com/ryancole/topdf/blob/master/src/topdf.cc#L29-L74
还有什么我需要设置会导致这种情况吗?我只是明确指定字体目录。这些库实际上是线程安全的吗?它看起来不像。
答案 0 :(得分:1)
根据Oracle Outside In V 8.4.0 documentation (Chapter 4.2, page 50)您对DAInitEx
的提问是错误的,请查看第一个参数...
只应在应用程序中为每个应用程序调用一次DAInitEx 启动时间。可以打开任意数量的文档以进行访问 调用DAInitEx和DADeInit。如果DAInitEx成功,DADeInit必须是 无论任何其他API调用都会调用。
和
所有Windows平台都支持多个线程 32位版本的Linux x86和Solaris SPARC。初始化失败 线程函数不会影响其他API调用。如果 线程未初始化或失败,调用存根函数 而不是互斥函数。