]> granicus.if.org Git - procps-ng/commitdiff
top: trade that 'strncpy' for more efficient 'memccpy'
authorJim Warner <james.warner@comcast.net>
Tue, 15 Feb 2022 06:00:00 +0000 (00:00 -0600)
committerCraig Small <csmall@dropbear.xyz>
Thu, 17 Feb 2022 07:24:55 +0000 (18:24 +1100)
This patch was prompted by the merge request for pgrep
referenced below. In top's case, any performance gains
will be minimal since the now defunct strncpy was only
employed for termcap rebuilds after interacting with a
user (+ 1 other non-termcap related user interaction).

[ golly, strncpy always calls at least two functions ]
[ but usually calls a total of 3. on the other hand, ]
[ memccpy will only call a maximum of two functions. ]

And thanks to Baruch Siach for these strncpy insights.

Reference(s):
https://gitlab.com/procps-ng/procps/-/merge_requests/148

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

index 082710d27e0ca741904a8d5e48769bf3f88b868d..a41755c4a2ef81e5049344321b5b5c6f508c4af1 100644 (file)
--- a/top/top.h
+++ b/top/top.h
@@ -509,7 +509,7 @@ typedef struct WIN_t {
 
         /* A null-terminating strncpy, assuming strlcpy is not available.
            ( and assuming callers don't need the string length returned ) */
-#define STRLCPY(dst,src) { strncpy(dst, src, sizeof(dst)); dst[sizeof(dst) - 1] = '\0'; }
+#define STRLCPY(dst,src) { memccpy(dst, src, '\0', sizeof(dst)); dst[sizeof(dst) - 1] = '\0'; }
 
         /* Used to clear all or part of our Pseudo_screen */
 #define PSU_CLREOS(y) memset(&Pseudo_screen[ROWMAXSIZ*y], '\0', Pseudo_size-(ROWMAXSIZ*y))