Skip to content

Commit 7918ba1

Browse files
authored
Merge pull request #3680 from martin-frbg/issue3636-2
Guard against sysconf(__SC_NPROCESSORS_CONF) returning zero at runtime
2 parents 4cfd6f1 + 69148ae commit 7918ba1

File tree

2 files changed

+32
-32
lines changed

2 files changed

+32
-32
lines changed

driver/others/init.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -877,34 +877,34 @@ void gotoblas_affinity_init(void) {
877877
nums = sysconf(_SC_NPROCESSORS_CONF);
878878

879879
#if !defined(__GLIBC_PREREQ)
880-
common->num_procs = nums;
880+
common->num_procs = nums >0 ? nums : 2;
881881
#else
882882

883883
#if !__GLIBC_PREREQ(2, 3)
884-
common->num_procs = nums;
884+
common->num_procs = nums >0 ? nums : 2;
885885
#elif __GLIBC_PREREQ(2, 7)
886-
cpusetp = CPU_ALLOC(nums);
886+
cpusetp = CPU_ALLOC(nums>0? nums:1024);
887887
if (cpusetp == NULL) {
888-
common->num_procs = nums;
888+
common->num_procs = nums>0 ? nums: 2;
889889
} else {
890890
size_t size;
891-
size = CPU_ALLOC_SIZE(nums);
891+
size = CPU_ALLOC_SIZE(nums>0? nums: 1024);
892892
ret = sched_getaffinity(0,size,cpusetp);
893893
if (ret!=0)
894-
common->num_procs = nums;
894+
common->num_procs = nums >0 ? nums : 1;
895895
else
896896
common->num_procs = CPU_COUNT_S(size,cpusetp);
897897
}
898898
CPU_FREE(cpusetp);
899899
#else
900900
ret = sched_getaffinity(0,sizeof(cpu_set_t), &cpuset);
901901
if (ret!=0) {
902-
common->num_procs = nums;
902+
common->num_procs = nums >0 ? nums : 2;
903903
} else {
904904
#if !__GLIBC_PREREQ(2, 6)
905905
int i;
906906
int n = 0;
907-
for (i=0;i<nums;i++)
907+
for (i=0;i<(nums >0 ?nums:1024) ;i++)
908908
if (CPU_ISSET(i,&cpuset)) n++;
909909
common->num_procs = n;
910910
}
@@ -1022,7 +1022,7 @@ void gotoblas_set_affinity2(int threads) {};
10221022

10231023
void gotoblas_affinity_reschedule(void) {};
10241024

1025-
int get_num_procs(void) { return sysconf(_SC_NPROCESSORS_CONF); }
1025+
int get_num_procs(void) { int num = sysconf(_SC_NPROCESSORS_CONF); return (nums >0 ? nums : 2); }
10261026

10271027
int get_num_nodes(void) { return 1; }
10281028

driver/others/memory.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -252,23 +252,23 @@ int get_num_procs(void) {
252252
ret = omp_get_num_places();
253253
if (ret >0 ) nums = ret;
254254
#endif
255-
return nums;
255+
return (nums > 0 ? nums : 2);
256256
#endif
257257

258258
#if !defined(OS_LINUX)
259-
return nums;
259+
return (nums > 0 ? nums : 2);
260260
#endif
261261

262262
#if !defined(__GLIBC_PREREQ)
263-
return nums;
263+
return (nums > 0 ? nums :2);
264264
#else
265265
#if !__GLIBC_PREREQ(2, 3)
266-
return nums;
266+
return (nums > 0 ? nums :2);
267267
#endif
268268

269269
#if !__GLIBC_PREREQ(2, 7)
270270
ret = sched_getaffinity(0,sizeof(cpuset), &cpuset);
271-
if (ret!=0) return nums;
271+
if (ret!=0) return (nums > 0 ? nums :2);
272272
n=0;
273273
#if !__GLIBC_PREREQ(2, 6)
274274
for (i=0;i<nums;i++)
@@ -277,31 +277,31 @@ int get_num_procs(void) {
277277
#else
278278
nums = CPU_COUNT(sizeof(cpuset),&cpuset);
279279
#endif
280-
return nums;
280+
return (nums > 0 ? nums :2);
281281
#else
282282
if (nums >= CPU_SETSIZE) {
283283
cpusetp = CPU_ALLOC(nums);
284284
if (cpusetp == NULL) {
285-
return nums;
285+
return (nums > 0 ? nums :2);
286286
}
287287
size = CPU_ALLOC_SIZE(nums);
288288
ret = sched_getaffinity(0,size,cpusetp);
289289
if (ret!=0) {
290290
CPU_FREE(cpusetp);
291-
return nums;
291+
return (nums > 0 ? nums :2);
292292
}
293293
ret = CPU_COUNT_S(size,cpusetp);
294294
if (ret > 0 && ret < nums) nums = ret;
295295
CPU_FREE(cpusetp);
296-
return nums;
296+
return (nums > 0 ? nums :2);
297297
} else {
298298
ret = sched_getaffinity(0,sizeof(cpuset),&cpuset);
299299
if (ret!=0) {
300-
return nums;
300+
return (nums > 0 ? nums :2);
301301
}
302302
ret = CPU_COUNT(&cpuset);
303303
if (ret > 0 && ret < nums) nums = ret;
304-
return nums;
304+
return (nums > 0 ? nums :2);
305305
}
306306
#endif
307307
#endif
@@ -1823,56 +1823,56 @@ int get_num_procs(void) {
18231823
ret = omp_get_num_places();
18241824
if (ret >0 ) nums = ret;
18251825
#endif
1826-
return nums;
1826+
return (nums > 0 ? nums :2);
18271827
#endif
18281828

18291829
#if !defined(OS_LINUX)
1830-
return nums;
1830+
return (nums > 0 ? nums :2);
18311831
#endif
18321832

18331833
#if !defined(__GLIBC_PREREQ)
1834-
return nums;
1834+
return (nums > 0 ? nums :2);
18351835
#else
18361836
#if !__GLIBC_PREREQ(2, 3)
1837-
return nums;
1837+
return (nums > 0 ? nums :2);
18381838
#endif
18391839

18401840
#if !__GLIBC_PREREQ(2, 7)
18411841
ret = sched_getaffinity(0,sizeof(cpuset), &cpuset);
1842-
if (ret!=0) return nums;
1842+
if (ret!=0) return (nums > 0 ? nums :2);
18431843
n=0;
18441844
#if !__GLIBC_PREREQ(2, 6)
1845-
for (i=0;i<nums;i++)
1845+
for (i=0;i<(nums > 0 ? nums :2);i++)
18461846
if (CPU_ISSET(i,&cpuset)) n++;
18471847
nums=n;
18481848
#else
18491849
nums = CPU_COUNT(sizeof(cpuset),&cpuset);
18501850
#endif
1851-
return nums;
1851+
return (nums > 0 ? nums :2);
18521852
#else
18531853
if (nums >= CPU_SETSIZE) {
18541854
cpusetp = CPU_ALLOC(nums);
18551855
if (cpusetp == NULL) {
1856-
return nums;
1856+
return (nums > 0 ? nums :2);
18571857
}
18581858
size = CPU_ALLOC_SIZE(nums);
18591859
ret = sched_getaffinity(0,size,cpusetp);
18601860
if (ret!=0) {
18611861
CPU_FREE(cpusetp);
1862-
return nums;
1862+
return (nums > 0 ? nums :2);
18631863
}
18641864
ret = CPU_COUNT_S(size,cpusetp);
18651865
if (ret > 0 && ret < nums) nums = ret;
18661866
CPU_FREE(cpusetp);
1867-
return nums;
1867+
return (nums > 0 ? nums :2);
18681868
} else {
18691869
ret = sched_getaffinity(0,sizeof(cpuset),&cpuset);
18701870
if (ret!=0) {
1871-
return nums;
1871+
return (nums > 0 ? nums :2);
18721872
}
18731873
ret = CPU_COUNT(&cpuset);
18741874
if (ret > 0 && ret < nums) nums = ret;
1875-
return nums;
1875+
return (nums > 0 ? nums :2);
18761876
}
18771877
#endif
18781878
#endif

0 commit comments

Comments
 (0)