]> granicus.if.org Git - procps-ng/commitdiff
top: add some flexibility to dlopen() for numa support
authorJim Warner <james.warner@comcast.net>
Thu, 7 Nov 2013 06:00:00 +0000 (00:00 -0600)
committerCraig Small <csmall@enc.com.au>
Mon, 25 Nov 2013 09:57:32 +0000 (20:57 +1100)
A recent libnuma potential corruption problem solution
suggests that libnuma could change in the future so as
to not spew to stderr. This then raises a question how
top could exploit any such library change since we are
currently locked into version #1 of the library by way
of our dlopen("libnuma.so.1", RTLD_LAZY) runtime call.

While not an ultimate solution, this commit will first
try for the most recent version of that library during
top's startup before trying the original libnuma.so.1.
We do this via the unqualified library soname symlink.

For this new dlopen() call to succeed, technically the
numa 'devel' package would usually have been required,
but that's not always true with every distro. And when
the libnuma.so symlink isn't present, it can always be
manually added should a newer & better behaved library
arrive & users tire of the stderr warning at top exit.

Reference(s):
commit 24bd950cb2e1722d459461f0f9c0c30a4b9ffdaa

Signed-off-by: Jim Warner <james.warner@comcast.net>
top/top.c

index a48a5b9172fec3096d278d89aacc2b0de99e6c8d..e619ddd3455a37662f8b94a31de90c4e8e4d8f3e 100644 (file)
--- a/top/top.c
+++ b/top/top.c
@@ -3246,8 +3246,9 @@ static void before (char *me) {
 #if defined(PRETEND_NUMA) || defined(PRETEND8CPUS)
    Numa_node_tot = Numa_max_node() + 1;
 #else
-   Libnuma_handle = dlopen("libnuma.so.1", RTLD_LAZY);
-   if (Libnuma_handle) {
+   // we'll try for the most recent version, then a version we know works...
+   if ((Libnuma_handle = dlopen("libnuma.so", RTLD_LAZY))
+    || (Libnuma_handle = dlopen("libnuma.so.1", RTLD_LAZY))) {
       Numa_max_node = dlsym(Libnuma_handle, "numa_max_node");
       Numa_node_of_cpu = dlsym(Libnuma_handle, "numa_node_of_cpu");
       if (Numa_max_node && Numa_node_of_cpu)
@@ -3265,7 +3266,7 @@ static void before (char *me) {
 #endif
    // lastly, establish a robust signals environment
    sigemptyset(&sa.sa_mask);
-   // with user position perserved through SIGWINCH, we must avoid SA_RESTART
+   // with user position preserved through SIGWINCH, we must avoid SA_RESTART
    sa.sa_flags = 0;
    for (i = SIGRTMAX; i; i--) {
       switch (i) {