/** * \fn void Timer_CallTimers() */ void Timer_CallTimers() { // Tick the random number generator every time timers are checked rand(); SHORTLOCK(&gTimers_ListLock); LOG("gTimers = %p (%lli ms)", gTimers, (gTimers ? gTimers->FiresAfter : 0)); while( gTimers && gTimers->FiresAfter < now() ) { ASSERT( gTimers != gTimers->Next ); // Get timer from list tTimer *timer = gTimers; gTimers = gTimers->Next; // Perform event if( timer->Callback ) { LOG("Callback schedule %p", timer); Workqueue_AddWork(&gTimers_CallbackQueue, timer); } else { LOG("Event fire %p", timer); ASSERT( timer->Argument ); Threads_PostEvent(timer->Argument, THREAD_EVENT_TIMER); timer->bActive = 0; } } SHORTREL(&gTimers_ListLock); }
void USB_PortCtl_BeginReset(tUSBHub *Hub, int Port) { LOG("Starting %p %i", Hub, Port); // Set status field in hub structure Hub->Ports[Port].Status = 1; Hub->Ports[Port].PortNum = Port; // Add to the work queue Workqueue_AddWork(&gUSB_PortCtl_WorkQueue, &Hub->Ports[Port]); }