svm: use standard function to reset stale mutex 62/30862/2
authorBenoît Ganne <bganne@cisco.com>
Wed, 20 Jan 2021 18:10:59 +0000 (19:10 +0100)
committerFlorin Coras <florin.coras@gmail.com>
Sun, 24 Jan 2021 02:36:16 +0000 (02:36 +0000)
Avoid accessing the private data structure of mutexes which is
implementation-dependent, eg. musl is different from glibc.

Type: improvement

Change-Id: I20ec0c1c9faef0749d89a1969cd2430c80ac04b3
Signed-off-by: Benoît Ganne <bganne@cisco.com>
src/svm/svm.c

index 2834524..313fe4a 100644 (file)
@@ -716,12 +716,17 @@ svm_map_region (svm_map_region_args_t * a)
       pid_holding_region_lock = rp->mutex_owner_pid;
       if (pid_holding_region_lock && kill (pid_holding_region_lock, 0) < 0)
        {
+         pthread_mutexattr_t attr;
          clib_warning
            ("region %s mutex held by dead pid %d, tag %d, force unlock",
             rp->region_name, pid_holding_region_lock, rp->mutex_owner_tag);
          /* owner pid is nonexistent */
-         rp->mutex.__data.__owner = 0;
-         rp->mutex.__data.__lock = 0;
+         if (pthread_mutexattr_init (&attr))
+           clib_unix_warning ("mutexattr_init");
+         if (pthread_mutexattr_setpshared (&attr, PTHREAD_PROCESS_SHARED))
+           clib_unix_warning ("mutexattr_setpshared");
+         if (pthread_mutex_init (&rp->mutex, &attr))
+           clib_unix_warning ("mutex_init");
          dead_region_recovery = 1;
        }