Messages in this thread | | | From | Linus Torvalds <> | Date | Tue, 26 Apr 2011 14:43:00 -0700 | Subject | Re: [PATCH v2 5/6] signal: sys_sigprocmask() needs retarget_shared_pending() |
| |
> + sigemptyset(&new_full_set); > + if (how == SIG_SETMASK) > + new_full_set = current->blocked; > + new_full_set.sig[0] = new_set;
Ugh. This is just ugly.
Could we not instead turn the whole thing into a "clear these bits" and "set these bits", and get rid of the "how" entirely for the helper function?
IOW, we'd have
switch (how) { case SIG_BLOCK: clear_bits = 0; set_bits = new_set; break; case SIG_UNBLOCK: clear_bits = new_set; set_bits = 0; break case SIG_SET: clear_bits = low_bits; set_bits = new_set; break; default: return -EINVAL; }
and notice how you now can do that helper function *WITHOUT* any conditionals, and just make it do
sigprocmask(&clear, &set, NULL);
which handles all cases correctly (just "andn clear" + "or set") with no if's or switch'es.
This is why I _detest_ that idiotic "sigprocmask()" interface. That "how" parameter is the invention of somebody who didn't understand sets. It's stupid. There is no reason to have multiple different set operations, when in practice all anybody ever wants is the "clear these bits and set those other bits" - an operation that is not only more generic than the idiotic "how", but is _faster_ too, because it involves no conditionals.
So I realize that we cannot get away from the broken user interface, but I do not believe that that means that our _internal_ helper functions should use that idiotic and broken interface!
I had basically this same comment earlier when you did something similarly mindless for another case.
So basic rule should be: if you ever pass "how" to any helper functions, it's broken.
Linus
| |