php / php/php-src

thread safe php make ffi callback error(ext ffi)

Aperta
#14,574 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Extension: ffi Status: Needs Triage
Lingua principale
C
Stelle
40.4k
Fork
8.2k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

Description
<?php
$ffi = FFI::cdef("
    typedef void (*log_message_callback_t)(int level, const char* msg);

    int test_start_str(const char* oldP, int id, log_message_callback_t log_callback);
", "test_lib.dll");

$log_callback = function($level, $msg) {
    echo "Log (level $level): " . $msg . "\n";
};

$result = $ffi->test_start_str("example_parameter", 42, $log_callback);
echo "Result: $result\n";

this is the c code

#include <stdio.h>
#include <pthread.h>

#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif

typedef void (*log_message_callback_t)(int level, const char* msg);

typedef struct {
    const char* oldP;
    log_message_callback_t log_callback;
} thread_data_t;

void* thread_function(void* arg) {
    thread_data_t* data = (thread_data_t*) arg;
    const char* oldP = data->oldP;
    log_message_callback_t log_callback = data->log_callback;

    char message[256];
    snprintf(message, sizeof(message), "Thread running with parameter %s", oldP);
    if (log_callback) {
        log_callback(1, message);
    } else {
        fprintf(stderr, "Log callback not set in thread\n");
    }
    return NULL;
}

DLL_EXPORT int test_start_str(const char* oldP, int id, log_message_callback_t log_callback) {
    thread_data_t* data = (thread_data_t*) malloc(sizeof(thread_data_t));
    if (!data) {
        return -1;
    }
    data->oldP = oldP;
    data->log_callback = log_callback;

    pthread_t thread;
    int result = pthread_create(&thread, NULL, thread_function, (void*) data);
    if (result != 0) {
        free(data);
        return -1;
    }

    pthread_detach(thread);
    return 0;
}
PHP Version

php 8.3.7

Operating System

windows10

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia riproducendo l’esempio fornito di PHP FFI e C pthread su PHP 8.3.7 in Windows 10, registrando l’errore esatto del callback e quando si verifica. Confronta il comportamento del callback eseguito in un thread con il percorso di chiamata sincrono; il lavoro è completo quando il fallimento è riproducibile e il comportamento previsto per la sicurezza dei thread o la correzione necessaria è stato stabilito chiaramente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
c, php
Ambito
backend
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
25/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.