Re: Blocks runtime in the kernel

From: Brooks Davis <brooks_at_freebsd.org>
Date: Fri, 17 Mar 2023 18:08:06 UTC
On Thu, Mar 16, 2023 at 10:06:11AM -0400, Justin Hibbits wrote:
> 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.

I think two things make this a non-starter.  First, GCC doesn't support
this feature and I don't think we want to lose that for the reasons
Warner outlines elsewhere.  Second, it seems moderately likely that C2Y
will include lambdas in some form which fills the same niche.  This
will further reduce the likelihood of blocks support being widespread
(already extremely unlikely).  At this point I think we just need to
live with the clunky syntax. :(

-- Brooks