Re: Atomic Limit Counter Add and Subtract, and QQ about goto

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jan 18, 2025 at 05:52:00PM -0300, Leonardo Brás wrote:
> 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.

Congratulations!  You are the first to have responded to the implicit
challenge in the last sentence of the answer to that Quick Quiz:

	If you really hate the goto that much, your best bet would be
	to pull the fastpath into a separate function that returned
	success or failure, with “failure” indicating a need for
	the slowpath. This is left as an exercise for goto-hating readers.

Very good!  ;-)

So why didn't I do it that way in the book?  Because that would add
several lines for the function declaration, and Listing 5.13 is long
enough as it is.

But if enough people prefer the separate slowpath function, and someone
is willing to create the patch, adjust the text, and test the result,
why not?

							Thanx, Paul




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux