php / php/php-src

thread safe php make ffi callback error(ext ffi)

Offen
#14,574 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Extension: ffi Status: Needs Triage
Vorherrschende Sprache
C
Sterne
40.4k
Forks
8.2k
Ø Merge
2 T. 13 Std.
Gemergte PRs (30 T.)
96

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, das bereitgestellte PHP FFI- und C pthread-Beispiel unter PHP 8.3.7 auf Windows 10 zu reproduzieren, und halte den genauen Callback-Fehler sowie den Zeitpunkt seines Auftretens fest. Vergleiche das Verhalten des Callback in einem Thread mit dem synchronen Aufrufpfad; abgeschlossen ist die Aufgabe, wenn der Fehler reproduzierbar ist und das erwartete Thread-Sicherheitsverhalten oder die erforderliche Behebung eindeutig festgestellt wurde.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
c, php
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.