зеркало из https://github.com/github/ruby.git
[ruby/etc] Get rid of alloca in the loop
https://github.com/ruby/etc/commit/c989bacc4c
This commit is contained in:
Родитель
1d6a490c2c
Коммит
d210950196
|
@ -957,11 +957,13 @@ io_pathconf(VALUE io, VALUE arg)
|
|||
static int
|
||||
etc_nprocessors_affin(void)
|
||||
{
|
||||
cpu_set_t *cpuset;
|
||||
cpu_set_t *cpuset, cpuset_buff[1024 / sizeof(cpu_set_t)];
|
||||
size_t size;
|
||||
int ret;
|
||||
int n;
|
||||
|
||||
CPU_ZERO_S(sizeof(cpuset_buff), cpuset_buff);
|
||||
|
||||
/*
|
||||
* XXX:
|
||||
* 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) {
|
||||
size = CPU_ALLOC_SIZE(n);
|
||||
if (size >= 1024) {
|
||||
if (size >= sizeof(cpuset_buff)) {
|
||||
cpuset = xcalloc(1, size);
|
||||
if (!cpuset)
|
||||
return -1;
|
||||
} else {
|
||||
cpuset = alloca(size);
|
||||
CPU_ZERO_S(size, cpuset);
|
||||
cpuset = cpuset_buff;
|
||||
}
|
||||
|
||||
ret = sched_getaffinity(0, size, cpuset);
|
||||
|
@ -995,10 +996,10 @@ etc_nprocessors_affin(void)
|
|||
ret = CPU_COUNT_S(size, cpuset);
|
||||
}
|
||||
|
||||
if (size >= 1024) {
|
||||
if (size >= sizeof(cpuset_buff)) {
|
||||
xfree(cpuset);
|
||||
}
|
||||
if (ret > 0) {
|
||||
if (ret > 0 || errno != EINVAL) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче