LINUX.ORG.RU

проблема с использованием perl в C-коде


0

0

Есть программа, которая использует libperl.so.5.8.0 для выполнения pl-скриптов. Скрипты могут выполняют несколько потоков, но инстанс perl'а создаётся только один. С синхронизацией потоков всё нормально (сто раз проверял, к тому же разделяемая только одна функция). При выполнении иногда (довольно часто) программа падает с сообщением: Attempt to free unreferenced scalar: SV 0x80f41ec, за которым следует segmentation fault.

Если кто знает, подскажите, что может быть не так?

Ответ на: комментарий от hyde

В man perldiag ошибка описана очень скудно, к тому же там причиной названо неправильное использование SvREFCNT_dec() и SvREFCNT_inc(),
 которые я явно не вызываю. Так что всё равно не ясно. Вот мой код:

int MyPerlCall(const char* nameFunc, Userfield* pArray, Userfield* pArrayRes) 
{ 
    dSP;
    ENTER; // everything created after here 
    SAVETMPS; // ...is a temporary variable. 
    PUSHMARK(SP); // remember the stack pointer 
    Userfield* pBuffRes = pArray; 
    while (*(pBuffRes->cdata) != char(255)) 
    { 
        XPUSHs(sv_2mortal(newSVpv(pBuffRes->cdata, 0))); 
        pBuffRes++; 
    } 
    PUTBACK; // make local stack pointer global 
    int count = call_pv(nameFunc, G_ARRAY); // call the function  
    SPAGAIN; // refresh stack pointer 
    // pop the return value from stack  
    pBuffRes = pArrayRes; 
    for(int i=0;i<count;i++)  
    { 
        // *pBuffRes++ = POPp; 
        strcpy(pBuffRes->cdata, POPp); 
        pBuffRes++; 
    } 
    pBuffRes->cdata[0] = char(255); 
    pBuffRes->cdata[1] = 0;

    PUTBACK; 
    FREETMPS; // free that return value 
    LEAVE; // ...and the XPUSHed "mortal" args 
    return count; 
}

andreyk
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.