Skip to content

Commit 5a56ffc

Browse files
committed
Add get_pmu_event_info()
1 parent 1011727 commit 5a56ffc

File tree

5 files changed

+97
-2
lines changed

5 files changed

+97
-2
lines changed

src/functions.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,42 @@ static PHP_FUNCTION(perfidious_get_pmu_info)
4545
Z_PARAM_LONG(pmu)
4646
ZEND_PARSE_PARAMETERS_END();
4747

48-
if (SUCCESS != perfidious_get_pmu_info(pmu, return_value, false)) {
48+
if (UNEXPECTED(SUCCESS != perfidious_get_pmu_info(pmu, return_value, false))) {
49+
RETURN_NULL();
50+
}
51+
}
52+
53+
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(perfidious_get_pmu_event_info_arginfo, false, 2, Perfidious\\PmuEventInfo, false)
54+
ZEND_ARG_TYPE_INFO(false, pmu, IS_LONG, false)
55+
ZEND_ARG_TYPE_INFO(false, idx, IS_LONG, false)
56+
ZEND_END_ARG_INFO()
57+
58+
ZEND_COLD
59+
static PHP_FUNCTION(perfidious_get_pmu_event_info)
60+
{
61+
zend_long pmu;
62+
zend_long idx;
63+
pfm_pmu_info_t pmu_info = {0};
64+
pmu_info.size = sizeof(pmu_info);
65+
66+
ZEND_PARSE_PARAMETERS_START(2, 2)
67+
Z_PARAM_LONG(pmu)
68+
Z_PARAM_LONG(idx)
69+
ZEND_PARSE_PARAMETERS_END();
70+
71+
pfm_err_t pfm_err = pfm_get_pmu_info(pmu, &pmu_info);
72+
if (PFM_SUCCESS != pfm_err) {
73+
zend_throw_exception_ex(
74+
perfidious_pmu_not_found_exception_ce,
75+
pfm_err,
76+
"cannot get pmu info for %lu: %s",
77+
pmu,
78+
pfm_strerror(pfm_err)
79+
);
80+
return;
81+
}
82+
83+
if (UNEXPECTED(SUCCESS != perfidious_get_pmu_event_info(&pmu_info, (int) idx, return_value))) {
4984
RETURN_NULL();
5085
}
5186
}
@@ -268,6 +303,7 @@ static ZEND_FUNCTION(perfidious_debug_uint64_overflow)
268303
PERFIDIOUS_LOCAL
269304
const zend_function_entry perfidious_functions[] = {
270305
ZEND_RAW_FENTRY(PHP_PERFIDIOUS_NAMESPACE "\\get_pmu_info", ZEND_FN(perfidious_get_pmu_info), perfidious_get_pmu_info_arginfo, 0)
306+
ZEND_RAW_FENTRY(PHP_PERFIDIOUS_NAMESPACE "\\get_pmu_event_info", ZEND_FN(perfidious_get_pmu_event_info), perfidious_get_pmu_event_info_arginfo, 0)
271307
ZEND_RAW_FENTRY(PHP_PERFIDIOUS_NAMESPACE "\\global_handle", ZEND_FN(perfidious_global_handle), perfidious_global_handle_arginfo, 0)
272308
ZEND_RAW_FENTRY(PHP_PERFIDIOUS_NAMESPACE "\\list_pmus", ZEND_FN(perfidious_list_pmus), perfidious_list_pmus_arginfo, 0)
273309
ZEND_RAW_FENTRY(PHP_PERFIDIOUS_NAMESPACE "\\list_pmu_events", ZEND_FN(perfidious_list_pmu_events), perfidious_list_pmu_events_arginfo, 0)

src/pmu_event_info.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "private.h"
2929

3030
PERFIDIOUS_LOCAL zend_string *PERFIDIOUS_INTERNED_EQUIV;
31+
PERFIDIOUS_LOCAL zend_string *PERFIDIOUS_INTERNED_IDX;
3132
PERFIDIOUS_PUBLIC zend_class_entry *perfidious_pmu_event_info_ce;
3233

3334
ZEND_COLD
@@ -62,6 +63,9 @@ perfidious_pmu_event_info_ctor(pfm_pmu_info_t *pmu_info, pfm_event_info_t *info,
6263
ZVAL_LONG(&tmp, (zend_long) info->pmu);
6364
zend_update_property_ex(Z_OBJCE_P(return_value), Z_OBJ_P(return_value), PERFIDIOUS_INTERNED_PMU, &tmp);
6465

66+
ZVAL_LONG(&tmp, (zend_long) info->idx);
67+
zend_update_property_ex(Z_OBJCE_P(return_value), Z_OBJ_P(return_value), PERFIDIOUS_INTERNED_IDX, &tmp);
68+
6569
ZVAL_BOOL(&tmp, pmu_info->is_present);
6670
zend_update_property_ex(Z_OBJCE_P(return_value), Z_OBJ_P(return_value), PERFIDIOUS_INTERNED_IS_PRESENT, &tmp);
6771

@@ -154,6 +158,19 @@ static zend_always_inline zend_class_entry *register_class_PmuEventInfo(void)
154158
);
155159
} while (false);
156160

161+
do {
162+
zval default_value = {0};
163+
ZVAL_UNDEF(&default_value);
164+
zend_declare_typed_property(
165+
class_entry,
166+
PERFIDIOUS_INTERNED_IDX,
167+
&default_value,
168+
ZEND_ACC_PUBLIC | ZEND_ACC_READONLY,
169+
NULL,
170+
(zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG)
171+
);
172+
} while (false);
173+
157174
do {
158175
zval default_value = {0};
159176
ZVAL_UNDEF(&default_value);
@@ -179,6 +196,7 @@ void perfidious_pmu_event_info_minit(void)
179196
PERFIDIOUS_INTERNED_DESC = zend_string_init_interned(ZEND_STRL("desc"), 1);
180197
PERFIDIOUS_INTERNED_EQUIV = zend_string_init_interned(ZEND_STRL("equiv"), 1);
181198
PERFIDIOUS_INTERNED_PMU = zend_string_init_interned(ZEND_STRL("pmu"), 1);
199+
PERFIDIOUS_INTERNED_IDX = zend_string_init_interned(ZEND_STRL("idx"), 1);
182200
PERFIDIOUS_INTERNED_IS_PRESENT = zend_string_init_interned(ZEND_STRL("is_present"), 1);
183201

184202
perfidious_pmu_event_info_ce = register_class_PmuEventInfo();

tests/get-pmu-event-info.phpt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Perfidious\get_pmu_event_info()
3+
--EXTENSIONS--
4+
perfidious
5+
--FILE--
6+
<?php
7+
$idx = Perfidious\list_pmu_events(51)[0]->idx;
8+
$pmu = Perfidious\get_pmu_event_info(51, $idx);
9+
var_dump(get_class($pmu));
10+
try {
11+
Perfidious\get_pmu_event_info(0, $idx);
12+
} catch (\Throwable $e) {
13+
var_dump(get_class($e), $e->getMessage());
14+
}
15+
try {
16+
Perfidious\get_pmu_event_info(51, 12345);
17+
} catch (\Throwable $e) {
18+
var_dump(get_class($e), $e->getMessage());
19+
}
20+
--EXPECTF--
21+
string(%d) "Perfidious\PmuEventInfo"
22+
string(%d) "Perfidious\PmuNotFoundException"
23+
string(%d) "cannot get pmu info for %d: not supported"
24+
string(%d) "Perfidious\PmuEventNotFoundException"
25+
string(%d) "libpfm: cannot get event info for %d: invalid parameters"

tests/list-pmu-events.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ foreach ($events as $event) {
1717
bool(true)
1818
int(%d)
1919
string(%d) "Perfidious\PmuEventInfo"
20-
object(Perfidious\PmuEventInfo)#%d (5) {
20+
object(Perfidious\PmuEventInfo)#%d (%d) {
2121
["name"]=>
2222
string(30) "perf::PERF_COUNT_HW_CPU_CYCLES"
2323
["desc"]=>
@@ -26,6 +26,8 @@ object(Perfidious\PmuEventInfo)#%d (5) {
2626
NULL
2727
["pmu"]=>
2828
int(51)
29+
["idx"]=>
30+
int(%d)
2931
["is_present"]=>
3032
bool(true)
3133
}

tests/overflow/whoops.phpt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--TEST--
2+
overflow (whoops)
3+
--EXTENSIONS--
4+
perfidious
5+
gmp
6+
--SKIPIF--
7+
<?php if (!Perfidious\DEBUG) die("skip: must be compiled in debug mode"); ?>
8+
--INI--
9+
perfidious.overflow_mode=3
10+
--FILE--
11+
<?php
12+
Perfidious\debug_uint64_overflow(PHP_INT_MAX);
13+
--EXPECTF--
14+
%A Uncaught TypeError: Overflow mode out-of-range %A

0 commit comments

Comments
 (0)