Skip to content

Commit 85df17c

Browse files
committed
changes from feeback 2
1 parent 376bdd9 commit 85df17c

File tree

5 files changed

+81
-67
lines changed

5 files changed

+81
-67
lines changed

ext/pcntl/pcntl.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ typedef cpuset_t cpu_set_t;
5353

5454
#if defined(HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP)
5555
#include <pthread/qos.h>
56+
PHPAPI zend_class_entry *QosClass_ce;
5657
#endif
5758

5859
#ifdef HAVE_PIDFD_OPEN
@@ -69,10 +70,11 @@ typedef cpuset_t cpu_set_t;
6970

7071
#define LONG_CONST(c) (zend_long) c
7172

72-
#include "pcntl_arginfo.h"
73-
73+
#include "Zend/zend_enum.h"
7474
#include "Zend/zend_max_execution_timer.h"
7575

76+
#include "pcntl_arginfo.h"
77+
7678
ZEND_DECLARE_MODULE_GLOBALS(pcntl)
7779
static PHP_GINIT_FUNCTION(pcntl);
7880

@@ -140,6 +142,9 @@ PHP_RINIT_FUNCTION(pcntl)
140142

141143
PHP_MINIT_FUNCTION(pcntl)
142144
{
145+
#if defined(HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP)
146+
QosClass_ce = register_class_QosClass();
147+
#endif
143148
register_pcntl_symbols(module_number);
144149
orig_interrupt_function = zend_interrupt_function;
145150
zend_interrupt_function = pcntl_interrupt_function;
@@ -1630,6 +1635,7 @@ PHP_FUNCTION(pcntl_getcpu)
16301635
PHP_FUNCTION(pcntl_getqos_class)
16311636
{
16321637
qos_class_t qos_class;
1638+
zend_object *qos_obj;
16331639

16341640
ZEND_PARSE_PARAMETERS_NONE();
16351641

@@ -1641,21 +1647,29 @@ PHP_FUNCTION(pcntl_getqos_class)
16411647
RETURN_THROWS();
16421648
}
16431649

1644-
RETURN_LONG((zend_long)qos_class);
1650+
if (UNEXPECTED(zend_enum_get_case_by_value(&qos_obj, QosClass_ce, (zend_long)qos_class, NULL, false) == FAILURE))
1651+
{
1652+
zend_throw_error(NULL, "invalid QOS value class entry %u", qos_class);
1653+
RETURN_THROWS();
1654+
}
1655+
1656+
ZVAL_COPY_OR_DUP(return_value, zend_enum_fetch_case_value(qos_obj));
16451657
}
16461658

16471659
PHP_FUNCTION(pcntl_setqos_class)
16481660
{
1649-
zend_long qos_class = QOS_CLASS_DEFAULT;
1661+
zval *qos_obj;
16501662

16511663
ZEND_PARSE_PARAMETERS_START(1, 1)
1652-
Z_PARAM_LONG(qos_class)
1664+
Z_PARAM_OBJECT_OF_CLASS(qos_obj, QosClass_ce)
16531665
ZEND_PARSE_PARAMETERS_END();
16541666

1667+
zend_long qos_class = Z_LVAL_P(zend_enum_fetch_case_value(Z_OBJ_P(qos_obj)));
1668+
16551669
if (pthread_set_qos_class_self_np((qos_class_t)qos_class, 0) != 0)
16561670
{
16571671
PCNTL_G(last_error) = errno;
1658-
zend_argument_value_error(1, "must be one of QOS_CLASS_USER_INTERACTIVE, QOS_CLASS_USER_INITIATED, QOS_CLASS_DEFAULT, QOS_CLASS_UTILITY and QOS_CLASS_BACKGROUND");
1672+
zend_argument_value_error(1, "must be one of QosClass enum entries : ::UserInteractive, ::UserInitiated, ::Default, ::Utility and ::Background");
16591673
RETURN_THROWS();
16601674
}
16611675
}

ext/pcntl/pcntl.stub.php

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -905,39 +905,6 @@
905905
const PCNTL_ECAPMODE = UNKNOWN;
906906
#endif
907907

908-
#ifdef HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP
909-
/**
910-
* @var int
911-
* @cvalue QOS_CLASS_USER_INTERACTIVE
912-
*/
913-
const QOS_CLASS_USER_INTERACTIVE = UNKNOWN;
914-
/**
915-
* @var int
916-
* @cvalue QOS_CLASS_USER_INITIATED
917-
*/
918-
const QOS_CLASS_USER_INITIATED = UNKNOWN;
919-
/**
920-
* @var int
921-
* @cvalue QOS_CLASS_DEFAULT
922-
*/
923-
const QOS_CLASS_DEFAULT = UNKNOWN;
924-
/**
925-
* @var int
926-
* @cvalue QOS_CLASS_UTILITY
927-
*/
928-
const QOS_CLASS_UTILITY = UNKNOWN;
929-
/**
930-
* @var int
931-
* @cvalue QOS_CLASS_BACKGROUND
932-
*/
933-
const QOS_CLASS_BACKGROUND = UNKNOWN;
934-
/**
935-
* @var int
936-
* @cvalue QOS_CLASS_UNSPECIFIED
937-
*/
938-
const QOS_CLASS_UNSPECIFIED = UNKNOWN;
939-
#endif
940-
941908
function pcntl_fork(): int {}
942909

943910
/**
@@ -1038,6 +1005,16 @@ function pcntl_getcpu(): int {}
10381005
#endif
10391006

10401007
#ifdef HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP
1041-
function pcntl_getqos_class(): int {}
1042-
function pcntl_setqos_class(int $qos_class = QOS_CLASS_DEFAULT): void {}
1008+
enum QosClass: int
1009+
{
1010+
case UserInteractive = 0x21;
1011+
case UserInitiated = 0x19;
1012+
case Default = 0x15;
1013+
case Utility = 0x11;
1014+
case Background = 0x09;
1015+
case Unspecified = 0x00;
1016+
}
1017+
1018+
function pcntl_getqos_class(): QosClass {}
1019+
function pcntl_setqos_class(QosClass $qos_class = QosClass::Default): void {}
10431020
#endif

ext/pcntl/pcntl_arginfo.h

Lines changed: 41 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/pcntl/php_pcntl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,6 @@ ZEND_TSRMLS_CACHE_EXTERN()
5858
ZEND_EXTERN_MODULE_GLOBALS(pcntl)
5959
#define PCNTL_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(pcntl, v)
6060

61+
extern PHPAPI zend_class_entry *QosClass_ce;
62+
6163
#endif /* PHP_PCNTL_H */

ext/pcntl/tests/pcntl_qosclass.phpt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,18 @@ if (getenv('SKIP_REPEAT')) die("skip Not repeatable");
99
?>
1010
--FILE--
1111
<?php
12-
pcntl_setqos_class(QOS_CLASS_DEFAULT);
13-
var_dump(QOS_CLASS_DEFAULT === pcntl_getqos_class());
12+
pcntl_setqos_class(QosClass::Default);
13+
var_dump(QosClass::Default->value === pcntl_getqos_class());
1414

1515
try {
16-
pcntl_setqos_class(QOS_CLASS_UNSPECIFIED);
16+
pcntl_setqos_class(QosClass::Unspecified);
1717
} catch (\ValueError $e) {
1818
echo $e->getMessage() . PHP_EOL;
1919
}
20-
pcntl_setqos_class(QOS_CLASS_BACKGROUND);
21-
var_dump(QOS_CLASS_BACKGROUND === pcntl_getqos_class());
20+
pcntl_setqos_class(QosClass::Background);
21+
var_dump(QosClass::Background->value == pcntl_getqos_class());
2222
?>
2323
--EXPECT--
2424
bool(true)
25-
pcntl_setqos_class(): Argument #1 ($qos_class) must be one of QOS_CLASS_USER_INTERACTIVE, QOS_CLASS_USER_INITIATED, QOS_CLASS_DEFAULT, QOS_CLASS_UTILITY and QOS_CLASS_BACKGROUND
25+
pcntl_setqos_class(): Argument #1 ($qos_class) must be one of QosClass enum entries : ::UserInteractive, ::UserInitiated, ::Default, ::Utility and ::Background
2626
bool(true)

0 commit comments

Comments
 (0)