thread safe php make ffi callback error(ext ffi)
Offen
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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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