Linux Completion

內核版本:Linux-4.5

在Linux驅動程序中,有時需要等待一個事件的完成,就需要用到completion機制,需要包含頭文件<linux/completion.h>

completion類型定義如下:
struct completion {
	unsigned int done;
	wait_queue_head_t wait;
};

說明completion使用等待隊列來實現的。

可以使用宏DECLARE_COMPLETION來靜態定義並初始化一個completion。

如果要動態初始化一個completion,可以使用函數init_completion()來完成。

要等待一個事件的完成,可以使用wait_for_completion()、wait_for_completion_timeout()函數,例如:

wait_for_completion(&done);
調用了wait_for_completion相關函數之後,調用的線程將睡眠下去。如果要喚醒該線程,那麼需要在其他線程中調用complete()、complete_all()。complete只喚醒一個線程,而complete_all則是喚醒所有的線程。

例程如下(來自drivers/spi/spi-s3c24xx.c):
static int s3c24xx_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
{
	...

	init_completion(&hw->done);

	...

	wait_for_completion(&hw->done);
}

staic irqreturn_t s3c24xx_spi_irq(int irq, void *dev)
{
	...

	complete(&hw->done);

	...

 irq_done:
	return IRQ_HANDLED;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章