49
49
#include <sys/cpuset.h>
50
50
typedef cpuset_t cpu_set_t ;
51
51
#endif
52
+ #define PCNTL_CPUSET (mask ) &mask
53
+ #define PCNTL_CPUSET_SIZE (mask ) sizeof(mask)
54
+ #define PCNTL_CPU_ISSET (i , mask ) CPU_ISSET(i, &mask)
55
+ #define PCNTL_CPU_SET (i , mask ) CPU_SET(i, &mask)
56
+ #define PCNTL_CPU_ZERO (mask ) CPU_ZERO(&mask)
57
+ #define PCNTL_CPU_DESTROY (mask ) ((void)0)
58
+ #elif defined(__NetBSD__ )
59
+ #include <sys/syscall.h>
60
+ #include <sched.h>
61
+ typedef cpuset_t * cpu_set_t ;
62
+ #define sched_getaffinity (p , c , m ) syscall(SYS__sched_getaffinity, p, 0, c, m)
63
+ #define sched_setaffinity (p , c , m ) syscall(SYS__sched_setaffinity, p, 0, c, m)
64
+ #define PCNTL_CPUSET (mask ) mask
65
+ #define PCNTL_CPUSET_SIZE (mask ) cpuset_size(mask)
66
+ #define PCNTL_CPU_ISSET (i , mask ) cpuset_isset((cpuid_t)i, mask)
67
+ #define PCNTL_CPU_SET (i , mask ) cpuset_set((cpuid_t)i, mask)
68
+ #define PCNTL_CPU_ZERO (mask ) \
69
+ do { \
70
+ mask = cpuset_create(); \
71
+ if (UNEXPECTED(!mask)) { \
72
+ php_error_docref(NULL, E_WARNING, "cpuset_create: Insufficient memory"); \
73
+ RETURN_FALSE; \
74
+ } \
75
+ cpuset_zero(mask); \
76
+ } while(0)
77
+ #define PCNTL_CPU_DESTROY (mask ) cpuset_destroy(mask)
78
+ #define HAVE_SCHED_SETAFFINITY 1
52
79
#endif
53
80
54
81
#if defined(HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP )
@@ -1533,9 +1560,10 @@ PHP_FUNCTION(pcntl_getcpuaffinity)
1533
1560
// 0 == getpid in this context, we're just saving a syscall
1534
1561
pid = pid_is_null ? 0 : pid ;
1535
1562
1536
- CPU_ZERO ( & mask );
1563
+ PCNTL_CPU_ZERO ( mask );
1537
1564
1538
- if (sched_getaffinity (pid , sizeof (mask ), & mask ) != 0 ) {
1565
+ if (sched_getaffinity (pid , PCNTL_CPUSET_SIZE (mask ), PCNTL_CPUSET (mask )) != 0 ) {
1566
+ PCNTL_CPU_DESTROY (mask );
1539
1567
PCNTL_G (last_error ) = errno ;
1540
1568
switch (errno ) {
1541
1569
case ESRCH :
@@ -1558,10 +1586,11 @@ PHP_FUNCTION(pcntl_getcpuaffinity)
1558
1586
array_init (return_value );
1559
1587
1560
1588
for (zend_ulong i = 0 ; i < maxcpus ; i ++ ) {
1561
- if (CPU_ISSET (i , & mask )) {
1589
+ if (PCNTL_CPU_ISSET (i , mask )) {
1562
1590
add_next_index_long (return_value , i );
1563
1591
}
1564
1592
}
1593
+ PCNTL_CPU_DESTROY (mask );
1565
1594
}
1566
1595
1567
1596
PHP_FUNCTION (pcntl_setcpuaffinity )
@@ -1585,7 +1614,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1585
1614
// 0 == getpid in this context, we're just saving a syscall
1586
1615
pid = pid_is_null ? 0 : pid ;
1587
1616
zend_ulong maxcpus = (zend_ulong )sysconf (_SC_NPROCESSORS_CONF );
1588
- CPU_ZERO ( & mask );
1617
+ PCNTL_CPU_ZERO ( mask );
1589
1618
1590
1619
ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (hmask ), ncpu ) {
1591
1620
ZVAL_DEREF (ncpu );
@@ -1595,6 +1624,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1595
1624
zend_ulong tmp ;
1596
1625
if (!ZEND_HANDLE_NUMERIC (Z_STR_P (ncpu ), tmp )) {
1597
1626
zend_argument_value_error (2 , "cpu id invalid value (%s)" , ZSTR_VAL (Z_STR_P (ncpu )));
1627
+ PCNTL_CPU_DESTROY (mask );
1598
1628
RETURN_THROWS ();
1599
1629
}
1600
1630
@@ -1603,6 +1633,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1603
1633
zend_string * wcpu = zval_get_string_func (ncpu );
1604
1634
zend_argument_value_error (2 , "cpu id invalid type (%s)" , ZSTR_VAL (wcpu ));
1605
1635
zend_string_release (wcpu );
1636
+ PCNTL_CPU_DESTROY (mask );
1606
1637
RETURN_THROWS ();
1607
1638
}
1608
1639
} else {
@@ -1614,12 +1645,13 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1614
1645
RETURN_THROWS ();
1615
1646
}
1616
1647
1617
- if (!CPU_ISSET (cpu , & mask )) {
1618
- CPU_SET (cpu , & mask );
1648
+ if (!PCNTL_CPU_ISSET (cpu , mask )) {
1649
+ PCNTL_CPU_SET (cpu , mask );
1619
1650
}
1620
1651
} ZEND_HASH_FOREACH_END ();
1621
1652
1622
- if (sched_setaffinity (pid , sizeof (mask ), & mask ) != 0 ) {
1653
+ if (sched_setaffinity (pid , PCNTL_CPUSET_SIZE (mask ), PCNTL_CPUSET (mask )) != 0 ) {
1654
+ PCNTL_CPU_DESTROY (mask );
1623
1655
PCNTL_G (last_error ) = errno ;
1624
1656
switch (errno ) {
1625
1657
case ESRCH :
@@ -1636,6 +1668,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1636
1668
}
1637
1669
RETURN_FALSE ;
1638
1670
} else {
1671
+ PCNTL_CPU_DESTROY (mask );
1639
1672
RETURN_TRUE ;
1640
1673
}
1641
1674
}
0 commit comments