linux: Use /proc/stat fallback for __get_nprocs_conf (BZ #28624)
Checks
Context |
Check |
Description |
dj/TryBot-apply_patch |
success
|
Patch applied to master at the time it was sent
|
dj/TryBot-32bit |
success
|
Build for i686
|
Commit Message
The /proc/statm fallback was removed by f13fb81ad3159 if sysfs is
not available, reinstate it.
Checked on x86_64-linux-gnu.
---
sysdeps/unix/sysv/linux/getsysstats.c | 60 ++++++++++++++++-----------
1 file changed, 35 insertions(+), 25 deletions(-)
Comments
On Nov 25 2021, Adhemerval Zanella via Libc-alpha wrote:
> diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
> index 15ad91cf2f..0165e58b05 100644
> --- a/sysdeps/unix/sysv/linux/getsysstats.c
> +++ b/sysdeps/unix/sysv/linux/getsysstats.c
> @@ -107,6 +107,39 @@ next_line (int fd, char *const buffer, char **cp, char **re,
> return res == *re ? NULL : res;
> }
>
> +static int
> +get_nproc_stat (void)
> +{
> + enum { buffer_size = 1024 };
> + char buffer[buffer_size];
Perhaps reuse the array from the caller (for __get_nprocs)?
Andreas.
@@ -107,6 +107,39 @@ next_line (int fd, char *const buffer, char **cp, char **re,
return res == *re ? NULL : res;
}
+static int
+get_nproc_stat (void)
+{
+ enum { buffer_size = 1024 };
+ char buffer[buffer_size];
+ char *buffer_end = buffer + buffer_size;
+ char *cp = buffer_end;
+ char *re = buffer_end;
+
+ /* Default to an SMP system in case we cannot obtain an accurate
+ number. */
+ int result = 2;
+
+ const int flags = O_RDONLY | O_CLOEXEC;
+ int fd = __open_nocancel ("/proc/stat", flags);
+ if (fd != -1)
+ {
+ result = 0;
+
+ char *l;
+ while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL)
+ /* The current format of /proc/stat has all the cpu* entries
+ at the front. We assume here that stays this way. */
+ if (strncmp (l, "cpu", 3) != 0)
+ break;
+ else if (isdigit (l[3]))
+ ++result;
+
+ __close_nocancel_nostatus (fd);
+ }
+
+ return result;
+}
int
__get_nprocs (void)
@@ -162,30 +195,7 @@ __get_nprocs (void)
return result;
}
- cp = buffer_end;
- re = buffer_end;
-
- /* Default to an SMP system in case we cannot obtain an accurate
- number. */
- result = 2;
-
- fd = __open_nocancel ("/proc/stat", flags);
- if (fd != -1)
- {
- result = 0;
-
- while ((l = next_line (fd, buffer, &cp, &re, buffer_end)) != NULL)
- /* The current format of /proc/stat has all the cpu* entries
- at the front. We assume here that stays this way. */
- if (strncmp (l, "cpu", 3) != 0)
- break;
- else if (isdigit (l[3]))
- ++result;
-
- __close_nocancel_nostatus (fd);
- }
-
- return result;
+ return get_nproc_stat ();
}
libc_hidden_def (__get_nprocs)
weak_alias (__get_nprocs, get_nprocs)
@@ -219,7 +229,7 @@ __get_nprocs_conf (void)
return count;
}
- return 1;
+ return get_nproc_stat ();
}
libc_hidden_def (__get_nprocs_conf)
weak_alias (__get_nprocs_conf, get_nprocs_conf)