<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/82a0bffc6e872f14e745f724d4c48c82aed0948e">https://github.com/macports/macports-legacy-support/commit/82a0bffc6e872f14e745f724d4c48c82aed0948e</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 82a0bffc6e872f14e745f724d4c48c82aed0948e
</span>Author: Fred Wright <fw@fwright.net>
AuthorDate: Tue May 27 20:34:34 2025 -0700
<span style='display:block; white-space:pre;color:#404040;'> Add branch hints to one-time setups.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> This arranges for various "first time" setups to assume that the
</span><span style='display:block; white-space:pre;color:#404040;'> already set up case is the normal path, provided that the compiler
</span><span style='display:block; white-space:pre;color:#404040;'> supports that feature.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> In practice, this seems to have no effect in these particular cases,
</span><span style='display:block; white-space:pre;color:#404040;'> though it doesn't hurt. Apple's code does something similar in a
</span><span style='display:block; white-space:pre;color:#404040;'> couple of cases, which is what prompted these additions. It's not
</span><span style='display:block; white-space:pre;color:#404040;'> known whether the compiler is actually ignoring the hints, or whether
</span><span style='display:block; white-space:pre;color:#404040;'> the code was already considered optimal without the hints and hence
</span><span style='display:block; white-space:pre;color:#404040;'> unaffected.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> TESTED:
</span><span style='display:block; white-space:pre;color:#404040;'> Builds and passes tests.
</span>---
src/compiler.h | 2 +-
src/packet.c | 5 +++--
src/pthread_get_stacksize_np.c | 4 +++-
src/realpath.c | 6 ++++--
src/statxx.c | 8 ++++++--
src/sysconf.c | 6 ++++--
src/time.c | 12 +++++++-----
7 files changed, 28 insertions(+), 15 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/compiler.h b/src/compiler.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 212f540..0391a20 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/compiler.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/compiler.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -19,7 +19,7 @@
</span>
/* Macros for compiler-specific features */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-/* Branch prediction hints */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/* Branch prediction hints, similar to Apple's os_fastpath/os_slowpath */
</span> #ifdef __has_builtin
#if __has_builtin(__builtin_expect)
#define MPLS_EXPECT(x, v) __builtin_expect((x), (v))
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/packet.c b/src/packet.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 8f067dc..f54322c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/packet.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/packet.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -101,6 +101,7 @@
</span> #include <sys/time.h>
#include <sys/types.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span> #include "endian.h"
#define CMSG_DATALEN(cmsg) ((uint8_t *) (cmsg) + (cmsg)->cmsg_len \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -138,7 +139,7 @@ static recvmsg_fn_t *
</span> sys_recvmsg(fv_type_t fvtype)
{
/* Return cached value if available */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (fv_adrs[fvtype]) return fv_adrs[fvtype];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_FASTPATH(fv_adrs[fvtype])) return fv_adrs[fvtype];
</span>
/* Or cache and return address of desired variant if available */
if ((fv_adrs[fvtype] = dlsym(RTLD_NEXT, fv_names[fvtype]))) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -395,7 +396,7 @@ recvmsg_internal(int socket, struct msghdr *message, int flags,
</span> ssize_t ret;
/* Determine Rosettaness, if not already known */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!is_rosetta) is_rosetta = check_rosetta();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!is_rosetta)) is_rosetta = check_rosetta();
</span>
/* Just pass through if Rosetta-only and not Rosetta */
if (!FORMAT_FIX && is_rosetta < 0) {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pthread_get_stacksize_np.c b/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 4ffb38b..d374b1c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pthread_get_stacksize_np.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,6 +8,8 @@
</span> #include <dlfcn.h>
#include <stdlib.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #if __MPLS_TARGET_OSVER >= 1090
/* private system call available on OS X Mavericks (version 10.9) and later */
/* see https://github.com/apple-oss-distributions/libpthread/blob/ba8e1488a0e6848b710c5daad2e226f66cfed656/private/pthread/private.h#L34 */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -60,7 +62,7 @@ size_t pthread_get_stacksize_np(pthread_t t) {
</span> } else {
/* bug only affects main thread */
static size_t (*os_pthread_get_stacksize_np)(pthread_t);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!os_pthread_get_stacksize_np) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!os_pthread_get_stacksize_np)) {
</span> os_pthread_get_stacksize_np =
dlsym(RTLD_NEXT, "pthread_get_stacksize_np");
/* Something's badly broken if this fails */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/realpath.c b/src/realpath.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3e79005..03d308b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/realpath.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> /*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2024 Frederick H. G. Wright II <fw@fwright.net>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2025 Frederick H. G. Wright II <fw@fwright.net>
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -33,6 +33,8 @@
</span> /* Now undo our macro kludge */
#undef realpath
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /*
* This provides a wrapper for realpath() in order to make the 10.6+
* optional buffer allocation available in <10.6. At present, it does not
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -118,7 +120,7 @@ realpath_internal(const char * __restrict file_name,
</span> int saved_errno;
/* Locate proper OS realpath(), with fallback if needed */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!(os_realpath = rp_adr[version])) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!(os_realpath = rp_adr[version]))) {
</span> os_realpath = rp_adr[version] = dlsym(RTLD_NEXT, rp_name[version]);
if (!os_realpath && version != rp_basic) {
os_realpath = rp_adr[version] = dlsym(RTLD_NEXT, rp_name[rp_basic]);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/statxx.c b/src/statxx.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 0fd92ff..7a67a5d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/statxx.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/statxx.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -104,6 +104,8 @@ struct stat64 __DARWIN_STRUCT_STAT64;
</span>
#include <libkern/OSByteOrder.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /* sysctl to check whether we're running natively (non-ppc only) */
#define SYSCTL_NATIVE "sysctl.proc_native"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -134,14 +136,16 @@ fstatx_np(int fildes, struct stat *buf, filesec_t fsec)
</span> static __typeof__(fstatx_np) *fstatx = NULL;
static int tiger_rosetta = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!fstatx) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!fstatx)) {
</span> if (!(fstatx = dlsym(RTLD_NEXT, "fstatx_np"))) {
/* Something's badly wrong if we can't find the function */
abort();
}
}
/* If known not 10.4 Rosetta or NULL fsec, just call the function normally */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (tiger_rosetta < 0 || fsec == NULL) return (*fstatx)(fildes, buf, fsec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_FASTPATH(tiger_rosetta < 0 || fsec == NULL)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (*fstatx)(fildes, buf, fsec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span>
/* If we don't yet know the Rosetta status, get it */
if (!tiger_rosetta) tiger_rosetta = is_tiger_rosetta();
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/sysconf.c b/src/sysconf.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 74ca089..2fba95b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/sysconf.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span> /*
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Copyright (c) 2019
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Copyright (c) 2025
</span> *
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -28,6 +28,8 @@
</span> #include <stdlib.h>
#include <stddef.h>
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /*
* Emulate several commonly used but missing (or broken) selectors from
* sysconf() on various OS versions.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -97,7 +99,7 @@ long sysconf(int name) {
</span> #endif /* __MPLS_LIB_SUPPORT_SYSCONF_PHYS_PAGES__ */
/* for any other values of "name", call the real sysconf() */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!os_sysconf) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!os_sysconf)) {
</span> os_sysconf = dlsym(RTLD_NEXT, "sysconf");
/* Something's badly broken if this fails */
if (!os_sysconf) {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/time.c b/src/time.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 1b53efa..2310e52 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -18,6 +18,8 @@
</span> /* MP support header */
#include "MacportsLegacySupport.h"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+#include "compiler.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #if __MPLS_LIB_SUPPORT_APPROX_TIME__
#include <mach/mach_time.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -270,7 +272,7 @@ uint64_t mach_continuous_time(void)
</span> {
uint64_t mach_time;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!sleep_offset_valid) get_sleep_offset();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!sleep_offset_valid)) get_sleep_offset();
</span> mach_time = mach_absolute_time();
return mach_time + sleep_offset;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -279,7 +281,7 @@ uint64_t mach_continuous_approximate_time(void)
</span> {
uint64_t mach_time;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!sleep_offset_valid) get_sleep_offset();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!sleep_offset_valid)) get_sleep_offset();
</span> mach_time = mach_approximate_time();
return mach_time + sleep_offset;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -697,7 +699,7 @@ clock_gettime_nsec_np(clockid_t clk_id)
</span> uint64_t mach_time;
/* Set up mach scaling early, whether we need it or not. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!mach_mult) setup_mach_mult();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!mach_mult)) setup_mach_mult();
</span>
switch (clk_id) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -751,7 +753,7 @@ clock_gettime(clockid_t clk_id, struct timespec *ts)
</span> uint64_t mach_time, nanos;
/* Set up mach scaling early, whether we need it or not. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!mach_mult) mserr = setup_mach_mult();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!mach_mult)) mserr = setup_mach_mult();
</span>
switch (clk_id) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -807,7 +809,7 @@ clock_getres(clockid_t clk_id, struct timespec *res)
</span> int mserr = 0;
/* Set up mach scale factor, whether we need it or not. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if (!res_mach.tv_nsec) mserr = setup_mach_mult();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (MPLS_SLOWPATH(!res_mach.tv_nsec)) mserr = setup_mach_mult();
</span>
switch (clk_id) {
</pre><pre style='margin:0'>
</pre>