extern void *malloc (__SIZE_TYPE__) __attribute__((malloc,transaction_safe)); static int __attribute__((transaction_safe)) something (void) { return 0; } struct large { int foo[500]; }; int main (void) { int *p; struct large *lp; __transaction_atomic { p = malloc (sizeof (*p) * 100); lp = malloc (sizeof (*lp) * 100); /* No instrumentation necessary; P and LP are transaction local. */ p[5] = 123; lp->foo[66] = 123; if (something ()) __transaction_cancel; } __transaction_relaxed { ++p[5]; } return ( (p[5] == 124) ? 0 : 1 ); }