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.
- Josh Triplett
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)