php / php/php-src

thread safe php make ffi callback error(ext ffi)

Abierto
#14,574 1 comentario 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Extension: ffi Status: Needs Triage
Lenguaje dominante
C
Estrellas
40.4k
Forks
8.2k
Merge medio
2 d 13 h
PR fusionados (30 d)
96

Descripción

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

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza reproduciendo el ejemplo proporcionado de PHP FFI y C pthread en PHP 8.3.7 sobre Windows 10, registrando el error exacto del callback y cuándo ocurre. Compara el comportamiento del callback ejecutado en un hilo con la ruta de llamada síncrona; la tarea estará terminada cuando el fallo sea reproducible y se haya establecido claramente el comportamiento esperado de seguridad de hilos o la corrección necesaria.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
c, php
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Necesita aclaración
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.