From: matoro Date: Sun, 10 Jul 2022 03:39:51 +0000 (-0400) Subject: process-util: replace __sync intrinsics to __atomic X-Git-Tag: v252-rc1~611^2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8a75ba0a7f8b127614460d022ba313b5dba6af25;p=thirdparty%2Fsystemd.git process-util: replace __sync intrinsics to __atomic This one is rather tricky, but changing the initialization of current_val should give this the same effect. Based on ffmpeg's change here: https://ffmpeg.org/pipermail/ffmpeg-devel/2014-October/164556.html Quoting from them: > The second reason is __atomic_compare_exchange_n(), and how it differs from > __sync_val_compare_and_swap(). > While the latter returns *ptr as it was before the operation, the former > doesn't and instead copies *ptr to oldval if the result of the > comparison is false. This means that returning oldval will match the old behavoir > without having to change the wrapper. > A disassemble example from libavutil/buffer.o however hints that the > __atomic function may be slower because of it writting oldval. --- diff --git a/src/basic/process-util.c b/src/basic/process-util.c index 6980e0c4f69..493e4dcedb7 100644 --- a/src/basic/process-util.c +++ b/src/basic/process-util.c @@ -1147,7 +1147,7 @@ void reset_cached_pid(void) { pid_t getpid_cached(void) { static bool installed = false; - pid_t current_value; + pid_t current_value = CACHED_PID_UNSET; /* getpid_cached() is much like getpid(), but caches the value in local memory, to avoid having to invoke a * system call each time. This restores glibc behaviour from before 2.24, when getpid() was unconditionally @@ -1158,7 +1158,13 @@ pid_t getpid_cached(void) { * https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=c579f48edba88380635ab98cb612030e3ed8691e */ - current_value = __sync_val_compare_and_swap(&cached_pid, CACHED_PID_UNSET, CACHED_PID_BUSY); + __atomic_compare_exchange_n( + &cached_pid, + ¤t_value, + CACHED_PID_BUSY, + false, + __ATOMIC_SEQ_CST, + __ATOMIC_SEQ_CST); switch (current_value) {