Пример #1
0
/*
 * 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);
}
Пример #2
0
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;
}