# wait.h wait_queue_head_t 的可以看舊的文件: [wait.h](https://archive.kernel.org/oldlinux/htmldocs/kernel-hacking/queues.html) 結果發現 waitqueue 有文件藏在這裡 [driver-api](https://docs.kernel.org/next/driver-api/basics.html#wait-queues-and-wake-events) ## wait_queue_entry_t ```c /* * A single wait-queue entry structure: */ struct wait_queue_entry { unsigned int flags; void *private; wait_queue_func_t func; struct list_head entry; }; ``` - wake_up 會執行 func 來喚醒執行緒 - private 根據下面 init 的使用,應該是儲存當前執行緒的 `task_struct` 指標 ### 機制解讀 1. `add_wait_queue` 將 `entry` 加入 `head` 2. 使用 `wait_event` 或是其他機制讓執行緒睡眠 3. 使用 wake_up 喚醒某個 head 底下的 entry 對應的執行緒 ### add_wait_queue 其實就是將 `wait_queue_entry_t` 加入給定的 `head` ### init_waitqueue_entry - func 設成 default_wake_function ,它的實作位在 `sched/core.c` ,使用 `try_to_wake_up` ### init_waitqueue_func_entry - func 設成自定義的 `func` ## wake_up ### [__wake_up_common](https://elixir.bootlin.com/linux/v6.16-rc5/source/kernel/sched/wait.c#L73) 程式主要邏輯就是掃描 `wq_head` 底下的 linklist 並嘗試對每個 `wait_queue_entry_t` 執行它被設定的 `wait_queue_func_t` ,嘗試將對應的執行緒喚醒
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up