In the last article, we discussed the usage of wait queues in Linux kernel. We saw the variants of wait_event(). Just for completeness, we will discuss how the wait queues are implemented internally. First step is the creation and initialization of wait queue entry. This is done as below:
DEFINE_WAIT(wait_entry);
Next step is to add the wait queue entry to the queue and set the process state. Both of these things are being done by a single function declared below:
prepare_to_wait(wait_queue_head_t *wq_head, wait_queue_t *wq, int state);
After this, we schedule out the process by invoking the schedule() API. Once we are done with waiting, next step is to clean up with the API below:
finish_wait(wait_queue_head_t *wq_head, wait_queue_t *wq);
All the above are available from:
#include <linux/wait.h>
One more point worth noting is that the condition has to be tested manually as was done in our earlier article.