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