Re: Remove last traces of HPPA support - Mailing list pgsql-hackers
From | Thomas Munro |
---|---|
Subject | Re: Remove last traces of HPPA support |
Date | |
Msg-id | CA+hUKG+w-2RyyYUte_mSAunoRE00bQUCG44=FiOuyMaN-6uoOw@mail.gmail.com Whole thread Raw |
In response to | Re: Remove last traces of HPPA support (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: Remove last traces of HPPA support
|
List | pgsql-hackers |
On Tue, Jul 2, 2024 at 5:56 AM Tom Lane <tgl@sss.pgh.pa.us> wrote: > Done at commit edadeb0710. Here are some experimental patches to try out some ideas mentioned upthread, that are approximately unlocked by that cleanup. 1. We could get rid of --disable-spinlocks. It is hard to imagine a hypothetical new port that would actually be a useful place to run PostgreSQL where you can't implement spinlocks. (This one isn't exactly unlocked by PA-RISC's departure, it's just tangled up with the relevant cruft.) 2. We could get rid of --disable-atomics, and require at least 32 bit lock-free (non-emulated) atomics. AFAIK there are no relevant systems that don't have them. Hypothetical new systems would be unlikely to omit them, unless they are eg embedded systems that don't intend to be able to run an OS. Personally I would like to do this, because I'd like to be able to use pg_atomic_fetch_or_u32() in a SIGALRM handler in my latchify-all-the-things patch (a stepping stone in the multi-threading project as discussed in the Vancouver unconference). That's not allowed if it might be a locking fallback. It's not strictly necessary for my project, and I could find another way if I have to, but when contemplating doing extra work to support imaginary computers that I don't truly believe in... and since this general direction was suggested already, both on this thread and in the comments in the tree... Once you decide to do #2, ie require atomics, perhaps you could also implement spinlocks with them, rendering point #1 moot, and delete all that hand-rolled TAS stuff. (Then you'd have spinlocks implemented with flag/u32 atomics APIs, but potentially also u64 atomics implemented with spinlocks! Circular, but not impossible AFAICT. Assuming we can't require 64 bit lock-free atomics any time soon that is, not considered). 🤯🤯🤯But maybe there are still good reasons to have hand-rolled specialisations in some cases? I have not researched that idea and eg compared the generated instructions... I do appreciate that that code reflects a lot of accumulated wisdom and experience that I don't claim to possess, and this bit is vapourware anyway. 3. While tinkering with the above, and contemplating contact with hypothetical future systems and even existing oddball systems, it practically suggests itself that we could allow <stdatomic.h> as a way of providing atomics (port/atomics.h clearly anticipated that, it was just too soon). Note: that's different from requiring C11, but it means that the new rule would be that your system should have *either* C11 <stdatomic.h> or a hand-rolled implementation in port/atomics/*.h. This is not a proposal, just an early stage experiment to test the waters! Some early thoughts about that, not fully explored: * Since C11 uses funky generics, perhaps we might want to add some type checks to make sure you don't accidentally confuse u32 and u64 somewhere. * I couldn't immediately see how to use the standard atomic_flag for our stuff due to lack of relaxed load, so it's falling back to the generic u32 implementation (a small waste of space). atomic_bool or atomic_char should work fine though, not tried. I guess pg_atomic_flag might be a minor historical mistake, assuming it was supposed to be just like the standard type of the same name. Or maybe I'm missing something. * The pg_spin_delay_impl() part definitely still needs hand-rolled magic still when using <stdatomic.h> (I'm not aware of any standard way to do that). But I'm not sure it even belongs in the "atomics" headers anyway? It's not the same kind of thing, is it? * The comments seem to imply that we need to tell the compiler not to generate any code for read/write barriers on TSO systems (compiler barrier only), but AFAICS the right thing happens anyway when coded as standard acquire/release barriers. x86: nothing. ARM: something. What am I missing? * It'd be interesting to learn about anything else that modern tool chains might do worse than our hand-rolled wisdom. * Special support for Sun's compiler could be dropped if we could just use their <stdatomic.h>. The same applies for MSVC 2022+ AFAICS, so maybe in ~3 years from now we could drop the Windows-specific code. * Uhh, yeah, so that would also apply to any modern GCC/Clang, so in effect everyone would be using <stdatomic.h> except any hand-rolled special bits that we decide to keep for performance reasons, and the rest would become dead code and liable for garbage collection. So that would amount to a confusing policy like: "we require <stdatomic.h> with at least lock-free int in practice, but we'd consider patches to add a non-C11-way to do this stuff if you invent a new kind of computer/toolchain and refuse to support C11". Hmm. (I have another version of this type of thinking happening in another pending patch, the pg_threads.h one, more on that shortly...)
Attachment
pgsql-hackers by date: