On 12/14/2011 08:29 PM, Lars-Peter Clausen wrote:
> On 12/14/2011 08:08 PM, Josh Triplett wrote:
>> In the Linux kernel, "current" refers to the current task, of type
>> "struct task_struct *", by way of a stack of (sometimes arch-specific)
>> macros. For instance, arch/x86/include/asm/current.h defines current as
>> get_current(), an inline function returning "struct task_struct *".
>> Other architectures, as well as asm-generic, use variations on the same
>> theme with varying depths of macros.
>>
>> However, coccinelle doesn't seem to manage to figure out the type of
>> current, because rules defined with @@struct task_struct *task;@@ don't
>> match current.
>>
>> I can work around this by writing a duplicate set of rules with
>> @@identifier current;@@, but I'd rather not have to introduce that
>> duplication.
>>
>> For a test case, try the following semantic patch:
>>
>> @@ struct task_struct *task; @@
>> - (task)->pid == 0
>> + is_idle_task(task)
>>
>> @@ struct task_struct *task; @@
>> - (task)->pid != 0
>> + !is_idle_task(task)
>>
>>
>> And the following test file:
>>
>> #include <linux/sched.h>
>> extern struct task_struct *t;
>> void context(void)
>> {
>> if (t->pid)
>> do_something();
>> if (current->pid)
>> do_something();
>> }
>>
>>
>> Coccinelle successfully patches the first condition, but not the second.
>
> Did you ran spatch with -all_includes?
Sorry, make that -recursive_includes.
>
> Your example works fine here when I pass -all_includes:
>
> @@ -4,9 +4,9 @@
> extern struct task_struct *t;
> void context(void)
> {
> - if (t->pid)
> + if (!is_idle_task(t))
> do_something();
> - if (current->pid)
> + if (!is_idle_task(current))
> do_something();
> }
>
> - Lars
> _______________________________________________
> Cocci mailing list
> [email protected]
> http://lists.diku.dk/mailman/listinfo/cocci
> (Web access from inside DIKUs LAN only)
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)