最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin0浏览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)
}),
1
app.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 OS
if(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']],
});

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论