[patch] clear direction flag for signal handlers

Aggelos Economopoulos aoiko at cc.ece.ntua.gr
Sat Mar 15 10:47:06 PDT 2008


On Wednesday 12 March 2008, Aggelos Economopoulos wrote:
> On Wednesday 12 March 2008, Matthew Dillon wrote:
> > :only differs in some code block and that block can be cleanly turned into a
> > :function, do just that. Or, for example in sendsig() define a macro
> > :is_vm86(regs) (or whatever), only define it as 0 in the appropriate vkernel
> > :include and you're done. The compiler will just throw away the dead code, no
> > :#ifdefs involved. Etc.
> > 
> >     Heh.  No way.  A macro used for conditional compilation is really
> >     no different from an #ifdef.  We're definitely not going to do
> >     that.
> 
> But it is different.
> 
> compare
> 
> if (has_vm(regs)) {
> 	code;
> }
> 
> with
> 
> #ifndef _KERNEL_VIRTUAL
> if (regs->tf_eflags & PSL_VM) {
> 	code;
> }
> #endif
> 
> In the first case you have to parse one conditional, the same conditional that
> was there before vkernel was added to the tree. The macro just serves as an
> optimal __predict_false(regs->tf_eflags & PSL_VM) that effectively does
> __assume_false() and allows the compiler to remove the code at compile time.
> There is no extra logic.
> 
> The second case adds an extra conditional that is evaluated at a different time
> and uses different syntax than the rest of the code. Repeat a couple of times
> (with #else too), intersperse some C conditionals and you end up with the kind
> of mess that rightly gave #ifdef its bad name.

If it's not too much trouble, could you clarify exactly what you don't like
with this concrete example? I think my explanation of why this is not
equivalent with an #ifdef is reasonable.

Thanks,
Aggelos





More information about the Submit mailing list