Blocks runtime in the kernel

From: Justin Hibbits <jhibbits_at_FreeBSD.org>
Date: Thu, 16 Mar 2023 14:06:11 UTC
Most probably know I've been working on the IfAPI conversion of all
network drivers in order to hide the contents of `struct ifnet`.  I'm
pretty much done with the development, and it's all in review.
However, there's one bit that I've thought is very clunky since I added
it, the if_foreach() iterator function, which iterates over all
interfaces in the current VNET, and calls a callback to operate on each
interface.  I've noticed that oftentimes I end up with a 2 line
callback, which just calls if_foreach_addr_type(), so I end up with
just trivial callback functions, which seems like a waste.

All that backstory to say, would it be beneficial to anyone else to
add a (very basic) blocks runtime to the kernel for doing things like
this?  The rough change to the IfAPI becomes:

int if_foreach_b(int (^)(if_t));

__block int foo = 0;

if_foreach_b(^(if_t ifp) {
  if (if_getlinkstate(ifp) == LINK_STATE_UP)
    foo++;
});

The same could be done for other *_foreach KPIs as well, if this proves
out.  I think I could have something working in the next several days.

The only technical snag I see with this would be other compilers.  I'm
not sure if GCC still supports blocks, it did at one point.

What do you think?

- Justin