php / php/php-src

thread safe php make ffi callback error(ext ffi)

Ouverte
#14,574 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Extension: ffi Status: Needs Triage
Langage dominant
C
Étoiles
40.4k
Forks
8.2k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

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

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’exemple fourni de PHP FFI et C pthread avec PHP 8.3.7 sous Windows 10, en consignant l’erreur exacte du callback et le moment où elle se produit. Comparez le comportement du callback exécuté dans un thread avec celui du chemin d’appel synchrone ; le travail est terminé lorsque l’échec est reproductible et que le comportement attendu en matière de sécurité des threads ou la correction requise est clairement établi.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, php
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
À clarifier
Accessibilité débutants
25/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.