void main() { usb_init(); usb_set_idle_handler(idler); while (1) { idler(); usb_poll(); } }
TInt WaitForIdle() {// Wait for chunk to be destroyed and then for the chunk cleanup dfc to run. for (TUint i = 0; i < 2; i++) { NFastSemaphore s(0); TDfc idler(&signal_sem, &s, Kern::SvMsgQue(), 0); // supervisor thread, priority 0, so will run after destroyed DFC NTimer timer(&signal_sem, &s); idler.QueueOnIdle(); timer.OneShot(NKern::TimerTicks(5000), ETrue); // runs in DFCThread1 NKern::FSWait(&s); // wait for either idle DFC or timer TBool timeout = idler.Cancel(); // cancel idler, return TRUE if it hadn't run TBool tmc = timer.Cancel(); // cancel timer, return TRUE if it hadn't expired if (!timeout && !tmc) NKern::FSWait(&s); // both the DFC and the timer went off - wait for the second one if (timeout) return KErrTimedOut; } return KErrNone; }