是在外面的PDF导出库的函数EXOpenExport线程安全吗?

时间:2012-11-16 19:39:16

标签: oracle thread-safety

我正在为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

还有什么我需要设置会导致这种情况吗?我只是明确指定字体目录。这些库实际上是线程安全的吗?它看起来不像。

1 个答案:

答案 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调用。如果   线程未初始化或失败,调用存根函数   而不是互斥函数。