php / php/php-src

thread safe php make ffi callback error(ext ffi)

Open
#14,574 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Bug Extension: ffi Status: Needs Triage
Dominant language
C
Stars
40.4k
Forks
8.2k
Avg merge
2d 13h
Merged PRs (30d)
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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the supplied PHP FFI and C pthread example on PHP 8.3.7 under Windows 10, recording the exact callback error and when it occurs. Compare the behavior of the threaded callback with the synchronous call path; done means the failure is reproducible and its expected thread-safety behavior or required fix is clearly established.

Written by the indexing model from the issue text.

Assessment

Tech stack
c, php
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.