On Sat, 2025-01-18 at 17:49 -0300, Leonardo Brás wrote:
> Hi Paul,
>
> I was reading the Counting Chapter in detail, and the QQ about avoiding a Goto
> got my attention:
>
> Listing 5.13: Atomic Limit Counter Add and Subtract
> Quick Quiz 5.43: Yecch! Why the ugly goto on line 11 of
> Listing 5.13? Haven’t you heard of the break statement???
>
> And I was thinking on an alternate solution to those, by calling slowpath as a
> function in this simple change:
>
> ```
> inline int add_count_slowpath(unsigned long delta)
> {
> spin_lock(&gblcnt_mutex);
> globalize_count();
>
> if (globalcountmax - globalcount - globalreserve < delta) {
> flush_local_count();
> if (globalcountmax - globalcount - globalreserve < delta) {
> spin_unlock(&gblcnt_mutex);
> return 0;
> }
> }
>
> globalcount += delta;
> balance_count();
> spin_unlock(&gblcnt_mutex);
> return 1;
> }
>
>
> int add_count(unsigned long delta)
> {
> int c;
> int cm;
> int old;
> int new;
>
> do {
> split_counterandmax(&counterandmax, &old, &c, &cm);
> if (delta > MAX_COUNTERMAX || c + delta > cm)
> return add_count_slowpath(delta);
> new = merge_counterandmax(c + delta, cm);
> while (atomic_cmpxchg(&counterandmax, old, new) != old);
>
> return 1;
>
> }
> ```
>
> Does it make sense?
> Does it introduce any overhead I couldn't see?
>
> Thanks!
> Leo
>
>
Oh, just to be clear, I like goto, and IMO the above is a perfectly acceptable
way of using goto, and I would not change it. Just thinking about the QQ and
added complexity.