Today I built and installed Coccinelle 1.0.7 on NetBSD. I am processing this fragment of NetBSD kernel code, `tbr_timeout.c`,
| /* | * tbr_timeout goes through the interface list, and kicks the drivers | * if necessary. | */ | static void | tbr_timeout(void *arg) | { | struct ifnet *ifp; | int active, s; | | active = 0; | s = splnet(); | for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) { | if (!TBR_IS_ENABLED(&ifp->if_snd)) | #if 1 | continue; | #endif | active++; | if (!IFQ_IS_EMPTY(&ifp->if_snd) && ifp->if_start != NULL) | (*ifp->if_start)(ifp); | } | splx(s); | if (active > 0) | CALLOUT_RESET(&tbr_callout, 1, tbr_timeout, NULL); | else | tbr_timer = 0; /* don't need tbr_timer anymore */ | } | using this semantic patch, `tailq.spatch`, | @@ | identifier I, N; | expression H; | statement S; | iterator name TAILQ_FOREACH; | @@ | | - for (I = TAILQ_FIRST(H); I != NULL; I = TAILQ_NEXT(I, N)) S | + TAILQ_FOREACH(I, H, N) S I find that if the condition in the `#if` directive is 1, then `spatch --sp-file tailq.spatch -o tbr_timeout.spatch tbr_timeout.c` runs for a few minutes before running out of memory. `spatch` prints this mysterious message when it starts: (ONCE) already tagged but only removed, so safe If I turn the condition to 0, however, spatch instantaneously prints the result with the `for (...)` clause turned to `TAILQ_FOREACH(...)`, as expected. I don't see the mysterious `(ONCE) ...` message. Any ideas why `continue;` is troublesome to spatch? Dave -- David Young dyo...@pobox.com Urbana, IL (217) 721-9981 _______________________________________________ Cocci mailing list Cocci@systeme.lip6.fr https://systeme.lip6.fr/mailman/listinfo/cocci