serialEvent should be based on interrupt
It probably should be, but it isn't. It's called after each execution of the loop() function...
int main(void)
{
init();
#if defined(USBCON)
USB.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}