Skip to content

Commit 147475c

Browse files
committed
ci-setup
1 parent 0eb349d commit 147475c

5 files changed

Lines changed: 133 additions & 3 deletions

File tree

.github/workflows/ci.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [master]
6+
pull_request:
7+
branches: [master]
8+
9+
jobs:
10+
build:
11+
name: PHP ${{ matrix.php }} - ${{ matrix.os }}
12+
runs-on: ${{ matrix.os }}
13+
strategy:
14+
fail-fast: false
15+
matrix:
16+
os: [ubuntu-latest, macos-latest]
17+
php: ['8.1', '8.2', '8.3', '8.4', '8.5']
18+
19+
steps:
20+
- uses: actions/checkout@v4
21+
22+
- name: Setup PHP
23+
uses: shivammathur/setup-php@v2
24+
with:
25+
php-version: ${{ matrix.php }}
26+
tools: none
27+
28+
- name: Build extension
29+
run: |
30+
phpize
31+
./configure --enable-eventloop
32+
make -j$(nproc 2>/dev/null || sysctl -n hw.ncpu)
33+
34+
- name: Run tests
35+
run: make test TESTS="-q --show-diff"
36+
37+
- name: Verify extension loads
38+
run: php -d extension=modules/eventloop.so -m | grep eventloop

eventloop.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# include <signal.h>
2424
#endif
2525

26+
#include "php_eventloop_compat.h"
2627
#include "eventloop_arginfo.h"
2728

2829
ZEND_DECLARE_MODULE_GLOBALS(eventloop)

eventloop_cb.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
static zend_string *eventloop_generate_id(void)
1010
{
1111
char buf[24];
12-
int len;
1312

14-
len = snprintf(buf, sizeof(buf), "eL%" PRIx64, EVENTLOOP_G(next_id)++);
13+
int len = snprintf(buf, sizeof(buf), "eL%" PRIx64, EVENTLOOP_G(next_id)++);
14+
1515
return zend_string_init(buf, len, 0);
1616
}
1717

eventloop_suspension.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#ifdef HAVE_FIBERS
1313
#include "zend_exceptions.h"
1414
#include "zend_enum.h"
15+
#include "php_eventloop_compat.h"
1516
#include "eventloop_arginfo.h"
1617

1718
typedef struct _eventloop_suspension_obj {
@@ -41,6 +42,8 @@ static zend_object *suspension_create_object(zend_class_entry *ce)
4142
zend_object_std_init(&suspension->std, ce);
4243
object_properties_init(&suspension->std, ce);
4344

45+
suspension->std.handlers = &suspension_object_handlers;
46+
4447
ZVAL_NULL(&suspension->fiber_zv);
4548
suspension->pending = false;
4649
suspension->suspended = false;
@@ -207,7 +210,7 @@ void eventloop_suspension_init(void)
207210
{
208211
eventloop_suspension_ce = register_class_EventLoop_Suspension();
209212
eventloop_suspension_ce->create_object = suspension_create_object;
210-
eventloop_suspension_ce->default_object_handlers = &suspension_object_handlers;
213+
EVENTLOOP_SET_DEFAULT_HANDLERS(eventloop_suspension_ce, &suspension_object_handlers);
211214

212215
memcpy(&suspension_object_handlers, zend_get_std_object_handlers(),
213216
sizeof(zend_object_handlers));

php_eventloop_compat.h

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright (c) 2026 Aleksandr Cherednikov
3+
* Licensed under the MIT License. See LICENSE for details.
4+
*/
5+
6+
#ifndef PHP_EVENTLOOP_COMPAT_H
7+
#define PHP_EVENTLOOP_COMPAT_H
8+
9+
#include "php.h"
10+
#include "zend_API.h"
11+
12+
/*
13+
* Compatibility shims for building across PHP 8.1 – 8.5+.
14+
*
15+
* The extension targets PHP >= 8.1 (Fibers). Internal Zend APIs evolved
16+
* between releases, so we polyfill the newer signatures here and let
17+
* each call-site use a single, modern spelling.
18+
*/
19+
20+
/* ------------------------------------------------------------------ */
21+
/* zend_register_internal_class_with_flags() — added in PHP 8.4 */
22+
/* In 8.1-8.3 we register + set flags manually. */
23+
/* ------------------------------------------------------------------ */
24+
#if PHP_VERSION_ID < 80400
25+
static inline zend_class_entry *zend_register_internal_class_with_flags(
26+
zend_class_entry *ce, zend_class_entry *parent, uint32_t flags)
27+
{
28+
zend_class_entry *registered = zend_register_internal_class_ex(ce, parent);
29+
registered->ce_flags |= flags;
30+
return registered;
31+
}
32+
#endif
33+
34+
/* ------------------------------------------------------------------ */
35+
/* ce->default_object_handlers — added in PHP 8.3 */
36+
/* ------------------------------------------------------------------ */
37+
#if PHP_VERSION_ID >= 80300
38+
# define EVENTLOOP_SET_DEFAULT_HANDLERS(ce, h) \
39+
(ce)->default_object_handlers = (h)
40+
#else
41+
# define EVENTLOOP_SET_DEFAULT_HANDLERS(ce, h) \
42+
/* not available before 8.3 — handlers set in create_object */
43+
#endif
44+
45+
/* ------------------------------------------------------------------ */
46+
/* Fiber suspend / resume internal API */
47+
/* */
48+
/* PHP 8.4+ exposes zend_fiber_suspend() / zend_fiber_resume() with a */
49+
/* three-arg signature. Earlier versions do not export these symbols, */
50+
/* so we call the userland Fiber::suspend() / $fiber->resume() via */
51+
/* zend_call_method, which performs the same context switch. */
52+
/* ------------------------------------------------------------------ */
53+
#include "zend_fibers.h"
54+
#include "zend_interfaces.h"
55+
56+
#if PHP_VERSION_ID < 80400
57+
58+
static inline void eventloop_compat_fiber_suspend(
59+
zend_fiber *fiber, zval *value, zval *return_value)
60+
{
61+
(void)fiber; /* Fiber::suspend() operates on the active fiber */
62+
if (value && Z_TYPE_P(value) != IS_NULL) {
63+
zend_call_method_with_1_params(NULL, zend_ce_fiber, NULL, "suspend", return_value, value);
64+
} else {
65+
zend_call_method_with_0_params(NULL, zend_ce_fiber, NULL, "suspend", return_value);
66+
}
67+
}
68+
69+
static inline void eventloop_compat_fiber_resume(
70+
zend_fiber *fiber, zval *value, zval *error)
71+
{
72+
zval fiber_zv, retval;
73+
(void)error;
74+
ZVAL_OBJ(&fiber_zv, &fiber->std);
75+
if (value && Z_TYPE_P(value) != IS_NULL) {
76+
zend_call_method_with_1_params(&fiber_zv, zend_ce_fiber, NULL, "resume", &retval, value);
77+
} else {
78+
zend_call_method_with_0_params(&fiber_zv, zend_ce_fiber, NULL, "resume", &retval);
79+
}
80+
zval_ptr_dtor(&retval);
81+
}
82+
83+
# define zend_fiber_suspend(f, v, r) eventloop_compat_fiber_suspend((f), (v), (r))
84+
# define zend_fiber_resume(f, v, e) eventloop_compat_fiber_resume((f), (v), (e))
85+
86+
#endif /* PHP_VERSION_ID < 80400 */
87+
88+
#endif /* PHP_EVENTLOOP_COMPAT_H */

0 commit comments

Comments
 (0)