]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pidref: various shortcuts to pidref_equal()
authorLennart Poettering <lennart@poettering.net>
Mon, 13 Jan 2025 10:06:27 +0000 (11:06 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 16 Jan 2025 10:55:21 +0000 (11:55 +0100)
This adds some shortcuts to pidref_equal(), so that we don't have to
query the pidfs id if there's no need.

src/basic/pidref.c

index a275f77b5697ffa648c49d86ecf61d3f0b7f5c04..ccfa2903b60efb6d4335d6a11ea8a0b5e2318fef 100644 (file)
@@ -40,6 +40,10 @@ int pidref_acquire_pidfd_id(PidRef *pidref) {
 
 bool pidref_equal(PidRef *a, PidRef *b) {
 
+        /* If this is the very same structure, it definitely refers to the same process */
+        if (a == b)
+                return true;
+
         if (!pidref_is_set(a))
                 return !pidref_is_set(b);
 
@@ -58,9 +62,15 @@ bool pidref_equal(PidRef *a, PidRef *b) {
                 if (a->fd_id == 0 || b->fd_id == 0)
                         return true;
         } else {
+                /* If the other side is remote, then this is not the same */
                 if (pidref_is_remote(b))
                         return false;
 
+                /* PID1 cannot exit, hence it cannot change pidfs ids, hence no point in comparing them, we
+                 * can shortcut things */
+                if (a->pid == 1)
+                        return true;
+
                 /* Try to compare pidfds using their inode numbers. This way we can ensure that we
                  * don't spuriously consider two PidRefs equal if the pid has been reused once. Note
                  * that we ignore all errors here, not only EOPNOTSUPP, as fstat() might fail due to