]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/i386/smp.h
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / i386 / smp.h
CommitLineData
7bb1b2c9 1/* Determine whether the host has multiple processors. Linux version.
04277e02 2 Copyright (C) 1996-2019 Free Software Foundation, Inc.
7bb1b2c9
UD
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
59ba27a6 16 License along with the GNU C Library; see the file COPYING.LIB. If
5a82c748 17 not, see <https://www.gnu.org/licenses/>. */
7bb1b2c9
UD
18
19#include <errno.h>
20#include <fcntl.h>
21#include <string.h>
22#include <sys/utsname.h>
23#include <not-cancel.h>
24
25/* Test whether the machine has more than one processor. This is not the
26 best test but good enough. More complicated tests would require `malloc'
27 which is not available at that time. */
28static inline int
29is_smp_system (void)
30{
31 union
32 {
fbbc73b3 33 struct utsname uts;
7bb1b2c9 34 char buf[512];
fbbc73b3 35 } u;
7bb1b2c9
UD
36 char *cp;
37
38 /* Try reading the number using `sysctl' first. */
fa872e1b 39 if (__uname (&u.uts) == 0)
fbbc73b3 40 cp = u.uts.version;
7bb1b2c9
UD
41 else
42 {
43 /* This was not successful. Now try reading the /proc filesystem. */
329ea513 44 int fd = __open64_nocancel ("/proc/sys/kernel/version", O_RDONLY);
7bb1b2c9 45 if (__builtin_expect (fd, 0) == -1
a748eb31 46 || __read_nocancel (fd, u.buf, sizeof (u.buf)) <= 0)
7bb1b2c9 47 /* This also didn't work. We give up and say it's a UP machine. */
fbbc73b3 48 u.buf[0] = '\0';
7bb1b2c9 49
c181840c 50 __close_nocancel_nostatus (fd);
fbbc73b3 51 cp = u.buf;
7bb1b2c9
UD
52 }
53
54 return strstr (cp, "SMP") != NULL;
55}