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 ) (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
+ RETURN_FALSE; \
73
+ } \
74
+ cpuset_zero(mask); \
75
+ } while(0)
76
+ #define PCNTL_CPU_DESTROY (mask ) cpuset_destroy(mask)
77
+ #define HAVE_SCHED_SETAFFINITY 1
52
78
#endif
53
79
54
80
#if defined(HAVE_PTHREAD_SET_QOS_CLASS_SELF_NP )
@@ -1533,9 +1559,10 @@ PHP_FUNCTION(pcntl_getcpuaffinity)
1533
1559
// 0 == getpid in this context, we're just saving a syscall
1534
1560
pid = pid_is_null ? 0 : pid ;
1535
1561
1536
- CPU_ZERO ( & mask );
1562
+ PCNTL_CPU_ZERO ( mask );
1537
1563
1538
- if (sched_getaffinity (pid , sizeof (mask ), & mask ) != 0 ) {
1564
+ if (sched_getaffinity (pid , PCNTL_CPUSET_SIZE (mask ), PCNTL_CPUSET (mask )) != 0 ) {
1565
+ PCNTL_CPU_DESTROY (mask );
1539
1566
PCNTL_G (last_error ) = errno ;
1540
1567
switch (errno ) {
1541
1568
case ESRCH :
@@ -1558,10 +1585,11 @@ PHP_FUNCTION(pcntl_getcpuaffinity)
1558
1585
array_init (return_value );
1559
1586
1560
1587
for (zend_ulong i = 0 ; i < maxcpus ; i ++ ) {
1561
- if (CPU_ISSET (i , & mask )) {
1588
+ if (PCNTL_CPU_ISSET (i , mask )) {
1562
1589
add_next_index_long (return_value , i );
1563
1590
}
1564
1591
}
1592
+ PCNTL_CPU_DESTROY (mask );
1565
1593
}
1566
1594
1567
1595
PHP_FUNCTION (pcntl_setcpuaffinity )
@@ -1585,7 +1613,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1585
1613
// 0 == getpid in this context, we're just saving a syscall
1586
1614
pid = pid_is_null ? 0 : pid ;
1587
1615
zend_ulong maxcpus = (zend_ulong )sysconf (_SC_NPROCESSORS_CONF );
1588
- CPU_ZERO ( & mask );
1616
+ PCNTL_CPU_ZERO ( mask );
1589
1617
1590
1618
ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (hmask ), ncpu ) {
1591
1619
ZVAL_DEREF (ncpu );
@@ -1595,6 +1623,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1595
1623
zend_ulong tmp ;
1596
1624
if (!ZEND_HANDLE_NUMERIC (Z_STR_P (ncpu ), tmp )) {
1597
1625
zend_argument_value_error (2 , "cpu id invalid value (%s)" , ZSTR_VAL (Z_STR_P (ncpu )));
1626
+ PCNTL_CPU_DESTROY (mask );
1598
1627
RETURN_THROWS ();
1599
1628
}
1600
1629
@@ -1603,6 +1632,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1603
1632
zend_string * wcpu = zval_get_string_func (ncpu );
1604
1633
zend_argument_value_error (2 , "cpu id invalid type (%s)" , ZSTR_VAL (wcpu ));
1605
1634
zend_string_release (wcpu );
1635
+ PCNTL_CPU_DESTROY (mask );
1606
1636
RETURN_THROWS ();
1607
1637
}
1608
1638
} else {
@@ -1614,12 +1644,13 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1614
1644
RETURN_THROWS ();
1615
1645
}
1616
1646
1617
- if (!CPU_ISSET (cpu , & mask )) {
1618
- CPU_SET (cpu , & mask );
1647
+ if (!PCNTL_CPU_ISSET (cpu , mask )) {
1648
+ PCNTL_CPU_SET (cpu , mask );
1619
1649
}
1620
1650
} ZEND_HASH_FOREACH_END ();
1621
1651
1622
- if (sched_setaffinity (pid , sizeof (mask ), & mask ) != 0 ) {
1652
+ if (sched_setaffinity (pid , PCNTL_CPUSET_SIZE (mask ), PCNTL_CPUSET (mask )) != 0 ) {
1653
+ PCNTL_CPU_DESTROY (mask );
1623
1654
PCNTL_G (last_error ) = errno ;
1624
1655
switch (errno ) {
1625
1656
case ESRCH :
@@ -1636,6 +1667,7 @@ PHP_FUNCTION(pcntl_setcpuaffinity)
1636
1667
}
1637
1668
RETURN_FALSE ;
1638
1669
} else {
1670
+ PCNTL_CPU_DESTROY (mask );
1639
1671
RETURN_TRUE ;
1640
1672
}
1641
1673
}
0 commit comments