[PHP-CVS] [php-src] master: standard: Take `Time\Duration` in `Io\Poll\Context::wait()` (#23092)

[email protected] (Tim Düsterhus via GitHub)
Newsgroups php.cvs
Message-ID <[email protected]>
Author: Tim Düsterhus (TimWolla)
Committer: GitHub (web-flow)
Pusher: TimWolla
Date: 2026-08-07T12:48:41+02:00

Commit: https://github.com/php/php-src/commit/ed2ffe6f70f6d7f8391f46b1fac88b60b97cdb6b
Raw diff: https://github.com/php/php-src/commit/ed2ffe6f70f6d7f8391f46b1fac88b60b97cdb6b.diff

standard: Take `Time\Duration` in `Io\Poll\Context::wait()` (#23092)

RFC: https://wiki.php.net/rfc/duration_class

Changed paths:
  M  NEWS
  M  ext/standard/io_poll.c
  M  ext/standard/io_poll.stub.php
  M  ext/standard/io_poll_arginfo.h
  M  ext/standard/io_poll_decl.h
  M  ext/standard/tests/poll/poll_stream_sock_modify_write.phpt
  M  ext/standard/tests/poll/poll_stream_sock_read.phpt
  M  ext/standard/tests/poll/poll_stream_sock_remove_write.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_close.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_max_events.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt
  M  ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt
  M  ext/standard/tests/poll/poll_stream_sock_write.phpt
  M  ext/standard/tests/poll/poll_stream_sock_write_close.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_read.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_read_max_events.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_read_one_shot_max_events.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt
  M  ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt
  M  ext/standard/tests/poll/poll_stream_wait_no_add.phpt


Diff:

diff --git a/NEWS b/NEWS
index 890c5d89039d..b99bdc51e87c 100644
--- a/NEWS
+++ b/NEWS
@@ -67,6 +67,8 @@ PHP                                                                        NEWS
     is_link(), file_exists(), lstat(), stat(). (Girgias)
   . Fixed bug GH-22818 (stream_filter_register() orphaned user_filter_map on
     shutdown re-registration). (David Carlier)
+  . Io\Poll\Context::wait() now takes a Time\Duration object as a timeout.
+    (timwolla)
 
 30 Jul 2026, PHP 8.6.0alpha3
 
diff --git a/ext/standard/io_poll.c b/ext/standard/io_poll.c
index ca363c7b37d9..c29ccfee04f2 100644
--- a/ext/standard/io_poll.c
+++ b/ext/standard/io_poll.c
@@ -19,6 +19,7 @@
 #include "php_poll.h"
 #include "io_poll_arginfo.h"
 #include "io_poll_decl.h"
+#include "ext/date/php_time.h"
 
 /* Class entries */
 static zend_class_entry *php_io_poll_backend_class_entry;
@@ -774,38 +775,28 @@ PHP_METHOD(Io_Poll_Context, add)
 
 PHP_METHOD(Io_Poll_Context, wait)
 {
-	zend_long timeout_seconds = -1;
-	bool timeout_seconds_is_null = true;
-	zend_long timeout_microseconds = 0;
+	php_date_time_duration *timeout = NULL;
 	zend_long max_events = 0;
 	bool max_events_is_null = true;
 
-	ZEND_PARSE_PARAMETERS_START(0, 3)
+	ZEND_PARSE_PARAMETERS_START(0, 2)
 		Z_PARAM_OPTIONAL
-		Z_PARAM_LONG_OR_NULL(timeout_seconds, timeout_seconds_is_null)
-		Z_PARAM_LONG(timeout_microseconds)
+		Z_PARAM_DATE_TIME_DURATION_OR_NULL(timeout)
 		Z_PARAM_LONG_OR_NULL(max_events, max_events_is_null)
 	ZEND_PARSE_PARAMETERS_END();
 
 	php_io_poll_context_object *intern = PHP_POLL_CONTEXT_OBJ_FROM_ZV(getThis());
 
-	/* Build timespec from seconds + microseconds, or NULL for indefinite */
-	struct timespec ts;
-	const struct timespec *timeout = NULL;
-	if (timeout_seconds >= 0) {
-		if (timeout_microseconds < 0) {
-			zend_argument_value_error(2, "must be greater than or equal to 0");
+	/* Build timespec from php_date_time_duration, or NULL for indefinite */
+	struct timespec timeout_ts;
+	if (timeout) {
+		if (timeout->duration.negative) {
+			zend_argument_value_error(2, "must not be negative");
 			RETURN_THROWS();
 		}
 
-		/* Allow microseconds >= 1000000, carry overflow into seconds
-		 * (same behavior as stream_select) */
-		ts.tv_sec = (time_t) (timeout_seconds + (timeout_microseconds / 1000000));
-		ts.tv_nsec = (long) ((timeout_microseconds % 1000000) * 1000);
-		timeout = &ts;
-	} else if (!timeout_seconds_is_null) {
-		zend_argument_value_error(1, "must be greater than or equal to 0");
-		RETURN_THROWS();
+		timeout_ts.tv_sec = timeout->duration.seconds;
+		timeout_ts.tv_nsec = timeout->duration.nanoseconds;
 	}
 
 	if (max_events_is_null) {
@@ -814,12 +805,12 @@ PHP_METHOD(Io_Poll_Context, wait)
 			max_events = 64;
 		}
 	} else if (max_events <= 0) {
-		zend_argument_value_error(3, "must be greater than 0");
+		zend_argument_value_error(2, "must be greater than 0");
 		RETURN_THROWS();
 	}
 
 	php_poll_event *events = safe_emalloc(max_events, sizeof(*events), 0);
-	int num_events = php_poll_wait(intern->ctx, events, (int) max_events, timeout);
+	int num_events = php_poll_wait(intern->ctx, events, (int) max_events, timeout ? &timeout_ts : NULL);
 
 	if (num_events < 0) {
 		php_poll_error err = php_poll_get_error(intern->ctx);
diff --git a/ext/standard/io_poll.stub.php b/ext/standard/io_poll.stub.php
index 83c1ba5cbe2e..e3bcbf11c871 100644
--- a/ext/standard/io_poll.stub.php
+++ b/ext/standard/io_poll.stub.php
@@ -86,7 +86,7 @@ public function __construct(Backend $backend = Backend::Auto) {}
         public function add(Handle $handle, array $events, mixed $data = null): Watcher {}
 
         /** @return list<Watcher> */
-        public function wait(?int $timeoutSeconds = null, int $timeoutMicroseconds = 0, ?int $maxEvents = null): array {}
+        public function wait(?\Time\Duration $timeout = null, ?int $maxEvents = null): array {}
 
         public function getBackend(): Backend {}
     }
diff --git a/ext/standard/io_poll_arginfo.h b/ext/standard/io_poll_arginfo.h
index 5fc62f629564..801df235c26b 100644
--- a/ext/standard/io_poll_arginfo.h
+++ b/ext/standard/io_poll_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit io_poll.stub.php instead.
- * Stub hash: a7450146c5b3b3f3486611c83a55cf0cc932b27a
+ * Stub hash: 2f52b00fd6dfc62291e0dd288ffd68547b29bdaa
  * Has decl header: yes */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Backend_getAvailableBackends, 0, 0, IS_ARRAY, 0)
@@ -56,8 +56,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_Io_Poll_Context_add, 0, 2,
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Io_Poll_Context_wait, 0, 0, IS_ARRAY, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeoutSeconds, IS_LONG, 1, "null")
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeoutMicroseconds, IS_LONG, 0, "0")
+	ZEND_ARG_OBJ_INFO_WITH_DEFAULT_VALUE(0, timeout, Time\\Duration, 1, "null")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, maxEvents, IS_LONG, 1, "null")
 ZEND_END_ARG_INFO()
 
diff --git a/ext/standard/io_poll_decl.h b/ext/standard/io_poll_decl.h
index 2b09e3665f58..de49880392a7 100644
--- a/ext/standard/io_poll_decl.h
+++ b/ext/standard/io_poll_decl.h
@@ -1,8 +1,8 @@
 /* This is a generated file, edit io_poll.stub.php instead.
- * Stub hash: a7450146c5b3b3f3486611c83a55cf0cc932b27a */
+ * Stub hash: 2f52b00fd6dfc62291e0dd288ffd68547b29bdaa */
 
-#ifndef ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H
-#define ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H
+#ifndef ZEND_IO_POLL_DECL_2f52b00fd6dfc62291e0dd288ffd68547b29bdaa_H
+#define ZEND_IO_POLL_DECL_2f52b00fd6dfc62291e0dd288ffd68547b29bdaa_H
 
 typedef enum zend_enum_Io_Poll_Backend {
 	ZEND_ENUM_Io_Poll_Backend_Auto = 1,
@@ -23,4 +23,4 @@ typedef enum zend_enum_Io_Poll_Event {
 	ZEND_ENUM_Io_Poll_Event_EdgeTriggered = 7,
 } zend_enum_Io_Poll_Event;
 
-#endif /* ZEND_IO_POLL_DECL_a7450146c5b3b3f3486611c83a55cf0cc932b27a_H */
+#endif /* ZEND_IO_POLL_DECL_2f52b00fd6dfc62291e0dd288ffd68547b29bdaa_H */
diff --git a/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt b/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt
index 4f32ec28c88d..3e64d950c19e 100644
--- a/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_modify_write.phpt
@@ -10,7 +10,7 @@ $poll_ctx = pt_new_stream_poll();
 $watcher = pt_stream_poll_add($poll_ctx, $socket2, [Io\Poll\Event::Write], "socket_data");
 $watcher->modify([Io\Poll\Event::Write], "modified_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'modified_data']
 ]);
 ?>
diff --git a/ext/standard/tests/poll/poll_stream_sock_read.phpt b/ext/standard/tests/poll/poll_stream_sock_read.phpt
index 70aebc9cd926..0b44a3d14eac 100644
--- a/ext/standard/tests/poll/poll_stream_sock_read.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_read.phpt
@@ -10,7 +10,7 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read], "socket_data");
 
 fwrite($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket_data', 'read' => 'test data']
 ]);
 
diff --git a/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt b/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt
index c5fec5391652..2662a4e1f4c1 100644
--- a/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_remove_write.phpt
@@ -11,14 +11,14 @@ $poll_ctx = pt_new_stream_poll();
 $watcher1w = pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write], "socket_data_1");
 pt_stream_poll_add($poll_ctx, $socket2w, [Io\Poll\Event::Write], "socket_data_2");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_1'],
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_2']
 ]);
 
 $watcher1w->remove();
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data_2']
 ]);
 
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt
index 3909dea58637..f81ac40bcfab 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_close.phpt
@@ -13,7 +13,7 @@ pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write], "socket2_data")
 fwrite($socket1w, "test data");
 
 fclose($socket1r);
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     [
         'events' => [
             'default' => [Io\Poll\Event::Write, Io\Poll\Event::Error, Io\Poll\Event::HangUp],
@@ -28,7 +28,7 @@ pt_expect_events($poll_ctx->wait(0, 100000), [
 ], $poll_ctx);
 
 fclose($socket1w);
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_max_events.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_max_events.phpt
index d78d3f4fde35..c7374d2986e0 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_max_events.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_max_events.phpt
@@ -23,14 +23,14 @@ for ($i = 0; $i < 4; $i++) {
     ];
 }
 
-pt_expect_events($poll_ctx->wait(0, 100000, 8), $expected);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000), 8), $expected);
 
 // All read data was drained above, so only write events remain
 $expected = [];
 for ($i = 0; $i < 4; $i++) {
     $expected[] = ['events' => [Io\Poll\Event::Write], 'data' => "sock$i"];
 }
-pt_expect_events($poll_ctx->wait(0, 100000, 8), $expected);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000), 8), $expected);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt
index f25cb973ddce..63b22bd94941 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_multi_edge.phpt
@@ -15,32 +15,32 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read, Io\Poll\Event::EdgeTriggered], "socket1_data");
 pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write, Io\Poll\Event::EdgeTriggered], "socket2_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data']
 ]);
 
-pt_expect_events($poll_ctx->wait(0), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), []);
 
 fwrite($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data']
 ]);
 
 fwrite($socket1w, "more data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data']
 ]);
 
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 fwrite($socket1w, " and even more data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'more data and even more data']
 ]);
 
 fclose($socket1r);
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     [
         'events' => ['default' => [Io\Poll\Event::Write, Io\Poll\Event::HangUp]],
         'data' => 'socket2_data'
@@ -48,7 +48,7 @@ pt_expect_events($poll_ctx->wait(0, 100000), [
 ], $poll_ctx);
 
 fclose($socket1w);
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt
index 8bc8ea7fcc3d..639420872614 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_multi_level.phpt
@@ -10,39 +10,39 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read], "socket1_data");
 pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write], "socket2_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data']
 ]);
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data']
 ]);
 
 fwrite($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data']
 ]);
 
 fwrite($socket1w, "more data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data']
 ]);
 
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data']
 ]);
 
 fwrite($socket1w, " and even more data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'more data and even more data']
 ]);
 
 fclose($socket1r);
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     [
         'events' => [
             'default' => [Io\Poll\Event::Write, Io\Poll\Event::HangUp],
@@ -56,7 +56,7 @@ pt_expect_events($poll_ctx->wait(0, 100000), [
 ], $poll_ctx);
 
 fclose($socket1w);
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt
index 4a7b67b8243f..29432b7f95af 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_single_edge.phpt
@@ -15,11 +15,11 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read, Io\Poll\Event::EdgeTriggered], "socket1_data");
 pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write, Io\Poll\Event::EdgeTriggered], "socket2_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data']
 ]);
 fwrite($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data']
 ]);
 
diff --git a/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt b/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt
index a807e573c5fe..f0a64fc06387 100644
--- a/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_rw_single_level.phpt
@@ -10,11 +10,11 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read], "socket1_data");
 pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write], "socket2_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data']
 ]);
 fwrite($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket2_data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket1_data', 'read' => 'test data']
 ]);
diff --git a/ext/standard/tests/poll/poll_stream_sock_write.phpt b/ext/standard/tests/poll/poll_stream_sock_write.phpt
index 2d937d7e9a3b..1bfb0524ec87 100644
--- a/ext/standard/tests/poll/poll_stream_sock_write.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_write.phpt
@@ -9,7 +9,7 @@ $poll_ctx = pt_new_stream_poll();
 
 pt_stream_poll_add($poll_ctx, $socket1w, [Io\Poll\Event::Write], "socket_data");
 
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'socket_data']
 ]);
 
diff --git a/ext/standard/tests/poll/poll_stream_sock_write_close.phpt b/ext/standard/tests/poll/poll_stream_sock_write_close.phpt
index 8927e017b05d..49e452907f20 100644
--- a/ext/standard/tests/poll/poll_stream_sock_write_close.phpt
+++ b/ext/standard/tests/poll/poll_stream_sock_write_close.phpt
@@ -13,7 +13,7 @@ pt_stream_poll_add($poll_ctx, $socket2w, [Io\Poll\Event::Write], "socket2w_data"
 
 fclose($socket1w);
 fclose($socket2w);
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_read.phpt b/ext/standard/tests/poll/poll_stream_tcp_read.phpt
index 71c7af0ca734..e9296a266e04 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_read.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_read.phpt
@@ -10,7 +10,7 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $socket1r, [Io\Poll\Event::Read], "socket_data");
 
 pt_write_sleep($socket1w, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'socket_data', 'read' => 'test data']
 ]);
 
diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_max_events.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_max_events.phpt
index f927e73ed4d3..bb2c734cbf2c 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_read_max_events.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_read_max_events.phpt
@@ -19,7 +19,7 @@ for ($i = 0; $i < count($clients); $i++) {
 // events must be delivered by the following wait() without any duplicates.
 $seen = [];
 for ($round = 1; $round <= 2; $round++) {
-    $watchers = $poll_ctx->wait(0, 100000, 4);
+    $watchers = $poll_ctx->wait(Time\Duration::fromMicroseconds(100000), 4);
     echo "Round $round count: " . count($watchers) . "\n";
     foreach ($watchers as $watcher) {
         $data = $watcher->getData();
@@ -35,7 +35,7 @@ for ($round = 1; $round <= 2; $round++) {
 ksort($seen);
 echo "Seen: " . implode(',', array_keys($seen)) . "\n";
 
-pt_expect_events($poll_ctx->wait(0), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt
index db2ff71fb7c8..bc49571ca8ef 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_read_multiple_level.phpt
@@ -11,7 +11,7 @@ for ($i = 0; $i < count($servers); $i++) {
     pt_stream_poll_add($poll_ctx, $servers[$i], [Io\Poll\Event::Read], "server{$i}_data");
 }
 
-pt_expect_events($poll_ctx->wait(0), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), []);
 
 for ($i = 0; $i < count($clients); $i++) {
     pt_write_sleep($clients[$i], "test $i data");
@@ -22,16 +22,16 @@ $expected_events = [];
 for ($i = 0; $i < 20; $i++) {
     $expected_events[] = ['events' => [Io\Poll\Event::Read], 'data' => "server{$i}_data", 'read' => "test $i data"];
 }
-pt_expect_events($poll_ctx->wait(0, 100000), $expected_events);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), $expected_events);
 
 pt_write_sleep($clients[1], "more data");
 pt_write_sleep($clients[2], "more data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'server1_data', 'read' => 'more data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'server2_data', 'read' => 'more data']
 ]);
 
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt
index 02db6355ca1a..c8f7c424b3dc 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot.phpt
@@ -13,18 +13,18 @@ pt_stream_poll_add($poll_ctx, $server1, [Io\Poll\Event::Read, Io\Poll\Event::One
 pt_stream_poll_add($poll_ctx, $client2, [Io\Poll\Event::Read, Io\Poll\Event::OneShot], "client2_data");
 pt_stream_poll_add($poll_ctx, $server2, [Io\Poll\Event::Read, Io\Poll\Event::OneShot], "server2_data");
 
-pt_expect_events($poll_ctx->wait(0), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), []);
 
 pt_write_sleep($client1, "test data");
 pt_write_sleep($client2, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Read], 'data' => 'server1_data', 'read' => 'test data'],
     ['events' => [Io\Poll\Event::Read], 'data' => 'server2_data', 'read' => 'test data']
 ]);
 
 pt_write_sleep($client1, "more data");
 pt_write_sleep($client2, "more data");
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_read_one_shot_max_events.phpt b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot_max_events.phpt
index d7a2e48be6f4..73142b16f636 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_read_one_shot_max_events.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_read_one_shot_max_events.phpt
@@ -20,7 +20,7 @@ for ($i = 0; $i < count($clients); $i++) {
 // them, and each oneshot event must be delivered exactly once.
 $seen = [];
 for ($round = 1; $round <= 2; $round++) {
-    $watchers = $poll_ctx->wait(0, 100000, 4);
+    $watchers = $poll_ctx->wait(Time\Duration::fromMicroseconds(100000), 4);
     echo "Round $round count: " . count($watchers) . "\n";
     foreach ($watchers as $watcher) {
         $data = $watcher->getData();
@@ -36,7 +36,7 @@ echo "Seen: " . implode(',', array_keys($seen)) . "\n";
 
 // Every oneshot watcher fired once, so new data must not be reported
 pt_write_sleep($clients[0], "more data");
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt
index 6132975e1b50..79db5608b974 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot.phpt
@@ -10,16 +10,16 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $client, [Io\Poll\Event::Read, Io\Poll\Event::Write, Io\Poll\Event::OneShot], "client_data");
 pt_stream_poll_add($poll_ctx, $server, [Io\Poll\Event::Read, Io\Poll\Event::Write, Io\Poll\Event::OneShot], "server_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'],
     ['events' => [Io\Poll\Event::Write], 'data' => 'server_data']
 ]);
 
 pt_write_sleep($client, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 pt_write_sleep($client, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt
index c480caf1b73d..b8646f252e70 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_rw_one_shot_mixed.phpt
@@ -11,13 +11,13 @@ pt_stream_poll_add($poll_ctx, $client, [Io\Poll\Event::Read, Io\Poll\Event::Writ
 pt_stream_poll_add($poll_ctx, $server, [Io\Poll\Event::Read, Io\Poll\Event::Write, Io\Poll\Event::OneShot], "server_data");
 
 pt_write_sleep($client, "test data");
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'],
     ['events' => [Io\Poll\Event::Read, Io\Poll\Event::Write], 'data' => 'server_data']
 ]);
 
 pt_write_sleep($client, "test data");
-pt_expect_events($poll_ctx->wait(0, 100000), []);
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), []);
 
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt b/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt
index f29a74f19edd..9300e2266f37 100644
--- a/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt
+++ b/ext/standard/tests/poll/poll_stream_tcp_rw_single_level.phpt
@@ -10,14 +10,14 @@ $poll_ctx = pt_new_stream_poll();
 pt_stream_poll_add($poll_ctx, $client, [Io\Poll\Event::Read, Io\Poll\Event::Write], "client_data");
 pt_stream_poll_add($poll_ctx, $server, [Io\Poll\Event::Read, Io\Poll\Event::Write], "server_data");
 
-pt_expect_events($poll_ctx->wait(0), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromSeconds(0)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'],
     ['events' => [Io\Poll\Event::Write], 'data' => 'server_data']
 ]);
 
 fwrite($client, "test data");
 usleep(10000);
-pt_expect_events($poll_ctx->wait(0, 100000), [
+pt_expect_events($poll_ctx->wait(Time\Duration::fromMicroseconds(100000)), [
     ['events' => [Io\Poll\Event::Write], 'data' => 'client_data'],
     ['events' => [Io\Poll\Event::Read, Io\Poll\Event::Write], 'data' => 'server_data', 'read' => 'test data']
 ]);
diff --git a/ext/standard/tests/poll/poll_stream_wait_no_add.phpt b/ext/standard/tests/poll/poll_stream_wait_no_add.phpt
index a297fa5e1162..14789d709f6b 100644
--- a/ext/standard/tests/poll/poll_stream_wait_no_add.phpt
+++ b/ext/standard/tests/poll/poll_stream_wait_no_add.phpt
@@ -4,7 +4,7 @@ Poll stream - only wait
 <?php
 require_once __DIR__ . '/poll.inc';
 $poll_ctx = pt_new_stream_poll();
-$events = $poll_ctx->wait(0, 100000);
+$events = $poll_ctx->wait(Time\Duration::fromMicroseconds(100000));
 pt_print_events($events);
 
 ?>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.