Quantcast
Channel: Active questions tagged ubuntu - Stack Overflow
Viewing all articles
Browse latest Browse all 7069

worker_threads, loading ffi-napi in a mult-threads causes "Segmentation Fault" on close thread

$
0
0

I’m working on an API for tax issuance and using a library in .so format. The library is available here, and you can download it here. i split task with worker_threads.js

I’m starting a new worker instance and loading the .so file using napi-ffi. The code works fine during execution, but it causes a segmentation fault when I close the worker.

Here’s some additional context:

I’m using the express library to run the API.

The environment is Ubuntu.

Has anyone encountered a similar issue or can help me debug this?

Thank you in advance!

the Code index.js;

const express = require('express');//const cors = require('cors');//const fs = require('fs');const bodyParser = require('body-parser');// require('dotenv').config()const port = 5723;const { Worker } = require('node:worker_threads')// const dbConnect = require(`${__dirname}/lib/databaseConnector`);// const db = new dbConnect();const app = express()app.use(bodyParser.urlencoded({ extended: false }));app.use(bodyParser.json())const path = require("node:path")//// Evento NOTA FISCAL//app.get('/NFE', function (req, res) {        var post = { body: req.body, headers: req.headers }        try {            const worker = new Worker(path.resolve(__dirname, 'NFE.js'), post)            worker.on('message', (data) => res.status(200).send(data));        } catch (error) {           console.log(error)        }        //worker.postMessage(post);});app.get('/', async function (req, res) {    var html = "<html><body><h1>Hera</h1></body></html>"    res.send(html)}),1app.listen(port, () => {    console.log(`servidor rodando ${port}`)});

the NFE.js code

const { parentPort, workerData } = require("node:worker_threads")parentPort.on('message', async (req) => {})async function loadAcbr(){    const ref = require("ref-napi");    const path = require("node:path");    const acbrLib = require('./interface_nfe.js');    const handle = ref.alloc('pointer');    var buflength = 256;    const aloc_sResposta = Buffer.alloc(buflength);    const aloc_esTamanho = ref.alloc("int");    //Diretórios usados    // var ret = acbrLib.NFE_Inicializar(handle, './NFeConfig.ini', '')    // var pathLog = path.resolve(__dirname)    //acbrLib.NFE_ConfigGravarValor(handle, "Principal", "LogPath", './log')    //acbrLib.NFE_Finalizar(handle)    parentPort.postMessage({ "MESSAGE": "fim", });    parentPort.close();}loadAcbr()

the interface_nfe.js code

const path = require('path');const ffi = require('ffi-napi');// inicia variável de acordo com o OSif(process.platform == 'win32'){    var pathDllACBrLibNFe = path.join(__dirname, 'ACBrNFe64.dll')}else if(process.platform == 'linux'){    var pathDllACBrLibNFe = path.join(__dirname, 'libacbrnfe64.so')}module.exports = ffi.Library(pathDllACBrLibNFe, {    //Métodos da Biblioteca    // NFE_Inicializar([eArqConfig, eChaveCrypt]);    NFE_Inicializar: ['int', ['pointer', 'string', 'string']],    // NFE_Finalizar();    NFE_Finalizar: ['int', ['pointer']],    // NFE_UltimoRetorno(sMensagem, ref esTamanho);    NFE_UltimoRetorno: ['int', ['pointer', 'string', 'string']],    // // NFE_Nome(sNome, ref esTamanho);    // NFE_Nome: ['int', [ 'string', 'string']],    // // NFE_Versao(sVersao, ref esTamanho);    // NFE_Versao: ['int', [ 'string', 'string']],    //Métodos de Configuração    // NFE_ConfigLer([eArqConfig]);    NFE_ConfigLer: ['int', ['pointer', 'string']],    // NFE_ConfigGravar([eArqConfig]);    NFE_ConfigGravar: ['int', ['pointer', 'string']],    // NFE_ConfigLerValor(eSessao, eChave, sValor, esTamanho);    NFE_ConfigLerValor: ['int', ['pointer', 'string', 'string', 'string', 'string']],    // NFE_ConfigGravarValor(eSessao, eChave, sValor);    NFE_ConfigGravarValor: ['int', ['pointer', 'string', 'string', 'string']],    // NFE_ConfigImportar([eArqConfig]);    NFE_ConfigImportar: ['int', ['pointer', 'string']],    // NFE_ConfigExportar(sMensagem, ref esTamanho);    NFE_ConfigExportar: ['int', ['pointer', 'string', 'string']],    //Métodos NFe    // NFE_CarregarXML(eArquivoOuXML);    NFE_CarregarXML: ['int', ['pointer', 'string']],    // NFE_CarregarINI(eArquivoOuINI);    NFE_CarregarINI: ['int', ['pointer', 'string']],    // NFE_ObterXml(AIndex, sResposta, esTamanho);    NFE_ObterXml: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_GravarXml(AIndex, [eNomeArquivo], [ePathArquivo]);    NFE_GravarXml: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_ObterIni(AIndex, sResposta, esTamanho);    NFE_ObterIni: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_GravarIni(AIndex, eNomeArquivo, [ePathArquivo]);    NFE_GravarIni: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_CarregarEventoXML(eArquivoOuXML);    NFE_CarregarEventoXML: ['int', ['pointer', 'string']],    // NFE_CarregarEventoINI(eArquivoOuINI);    NFE_CarregarEventoINI: ['int', ['pointer', 'string']],    // NFE_LimparLista();    NFE_LimparLista: ['int', ['pointer']],    // NFE_LimparListaEventos();    NFE_LimparListaEventos: ['int', ['pointer']],    // NFE_Assinar();    NFE_Assinar: ['int', ['pointer']],    // NFE_Validar();    NFE_Validar: ['int', ['pointer']],    // NFE_ValidarRegrasdeNegocios(sResposta, esTamanho);    NFE_ValidarRegrasdeNegocios: ['int', ['pointer', 'string', 'string']],    // NFE_VerificarAssinatura(sResposta, esTamanho);    NFE_VerificarAssinatura: ['int', ['pointer', 'string', 'string']],    // NFE_GerarChave(ACodigoUF, ACodigoNumerico, AModelo, ASerie, ANumero, ATpEmi, AEmissao, ACNPJCPF, sResposta, esTamanho);    NFE_GerarChave: ['int', ['pointer', 'int', 'int', 'int', 'int', 'int', 'int', 'string', 'string', 'string', 'string']],    // NFE_ObterCertificados(sResposta, esTamanho);    NFE_ObterCertificados: ['int', ['pointer', 'string', 'string']],    // NFE_GetPath(ATipo, sResposta, esTamanho);    NFE_GetPath: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_GetPathEvento(ACodEvento, sResposta, esTamanho);    NFE_GetPathEvento: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_StatusServico(sResposta, esTamanho);    NFE_StatusServico: ['int', ['pointer', 'string', 'string']],    // NFE_Consultar( eChaveOuNFe, AExtrairEventos, sResposta, esTamanho);    NFE_Consultar: ['int', ['pointer', 'string', 'bool', 'string', 'string']],    // NFE_ConsultarRecibo(ARecibo, sResposta, esTamanho);    NFE_ConsultarRecibo: ['int', ['pointer', 'string', 'string', 'string']],    // NFE_ConsultaCadastro(cUF, nDocumento, nIE, sResposta, esTamanho);    NFE_ConsultaCadastro: ['int', ['pointer', 'string', 'string', 'bool', 'string', 'string']],    // NFE_Inutilizar(ACNPJ, AJustificativa, Ano, Modelo, Serie, NumeroInicial, NumeroFinal, sResposta, esTamanho);    NFE_Inutilizar: ['int', ['pointer', 'string', 'string', 'int', 'int', 'int', 'int', 'int', 'string', 'string']],    // NFE_Enviar( (ALote, AImprimir, ASincrono, AZipado, sResposta, esTamanho);    NFE_Enviar: ['int', ['pointer', 'int', 'bool', 'bool', 'bool', 'string', 'string']],    // NFE_Cancelar(eChave, eJustificativa, eCNPJ, ALote, sResposta, esTamanho);    NFE_Cancelar: ['int', ['pointer', 'string', 'string', 'string', 'int', 'string', 'string']],    // NFE_EnviarEvento(idLote, sResposta, esTamanho);    NFE_EnviarEvento: ['int', ['pointer', 'int', 'string', 'string']],    // NFE_DistribuicaoDFePorUltNSU(AcUFAutor, eCNPJCPF, eultNSU, sResposta, esTamanho);    NFE_DistribuicaoDFePorUltNSU: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']],    // NFE_DistribuicaoDFePorNSU(AcUFAutor, eCNPJCPF, eNSU, sResposta, esTamanho);    NFE_DistribuicaoDFePorNSU: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']],    // NFE_DistribuicaoDFePorChave(AcUFAutor, eCNPJCPF, eChave, sResposta, esTamanho);    NFE_DistribuicaoDFePorChave: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']],    // NFE_EnviarEmail(ePara, eXMLNFe, AEnviaPDF, eAssunto, eCC, eAnexos, eMensagem);    NFE_EnviarEmail: ['int', ['pointer', 'string', 'string', 'bool', 'string', 'string', 'string', 'string']],    // NFE_EnviarEmailEvento(ePara, eChaveEvento, eChaveNFe, AEnviaPDF, eAssunto, eCC, eAnexos, eMensagem);    NFE_EnviarEmailEvento: ['int', ['pointer', 'string', 'string', 'string', 'bool', 'string', 'string', 'string', 'string']],    // NFE_Imprimir([cImpressora], [nNumCopias], [cProtocolo], [bMostrarPreview], [cMarcaDagua], [bViaConsumidor], [bSimplificado]);    NFE_Imprimir: ['int', ['pointer', 'string', 'int', 'string', 'string', 'string', 'string', 'string',]],    // NFE_ImprimirPDF();    NFE_ImprimirPDF: ['int', ['pointer']],    // NFE_SalvarPDF(sResposta, esTamanho);    NFE_SalvarPDF: ['int', ['pointer', 'string', 'string']],    // NFE_ImprimirEvento(eArquivoXmlNFe, eArquivoXmlEvento);    NFE_ImprimirEvento: ['int', ['pointer', 'string', 'string']],    // NFE_ImprimirEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento);    NFE_ImprimirEventoPDF: ['int', ['pointer', 'string', 'string']],    // NFE_SalvarEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento);    NFE_SalvarEventoPDF: ['int', ['pointer', 'string', 'string']],    // NFE_ImprimirInutilizacao(eArquivoXml);    NFE_ImprimirInutilizacao: ['int', ['pointer', 'string']],    // NFE_ImprimirInutilizacaoPDF(eArquivoXml);    NFE_ImprimirInutilizacaoPDF: ['int', ['pointer', 'string']],    // NFE_SalvarInutilizacaoPDF(eArquivoXml);    NFE_SalvarInutilizacaoPDF: ['int', ['pointer', 'string']],});

Viewing all articles
Browse latest Browse all 7069

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>