Sometimes I seem to lose track of the big picture. The instrumentor I’m writing right now converts (non-native) synchronized methods to unsynchronized methods and synchronized blocks, which subsequently get instrumented just like any other synchronized block.
I was just wondering why so much rewriting was going on — it turned out I was inserting the “try enter”, “enter”, and “leave” notifications in both instrumentors. They don’t belong in the one that merely converts. D’uh.