Compiled and ran the code with your modifications, I left the return statement out at the end. I figure that's probably okay due to it being a void function and your saying it's okay.
None of the timer scripts caused a crash. I created an object with multiple timers that all ran seemingly concurrently. Again, no crashes.
The only error that appeared in syslog was
"SYSERR: Freeing null pointer dg_olc.c:417" during the OLC session to create my test objects and scripts. Again, I assume that's okay, if not great, as free is acting on a null pointer and should, by default, do nothing?
Addendum:
I just realized I was being stupid only in the way a sleep deprived brain could be. To correct this I put this entry in the modifications:
log("SYSERR: data in obj not equal to data in tmp. obj=%p tmp=%p", obj, tmp);
This shows up in the syslog by the way.
SYSERR: data in obj not equal to data in tmp. obj=0x0 tmp = 0xaf0..... So obj is null'd? I've heard this before. It's also when running self purging timers.