[ruby/etc] Get rid of alloca in the loop
https://github.com/ruby/etc/commit/c989bacc4c
This commit is contained in:
parent
1d6a490c2c
commit
d210950196
@ -957,11 +957,13 @@ io_pathconf(VALUE io, VALUE arg)
|
|||||||
static int
|
static int
|
||||||
etc_nprocessors_affin(void)
|
etc_nprocessors_affin(void)
|
||||||
{
|
{
|
||||||
cpu_set_t *cpuset;
|
cpu_set_t *cpuset, cpuset_buff[1024 / sizeof(cpu_set_t)];
|
||||||
size_t size;
|
size_t size;
|
||||||
int ret;
|
int ret;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
|
CPU_ZERO_S(sizeof(cpuset_buff), cpuset_buff);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* XXX:
|
* XXX:
|
||||||
* man page says CPU_ALLOC takes number of cpus. But it is not accurate
|
* man page says CPU_ALLOC takes number of cpus. But it is not accurate
|
||||||
@ -980,13 +982,12 @@ etc_nprocessors_affin(void)
|
|||||||
*/
|
*/
|
||||||
for (n=64; n <= 16384; n *= 2) {
|
for (n=64; n <= 16384; n *= 2) {
|
||||||
size = CPU_ALLOC_SIZE(n);
|
size = CPU_ALLOC_SIZE(n);
|
||||||
if (size >= 1024) {
|
if (size >= sizeof(cpuset_buff)) {
|
||||||
cpuset = xcalloc(1, size);
|
cpuset = xcalloc(1, size);
|
||||||
if (!cpuset)
|
if (!cpuset)
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
cpuset = alloca(size);
|
cpuset = cpuset_buff;
|
||||||
CPU_ZERO_S(size, cpuset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sched_getaffinity(0, size, cpuset);
|
ret = sched_getaffinity(0, size, cpuset);
|
||||||
@ -995,10 +996,10 @@ etc_nprocessors_affin(void)
|
|||||||
ret = CPU_COUNT_S(size, cpuset);
|
ret = CPU_COUNT_S(size, cpuset);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size >= 1024) {
|
if (size >= sizeof(cpuset_buff)) {
|
||||||
xfree(cpuset);
|
xfree(cpuset);
|
||||||
}
|
}
|
||||||
if (ret > 0) {
|
if (ret > 0 || errno != EINVAL) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user