/* * nk_thread_destroy * * destroys a thread and reclaims its memory (its stack page mostly) * interrupts should be off * * @t: the thread to destroy * */ void nk_thread_destroy (nk_thread_id_t t) { nk_thread_t * thethread = (nk_thread_t*)t; SCHED_DEBUG("Destroying thread (%p, tid=%lu)\n", (void*)thethread, thethread->tid); ASSERT(!irqs_enabled()); nk_dequeue_thread_from_runq(thethread); dequeue_thread_from_tlist(thethread); /* remove it from any wait queues */ nk_dequeue_entry(&(thethread->wait_node)); /* remove its own wait queue * (waiters should already have been notified */ nk_thread_queue_destroy(thethread->waitq); free(thethread->stack); free(thethread); }
enum twi_status twi_transfer_wait(struct twi_transfer *xfer, uint16_t timeout_ms) { enum twi_status status; uint32_t timeout = (uint32_t)timeout_ms * 100; while (1) { status = twi_transfer_get_status(xfer); if (status != TWI_STAT_INPROGRESS) break; if (timeout-- == 0) { twi_transfer_cancel(xfer); status = TWI_STAT_TIMEOUT; break; } _delay_us(10); if (!irqs_enabled()) { if (TWCR & (1 << TWINT)) twi_interrupt_handler(); } } return status; }